牛客SQL练习-57-使用含有关键字exists查找未分配具体部门的员工的所有信息

在这里插入图片描述

SELECT
	* 
FROM
	employees 
WHERE
	NOT EXISTS (
	SELECT
		emp_no 
	FROM
		dept_emp 
WHERE
	employees.emp_no = dept_emp.emp_no)
或者 not in
SELECT
	* 
FROM
	employees 
WHERE
	emp_no NOT IN (
	SELECT
		emp_no 
FROM
	dept_emp)	

拓展:

  1. EXISTS 和 IN
  • 在主表和从表都对关联的列建立索引的前提下:
    当主表比从表大时,IN查询的效率较高;
    当从表比主表大时,EXISTS查询的效率较高;

  • 举例如下:
    A表小,B表大;
    select * from A where cc in (select cc from B)
    效率低,用到了A表上cc列的索引;
    select * from A where exists(select cc from B where cc=A.cc)
    效率高,用到了B表上cc列的索引;

  • 反过来
    select * from B where cc in (select cc from A)
    效率高,用到了B表上cc列的索引;
    select * from B where exists(select cc from A where cc=B.cc)
    效率低,用到了A表上cc列的索引;

  • 原因如下:
    in是先执行子查询,得到一个结果集,将结果集代入外层作为条件执行主查询,子查询只需要执行一次
    exists是先从主查询中取得一条数据,再代入到子查询中,执行一次子查询,判断子查询是否能返回结果,主查询有多少条数据,子查询就要执行多少次

  1. not in 和 not exists
    查询语句使用not in ,内外表都进行全表扫描,不会用到索引;
    not extsts 的子查询会用到表上的索引;
    无论哪个表大,not exists都比not in要快;
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值