今天2021.12.12
一开始使用mysql -u root -p 登录mysql时候
忘了root用户的密码
可以将mysql文件夹中my.ini文件中的skip-grant-tables使用#注销,这样就不会进行安全检查
但是注销后要net stop mysql
然后net start mysql
相当于重启mysql服务才会生效
从y总课中知道
数据库有:mysql和redis两种类型的
redis是内存数据库
show databases;
use mysql;
show tables;
https://github.com/webyog/sqlyog-community/wiki/Downloads
三层结构:数据库管理系统——>数据库——>表
mysqld这个程序在3306这个端口监听
是DBMS中最重要的一个程序之一
mysqld是dbms核心的监听程序
上图中,等服务器端查询到之后再返回给客户端数据
略
create database db01
drop database db01(此处为数据库名字)
create database db02 character set utf8
create database db03 character set utf8 collate utf8_bin
默认校验规则为utf8_general_ci:不区分大小写
区分大小写的校验规则:utf8_bin
show databases#有s
show create database `db03`
在创建数据库/表的时候为了规避关键字可以使用反引号`来解决
eg:create database create 会报错
在create上增加反引号即可解决
用关键字来创建表或者数据库时要加上反引号`
drop database db03
看视频效果更好
sqldump -u 用户名 -p -B 数据库1 数据库2 数据库n > 文件名.sql(此处也可以是路径)
source 文件名.sql
进入Mysql命令行 如果不执行mysql -u root -p进入mysql命令行的话只能备份,不能恢复
使用mysql -u root -p进入mysql命令行后即有mysql>提示符时可以使用恢复命令
法二:因为备份文件是sql语句
所以可以将备份文件拷贝后到SQLyog的编辑区中整体执行即可
练习:备份db02和db03库中的数据并且恢复
备份
mysqldump -u root -p -B db02 db03 > C://back.sql
C盘下back.sql文件就是一系列sql语句
所以备份的文件就对应的是备份sql语句
恢复
法一:source C://back.sql
法二:打开back.sql文件将其内容复制后在SQLyog的查询编辑器中全部执行即可
mysqldump -u root -p 数据库 表1 表2 表n > C://文件名.sql
utf8:3字节表示1字符
gbk:2字节表示1字符
utf8编码:1字符=3字节
gbk编码:1字符=2字节
varchar相当于一个可伸缩的盒子
存放文章一般用varchar
如果数据就是定长的就是固定的大小就用char
所以查询速度比varchar更快
注意text不能带有默认值
如content text
而不是content text(10)
字符串用单引号
java中字符串用双引号
如果需要某列的属性为timestamp能够自动更新还需要配置如下黄色语句
alter table emp
add 列名 varchar(32) not null default ' '
after resume#表明在resume列后面插入这列
alter table emp
modify 列名 varchar(60)#表示修改这一列的长度原为32现为60
alter table 表名如emp
drop 列名如sex列
rename table 原表名emp to 新表名employ
alter table 表名如employ character set utf8
或
alter table 表名如employ charset utf8
#这些语句后面可以带;也可不带;
alter table 表名
change 原列名 新列名 新列的附加属性
以goods表为例
限制表中某字段为非空
如下定义表中没有限制字段为非空即没有not null
所以可以为空即null
insert into 表名 (表中的列名)
values (),(),()
如
inset into goods (id,goods_name,price)
values(20,'三星手机',20),(89,'苹果手机',90)
要删除整个表:drop table 表名
表没有了里面的记录也自然没有了
select `name`,(chinese+english+math) from student
select 原列名 as 新列名即别名 from 表名
统计班级共多少学生
就用select count(*) from student
就返回student这个表中所有的行数即学生个数
select user()
或
select user() from dual
select database()
或者
select database() from dual #加上只是为了看起来不那么怪
select MD5()
或
select MD5() from dual
或者
加密的意义:假设root用户的密码是hsp但是存到系统中不能是hsp因为当数据库被爆破了就被看见了所以要使用MD5来加密
不管str即你的密码有多长经过MD5后都是32位
select length(MD5('HSP'))#返回的是32
select length(MD5('HSPdsadasdsa'))#返回的还是32
select password('mima')
或
select password('mima') from dual
若不带mysql则表示现在这个数据库中的user表 mysql本身也是一个数据库
当带上mysql.user后可以不用切换到mysql数据库后再使用user表 而在db数据库中也可以使用mysql数据库中的表
自己创建的用户还有root用户是放在系统的mysql数据库中 即指定一个库指定一个表名即可不切换数据库查询到其他库中的表
案例:验证root用户的明文密码为hsp放入数据库中使用的是password()加密
select case when exp1 then exp2
when exp3 then exp4
when exp5 then exp6
.
.
.
when expn-2 then expn-1
else expn end
判断是空:字段 is null
判断非空:字段 is not null
判断相等:使用一个等号=而不是两个
select ename from emp if(comm is null,0.0,comm)
select ename from emp ifnull(comm,0.0)
select ename,(select case
when job = 'CLERK' then '职员'
when job = 'MANAGER' then '经理'
when job = 'SALESMAN' then '销售'
else job end)
from emp;
因为之前的单表中还有一些没有讲到所以先在查询加强中讲完再将多表为多表做准备
**4 **
————————————————————————
2——很重要
此时表中已经按照deptno排好了序
但是每个部门即每个相同的deptno中薪资没有排序
现在要对每个部门中的薪资再进行排序
1
2
3
此处不可以使用别名因为使用别名后还是有两个同样的别名
重要提醒
如果5表联查最少需要4个条件
即where中要4个条件最少
部门号涉及dept表,后面的三个要查的涉及emp表,所以多表查询
select ename,dname,sal,emp.deptno#也可以是dept.deptno
from emp,dept
where emp.deptno=dept.deptno and emp.dept=10
作用:将子查询当作临时表使用实际并不存在
重点
否则就需要写成:表名.列名
此步:查看要复制的表
因为自我复制的前提是要自我复制的表中有数据
所以才有第一步将emp表查到的数据先插入到my_tab01中
1:
create table my_tab02 like emp;#把emp表的结构(列)复制到my_tab02中
2:
insert into my_tab02 select * from emp;#将emp表的拆线呢结果插入到my_tab02表中
#自我复制
insert into my_tab02 select * from my_tab02;#my_tab02表的自我复制
create table my_tmp like my_tab02;
insert into my_tmp #后面不用加from
select distinct * from my_tab02;
delete from my_tab02;#删除my_tab02的记录但是my_tab02表的结构还在
insert into my_tab02 from
select * from my_tmp;
drop table my_tmp;
未使用外连接时
使用左外连接
所以左外连接是左侧表完全显示就算没有与右侧匹配的也显示
1
主键虽然没有写not null但是默认包含非空
2
复合主键
3
4
外键所在表=从表
先创建主表因为我即外键所在表要用到别人即主表
所以先创建主表
创建主从表
测试案例
4
其中只要主表定义id时不是
id int not null
那么从表的class_id就可以为null
5
若没有外键指向它就可以删
除非先把指向它的一行先删除了才能删除这一行
同理若两行指向它先删除这两行才行
p57有讲
在某列建立索引就会建立一个索引二叉树
对dml效率有影响的原因
某大V有1000w粉丝,每天发2篇文章
则增删改为2
而1000w粉丝查询为2*1000w
所以select比insert delete update多得多
create table t1(
id int primary key,
name varchar(32)
);
create table t1(
id int unique,
name varchar(32)
);
因为有一列name
其中这一列有两个tom
所以这时候希望name列为索引有希望name列中可以有重复
则设置name列为index
1先创建一个表
2查询创建的表有没有索引
3添加唯一索引
4添加普通索引方式1
5唯一索引VS普通索引
即id不重复所以使用unique索引更快与普通索引
而如name可能重复所以使用普通索引
6添加普通索引方式2
7添加主键索引
建表时添加
先创建表再添加
删除普通索引和唯一索引
删除主键索引
因为一张表最多只有一个主键
所以不用指定主键是哪一列
下图dml不包括查select
回顾一下update用法
事实上用之前的方法有风险
——————————————————————————————
前提是开始事务且有相关的保存点
-- 1. 创建一张测试表
CREATE TABLE t27
( id INT,
`name` VARCHAR(32));
-- 2. 开始事务
START TRANSACTION
-- 3. 设置保存点
SAVEPOINT a
-- 执行dml 操作
INSERT INTO t27 VALUES(100, 'tom');
SELECT * FROM t27;
SAVEPOINT b
-- 执行dml操作
INSERT INTO t27 VALUES(200, 'jack');
-- 回退到 b
ROLLBACK TO b
-- 继续回退 a
ROLLBACK TO a
-- 如果这样, 表示直接回退到事务开始的状态.
ROLLBACK
COMMIT
– 讨论 事务细节
– 1. 如果不开始事务,默认情况下,dml操作是自动提交的即自动commit,不能回滚
INSERT INTO t27 VALUES(300, 'milan'); -- 自动提交 commit
SELECT * FROM t27
-- 若开启事务后
rollback -- 则表中没有任何数据
– 2. 如果开始一个事务,你没有创建保存点. 你可以执行 rollback,
– 默认就是回退到你事务开始的状态
START TRANSACTION #开启事务时就给了你默认保存点即开始的保存点
INSERT INTO t27 VALUES(400, 'king');
INSERT INTO t27 VALUES(500, 'scott');
ROLLBACK -- 表示直接回退到事务开始的的状态即只有300 milan了
COMMIT;
– 3. 你也可以在这个事务中(还没有提交时), 创建多个保存点.比如: savepoint aaa;
– 执行 dml , savepoint bbb
– 4. 你可以在事务没有提交前,选择回退到哪个保存点
– 5. InnoDB 存储引擎支持事务 , MyISAM 不支持
innodb存储引擎支持事务 myisam不支持事务
– 6. 开始一个事务 start transaction, 也可以用: set autocommit=off;