@【多表查询】
#########################################################################################################
<多表查询的规律>
1. 不管我们查询几张表,表连接查询会产出笛卡尔积,我们需要消除笛卡尔积,拿到正确的数据。我们需要找 到表与表之间通过哪个字段关联起来的 (通常是 外键=主键 )
2. 消除笛卡尔积规律:2张表需要1个条件,3张表需要2个条件,4张表需要3个条件。(条件数量=表的数 量-1),每张表都要参与进来
3. 多表连接查询步骤:
1. 确定要查询哪些表
2. 确定表连接条件
3. 确定查询字段
#########################################################################################################
<内连接>–查出两张表中等值的记录,不等值得记录不显示
a).隐式内连接:看不到 JOIN 关键字,条件使用 WHERE 指定 --SELECT 字段名 FROM 左表, 右表 WHERE 条件; (官方)
格式:select 字段 from 表名1,表名2 where 主表.主键=从表.从键;(个人)
b).显示内连接:显示内连接:使用 INNER JOIN ... ON 语句, 可以省略 INNER --SELECT 字段名 FROM 左表 INNER JOIN 右表 ON 条 件;( 官方)
格式:select 字段 from 表名1 join 表2 on 主表.主键=从表.从键; (个人)
<左外连接>–结果:查出左表的所有记录,右表的等值记录
[官方]:使用 LEFT?OUTER?JOIN?...?ON , OUTER 可以省略 SELECT?字段名?FROM?左表?LEFT?OUTER?JOIN?右表?ON 条件; 用左边表的记录 去匹配右边表的记录,如果符合条件的则显示;否则,显示NULL 可以理解为:在内连接的 基础上保证左表的数据全部显示
[个人]:格式:select 字段 from 表1 left Join 表2 on 主表.主键=从表.主键;
<右外连接>–结果:查出右表的所有记录,左表的等值记录
[官方]:右外连接:使用 RIGHT?OUTER?JOIN?...?ON , OUTER 可以省略 SELECT?字段名?FROM?左表?RIGHT?OUTER?JOIN?右表 ON?条件; 用右边表的记录去匹配左边表的记录,如果符合条件的则显示;否则,显示NULL 可以理解为:在内连 接的基础上保证右表的数据全部显示
[个人]:格式:select 字段 from 表1 right join 表2 on 主表.主键=从表.主键;
<子查询>–: 子查询结果只要是 单列 ,肯定在 WHERE 后面作为 条件> >SELECT?查询字段?FROM?表?WHERE?字段=(子查询);
子查询结果只要是 多列 ,肯定在 FROM 后面作为 表 >>>>SELECT?查询字段?FROM?(子查询)?表别名?WHERE?条件;
##||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~||##
##||注意:字查询需要放在( )中:字查询结果的3种情况 ||##
##|| a).字查询的结果是一个值的时候 ||##
##|| b).字查询的结果是单列多行的时候 ||##
##|| c).字查询的结果是多列多行的时候 ||##
##||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~||##子查询:写在另一个查询内部的查询叫:子查询。
<值>
举例:#查询最高工资员工的全部信息
>SELECT * FROM employee e WHERE salary=(SELECT MAX(salary) FROM employee);
#最高工资是谁
>SELECT NAME, MAX(salary) FROM employee;
<单列多行> 用in替换=
举例:# 查询工资大于5000的员工,来自于哪些部门的名字
>SELECT d.name FROM depertment d WHERE d.id IN(SELECT dept_id FROM employee WHERE salary >5000);
查询开发部与财务部所有的员工信息
>select * from employee e where dept_id in(select id from depertment d where d.name in('开发部','财务部'))
<多列多行>
举例:#查询出2011年以后入职的员工信息,包括部门名称
>SELECT * FROM (SELECT * FROM employee WHERE join_date >'2010-12-31') e,depertment d WHERE e.id=d.`id`;
#########################################################################################################
@【事务】
查询提交方式:show variables like ‘autocommit’;
关闭自动提交:set autocommit=off;
:提交:commit;
:回滚:rollback
4种隔离级别:
1).read uncommitted:读未提交
2).read committed:读已提交[oracle默认]
3).repeatable read:可重复读[MySQL默认]
4:)serializable:序列化(排队)
开启临时事务:start transaction;--结束后续跟commit或者rollback;
**事务的4大特性**:
1. 原子性(Atomicity)
事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2. 一致性(Consistency)
事务前后数据的完整性必须保持一致
3. 隔离性(Isolation)【通过隔离级别】
是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离,不能相互影响。
4. 持久性(Durability)
指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
效率:
a > b > c > d
安全性:
d > c > b > a