【MySQL】第八节—表的增删改查,吃透这篇就够了(下)
Hi,我是云边有个稻草人-ZEEKLOG博客个人主页,今天结束表的增删改查,继续!

目录
3.2【将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分】
3.3【将总成绩倒数前三的 3 位同学的数学成绩加上 30 分】
上节回顾:【MySQL】第七节—表的增删改查,吃透这篇就够了(上)
正文开始——
三、Update
语法:
UPDATE table_name SET column = expr [, column = expr ...] [WHERE ...] [ORDER BY ...] [LIMIT ...] 对查询到的结果进行列值更新
案例:
3.1【将孙悟空同学的数学成绩变更为 80 分】
- -- 更新值为具体值

3.2【将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分】
- -- 一次更新多个列

3.3【将总成绩倒数前三的 3 位同学的数学成绩加上 30 分】
- - 更新值为原值基础上变更

3.4【将所有同学的语文成绩更新为原来的 2 倍】
注意:更新全表的语句慎用!
- -- 没有 WHERE 子句,则更新全表

四、Delete
4.1 删除数据
语法:
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...] 案例:
【删除孙悟空同学的考试成绩】

【删除总分倒数第一的同学信息】

【删除整张表数据】
注意:删除整表操作要慎用!
MySQL当中的表分为表和表里面的数据,delete删除的是表里面的数据,表的结构不受影响。
清空表的第一种做法:

4.2 截断表
对于删除整表里面的数据这个操作,在效果上和delete是一样的,但是在原理和细节上有差异
语法:
TRUNCATE [TABLE] table_name 注意:这个操作慎用
- 只能对整表操作,不能像 DELETE 一样针对部分数据操作;
- 实际上 MySQL 不对数据操作,所以比 DELETE 更快,但是TRUNCATE在删除数据的时候,并不经过真正的事物,所以无法回滚
- 会重置 AUTO_INCREMENT 项

【补充】


五、去重数据表,插入查询结果
语法:
支持将 select 的结果直接 insert 插入表里面
INSERT INTO table_name [(column [, column ...])] SELECT ... 案例:删除表中的的重复记录,重复的数据只能有一份

六、聚合函数

案例:
6.1 【统计班级共有多少同学】
- -- 使用 * 做统计,不受 NULL 影响

也可以进行重命名操作:

- -- 使用表达式做统计

6.2 【统计本次考试的数学成绩分数个数】
- -- COUNT(math) 统计的是全部成绩

- -- COUNT(DISTINCT math) 统计的是去重成绩数量
count 肯定是对筛选后的结果进行聚合统计,所以我们应该先去重操作,再进行聚合统计,so

6.3【统计数学成绩总分】

- -- 去重之后的数学成绩的总分

- -- 不及格 < 60 的总分,没有结果,返回 NULL

- --数学成绩的平均分

6.4【统计平均总分】

6.5【返回英语最高分】
不能直接找到英语最高分是谁,但是可以用order by结合limit实现

6.6【返回 > 70 分以上的数学最低分】

聚合是有条件的,一定要保证列信息是可被聚合的,一个只属于某一个人的属性是无法与聚合信息相结合的,就比如上面的例子中,最高分和最高分是谁是无法相结合的。
聚合函数在应用层上,更多的是在进行数据统计,接下来学习group by进一步认识聚合函数的应用
七、group by子句的使用
在select中使用group by 子句可以对指定列进行分组查询
select column1, column2, .. from table group by column; 案例:
- 准备工作,创建一个雇员信息表(来自oracle 9i的经典测试表)
- EMP员工表
- DEPT部门表
- SALGRADE工资等级表
案例代码,准备工作,根据下面的代码创建对应的库和表:
DROP database IF EXISTS `scott`; CREATE database IF NOT EXISTS `scott` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; USE `scott`; DROP TABLE IF EXISTS `dept`; CREATE TABLE `dept` ( `deptno` int(2) unsigned zerofill NOT NULL COMMENT '部门编号', `dname` varchar(14) DEFAULT NULL COMMENT '部门名称', `loc` varchar(13) DEFAULT NULL COMMENT '部门所在地点' ); DROP TABLE IF EXISTS `emp`; CREATE TABLE `emp` ( `empno` int(6) unsigned zerofill NOT NULL COMMENT '雇员编号', `ename` varchar(10) DEFAULT NULL COMMENT '雇员姓名', `job` varchar(9) DEFAULT NULL COMMENT '雇员职位', `mgr` int(4) unsigned zerofill DEFAULT NULL COMMENT '雇员领导编号', `hiredate` datetime DEFAULT NULL COMMENT '雇佣时间', `sal` decimal(7,2) DEFAULT NULL COMMENT '工资月薪', `comm` decimal(7,2) DEFAULT NULL COMMENT '奖金', `deptno` int(2) unsigned zerofill DEFAULT NULL COMMENT '部门编号' ); DROP TABLE IF EXISTS `salgrade`; CREATE TABLE `salgrade` ( `grade` int(11) DEFAULT NULL COMMENT '等级', `losal` int(11) DEFAULT NULL COMMENT '此等级最低工资', `hisal` int(11) DEFAULT NULL COMMENT '此等级最高工资' ); insert into dept (deptno, dname, loc) values (10, 'ACCOUNTING', 'NEW YORK'); insert into dept (deptno, dname, loc) values (20, 'RESEARCH', 'DALLAS'); insert into dept (deptno, dname, loc) values (30, 'SALES', 'CHICAGO'); insert into dept (deptno, dname, loc) values (40, 'OPERATIONS', 'BOSTON'); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7844, 'TURNER', 'SALESMAN', 7698,'1981-09-08', 1500, 0, 30); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10); insert into salgrade (grade, losal, hisal) values (1, 700, 1200); insert into salgrade (grade, losal, hisal) values (2, 1201, 1400); insert into salgrade (grade, losal, hisal) values (3, 1401, 2000); insert into salgrade (grade, losal, hisal) values (4, 2001, 3000); insert into salgrade (grade, losal, hisal) values (5, 3001, 9999); 

emp表:

dept表:

salgrade表:

7.1【如何显示每个部门的平均工资和最高工资】

7.2【显示每个部门的每种岗位的平均工资和最低工资】

7.3 【显示平均工资低于2000的部门和它的平均工资】
第一步:首先统计各个部门的平均工资(把结果先聚合出来)

第二步:然后having和group by配合使用,对group by结果进行过滤

- --having经常和group by搭配使用,作用是对分组进行筛选,作用有些像where。
7.4【having 和 where】
SMISH员工不参与统计,显示平均工资低于2000的部门和它的平均工资,在完成这个题目的过程中体会 having 和 where 的区别

八、实战OJ
查找入职员工时间升序排名的情况下的倒数第三的员工所有信息_牛客题霸_牛客网
查找薪水记录超过15条的员工号emp_no以及其对应的记录次_牛客题霸_牛客网
获取所有部门当前manager的当前薪水情况,给出dept__牛客题霸_牛客网
从titles表获取按照title进行分组_牛客题霸_牛客网
面试题:
SQL查询中各个关键字的执行先后顺序 from > on> join > where > group by > with > having > select > distinct > order by > limit
下节内置函数
完——

至此结束——
我是云边有个稻草人
期待与你的下一次相遇......