MySQL之连接查询


在连接查询中一直要遵守的一个原则就是:小表驱动大表原则

UNION

  1. UNION操作符主要用来连接两个以上的SELECT语句的结果组合到一个结果集合中。多个SELECT语句会删除重复数据
  2. 可选关键字:
    1. DISTINCT:可选,去除重复数据,但是union本身会去除重复数据,所以 DISTINCT对结果没啥影响
    2. ALL:可选,结果集中包含重复数据
  3. 注意:被连接的两个SELECT的列数必须相同
  4. 语法格式:
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];

IN 和 EXISTS的区别

  1. 关于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次。效率自然就可知了

  1. 关于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适合表层表比较大的情况,它不需要两层遍历,只需要执行一次查询即可。

  1. 当内外表大小接近时用IN和EXISTS都可以
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值