SELECT *
FROM department d
WHERE EXISTS (SELECT 1 FROM employee WHERE dept_id = d.dept_id);
dept_id|dept_name |
-------|-----------|
1|行政管理部 |
2|人力资源部 |
3|财务部 |
4|研发部 |
5|销售部 |
SELECT *
FROM department d
WHERE dept_id IN (SELECT dept_id FROM employee);
SELECT *
FROM department d
WHERE dept_id = ANY (SELECT dept_id FROM employee);
EXPLAIN ANALYZE
SELECT *
FROM department d
WHERE EXISTS (SELECT 1 FROM employee WHERE dept_id = d.dept_id);
-> Nested loop semijoin (cost=5.36 rows=30) (actual time=0.056..0.097 rows=5 loops=1)
-> Table scan on d (cost=0.85 rows=6) (actual time=0.034..0.042 rows=6 loops=1)
-> Index lookup on employee using idx_emp_dept (dept_id=d.dept_id) (cost=1.67 rows=5) (actual time=0.008..0.008 rows=1 loops=6)
SELECT DISTINCT d.*
FROM department d
JOIN employee e ON e.dept_id = d.dept_id;
SELECT *
FROM department d
WHERE NOT EXISTS (SELECT 1 FROM employee WHERE dept_id = d.dept_id);
dept_id|dept_name |
-------|-----------|
6|保卫部 |
SELECT *
FROM department d
WHERE dept_id NOT IN (SELECT dept_id FROM employee);
SELECT *
FROM department d
WHERE dept_id !=ALL (SELECT dept_id FROM employee);
SELECT *
FROM department d
WHERE dept_id NOT IN (1, NULL, 2);
SELECT *
FROM department d
WHERE dept_id !=1 AND dept_id != NULL AND dept_id != 2;
EXPLAIN ANALYZE
SELECT *
FROM department d
WHERE NOT EXISTS (SELECT 1 FROM employee WHERE dept_id = d.dept_id);
-> Nested loop antijoin (cost=5.36 rows=30) (actual time=0.245..0.255 rows=1 loops=1)
-> Table scan on d (cost=0.85 rows=6) (actual time=0.135..0.151 rows=6 loops=1)
-> Index lookup on employee using idx_emp_dept (dept_id=d.dept_id) (cost=1.67 rows=5) (actual time=0.016..0.016 rows=1 loops=6)
SELECT DISTINCT d.*
FROM department d
LEFT JOIN employee e ON e.dept_id = d.dept_id
WHERE e.dept_id IS NULL;
原文作者:SQL编程思想;如有侵权,请联系管理员删除。