MySQL-子查询和多表联查
1、多表联查
使用多表联查的场景,有些时候数据在不同的表中,这个时候我们就需要用到mysql中的多表联查。
2、多表联查概念
将两个或两个以上的表按某个条件连接起来,从而选取需要的数据。多表联查是同时查询两个或两个以上的表时使用的。
3、多表联查分类
1. 内连接查询
内连接查询使用关键字join或cross join 或 inner join, 然后通过on连接表与表之间的条件
注意: 内连接查询只能查询出两个表符合条件的数据
语法: SELECT 字段,字段1,.. FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name
2. 外连接查询
2.1 左外连接
左外连接使用关键字left join, 然后通过on连接表与表之间的条件
注意:left join 会查询出left join左边的表所有的数据,即使右表没有匹配
语法:SELECT 字段,字段1,... FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name
2.2 右外连接
左外连接使用关键字right join,然后通过on连接表与表之间的条件
注意: 即使左表中没有匹配,也从右表返回所有的行
语法: SELECT 字段,字段1,.... FROM table_name1 RIGHT JOIN table_name2 ON table_name1.column_name=table_name2.column_name
4、注意
1. 子查询先执行里面的SQL语句,再执行外面SQL语句。
2. 子查询的效率比较低,一般建议使用join替换子查询
3. 子查询时,MySQL需要为内层查询语句的查询结果建立一个临时表。然后外层查询语句再临时表中查询记录。查询完毕后,MySQL需要撤销这些临时表。因此,子查询的速度会受到一定的影响。如果查询的数据量比较大,这种影响就会随之增大。
5、 使用子查询原则
1. 一个子查询必须放在圆括号中
2. 将子查询放在比较条件的右边,这样可以增加SQL可读性
子查询分类
1. where 型子查询(重点掌握) ,where型子查询把内层查询结果当作外层查询的比较条件
例如:SELECT * FROM user WHERE id in (SELECT uid FROM user_detail );
2. exists/not exists型子查询
EXISTS关键字表示存在。使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值,如果内层查询语句查询到满足条件的记录,只要子查询中至少返回一个值,则EXISTS语句的值就为True。就返回true,否则返回false。当返回的值为true时,外层查询语句将进行查询,否则不进行查询
3. 使用IN/NOT IN的子查询
SELECT * FROM user WHERE id not in (SELECT uid FROM user_detail );
4. 使用比较运算符的子查询 ( = > < >= <= != )
SELECT * FROM user WHERE id = (SELECT uid FROM user_detail limit 1 );