1. 题目描述
1.1 输入
有一个员工表employees简况如下:
建表语句如下:
CREATE TABLE employees (
emp_no int(11) NOT NULL,
birth_date date NOT NULL,
first_name varchar(14) NOT NULL,
last_name varchar(16) NOT NULL,
gender char(1) NOT NULL,
hire_date date NOT NULL,
PRIMARY KEY (emp_no));
有一个部门领导表dept_manager简况如下:
建表语句如下:
CREATE TABLE dept_manager (
dept_no char(4) NOT NULL,
emp_no int(11) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no, dept_no));
1.2 输出
请你找出所有非部门领导的员工emp_no,以上例子输出:
2. 题目分析及解答
2.1 题目分析
该题旨在考查SQL逻辑运算符NOT IN的用法。由于IN关键字效率较低,也可将NOT IN语句改写为左外连接语句。需要注意的是,不能写成如下语句:
SELECT e.emp_no FROM employees AS e, dept_manager AS d WHERE e.emp_no != d.emp_no;
该语句的输出实际上是employees表和dept_manager表的笛卡尔积去掉满足employees.emp_no = dept_manager.emp_no
的记录后得到的集合,并不符合本题的查询要求。
2.2 详细解答
根据题目分析可直接写出相应的SQL查询语句:
SELECT emp_no FROM employees WHERE emp_no NOT IN (SELECT emp_no FROM dept_manager);
或:
SELECT e.emp_no FROM employees AS e LEFT OUTER JOIN dept_manager AS d ON e.emp_no = d.emp_no WHERE d.dept_no is NULL;
-- 左外连接的目的是获取一个结果集合,该集合中非manager的员工的dept_no为NULL,从而可以使用WHERE子句将这些员工从集合中筛选出来。