EXIT 和 IN 的区别

  对于sql中的EXITIN,他们有时候查询出来的结果可能是一致的,例如下面这两条语句:

SELECT * FROM A WHERE cc IN (SELECT cc FROM B)
SELECT * FROM A WHERE EXISTS (SELECT cc FROM B WHERE B.cc = A.cc)

  此时他们的区别就在于,IN是在A中选择一条记录,然后在B中查找该记录是否存在。EXISTS是在B中选择一条符合条件的记录,然后在A中查找该记录是否存在。

  因此,当我们需要提高sql查询效率的时候,在对cc列建立索引后,当A表小的话就用EXISTS,当B表小的话就用IN原理就是尽量用小表作为驱动表,这样搜索效率更高。

  下面是我针对EXIT和IN练习的几条sql语句,查询的结果都是一致的。

SELECT player_id, player_name, team_id 
FROM player 
WHERE
	player_id = ( 
	SELECT player_id 
	FROM player_score 
	WHERE score > 20 AND player_score.player_id = player.player_id );
SELECT player_id,player_name,team_id 
FROM player 
WHERE
	EXISTS ( 
	SELECT player_id 
	FROM player_score 
	WHERE score > 20 AND player_score.player_id = player.player_id );
SELECT player_id, player_name, team_id
FROM player
WHERE player_id IN (SELECT player_id FROM player_score WHERE score > 20);
SELECT player.player_id, player_name, team_id
FROM player JOIN player_score
WHERE player.player_id = player_score.player_id AND score > 20;
SELECT
	t1.player_id,
	t1.player_name,
	t1.team_id 
FROM
	player t1 
WHERE
	t1.player_id IN (
	SELECT
		t2.player_id 
	FROM
		player_score t2 
	GROUP BY
		t2.player_id 
	HAVING
	( AVG( t2.score ) > 20 ) 
	);
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值