下面这篇文章简单介绍子查询。
子查询指在一个select语句中还嵌套另一个select语句。
1、子查询的语法
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);
2、使用子查询
SELECT last_name
FROM employees
WHERE salary >
(SELECT salary
FROM employees
WHERE last_name = 'Abel');
上面的结果是输出比last_name为Abel的职员的工资高的职员的last_name.
3、单行子查询
SELECT last_name, job_id, salary
FROM employees
WHERE job_id =
(SELECT job_id
FROM employees
WHERE employee_id = 141)
AND salary >
(SELECT salary
FROM employees
WHERE employee_id = 143);
上面的结果是输出job_id等于employee_id为141的职员的job_id并且工资大于employee_id为143的职员的工资的职员的last_name, job_id, salary
4、多行子查询
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary < ANY
(SELECT salary
FROM employees
WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';
上面的结果是输出工资比其中一个job_id为'IT_PROG'的工资小并且job_id不等于'IT_PROG'的职员的employee_id, last_name, job_id, salary
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary < ALL
(SELECT salary
FROM employees
WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';
上面的结果是输出工资比任何一个job_id为'IT_PROG'的工资小并且job_id不等于'IT_PROG'的职员的employee_id, last_name, job_id, salary。这里的<ALL与上面题目的<ANY区别就是<ANY是比其中一个小就可以,可以是比最大工资小而不用比最小工资小。而<ALL就是比最小工资小。
练习内容:
1. 写一个查询显示与 Zlotkey 在同一部门的雇员的 last name 和 hire date,结果中不包括 Zlotkey。
select last_name,hire_date
from employees
where department_id=(select department_idfrom employeeswhere last_name='Zlotkey')
and last_name<>'Zlotkey';
2. 创建一个查询显示所有其薪水高于平均薪水的雇员的雇员号和名字。按薪水的升序排序。
TIPS:用到employees表
select employee_id,last_name,salary
from employees
where salary>(select AVG(salary)from employees)
order by salary;
3.写一个查询显示所有工作在有任一雇员的名字中包含一个 u 的部门的雇员的雇员号和名字。保存 SQL 语句到一个名为 lab6_3.sql 的文本文件中,运行该查询。
TIPS:用到employees表;使用in或者=some或者=any(some与any是同义词)。
select employee_id,last_name
from employees
where department_id=any(select department_idfrom employeeswhere last_name like '%u%'or first_name like '%u%;);
4. 显示所有部门地点号 (department location ID ) 是 1700 的雇员的 last name、department number 和 job ID。
TIPS:用到employees表和departments表。
select distinct last_name,department_id,job_id
from employees
where department_id=any(select department_idfrom departmentswhere location_id=1700);