Create
语法
[ ]:表示该内容可以省略
全列插入
指定列插入
多行插入
插入否则更新
当创建的表中有唯一性约束时,当插入数据冲突时,更新数据。
- 语法
替换
- 语法
Retrieve
语法
- distinct:去重
简单使用
- 建表
CREATE TABLE exam_result (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL COMMENT '同学姓名',
chinese float DEFAULT 0.0 COMMENT '语文成绩',
math float DEFAULT 0.0 COMMENT '数学成绩',
english float DEFAULT 0.0 COMMENT '英语成绩'
);
- 插入数据
INSERT INTO exam_result (name, chinese, math, english) VALUES
('唐三藏', 67, 98, 56),
('孙悟空', 87, 78, 77),
('猪悟能', 88, 98, 90),
('曹孟德', 82, 84, 67),
('刘玄德', 55, 85, 45),
('孙权', 70, 73, 78),
('宋公明', 75, 65, 30);
-
全列查询
-
指定列查询
语法中指定列的顺序就是显示的顺序
重命名
用as或者用空格都可以重命名
查询结果去重
- 查数学成绩
去重了一个98
where子句
关系运算符
- =:null不安全
- <=>: null安全
-
逻辑运算符
使用
查询总分>200分的人
为什么where在使用别名时会错误?
与mysql的执行顺序有关
首先需要知道在那个表中查询,其次需要知道筛选的条件,最后才需要知道显示哪些列。
英语不及格的人及英语成绩(<60)
语文成绩在 [80, 90] 分的同学及语文成绩
数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
姓孙的同学 及 孙某同学
语文成绩好于英语成绩的同学
总分在 200 分以下的同学
语文成绩 > 80 并且不姓孙的同学
孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80
查询NULL
结果排序
语法
同学及数学成绩,按数学成绩升序显示
id及 name,按 name排序显示
- 有上面可以知道NULL比任何值都小
查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示
查询同学及总分,由高到低
- 这里为什么可以使用别名?
排序,先有数据在排序,order by的执行顺序在select之后
查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示
筛选分页结果
语法
-
limit n 从表头开始,连续读取n行
-
limit s,n 从第s行开始,连续读取n行
由上面的结果可以知道,表的第一行起始为0 -
limit n offset s 从第s行开始,连续读取n行
跟limit s,n效果一样
执行顺序
- 需要有数据才能排序,所以order by在select之后;只有数据准备好了,才要显示,所以limit在order by之后,limit的本质就是“显示”。
通过limit将表分页
Update
语法
使用
将孙悟空同学的数学成绩变更为 80 分
将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分
将总成绩倒数前三的 3 位同学的数学成绩加上 30 分
总分排名倒数前三的
数学加分
将所有同学的语文成绩更新为原来的 2 倍
Delete
语法
使用
删除孙悟空同学的考试成绩
删除整张表的数据
- 这种删除只是删除了,表中的数据标的结构没有删除
截断表
语法
与delete的不同
- 清空auto_increment 这个计数器
- 不走事务
- 不会把操作记录在目录中
日志
插入 查询结果
语法
案例
删除表中的重复数据,重复的数据只能有一份
-- 创建原数据表
CREATE TABLE duplicate_table (id int, name varchar(20));
Query OK, 0 rows affected (0.01 sec)
-- 插入测试数据
INSERT INTO duplicate_table VALUES
(100, 'aaa'),
(100, 'aaa'),
(200, 'bbb'),
(200, 'bbb'),
(200, 'bbb'),
(300, 'ccc');
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0
- 思路: 1.创建一张一样的表duplicate1_table
2.向duplicate1_table中插入不重复的数据
3.重命名
- 为什么最后通过rename的方式进行?
单纯的等一切都准备就绪了,然后统一的放入,更新,生效等。
聚合函数
使用
统计班级共有多少同学
查询表中b有多少
- 使用*,会算NULL;不用*,则不会算NULL。
统计本次考试的数学成绩分数个数
统计数学成绩总分
统计平均总分
返回英语最高分
返回 > 70 分以上的数学最低分
分组 group by
语法
- 分组的目的是,分组之后,方便进行聚合统计。
oracle 9i测试
链接:oracle i9经典测试雇佣表
- DEPT部门表
- EMP员工表
- SALGRADE工资等级表
显示每个部门的平均工资和最高工资
显示每个部门的每种岗位的平均工资和最低工资
显示平均工资低于2000的部门和它的平均工资
-
having和group by配合使用,对group by结果进行过滤
-
统计各个部门的平均工资
-
去除掉SMITH后的工资后的每个部门的平均工资
-
执行顺序
-
分组统计,指定列名,实际分组是用该列的不同行的数据进行分组—>分组条件***,组内一定是相同的–>可以被聚合,就是把一组按条件拆成多组,进行各自组内的统计。
-
分组(“分表”),把一张表,按条件拆成了多个子表,然后对子表进行聚合统计
having
对聚合后的结果进行判断,即对聚合后的数据进行统计(条件筛选)
- having vs where
having 对分组聚合之后的结果,进行条件筛选
where 是具体的任意列进行筛选
两者的区别:条件筛选的阶段不同 - 对 “结果“ 的理解
不要单纯的认为,只有从磁盘上表结构导入到mysql中真实存在的表才叫表。
中间筛选出来的,包括最终结果都是逻辑上的表,mysql中‘一切皆表’.—>只要处理好一张表的CRUD,所有sql场景,全部都能用统一的方式进行—>?(这之后会讲)。