cgb2109-day03
Posted cgblpx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cgb2109-day03相关的知识,希望对你有一定的参考价值。
文章目录
一,mysql数据的备份
–1,用工具直接备份就行
1,如果是SQL,直接ctrl s保存就行
2,也可以把表或者数据库一整个导出–右键–导出–以SQL转储文件…
–2,练习
#练习SQL语句:
#练习1:查询部门地址在二区的部门名称
SELECT dname FROM dept WHERE loc='二区'
#练习2:查询部门地址在二区名字里有o的部门编号
SELECT deptno FROM dept WHERE
loc='二区' AND dname LIKE '%o%'
#练习3:查询名字以l开头的员工岗位并去重
SELECT DISTINCT job FROM emp WHERE ename LIKE 'l%'
#练习4:查询15年到19年入职的员工姓名和岗位
SELECT ename,job FROM emp WHERE
#year(hiredate)>=2015 and YEAR(hiredate)<=2019
hiredate>='2015-1-1' AND hiredate<='2019-12-31'
#练习5:查询副总的年薪
SELECT sal*12+IFNULL(comm,0)*12 FROM emp WHERE job='副总'
二,条件查询
–1,null
#1.null的数据用is /is not关键字来过滤
#练习1:查询没有奖金的员工信息
SELECT * FROM emp WHERE comm IS NULL
#练习2:查询有奖金的员工信息
SELECT * FROM emp WHERE comm IS NOT NULL
–2,between and
#练习3:查询工资5000~10000的员工信息
SELECT * FROM emp WHERE
#sal>=5000 and sal<10000
sal BETWEEN 5000 AND 10000 #[5000,10000]
#练习4:查询2019年入职的员工姓名
SELECT ename FROM emp WHERE
#hiredate between '2019-1-1' and '2019-12-31'
YEAR(hiredate)=2019
–3,limit分页
#练习5:展示前两条员工数据
SELECT * FROM emp LIMIT 2 #只取前n条
SELECT * FROM emp LIMIT 0,2 #从0+1的数据开始,总共展示2条
#练习6:查询岗位是员工的第一条记录
SELECT * FROM emp WHERE job='员工' LIMIT 0,1#limit通常放最后
–4,order by
#4.order by排序,按照字典顺序排,默认是升序ASC
#练习7:按照工资排序
SELECT * FROM emp ORDER BY sal DESC #按数值降序
#练习8:按照名字排序
SELECT * FROM emp ORDER BY ename DESC #按字母降序
#练习9:按照岗位排序
SELECT * FROM emp ORDER BY job ASC #按汉字对应的编号升序
#练习10:查询15年到19年入职的员工信息只取前两条并按照工资升序排
SELECT * FROM emp WHERE
YEAR(hiredate) BETWEEN 2015 AND 2019 #区间[2015,2019]
ORDER BY sal #排序,默认的升序
LIMIT 2 #分页,只取前两条,通常放最后
–5,统计案例
#统计需求
#练习1:统计每个员工的年薪
SELECT sal,comm,sal*16+IFNULL(comm,0)*16 FROM emp
#练习2:统计19年以前入职的员工信息
SELECT * FROM emp WHERE
YEAR(hiredate)<2019
三,聚合函数
–1,概述
基础函数:
upper lower length concat substr replace ifnull now()/date()/year()…
聚合函数:
把一个字段的值聚合起来,进行获取最大值,最小值,平均数,求和,求个数…
max() min() sum() avg() count()
–2,测试
#聚合函数max min sum avg count
#最大值 最小值 求和 求平均数
SELECT MAX(sal),MIN(sal),SUM(sal),AVG(sal) FROM emp
#求总记录数
SELECT COUNT(*) FROM emp#低效
SELECT COUNT(1) FROM emp#高效
SELECT COUNT(sal) FROM emp#了解,不推荐
SELECT COUNT(comm) FROM emp#按照字段统计时不统计null
#练习1:统计名字里包含a的总记录数
SELECT COUNT(1) FROM emp WHERE ename LIKE '%a%'
#练习2:统计19年入职的员工里的最高薪
SELECT MAX(sal) FROM emp WHERE YEAR(hiredate)=2019
#练习3:统计2号部门的平均薪资
SELECT AVG(sal) FROM emp WHERE deptno=2
#练习4:统计2号部门一年的工资支出总数
SELECT SUM(sal)*12 FROM emp WHERE deptno=2
四,分组
把表里的所有数据 按照 合理的维度 分成不同的组
–1,group by
#分组:使用group by
#练习1:统计每个部门的平均薪资
SELECT AVG(sal),deptno FROM emp
GROUP BY deptno #按照部门分组
#练习2:统计每个部门的最高薪资
SELECT MAX(sal),deptno FROM emp
#口诀1:查询结果中出现了混合列,包括着聚合列和非聚合列,必须分组
GROUP BY deptno
#口诀2:通常按照非聚合列分组
#练习3:统计每年入职的总人数
SELECT YEAR(hiredate),COUNT(1) FROM emp
GROUP BY YEAR(hiredate)
#练习4:统计每个岗位的平均薪资
SELECT AVG(sal),job FROM emp
GROUP BY job
–2,having
把分组后的数据还想继续过滤,使用group by的固定搭配having
#having
#练习5:统计每个岗位的平均薪资,而且只要>=10000的
SELECT AVG(sal) a,job FROM emp
#where AVG(sal)>=10000
#注意:::where里不能用别名,也不能出现聚合函数
GROUP BY job #按照非聚合列分组
HAVING a>=10000 #分组后的过滤,a是别名
#练习6:统计每年入职的人数,而且只要19年的
SELECT YEAR(hiredate) ,COUNT(1) FROM emp
WHERE YEAR(hiredate)=2019
GROUP BY YEAR(hiredate) #分组
#having a=2019 #分组后的过滤
# where比having 高效,因为执行时机要早一些
五,事务
–1,概述
1,数据库事务用来保证 多个SQL 要么全成功,要么全失败.英文叫transaction.
MySQL数据库会自动管理事务,Oracle数据库需要程序员管理事务.
MySQL也允许程序员手动管理事务
2,事务的四大特征:ACID
原子性: 把多条SQL看做一个原子密不可分,要么全成功,要么全失败
一致性: 保证数据守恒,将来广泛的应用到分布式系统里
隔离性: MySQL数据库可以支持高并发,可能会有数据安全的隐患,也有复杂的隔离级别
持久性: 对数据库的操作增删改,有持久影响
3,隔离级别:
read uncommitted读未提交:性能好,但是安全性差
read commited读已提交:是Oracle数据库默认的隔离级别,性能较差,但是安全性较好
repeatable read可重复读:是MySQL数据库默认的隔离级别,性能再差一点,但是安全性特别好
Serializable串行化:性能非常差,但是安全性比较好
也可以查:SELECT @@tx_isolation;
–2,测试
窗口1:
mysql> use cgb210901; #使用数据库,准备往表里插入数据
mysql> start transaction; #开启事务start transaction
mysql> insert into g values(null,'jack',20);#多条执行增删改的SQL
mysql> commit;#提交事务commit,不提交的话别人查不到的,没有持久影响
窗口2:
mysql> use cgb210901;
mysql> select * from g; #窗口1不执行commit,这里永远查不到的
以上是关于cgb2109-day03的主要内容,如果未能解决你的问题,请参考以下文章