多表查询、事务、DCL
多表查询
查询语法:
Select
列名列表
From
表名列表
Where-----
SELECT
-
FROM dept,emp; – A*B组合 笛卡尔积
分类:
1. 内连接查询
1).隐式内连接:用where来消除无用的内连接
SELECT
emp.name,emp.gender,dept.name FROM emp,dept WHERE emp.dep_id = dept.id;
SELECT
t1.name,t1.gender,t2.name
FROM
emp t1,dept t2
WHERE
t1.dep_id
= t2.id;
2).显示内连接
语法:select 字段列表 from 表名1
inner join 表名2 on 条件
SELECT * FROM
emp INNER JOIN dept ON emp.dep_id=dept.id;(inner可以省略)
3).内连接查询
1.从哪些表中查询数据
2.条件是什么
3.要查询哪些字段
- 外链接查询(前左后右)**
1).左外连接
语法:select 字段列表 from 表1
left [outer] join 表2 on 条件;
查询左表所有数据以及交集部分。
2).右外连接
语法:select 字段列表 from 表1 right
[outer] join 表2 on 条件;
查询右表所有数据以及交集部分。
子查询
概念:查询中嵌套查询,嵌套的查询就是子查询。
SELECT * FROM
emp WHERE salary=(SELECT MAX(salary) FROM emp);
子查询的不同情况
- 子查询的结果是单行单列的(结果可用运算符判断 )
SELECT * FROM
emp WHERE salary<(SELECT AVG(salary) FROM emp);
- 子查询的结果是多行单列的
SELECT * FROM
emp WHERE dep_id IN(SELECT id FROM dept WHERE NAME=‘财务部’
OR NAME=‘市场部’);
子查询可以作为条件,用in来进行判断
- 子查询的结果是多行多列的
子查询结果作为一张虚拟表,一同进行后续查询
SELECT * FROM dept t1,(SELECT * FROM emp WHERE emp.join_date >
‘1994-01-01’) t2
WHERE t1.id=t2.dep_id;
(可以用普通内连接实现,AND并列多个条件即可)
事务
事务的基本介绍
1).概念:如果一个包含多个步骤业务,被事务管理,要么同时成功,要么同时失败。
2).操作:1—开启事务:start transaction
2—回滚:rollback
3—提交:commit
SELECT * FROM account;
UPDATE account SET balance=1000;
START TRANSACTION;
UPDATE account SET balance=balance + 500 WHERE id=1;
– 出错了。。。
UPDATE account SET balance= balance - 500 WHERE id=2;
COMMIT;
ROLLBACK;
4.数据库中事务默认自动提交
一条DML语句会自动提交一次事务
事务提交的两种方式:
-
自动提交:MySQL就是自动提交的(oracle默认手动提交)
-
手动提交:需要先开启事务,最后提交
修改事务的默认提交方式:查看事务的默认提交方式
SELECT @@autocommit;(set @@autocommit进行设置)1自动 0手动
2.事务的四大特征:
1).原子性:不可分割的最小操作单位,要么同时成功,要么同时失败
2).持久性:当事务提交或回滚后,数据库会持久化的保存数据
3).隔离性:多个事务之间相互独立
4).一致性:事务操作前后,数据总量不变
3.事务的隔离级别(不太重要)
1).概念:多个事务之间是相互独立的。但是,如果多个事务操作同一批数据,则会影发一些问题,设置不同的隔离级别可以解决这些问题。
2).存在问题:
1.脏读:一个事务读取到另一个事务中没有提交的数据。
2.不可重复读:在同一个事务中,两次读取到数据不一样。
3.幻读:一个事务操作(DML)数据表中所有的记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。
3).隔离级别
1.read uncommitted:读未提交。
*产生问题:上述问题均有。
2.read committed:读已提交
*产生问题:2,3
3.repeated read:可重复读(MySQL默认)
*产生问题:3
4.serializable:串行化
可解决所有问题
***隔离级别安全性越来越高,但是效率越来越低
4.数据库查询隔离级别
Select @@tx_isolation
5.数据库设置隔离级别
Select global transaction isolation level 级别
DCL:管理用户,授权
1. 管理用户
1).添加用户
– 创建用户
CREATE USER ‘用户名’@‘主机名’ IDENTIFIED BY ‘密码’;
2).删除用户
DROP USER ‘用户名’@‘主机名’;
3).修改用户密码
UPDATE USER SET PASSWORD = PASSWORD(‘abc’)
WHERE USER = ‘用户名’;
SET PASSWORD FOR ‘用户名’@‘localhost’ =
PASSWORD(‘abc’);
*忘记了root用户的密码— cmd–net stop mysql停止MySQL服务(管理员运行)
使用无验证方式启动mysql服务-----mysqld—skip-grant-tables
任务管理器手动结束mysqld
重新启动后正常设置密码,再次重启即可
4).查询用户
– 1.切换到MySQL数据库
USE mysql;
– 2.查询user表
SELECT
- FROM USER;
*通配符 % 表示可以在任意主机使用用户登陆
2. 授权
- 查询权限
SHOW GRANTS FOR ‘root’@‘localhost’;
- 授予权限
GRANT 权限列表(ALL) ON 数据库名.表名(.) TO ‘用户名’@‘主机名’;
- 撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM ‘用户名’@‘主机名’;
上一篇: 思考关于微信小程序的开发过程