简单理解就是将多张表合并到一起,然后进行数据查询,所有也叫多表联查。
如何将两张表合并到一起?
取两张表的笛卡儿积:将表1中的数据逐条与表2中的数据进行合并,最终形成的新的临时表(它的数据条数即为表1的条数*表2的条数)。
但如果只是单纯的进行合并,会导致最终生成的临时表非常的庞大,因此联合查询的时候通常都会设置一个合并条件,只有符号条件的数据才会被合并在一起。
联合查询根据合并条件合并时,只连接符合合并条件的数据,不符合的全部丢弃。
联合查询根据合并条件合并时,以左表作为基础表,在右表中查找符合条件的数据,存在符合条件的数据则合并,不存在则以NULL补全。
联合查询根据合并条件合并时,以右表作为基础表,在左表中查找符合条件的数据,存在符合条件的数据则合并,不存在则以NULL补全。
在同一张表上连接自身进行查询。
left_table [inner/left/right] join right_table on conn_condition;
inner join:内连接
left join:左连接
right join:右连接
conn_condition:合并条件
left_table == right_table:自连接
详细举例介绍:MySQL 多表查询 "Join"+“case when”语句总结
子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。即一个sql语句查询的过滤条件,依赖于另一个sql语句的查询结果。
子句返回的结果记录只有一行的子查询。可以用'='来进行比较判断。
例如:select * from student where class_id=(select class_id from class where sname='张三');
[not] in关键字:
子句返回的结果记录为多行,此时不能使用'='进行比较判断,需要使用关键字in或not in来过滤存在于返回的结果集中或不存在于结果集中的记录。
例如:select * from student where class_id in (select class_id from class where credit=2);
[not] exists关键字:
exists是对子语句的查询结果进行判断,是否有查询结果,有则会真,没有则为假。
例如:select * from student where exists (select * from class where credit=2 and id=student.class_id);
in和exists的区别:
in是先执行子sql语句将结果放入内存中,再执行住sql语句,将每条结果与子语句返回的结果进行逐个比较,相同则取出。相当于每条数据都要跟返回的集合中的数据进行一次比对。
exists是先执行主语句,逐条取出数据,将数据的某个字段融入到子语句中进行执行,如果有查询结果则返回真,否则返回假。相当于针对主语句结果中的每一条数据都要去子语句中重新查一次表。
适用场景:
子句结果不多的情况下,适合用in;子句结果较多时,适用exists。
合并查询并不是把多个表合并起来查询,而是把多个类似的sql语句的结果合并一起返回,每个sql语句都是独立执行的。
注意:合并查询的结果集中,字段需要一致。
合并查询与使用or查询的区别:
一个sql语句中如果用到了o就会或略索引,而索引可以大大提高查询效率,所以使用到了or会或略索引,降低了查询效率。
而合并查询并不会或略索引,在这种情况下,合并查询反而效率更高。
union:用于取得两个结果集的并集,并且会自动去掉结果集中的重复行。
union all:用于取得两个结果集的并集,但不会去掉结果集中的重复行。