关键词:多表查询;事务; 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‘;
原文:https://www.cnblogs.com/DangSheng/p/14698599.html