3天学完Mysql
p3 命令行连接mysql
今天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是内存数据库
p4 安装Navicat
show databases;
use mysql;
show tables;
p5 安装SQLyog
SQLyog的各个版本的下载链接
https://github.com/webyog/sqlyog-community/wiki/Downloads
p6 Mysql三层结构
Mysql的端口号
三层结构:数据库管理系统——>数据库——>表
mysqld这个程序在3306这个端口监听
是DBMS中最重要的一个程序之一
mysqld是dbms核心的监听程序
上图中,等服务器端查询到之后再返回给客户端数据
p7 java操作Mysql
略
p8 创建数据库
创建普通的数据库db01
create database db01
删除数据库
drop database db01(此处为数据库名字)
创建使用utf8字符集的的数据库db02
create database db02 character set utf8
创建使用utf8字符集且带校验规则为区分大小写的数据库db03
create database db03 character set utf8 collate utf8_bin
默认校验规则为utf8_general_ci:不区分大小写
区分大小写的校验规则:utf8_bin
db02
db03
p9 查看 删除 数据库
查看当前数据库服务器中的所有数据库
show databases#有s
显示数据库创建语句
show create database `db03`
在创建数据库/表的时候为了规避关键字可以使用反引号`来解决
eg:create database create 会报错
在create上增加反引号即可解决
用关键字来创建表或者数据库时要加上反引号`
删除数据库
drop database db03
p10备份恢复数据库
看视频效果更好
备份数据库(在DOS下执行)
sqldump -u 用户名 -p -B 数据库1 数据库2 数据库n > 文件名.sql(此处也可以是路径)
mysqldump命令在mysql安装目录的bin目录下
恢复数据库(在DOS下的Mysql命令行执行)
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
p11创建表
p12 Mysql列类型即数据类型
标红表示用得较多
p13 整型
p14 bit
p15 小数型
p16 字符串1(char varchar)
utf8:3字节表示1字符
gbk:2字节表示1字符
p17 字符串2-使用的细节
utf8编码:1字符=3字节
gbk编码:1字符=2字节
char()括号中的表示字符而不是字节
定长与变长
varchar相当于一个可伸缩的盒子
存放文章一般用varchar
什么时候用char什么时候用varchar
如果数据就是定长的就是固定的大小就用char
所以查询速度比varchar更快
varchar不够用可以使用text mediumtext 或者更大的text 还有
注意text不能带有默认值
如content text
而不是content text(10)
字符串用单引号
java中字符串用双引号
p18 日期类型
如果需要某列的属性为timestamp能够自动更新还需要配置如下黄色语句
p19 创建表练习
hsp写的
p20 修改表——重要
1 在表中增加一列
alter table empadd 列名 varchar(32) not null default ' 'after resume#表明在resume列后面插入这列
2 修改表中的某一列![
alter table empmodify 列名 varchar(60)#表示修改这一列的长度原为32现为60
3 删除表中某一列
alter table 表名如empdrop 列名如sex列
4 修改表名
rename table 原表名emp to 新表名employ
5 修改表的字符集
alter table 表名如employ character set utf8或alter table 表名如employ charset utf8#这些语句后面可以带;也可不带;
6修改列名 注意与修改表名对比
alter table 表名change 原列名 新列名 新列的附加属性
p21insert基本使用
p22 insert注意事项
以goods表为例
1 插入的数据应与字段/列的数据类型相同
2 数据长度应在列规定的范围内
3 insert的数据应与表中的列对应
4 字符和日期应当在单引号内——重要
5 可以插入空值前提此列可以为空即无not null附加条件
限制表中某字段为非空
如下定义表中没有限制字段为非空即没有not null
所以可以为空即null
6 一次性添加多条记录——重要
insert into 表名 (表中的列名) values (),(),()如inset into goods (id,goods_name,price)values(20,'三星手机',20),(89,'苹果手机',90)
7 如果给所有列/字段添加数据可不写字段名
8 默认值的使用1——重要
指定某列的默认值
如先创建一个goods2表,其price列的默认值为100
p23 update语句
p24 delete语句
删除表中记录
delete from 表名:只能删除所有记录但是表还在
删除整个表
要删除整个表:drop table 表名
表没有了里面的记录也自然没有了
p25 select语句1
p26 select语句2
列运算——算某几列的总和
select `name`,(chinese+english+math) from student
列取别名
select 原列名 as 新列名即别名 from 表名
p27 select语句3
where子句中的运算符
3
4
p28 select语句4——查询结果排序
1
2
3我写的
3hsp写的
p29 统计/合记函数
count函数:返回行的总数
统计班级共多少学生
就用select count(*) from student
就返回student这个表中所有的行数即学生个数
count(*)和count(列)
上述第一条写成这样则
sum函数:求和-只对数值列起作用
avg函数:求平均值-只对数值列起作用
MAX/MIN函数
想知道总分最高和最低是谁:要用到子查询
p30 分组统计
1
没有group by则是求得整个表得最高薪水
两位小数
2
3
3.1
3.2
p31 字符串函数
p32字符串函数练习
p33 数学函数
p34 日期函数1
p35 日期函数2
p36 日期函数3
p37 加密函数----2021.12.15开始
查询当前用户
select user() 或select user() from dual
查询当前使用的数据库名称
select database()或者select database() from dual #加上只是为了看起来不那么怪
MD5加密
select MD5()或select MD5() from dual或者
加密的意义:假设root用户的密码是hsp但是存到系统中不能是hsp因为当数据库被爆破了就被看见了所以要使用MD5来加密
不管str即你的密码有多长经过MD5后都是32位
select length(MD5('HSP'))#返回的是32select length(MD5('HSPdsadasdsa'))#返回的还是32
演示案例
PASSWORD——mysql密码默认用这个方法加密而不是MD5
select password('mima')或select password('mima') from dual
mysql.user表示:数据库.表
若不带mysql则表示现在这个数据库中的user表 mysql本身也是一个数据库
当带上mysql.user后可以不用切换到mysql数据库后再使用user表 而在db数据库中也可以使用mysql数据库中的表
自己创建的用户还有root用户是放在系统的mysql数据库中 即指定一个库指定一个表名即可不切换数据库查询到其他库中的表
案例:验证root用户的明文密码为hsp放入数据库中使用的是password()加密
p38 流程控制函数
if(exp1,exp2,exp3)
ifnull(exp1,exp2)
select case when then when then … else end;——类似于多分枝
select case when exp1 then exp2when exp3 then exp4when exp5 then exp6...when expn-2 then expn-1else expn end
判断是否为空
判断是空:字段 is null
判断非空:字段 is not null
判断相等:使用一个等号=而不是两个
综合案例
1
select ename from emp if(comm is null,0.0,comm)select ename from emp ifnull(comm,0.0)
2
select ename,(select casewhen job = 'CLERK' then '职员'when job = 'MANAGER' then '经理'when job = 'SALESMAN' then '销售'else job end)from emp;
p39 查询增强——为多表做准备
emp表
dept表
salgrade
为什么要将查询加强
因为之前的单表中还有一些没有讲到所以先在查询加强中讲完再将多表为多表做准备
1
2
3 emp表中没有上级即mgr为null
**4 **
————————————————————————
1
2——很重要
此时表中已经按照deptno排好了序
但是每个部门即每个相同的deptno中薪资没有排序
现在要对每个部门中的薪资再进行排序
p40 分页查询
题目
p41 分组加强
1
2
3
4
p42 多子句查询——很重要
p43 多表笛卡尔积——这里开始多表查询——重重重难难难点
emp表
dept表
salgrade表
1
2
3
此处不可以使用别名因为使用别名后还是有两个同样的别名
重要提醒
如果5表联查最少需要4个条件
即where中要4个条件最少
p44 多表查询–接着p43继续
显示部门号为10的部门名 员工名 和 工资
部门号涉及dept表,后面的三个要查的涉及emp表,所以多表查询
select ename,dname,sal,emp.deptno#也可以是dept.deptnofrom emp,deptwhere emp.deptno=dept.deptno and emp.dept=10
标题
以上这是笛卡尔积
实际上不需要这么多只需要加上过滤条件即可
p45 自连接—12.15结束
p46 多行子查询
单行子查询案例
多行子查询案例
最终
p47 子查询临时表
作用:将子查询当作临时表使用实际并不存在
子查询临时表案例:查各类别中价格最高的商品
最终答案
p48 all和any
all
或
any
或
p49 多列子查询
案例1
案例2
下面为student表
p50 子查询练习——重要
例1
例2
先做一个临时表
然后进行多表查询
例3——较难
或者
但是
重点
否则就需要写成:表名.列名
p51 表复制和去重
表复制=自我复制=蠕虫复制
此步:查看要复制的表
因为自我复制的前提是要自我复制的表中有数据
所以才有第一步将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 #后面不用加fromselect distinct * from my_tab02;delete from my_tab02;#删除my_tab02的记录但是my_tab02表的结构还在insert into my_tab02 fromselect * from my_tmp;drop table my_tmp;
p52 合并查询 union 和 union all
要将上述两条语句合并
法一union all:将两个查询结果合并但是不去重
法二union:将两个查询结果合并且自动去重
union和union all的使用时间:需要将两个查询结果合并时但是where语句中不方便写的时候可以使用合并处理
p53 外连接需求
p54 左外连接右外连接
学生表
考试成绩表
左外连接例子
未使用外连接时
使用左外连接
所以左外连接是左侧表完全显示就算没有与右侧匹配的也显示
右外连接例子
外连接练习题
左连接就是:左表若没有匹配的也显示出来
右连接同理
小结
如:
约束简介——2021.12.16开始1
p55 主键
主键的细节
1
主键虽然没有写not null但是默认包含非空
2
复合主键
3
4
p56 not null+unique
unique细节
1
2
p57 外键简介
p58 外键使用细节
外键所在表=从表
先创建主表因为我即外键所在表要用到别人即主表
所以先创建主表
创建主从表
测试案例
小细节
1
2
即存储引擎为innodb
3
4
其中只要主表定义id时不是
id int not null
那么从表的class_id就可以为null
5
若没有外键指向它就可以删
除非先把指向它的一行先删除了才能删除这一行
同理若两行指向它先删除这两行才行
p57有讲
p59 check——2021.12.16结束1
可以写但是不会生效
p60 商店表设计
p61 自增长
p62 索引优化速度——2021.12.16开始2
索引简介
创建索引体验
创建索引
举例说明创建一列的索引是没有啥大用的
未创建ename索引前查询
创建ename索引后查询
但是索引占磁盘空间且只对建立的索引列有效
p63 索引机制
索引原理
在某列建立索引就会建立一个索引二叉树
对dml效率有影响的原因
某大V有1000w粉丝,每天发2篇文章
则增删改为2
而1000w粉丝查询为2*1000w
所以select比insert delete update多得多
p64 创建索引
主键索引 简介
引例
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添加主键索引
建表时添加
先创建表再添加
p65 删除索引
删除普通索引和唯一索引
删除主键索引
因为一张表最多只有一个主键
所以不用指定主键是哪一列
补:修改索引
补:查询索引
索引增删改查作业
p66 创建索引规则----2021.12.16 结束2
p67 事务有什么用——2021.12.16 开始3
事务定义
下图dml不包括查select
回顾一下update用法
事实上用之前的方法有风险
——————————————————————————————
前提是开始事务且有相关的保存点
p68 事务操作
事务操作举例
-- 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');-- 回退到 bROLLBACK TO b-- 继续回退 aROLLBACK TO a-- 如果这样, 表示直接回退到事务开始的状态.ROLLBACK COMMIT
p69 事务注意事项——2021.12.16 结束3
– 讨论 事务细节
– 1. 如果不开始事务,默认情况下,dml操作是自动提交的即自动commit,不能回滚
INSERT INTO t27 VALUES(300, 'milan'); -- 自动提交 commitSELECT * 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;