在连接查询中一直要遵守的一个原则就是:小表驱动大表原则
UNION
- UNION操作符主要用来连接两个以上的SELECT语句的结果组合到一个结果集合中。多个SELECT语句会删除重复数据
- 可选关键字:
- DISTINCT:可选,去除重复数据,但是union本身会去除重复数据,所以 DISTINCT对结果没啥影响
- ALL:可选,结果集中包含重复数据
- 注意:被连接的两个SELECT的列数必须相同
- 语法格式:
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
IN 和 EXISTS的区别
- 关于IN
1> IN的操作在内存中执行
2> IN适合“外大内小”的查询
3> 例子:
SELECT * FROM score WHERE score.stu_id
IN(SELECT id FROM student WHERE student.id = score.stu_id);
执行过程:
List result = new ArrayList();
String A = "SELECT * FROM score";
String B = "SELECT id FROM student";
for (int i = 0; i < A.length; i++){
for (int j = 0; j < B.length; j++){
if (student.id = score.stu_id){
result.add;
}
}
}
可知,先遍历外层,再遍历内层,之后比较条件,若条件满足则添加结果。若是内层表数据量太多,IN就不适合了。例如内层表有10000条,那么循环的次数最多是10000次,若是100条的话最多只执行100次。效率自然就可知了
- 关于EXISTS
1> EXISTS在操作中需要查询数据库【IN是在内存操作】
2> EXISTS实际不返回数据,而是返回布尔值
3> 适合“外小内大”的情况
3> 原理及例子
SELECT * FROM student WHERE EXISTS
(SELECT id FROM score WHERE score.stu_id = student.id)
执行原理:
String A = "SELECT * FROM student";
List result = new ArrayList();
for (int i = 0; i < a.length(); i++) {
if (score.stu_id = student.id)
result.add;
}
可知,EXISTS适合表层表比较大的情况,它不需要两层遍历,只需要执行一次查询即可。
- 当内外表大小接近时用IN和EXISTS都可以