cgb2106-day03

Posted cgblpx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cgb2106-day03相关的知识,希望对你有一定的参考价值。

一,统计年薪

#统计员工的年薪
SELECT sal,comm,(sal+comm)*12 FROM emp
SELECT sal,comm,
(sal+IFNULL(comm,0))*16 AS 年薪 #as用来设置别名
FROM emp

二,聚合函数

–1,概述

把一列的值全都取出来,聚合起来,分析最大值,最小值,平均值,求和,求个数
常见的聚合函数: max   min   avg    sum   count 

–2,测试

#聚合函数:把查出来的列聚合起来分析数据
#求最高薪max 
SELECT sal FROM emp ORDER BY sal DESC LIMIT 1
SELECT MAX(sal) FROM emp #获取sal这列里的最大值
#求最低薪min 
SELECT sal FROM emp ORDER BY sal LIMIT 1
SELECT MIN(sal) MIN FROM emp
#求和sum 
SELECT SUM(sal) FROM emp
#求平均数avg
SELECT AVG(sal) FROM emp
SELECT MAX(sal),MIN(sal),SUM(sal),AVG(sal) 
FROM emp
#求总个数count
SELECT COUNT(comm) FROM emp#不统计comm字段值是null的-低效
SELECT COUNT(*) FROM emp#都统计
SELECT COUNT(1) FROM emp#都统计-高效
#统计工资>8000的人数
SELECT COUNT(1) FROM emp 
WHERE sal>8000
#统计2019年入职的人数
SELECT COUNT(1) FROM emp
WHERE YEAR(hiredate)=2019

三,分组

–1,测试

#什么时候必须分组?当查询结果中出现了聚合列和非聚合列时
#按照什么分组合理?通常按照非聚合列分组
#什么是聚合列非聚合列?使用了聚合函数max min sum avg count的就是聚合列
#统计每个部门的平均薪资
SELECT deptno,AVG(sal) FROM emp
GROUP BY deptno #按照部门编号分组
#统计每个岗位的最高薪资
SELECT MAX(sal),job FROM emp
GROUP BY job#按照岗位分组
#统计每年的入职人数
#count是聚合函数,year只是普通函数
SELECT COUNT(1),YEAR(hiredate) FROM emp
GROUP BY YEAR(hiredate)#按照非聚合列分组

#having的作用:用来对分组后的数据,进一步过滤
#统计每个部门的平均薪资,只要>10000的记录
SELECT deptno,AVG(sal) FROM emp
GROUP BY deptno
HAVING AVG(sal)>10000
#统计每个岗位的最高薪资,只要>8000的记录
SELECT job,MAX(sal) FROM emp
#先过滤再分组高效,但是where里不能用聚合函数
#where MAX(sal)>8000  #会报错
GROUP BY job
HAVING MAX(sal)>8000
ORDER BY MAX(sal) #升序排序

#统计每年的入职人数,只要人数>1的记录
SELECT COUNT(1),YEAR(hiredate) FROM emp
GROUP BY YEAR(hiredate)
HAVING COUNT(1) > 1 
#不能改成where,后面出现了聚合函数

#统计每年的入职人数,只要2017年以后的记录
SELECT COUNT(1),YEAR(hiredate) FROM emp
WHERE YEAR(hiredate) > 2017 #高效,只是where里不能出现聚合函数
GROUP BY YEAR(hiredate)
#having YEAR(hiredate)> 2017 
#having里使用的过滤条件必须是查到的结果

四,事务

-1,概述

保证SQL语句,要么全执行成功,要么全失败
有四个特征ACID:
A是原子性: 是指多条SQL是一个原子,密不可分.如果都正确,就操作了数据.如果有错误的都会发生回滚,回到事务执行之前.
C是一致性: 保证了数据的一致性和完整性.
I是隔离性: 保证多线程并发时的数据安全,多个操作之间是被隔离的.
D是持久性: 是指对数据CDU的影响是持久生效的.
隔离级别:读未提交 读已提交 可重复读 串行化
从前往后,性能越来越差,安全性越来越高.mysql默认是可重复读

-2,测试

先开启事务,然后执行一批SQL,再结束事务

mysql> start transaction; #开启事务
Query OK, 0 rows affected (0.00 sec)
mysql> insert into dept values(18,'java','shanghai');
Query OK, 1 row affected (0.00 sec)
mysql> insert into dept values(19,'java2','shanghai2');
Query OK, 1 row affected (0.00 sec)
mysql> commit; #提交事务
Query OK, 0 rows affected (0.03 sec)

-1,概述

以上是关于cgb2106-day03的主要内容,如果未能解决你的问题,请参考以下文章

cgb2106-day09

cgb2106-day17

cgb2106-day18

cgb2106-day14

cgb2106-day05

cgb2106-day12