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的主要内容,如果未能解决你的问题,请参考以下文章

cgb2109-day04

cgb2109-day06

cgb2109-day17

cgb2109-day16

cgb2109-day11

cgb2109-day02