1>多表连接查询
语法:
SELECT 字段1,...字段n
FROM 表1 INNER|LEFT|RIGHT JOIN 表2
ON 表1.字段 = 表2.字段;
如上,先找到两张表,再根据on筛选条件筛选记录,得出一张新的(合体)表,再基于新表查值。
连接分为三种情况,inner,left,right
--->内连接 inner:只取两张表的共同部分。
--->左连接 left:在内连接的基础上保留左表的记录,即做连接之后的结果
包含 左表.字段 所有有值的记录,其中有些记录的值可能并不满足 on筛选条件。
--->右连接 right:在内连接的基础上保留右表的记录
--->模拟 full join 的全连接,MySQL本身不支持 full join语法,但是可以通过union实现。
select 字段 from 表1 left join 表2 on 表1.字段=表2.字段
union select 字段 from 表1 right join 表2 on 表1.字段=表2.字段;
例子,如下,有两张表,班级表和学生表,学生表的class_id逻辑上和班级表的id一样,并没有设置
外键进行强关联,并且各有条数据与另一张表没有对应关系,看下各连接的实际效果。
2>符合条件连接查询
现在加入表连接,把之前的select语法和顺序再完善一下,如下(重中之重):
--->关键字定义顺序
SELECT DISTINCT 字段1,..字段n
FROM 表1 <join_type> JOIN 表2
ON join的筛选条件
WHERE where筛选条件
GROUP BY 字段
HAVING having删选条件
ORDER BY 字段 [desc]
LIMIT 限制查询数量
--->语句执行顺序
第7步:查询 SELECT
第8步:去重 DISTINCT <select_list>
第1步:先找表 FROM <left_table>
第3步:表连接 <join_type> JOIN <right_table>
第2步:on筛选 ON <join_condition>
第4步:where筛选 WHERE <where_condition>
第5步:排序 GROUP BY <group_by_list>
第6步:having筛选 HAVING <having_condition>
第9步:排序 ORDER BY <order_by_condition>
第10步:限制数量 LIMIT <limit_number>
例子,基于上面的表
# 找出huang所在的班级名称
select class.name,student.name from class inner join student
on class.id=student.class_id where student.name='huang';
3>子查询
-->子查询是将一个查询语句嵌套在另一个查询语句中。
-->内层查询语句的查询结果,可以为外层查询语句提供查询条件。
-->子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字
EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录。
而是返回一个bool值。True或False.
当返回True时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询
-->还可以包含比较运算符:= 、 !=、> 、<等