目录
1. Mysql分组查询
2. Mysql子查询
3. 单行函数
4. 事务
5. 权限与安全
1. Mysql分组查询
1、分组 group by
# 统计每个部门有多少个员工 SELECT COUNT(*) AS number,edid FROM emp GROUP BY edid
2、演示group by和having
# 统计每个部门的年龄最大者
SELECT MAX(age),emp.edid FROM emp GROUP BY emp.edid
# 统计每个部门里面最高工资
## 编写emp和salary内连接查询
## 得到最高工资 max
## 部门分组 group by
SELECT MAX(salarystand),emp.edid FROM emp,salary WHERE emp.stid=salary.stid GROUP BY emp.edid
# 获取最高工资大于5000的部门
SELECT MAX(salarystand),emp.edid FROM emp,salary WHERE emp.stid=salary.stid GROUP BY emp.edid HAVING MAX(salarystand)>5000
2. Mysql子查询
1、一个查询结果,作为另外一个查询条件
2、演示子查询
# 查询比“张无忌”的工资高
## 查询张无忌工资
## 查询工资大于张无忌工资值
SELECT * FROM emp,salary WHERE emp.stid=salary.stid AND salary.salarystand > (SELECT salary.salarystand FROM emp,salary WHERE emp.stid=salary.stid AND emp.ename='张无忌')
# 查询和张无忌是一个部门
## 查询张无忌部门id
## 哪个员工部门id和张无忌部门id相同
SELECT * FROM emp WHERE emp.edid=(SELECT edid FROM emp WHERE ename='张无忌')
# 统计每个部门有多少个员工
SELECT dept.dname,es.num FROM dept,(SELECT COUNT(*) AS num,edid FROM emp GROUP BY edid) es WHERE dept.did=es.edid
3、exists子查询
SELECT * FROM t_department WHERE EXISTS (SELECT * FROM t_employee WHERE t_employee.dept_id = t_department.did);
4、复制子查询
(1)拷贝表结构
CREATE TABLE newadmin LIKE admin;
(2)拷贝表结构和数据(但约束与索引除外)
CREATE TABLE newadmin AS ( SELECT * FROM admin ) ;
(3)拷贝表结构+数据
CREATE TABLE newadmin LIKE admin; INSERT INTO newadmin SELECT * FROM admin;
(4)跨数据库拷贝表
CREATE TABLE newadmin LIKE shop.admin;
3. 单行函数
通过select直接使用,不需要依赖表
# mysql单行函数 SELECT POW(2,3) SELECT SQRT(4) SELECT LENGTH('atguigu') SELECT CURDATE() SELECT NOW() SELECT ename ,CASE WHEN age>=50 THEN '事业顶峰' WHEN age>=40 THEN '事业上升期' WHEN age>=30 THEN '事业奋斗期' ELSE '事业积累期' END FROM emp; SELECT DATABASE() SELECT VERSION() SELECT USER() SELECT PASSWORD("123") SELECT MD5('123456')
4. 事务
1、什么是事务
(1)事务是数据库操作最基本单元,在逻辑上一组操作,要么都成功,如果有一失败,所有都失败
(2)银行转账是典型例子
2、事务四个特性(ACID)
(1)原子性: 有多个操作,要么都成功,如果有一个失败,所有都失败
(2)一致性:操作之前和之后总量不变的
(3)隔离性:并发操作中,多事务操作,多事务之间不互相影响的
(4)持久性:当事务操作完成之后,进行事务提交,数据库数据真正发生变化
3、在mysql进行事务操作
(1)创建数据库引擎Innodb
(2)操作步骤
第一步 开启事务
第二步 具体操作(添加、修改、删除)
第三步 提交/回滚
# 第一步 开启事务
START TRANSACTION;
# 第二步 执行具体事务操作
UPDATE emp SET ename='lucyatguigu' WHERE eid=1
# 第三步 提交/回滚事务
ROLLBACK; COMMIT;
4、三个读问题(了解)
如果不考虑事务隔离性,并发操作中,会产生三个读问题
(1)脏读
* 有两个事务
* 一个未提交事务,读取到另外一个未提交事务操作数据
(2)不可重复读
* 一个未提交事务,读取到另外一个提交事务修改操作
(3)虚读(幻读)
* 一个未提交事务,读取到另外一个提交事务添加操作
** 只有事务提交(结束)之后,才可以看到其他数据
5. 权限与安全
创建用户,授予权限
GRANT SELECT,INSERT,UPDATE,DELETE ON *.* TO 'zhang3'@'%' IDENTIFIED BY '123';