高级查询(二)
一:表连接
目的: 在已经符合主外键关系的基础上,进行联合查询,得到多张表的
数据。
使用场景: 需要涉及到多表联合查询数据时使用。
语法:select 表名1.列名1,表名1.列名2,表名2.列名1from 表名 1 ,表名2 where 表名1.相关列=表名2.相关列
二:左外连接|右外连接
目的:表结构特殊,两张表中各有对方没有关系的数据,需要将没有相关
主外键关系的列内容进行输出。
使用场景:
需要将左表或右表的内容全部输出。
语法:
SELECT 别名1.列名1,别名2.列名1 FROM 表1 as 别名1 [LEFT | RIGHT] JOIN 表2 as 别名2
ON 别名1.条件列名 = 别名2.条件列名
注意点:
left join right join 都可以代表from的意思。on 可以代表我们的where
left join: 将左侧表作为主表全部显示。
right join: 将右侧表作为主表全部显示。
某些表中有一些独立列值,是必须要输出的,那么根据实际开发情况选择其输出在左边或者右边。
左边|右边: 主表
主表概念: 谁是主表谁全部输出,如果输出的内容没有对应的,则是
NULL。
三:子查询
错误解答:
错误代码:[Err] 1242 - Subquery returns more than 1 row
解决方案: 查看是不是内部子查询返回了多个值,并且外部使用的是‘=’
错误代码:[Err] 1241 - Operand should contain 1 column(s)
解决方案: 查看外部子查询的列需要接受几个结果,如果内部子查询返回了多列,在使用时就会出现这个错误。
单行子查询: 返回 一个结果 用‘=’接受结果。
多行子查询: 返回 多个结果 用 ’in‘ 接受结果。
相关子查询: 返回 true 或者 false ,如果返回true则执行外部SQL,否则不执行
exists: 如果有结果返回true 否则 false
not exists: 在exists结果的基础上取反。寻找非exists结果的其他值。