1 多表查询【+++++】【实践】
笛卡尔积:有两个集合A,B,取这两个集合的所有组成情况
- 内连接查询【+++++】
隐式内连接:where(用where清除不需要的数据),找出交集
SELECT * FROM emp,dept WHERE emp.`dept_id` = dept.`id`;【常用】
隐式:
select 字段列表 from 表名1 inner join 表名2 on 条件
SELECT * FROM emp [INNER ] JOIN dept ON emp.`dept_id` = dept.`id`;
可以对表起别名,可以对多表查询方便很多
select
t1.`name`,t1.gender,t2.name
from
emp t1, dept t2
where
t1.`id`= t2.`id`;
-
外连接查询【++++】
-
左外连接【左连接】:以左表为主【常用】
- 查询的是左表的所有记录和与右表的交集,显示条件:1)满足交集条件;2)数据存在于左表;两个条件满足一个就可以显示该数据,如果只满足后者条件,那么数据可能会残缺一些,比如:NULL
selecet 字段列表 from 表名1 left [outer] join 表2 on 条件 SELECT * FROM emp LEFT OUTER JOIN dept ON emp.`dept_id` = dept.`id`;
-
右外连接【右连接】:以右表为主
- 查询的是右表的所有记录和 与左表的交集
-
SELECT * FROM emp RIGHT OUTER JOIN dept ON emp.`dept_id` = dept.`id`;
小白龙在右表是没有的,且它不是左右表的交集,所以右外连接是不会显示它的
-
子查询【++++】
- 概念:一个查询语句中如果嵌套其他查询语句,那么被嵌套的语句叫子查询。
查询的结果:是多少行,且是根据几列来进行查询的
- 概念:一个查询语句中如果嵌套其他查询语句,那么被嵌套的语句叫子查询。
-
单行单列:一般运用这些运算法 >、<、=、>=、<=
-
多行单列:in
SELECT * FROM emp WHERE dept_id IN(
SELECT id FROM dept WHERE NAME = '财务部' OR NAME = '市场部');
-
多行多列:
- 将子查询的结果作为临时表和另外一张表进行关联查询
-- 查询员工入职日期是2011-11-11日之后的员工信息(emp)和部门信息(dept)
-- 子查询[解决很多问题]
SELECT * FROM dept t1 ,(SELECT * FROM emp
WHERE emp.`join_date` > '2011-11-11') t2
WHERE t1.id = t2.dept_id;
-- 普通内连接[解决一部分需求]
SELECT * FROM emp t1,dept t2
WHERE t1.`dept_id` = t2.`id` AND t1.`join_date` > '2011-11-11'
多表查询练习?
-
sql编写必考题(笔试题)
- sql查询【必考】
- 多表【必考】
-
多表查询练习
- 分析:
- 查询哪些表:from
- 查询哪些字段:select
- 关联条件:where
- 编写sql
- 分析:
2 事务【++++】
-
概念【++++】
- 如果一个业务包含多个操作,该业务被事务管理,多个操作要吗同时成功,要么同时失败
1.开启事务:start transaction(手动提交)
- 如果一个业务包含多个操作,该业务被事务管理,多个操作要吗同时成功,要么同时失败
- 没有错误:提交事务:commit
3.有错误:回滚事务:rollback
例:
(1) 转账:张三–》李四
(2) 查询张三账户余额 且-500
(3) 李四账户 余额+500
CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
balance DOUBLE
};
-- 添加数据
INSERT INTO account [NAME , balance VARCHAR
('zhangsan',1000),('lisi',1000);
-- 张三给李四 转账500
-- 1.开启事务
START TRANSACTION;
-- 2.张三账户-500
UPDATE account SET balance =balance-500 WHERE NAME = 'zhangsan';
-- 3.李四账户+500
UPDATE account SET balance =balance+500 WHERE NAME = 'lisi';
-- 4.没问题,提交事务
COMMIT;
-- 5.发现出问题,回滚事务
ROLLBACK;
-
注意:
- 如果事务没有提交或者回滚,那么这个数据只会在当前窗口(连接)才能看到数据变化,如果想让其他窗口(连接)也看到数据变化:需要:提交或者回滚;
-且数据是保存在缓存内,没有写到数据库文件中,如果此时将窗口(连接)关闭,修改的数据就会丢失。
如:开启事务后,执行了张三 账户 -500,但没有提交事务,关闭窗口后,再打开 张三的账户还是1000。 -
操作【++++】
-
操作【++++】
-
mysql自动提交(默认),每条DML语句都会进行一次自动提交
- 修改提交方式:set @@autocommit=0
1 代表自动提交;
0 代表手动提交
- 修改提交方式:set @@autocommit=0
-
四大特性【+++】【面试考点】
- 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。
- 持久性:当事务提交或回滚后,数据库会持久化的保存数据。
- 隔离性:多个事务之间。相互独立。
- 一致性:事务操作前后,数据总量不变
-
隔离级别【+++】
- 读未提交
- 脏读,不可重复读,幻读
- 读已提交(oracel)
- 不可重复读,幻读
- 可重复读(mysql默认)
- 幻读
- 串行化
- 解决所有问题
- 相当于:锁表
- 注意:安全性越来越高,但是性能越来越低
- 一般不会修改隔离级别
- 读未提交
DCL【++】:授权
- 运维工程师
- 用户管理
- 授权管理