#练习22:模拟用户登录的过程.
#就是拿着用户名和密码 去查库,查到了就登录查不到就不行
SELECT * FROM USER WHERE NAME='jack' AND pwd='xyz'
#练习23:模拟用户注册的过程.
#就是拿着用户名和密码 去入库
INSERT INTO USER VALUES(5,'张飞','123',28);
#练习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'
#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.分组:使用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.分组后的过滤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
用来保证 多条SQL 要么全成功要么全失败.
四大特征:ACID
1,原子性: 多条SQL是一个密不可分的整体
2,一致性: 分布式系统里,数据的一致性
3,隔离性: 数据库支持高并发,使用了锁的机制保证了数据的安全
4,持久性: 是指对数据的增删改是持久生效的
隔离级别:
1,read uncommitted:读未提交, 安全性最差,但是效率高
2,read committed:读已提交, 安全性较好,但是效率较差,也是Oracle的默认级别
3,repeatable read:可重复读,安全性适中,但是效率一般,也是MySQL的默认级别
4,serializable:串行化,安全性最高,但是效率太差
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.默认约束:使用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.检查约束:检查字段值是否合法
CREATE TABLE x2(
id INT PRIMARY KEY AUTO_INCREMENT,
age INT ,
CHECK(age<100)#检查约束,满足条件才能保存!
)
#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)
)