#一)标量子查询#案例1:谁的工资比Abel 高?#①查询Abel的工资SELECT
salary
FROM
employees
WHERE last_name ='Abel';#②查询员工的信息,满足salary>①结果SELECT*FROM
employees
WHERE salary >(SELECT
salary
FROM
employees
WHERE last_name ='Abel');#案例2:题目:返回job_ id与141号 员工相同,salary比143号员工多的员工姓名,job_ _id和工资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);#案例3:返回公司工资最少的员工的last_ name, job_ _id和salary SELECT
last_name,
job_id,
salary
FROM
employees
WHERE salary =(SELECTMIN(salary)FROM
employees);#案例4:查询最低工资大于50号部门最低工资的部门id和其最低工资SELECTMIN(salary)FROM employees
WHERE department_id =50;#-----------------------------------------------------------#有分组查询之后条件放在having后面SELECT department_id,MIN(salary)FROM employees
GROUPBY department_id
HAVINGMIN(salary)>(SELECTMIN(salary)FROM employees
WHERE department_id =50);
二、多行子查询
#二)列子查询(多行列子查询)#案例1:返location id是1400或1700的部门中的所有员工姓名SELECT department_id
FROM departments
WHERE location_id
IN(1400,1700);#---SELECT last_name
FROM employees
WHERE department_id
IN(SELECT department_id
FROM departments
WHERE location_id
IN(1400,1700));#案例2:返回其它部门中比job_ id为IT_ _PROG' 部门任一工资低的员工的:工号、姓名、job_ id以及salarySELECT
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';#案例3:返回其它部门中比job_ _id为'IT_ PROG' 部门所有#工资都低的员工的员工号、 姓名、job_ id以及salary SELECT
employee_id,
last_name,
job_id,
salary
FROM
employees
WHERE salary <ALL(SELECTMIN(salary)FROM
employees
WHERE job_id ='IT_PROG')AND job_id <>'IT_PROG';#查询员工最低编号,最高工资的员工SELECT*FROM employees
WHERE employee_id =(SELECTMIN(employee_id)FROM employees
)AND salary =(SELECTMAX(salary)FROM employees
);
#二、select后面(只有一列,仅仅只支持标量子查询)#案例:查询每个部门的员工个数/*
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id;
*/SELECT d.*,(SELECTCOUNT(*)FROM employees e
WHERE d.`department_id`= e.`department_id`)FROM departments d;#案例2:查询员工号=102的部门名/*
SELECT d.`department_name`,(
SELECT job_id
FROM employees e
WHERE d.`department_id` = e.`department_id` AND job_id = 102
)
FROM departments d;
*/SELECT(SELECT d.`department_name`FROM departments d
INNERJOIN`employees` e
ON d.`department_id`= e.`department_id`WHERE e.`employee_id`=102);#三、from后面#将子查询结果充当一张表,要求必须起别名#案例:查询每个部门的平均工资的工资等级SELECT department_id,AVG(salary)AS ag
FROM employees
GROUPBY department_id;SELECT ag_grades.*,j.`grade_level`FROM(SELECT department_id,AVG(salary)AS ag
FROM employees
GROUPBY department_id
) ag_grades
INNERJOIN`job_grades` j
ON ag_grades.ag BETWEEN j.`lowest_sal`AND j.`highest_sal`;#四、exists后面(相关子查询)/*
语法:
exists(完整的查询语句)
结果是:
1或0
*/SELECTEXISTS(SELECT*FROM employees WHERE salary =300000);#案例一、查询有员工的部门名SELECT`department_name`FROM`departments` d
WHEREEXISTS(SELECT*FROM employees e
WHERE d.`department_id`= e.`department_id`);#用inSELECT`department_name`FROM`departments` d
WHERE d.`department_id`IN(SELECT`department_id`FROM
employees);#1.查询和Zlotkey部门相同的员工的姓名和工资SELECT`department_id`FROM`employees`WHERE`last_name`='Zlotkey';SELECT`last_name`,`salary`,department_id
FROM employees
WHERE department_id IN(SELECT`department_id`FROM`employees`WHERE`last_name`='Zlotkey');#2.查询工资比公司平均工资高的员工的员工号,姓名和工资。SELECTAVG(salary)FROM employees;SELECT`employee_id`,`last_name`,`salary`FROM`employees`WHERE salary >(SELECTAVG(salary)FROM employees
);#3.查询各部门中工资比本部门平均工资高的员工的员工号,姓名和工资;SELECTAVG(salary),`department_id`FROM`employees`GROUPBY`department_id`;SELECT`employee_id`,`last_name`,`salary`FROM`employees` e
INNERJOIN(SELECTAVG(salary) 平均 ,`department_id`FROM`employees`GROUPBY`department_id`) avg_sa
ON e.`department_id`= avg_sa.`department_id`WHERE e.salary > avg_sa.平均
;#4. 查询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名 SELECT`last_name`,`department_id`FROM employees
WHERE last_name
LIKE'%u%';SELECT`last_name`,`employee_id`FROM employees e
WHERE`department_id`IN(SELECTDISTINCT`department_id`FROM employees
WHERE last_name
LIKE'%u%');5.查询在部门的location id为1700的部门工作的员工的员工号
SELECT`department_id`FROM departments
WHERE location_id =1700;SELECT employee_id
FROM`employees`INNERJOIN(SELECT`department_id`FROM departments
WHERE location_id =1700) de
ON employees.`department_id`= de.`department_id`;6.查询管理者是King的员工姓名和工资
SELECT`department_id`FROM employees
WHERE last_name ='K_ing';SELECT last_name,salary
FROM employees e
INNERJOIN(SELECT`employee_id`FROM employees
WHERE last_name ='K_ing') es
ON e.`manager_id`= es.`employee_id`;#7.查询工资最高的员工的姓名,要求first_ _name和1ast_ name显示为一列,列名为姓.名SELECTMAX(salary)FROM employees;SELECT CONCAT(first_name,'.',last_name)`姓.名`FROM employees
WHERE salary =(SELECTMAX(salary)FROM employees
);