cgb2110-day03

一,练习

–1,测试

#练习22:模拟用户登录的过程.
#就是拿着用户名和密码 去查库,查到了就登录查不到就不行
SELECT * FROM USER WHERE NAME='jack' AND pwd='xyz'
#练习23:模拟用户注册的过程.
#就是拿着用户名和密码 去入库
INSERT INTO USER VALUES(5,'张飞','123',28);

二,统计案例

–1,测试

#练习1:统计部门的工资支出
SELECT sal,comm,sal+IFNULL(comm,0) FROM emp#月薪
SELECT sal,comm,sal*16+IFNULL(comm,0)*16 FROM emp#年薪
#练习2:统计2019年以前入职的员工信息
SELECT * FROM emp WHERE YEAR(hiredate)<2019
SELECT * FROM emp WHERE hiredate<'2019-1-1'

三,聚合函数

–1,测试

#2.聚合函数: max min sum avg  count,重点!!
#练习3:获取最大值
SELECT sal FROM emp
SELECT MAX(sal) FROM emp
#练习4:获取最小值
SELECT MIN(sal) FROM emp
#练习5:求工资的总和
SELECT SUM(sal) FROM emp
#练习6:求平均工资
SELECT AVG(sal) FROM emp
#练习7:求个数
SELECT COUNT(comm) FROM emp#不推荐!!不统计null的,低效
SELECT COUNT(sal) FROM emp#不推荐!!
SELECT COUNT(*) FROM emp#高效
SELECT COUNT(1) FROM emp#高效

#练习8:统计2019年以前入职的员工人数
SELECT COUNT(1) FROM emp WHERE YEAR(hiredate)<2019
#练习9:统计2019年以前入职的员工的平均工资
SELECT AVG(sal) FROM emp WHERE YEAR(hiredate)<2019
#练习10:统计2号部门的最高薪
SELECT MAX(sal) FROM emp WHERE deptno=2
#练习11:统计岗位是员工的平均工资
SELECT AVG(sal) FROM emp WHERE job='员工'

四,分组

–1,测试

#1.分组:使用group by
#问题1:什么时候必须要分组???查询结果中出现了混合列
#问题2:按啥分组???按照非聚合列分组

#当查询结果中,出现了混合列的时候,必须分组!!!
#聚合列,使用了聚合函数.非聚合列,没有使用聚合函数
SELECT job,AVG(sal) FROM emp #不对
#按照合理的需求分组:job deptno hiredate
#练习1:统计每个岗位的平均薪资
SELECT job,AVG(sal) FROM emp 
GROUP BY job #按照岗位分组
#练习2:统计每个岗位的员工人数并排序
SELECT job,COUNT(1) a FROM emp
GROUP BY job#分组
ORDER BY a DESC#降序,默认是升序
#练习3:统计每个部门的最高薪
SELECT deptno,MAX(sal) FROM emp 
GROUP BY deptno
#练习4:统计每个部门的总人数
SELECT deptno,COUNT(*) FROM emp
GROUP BY deptno
#练习5:统计每年入职的总人数
SELECT YEAR(hiredate),COUNT(1) FROM emp
GROUP BY YEAR(hiredate)
#练习6:统计每年入职的工资总支出
SELECT YEAR(hiredate),SUM(sal)*12 FROM emp
GROUP BY YEAR(hiredate)


–2,分组后的过滤

#2.分组后的过滤having
#练习7:统计每年入职的工资总支出,只要15年以后的数据 
SELECT YEAR(hiredate) a,SUM(sal) FROM emp
GROUP BY a #按照非聚合列分组
HAVING a>2015 #分组后的条件
#练习8:统计每个部门的总人数,只要人数>2的数据
SELECT deptno,COUNT(1) a FROM emp
GROUP BY deptno
HAVING a>2

五,事务

–1,概述

用来保证 多条SQL 要么全成功要么全失败.
四大特征:ACID
1,原子性: 多条SQL是一个密不可分的整体
2,一致性: 分布式系统里,数据的一致性
3,隔离性: 数据库支持高并发,使用了锁的机制保证了数据的安全
4,持久性: 是指对数据的增删改是持久生效的

隔离级别:
1,read uncommitted:读未提交, 安全性最差,但是效率高
2,read committed:读已提交, 安全性较好,但是效率较差,也是Oracle的默认级别
3,repeatable read:可重复读,安全性适中,但是效率一般,也是MySQL的默认级别
4,serializable:串行化,安全性最高,但是效率太差

–2,测试

MySQL已经为我们提供了事务管理,默认是一条SQL一个事务,如果想要自己管理事务必须有下面的步骤:
1,开启事务:start transaction;
2,执行SQL:增删改的SQL
3,结束事务:commit提交

第一个窗口:

mysql> use cgb211001;
mysql> show tables;
mysql> start transaction;  #开启事务
mysql> insert into dept values(null,'java','beijing'); #执行了增删改的SQL
mysql> commit;  #提交事务,否则,别人查不到

第二个窗口:

mysql> use cgb211001;
mysql> select * from dept; #如果1号窗口提交了事务就能查到新数据,否则查不到

六,字段约束

–1,默认约束

给字段添加默认值

#1.默认约束:使用DEFAULT设置默认值
DROP TABLE x1; #删表
CREATE TABLE x1( #建表
 id INT PRIMARY KEY AUTO_INCREMENT, #主键约束
 sex CHAR(3) DEFAULT '男' #默认约束
)
#插入数据时,仍然需要指定具体值(用的少)
INSERT INTO x1 VALUES(NULL,NULL)
INSERT INTO x1 VALUES(NULL,'男')

–2,检查约束

#2.检查约束:检查字段值是否合法
CREATE TABLE x2(
 id INT PRIMARY KEY AUTO_INCREMENT,
 age INT ,
 CHECK(age<100)#检查约束,满足条件才能保存!
)

在这里插入图片描述

–3,外键约束

#3.外键约束:::::
#约束情况1:子表中的主键的值必须取自主表,
#约束情况2:主表的记录想要删除,必须保证子表没用过
CREATE TABLE tb_user(
 id INT PRIMARY KEY AUTO_INCREMENT,
 NAME VARCHAR(10),
 age INT
)
CREATE TABLE tb_user_address(
 user_id INT PRIMARY KEY , #主键
 address VARCHAR(100),
 #1,创建外键:描述和tb_user的关系
 #语法:foreign key(当前表的主键名) references 对方表名(对方表主键)
 FOREIGN KEY(user_id) REFERENCES tb_user(id)
)

猜你喜欢

转载自blog.csdn.net/u012932876/article/details/121552195