关键词:多表查询;事务; DCL
select * from emp, dept;
笛卡尔集:
由两个集合A,B组成的所有可能情况。
SELECT * FROM emp e INNER JOIN dept d ON e.dept_id = d.id;
概念:对查询的结果进行查询。有点类似数学的等价代换。
● 查询单行单列的结果; 子查询作为条件,使用运算符去判断。 SELECT 查询字段 FROM 表 WHERE 字段=(子查询); eg:员工工资小于平均工资 ● 查询多行单列的结果。 子查询结果是单例多行,结果集类似于一个数组,父查询使用 IN 运算符。 就类似于excel的高级筛选功能。 ● 查询多行多列的结果。 子查询是一张虚拟表。可以很容易地转换为内连接。 子查询作为表需要取别名,否则这张表没有名称则无法访问表中的字段。
事务执行是一个整体,所有的 SQL 语句都必须执行成功。如果其中有 1 条 SQL 语句出现异常,则所有的
SQL 语句都要回滚,整个业务执行失败。
操作
背景:张三给李四转账的案例。开两个查询窗口,一个执行事务,一个执行普通DQL查询操作。被事务管理了之后,只有提交了之后,真实数据才会改变。
MySQL数据库中,事务会默认自动提交
MySQL是自动提交的,一条DML语句会自动提交一次事务。 可以将其修改为手动提交模式,然后输入语句必须commit过后另一个窗口的查询才会更新。方法如下: SELECT @@autocommit; set @@autocommit = 0;
多个事物之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题。
需要开多个cmd窗口,来看效果
存在的问题:
隔离级别 (留了一些尾巴,有需要再看)
1. read uncommitted:读未提交 * 产生的问题:脏读、不可重复读、幻读 2. read committed:读已提交 (Oracle) * 产生的问题:不可重复读、幻读 3. repeatable read:可重复读 (MySQL默认) * 产生的问题:幻读 4. serializable:串行化 * 可以解决所有的问题
注意:隔离级别从小到大安全性越来越高,但是效率越来越低
数据库查询隔离级别:
数据库设置隔离级别:
演示:
set global transaction isolation level read uncommitted;
start transaction;
-- 转账操作
update account set balance = balance - 500 where id = 1;
update account set balance = balance + 500 where id = 2;
-- 创建 user1 用户,只能在 localhost 这个服务器登录 mysql 服务器,密码为 123 create user 'user1'@'localhost' identified by '123'; -- 创建 user2 用户可以在任何电脑上登录 create user 'user2'@'%' identified by '123'; -- 要进入mysql数据库才有用 use mysql; show TABLES; select * FROM user; -- 修改密码目前仅至两个办法有效果 ALTER USER 'root'@'localhost' IDENTIFIED BY '12345678'; SET PASSWORD = '123'; -- 查询权限 show grants for 'user1'@'localhost'; show grants for 'user2'@'%'; -- 授予权限 GRANT ALL ON *.* TO 'user1'@'localhost'; -- 撤销权限 (存在问题) REVOKE SELECT ON db4.account FROM 'user1'@'localhost';