这里写目录标题
- <font color="FF00FF">1. Create
- <font color="FF00FF"> 1. 单行数据全列插入
- <font color="FF00FF"> 2. 多行数据 + 指定列插入
- <font color="FF00FF">3. 插入否则更新
- <font color="FF00FF">4. replace
- <font color="FF00FF">5. Retrieve
- <font color="FF00FF">1. select
- <font color="FF00FF">1. 全列查询
- <font color="FF00FF">2. 指定列查询
- <font color="FF00FF">3. 查询字段为表达式
- <font color="FF00FF">4. where 条件
- <font color="FF00FF">3. 结果排序
- <font color="FF00FF">4. 筛选分页结果
- <font color="FF00FF">5. update
- <font color="FF00FF">6. Delete
- <font color="FF00FF">7. 截断表
- <font color="FF00FF">8. 插入查询结果
- <font color="FF00FF">9. 聚合函数
- <font color="FF00FF">10. group by子句的使用
- <font color="FF00"> where vs having
1. Create
1. 单行数据全列插入
这里的y1(id,name)可以不写,默认就是全列插入
2. 多行数据 + 指定列插入
3. 插入否则更新
1. 由于 主键 或者 唯一键 对应的值已经存在而导致插入失败
1. 0 row affected: 表中有冲突数据,但冲突数据的值和 update 的值相等
2. 1 row affected: 表中没有冲突数据,数据被插入
3. 2 rows affected: 表中有冲突数据,并且数据已经被更新
这个数据被插入,不用写后面的on duplicate key update 那些东西,因为没冲突就直接插入了
select row_count()可以看到表被影响的行数
4. replace
1. 主键 或者 唯一键 没有冲突,则直接插入;
2. 主键 或者 唯一键 如果冲突,则删除后再插入
1. row affected: 表中没有冲突数据,数据被插入
2. rows affected: 表中有冲突数据,删除后重新插入
5. Retrieve
1. select
1. 全列查询
2. 指定列查询
3. 查询字段为表达式
1. 表达式不包含字段
2. 表达式包含一个字段
3. 表达式包含多个字段
4. 为查询结果指定别名
这里的as可以省略
5. 结果去重
4. where 条件
比较运算符:
逻辑运算符:
1. 英语不及格的同学:英语成绩 ( < 60 )
2. 语文成绩在 [80, 90] 分的同学及语文成绩
3. 数学成绩是 73 或者 78 或者 98 或者 99 分的同学及数学成绩
4. 姓孙的同学 及 孙某同学
1. 姓孙的同学
2. 孙某同学和孙xx同学
5. 语文成绩好于英语成绩的同学
6. 总分在 200 分以下的同学
这里的total不能直接用where查,因为先执行from,然后再where,最后select,所以不认识total,但是可以在select那里重命名
7. 语文成绩 > 80 并且不姓孙的同学
8. 孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80
9. NULL 的查询
null不能用=比较,可以用<=>和 is null,is not null
3. 结果排序
ASC 为升序(从小到大)
– DESC 为降序(从大到小)
– 默认为 ASC
没有 ORDER BY 子句的查询,返回的顺序是随机的
1. 同学及数学成绩,按数学成绩升序显示
2. null排序
null比任何值都要小,排在最下面,即便是‘’,也比null大
2. 查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示
如果数学成绩全相等,才能轮到英语升序,英语成绩全相等,才能轮到语文升序,否则就只能实现数学降序了
3. 查询同学及总分,由高到低
这里可以使用total,因为先from,在select,最后排序,先有数据再排序,否则先排序了,再查数据,效率低,因为会对指定的数据排序,不是全部排序后,再去找指定的数据
查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示
这里加了where,from是1,where是2,select 是3,order by是4,如果有limit是5
需要有数据才能排序,只有数据准备好了,才能显示,limit的本质功能是显示
4. 筛选分页结果
起始下标为0--从 s 开始,筛选 n 条结果 SELECT...FROM table_name[WHERE...][ORDER BY...]LIMIT s,n;--从0开始,筛选 n 条结果 SELECT...FROM table_name[WHERE...][ORDER BY...]LIMIT n;--从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用 SELECT...FROM table_name[WHERE...][ORDER BY...]LIMIT n OFFSET s;对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死,从0号下标开始,连续读取1行
从指定下标开始,连续获取多少条记录
按 id 进行分页,每页 3 条记录,分别显示 第 1、2、3 页
5. update
1. 将孙悟空同学的数学成绩变更为 80 分
将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分
将总成绩倒数前三的 3 位同学的数学成绩减去 30 分
将所有同学的语文成绩更新为原来的 2 倍
更新全表的语句慎用!
6. Delete
删除孙悟空同学的考试成绩
删除整张表数据
注意:删除整表操作要慎用
7. 截断表
但是在centos7这个截断的计数器是清空的,就是下图的default
1. 只能对整表操作,不能像 DELETE 一样针对部分数据操作;
2. 实际上 MySQL 不对数据操作,所以比 DELETE 更快,但是TRUNCATE在删除数据的时候,
并不经过真正的事物,所以无法回滚
3. 会重置 AUTO_INCREMENT 项
相当于delete的历史SQL语句会被bin.log的磁盘文件储存起来,这叫主从同步,bin log默认是被关闭的,回源时,直接把磁盘文件加载到内存,把SQL语句全部执行一遍,就恢复了
8. 插入查询结果
INSERT INTO table_name[(column[,column...])]SELECT我们要把一个表去重
这个是查询时把表去重,我们要的是改变原表
1. 创建一张空表 no_duplicate_table,结构和 duplicate_table 一样
2. 将 duplicate_table 的去重数据插入到 no_duplicate_table
3. 通过重命名表,实现原子的去重操作
为什么用rename呢?
因为rename是原子的,如果要上传文件到linux,假如数据很大,所以上传很慢,想把这个文件上传到linux的一个特定目录下,就是写入数据,它一定不是原子的,所以一般把这个文件上传到临时目录下,等全部上传成功后,直接mv到特定的目录,rename是同样的原理,只是改文件名,就是把文件系统的inode和目录的映射关系改了,就是把inode改成和这个临时目录进行映射
用rename就是单纯的想等一切都就绪了,然后统一放入,更新,生效等
9. 聚合函数
1. 统计班级共有多少同学
count(*) 和count(1) 忽略了对null的影响
2. 统计本次考试数学成绩分数个数
3. 统计的是去重数学成绩的数量
4. 统计数学成绩总分
5. 英语成绩>=80分,的总成绩
6. 统计平均分
7. 返回英语最高分
8. 返回 > 70 分以上的数学最低分
10. group by子句的使用
建一个雇员信息表(来自oracle 9i的经典测试表)
EMP员工表
DEPT部门表
SALGRADE工资等级表
1. 显示每个部门员工的平均工资和最高工资
2. 显示每个部门的每种岗位的平均工资和最低工资
显示平均工资低于2000的部门和它的平均工资
统计各个部门的平均工资
显示除了smith以外,显示平均工资低于2000的部门和岗位和它的平均工资
SQL查询中各个关键字的执行先后顺序 :
from > on > join > where > group by > with > having > select > distinct > order by > limit
分组的目的是为了进行分组之后,方便进行聚合统计
分组:group by deptno,指定列名,实际分组,是用该列的不同行数据来进行分组的
分组的条件deptno,组内一定是相同的,可以被聚合压缩
分组 (分表):就是把一张表按照条件在逻辑上拆分了多个子表,然后分别对各自的子表进行聚合统计
这条SQL语句的执行顺序:
1. from emp
2. where ename!=‘SMITH’
3. group by deptno,job
4. avg(sal)
5. having 平均工资<2000
6. select deptno,job
1. 先分组再聚合
2. having是对聚合之后的结果进行条件筛选
where vs having
执行顺序的不同
1. where:对具体任意列进行条件筛选
2. having:对聚合之后的结果进行条件筛选
不是只有磁盘上的表结构导入到mysql,真实存在的表才叫表
中间筛选出来的,包括最终结果,都是逻辑上的表,MYSQL一切皆表