牛客SQL练习-57-使用含有关键字exists查找未分配具体部门的员工的所有信息
程序员文章站
2022-05-16 23:19:05
SELECT* FROMemployees WHERENOT EXISTS (SELECTemp_no FROMdept_emp WHEREemployees.emp_no = dept_emp.emp_no)或者 not inSELECT* FROMemployees WHEREemp_no NOT IN (SELECTemp_no FROMdept_emp)拓展:EXISTS 和 IN在主表和从表都对关联的....
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)
拓展:
- 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是先从主查询中取得一条数据,再代入到子查询中,执行一次子查询,判断子查询是否能返回结果,主查询有多少条数据,子查询就要执行多少次
- not in 和 not exists
查询语句使用not in ,内外表都进行全表扫描,不会用到索引;
not extsts 的子查询会用到表上的索引;
无论哪个表大,not exists都比not in要快;
本文地址:https://blog.csdn.net/hmyqwe/article/details/108981204
上一篇: sql必知必会知识点总结(长