8.复合查询与内外连接
特别注意:NULL与任何数(包括NULL)运算都为NULL。
如果表达式有NULL参与运算,需要进行判断,ifnull(字段,为NULL时设定的值);
多表查询
select * from 表1,表2 ...
表1和表2采用的就是笛卡尔积,对数据进行穷举组合。
自连接
自连接是指在同一张表连接查询
举例:显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号--empno)用子查询:select empno,ename from emp worker, emp leader where worker.name='FROD' and leader.empno=worker.mgr;
直接晒即可,这里用的是笛卡尔积,结果穷举完了。筛选行时,一定可以筛选出一行员工FORD直接对应的就是上级领导。
子查询
单行子查询:返回一行记录的子查询(一列单行)
多行子查询:返回多行记录的子查询(一列多行)
关键字:in(存在一个相同即可),all(所有都要满足),any(任意一个满足即可)多列子查询:多列多行
多行多列查询方法:select * from 表 where (字段1,字段2)=(select语句);
特别注意:任何时刻,查询出来的临时结构,本质在逻辑上也是表结构。
可以在from子句后面跟上子查询,原因上。
解决多表查询的本质:想办法把多表转化成为单表,所有mysql中,所有select问题全部可以转化成单表问题。
合并查询
union用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。
union all同上,只不过不去掉重复行。
union前提,列完全一样(数量,字段类型)。
表的内外连接
内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选。
select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件;
左外连接
- select 字段名 from 表名1 left join 表名2 on 连接条件;
- 保证左表的完整性,即使右表没有与之对应数据,还是存在,数据为NULL。
右外连接
- select 字段 from 表名1 right join 表名2 on 连接条件;
- 与左外连接保持一致