0
点赞
收藏
分享

微信扫一扫

MySQL 数据库 day-04

路西法阁下 2022-05-03 阅读 116

);

案例2:返回 job_id与141好员工相同,salary比143号员工多的员工 姓名,job_id和工资

#①查询141号员工的job_id

SELECT job_id

FROM employees

WHERE employee_id=141;

#②查询143号员工的salary

SELECT salary

FROM employees

WHERE employee_id=143

#查询员工的姓名,job_id和工资,要求job_id=①并且salary>②

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 MIN(salary)

FROM employees

#②查询last_name,job_id,salary,要求salary=①

SELECT last_name,job_id,salary

FROM employees

WHERE salary=(

SELECT MIN(salary)

FROM employees

);

案例4:查询最低工资大于50号部门最低工资的部门id和其最低工资

#①查询50号部门的最低工资

SELECT MIN(salary)

FROM employees

WHERE department_id=50

#②查询每个部门的最低工资

SELECT MIN(salary),department_id

FROM employees

GROUP BY department_id

#③在②基础上筛选,满足min(salary)>①

SELECT MIN(salary),department_id

FROM employees

GROUP BY depart 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 ment_id

HAVING MIN(salary)>(

SELECT MIN(salary)

FROM employees

WHERE department_id=50

);

#非法使用标量子查询

SELECT MIN(salary),department_id

FROM employees

GROUP BY department_id

HAVING MIN(salary)>(

SELECT salary

FROM employees

WHERE department_id=50

);

#单行操作符只能搭配单行子查询

[](()2、列子查询(多行子查询)

_返回多行

使用多行比较操作符_

**操作符       含义

IN/NOT IN    返回列表中的任意一个

ANY|some    和子查询返回的某一个值比较 <可以用MIN替换>

ALL       和子查询返回的所以值比较 <可以用MAX替换>**

案例1:返回location_id是1400或1700的部门中所以员工姓名

#①查询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以及salary

#①查询job_i为’IT_PROG’部门任意工资

SELECT salary

FROM employees

WHERE job_id=‘IT_PROG’

#②查询员工号、姓名、job_id以及salary,salary<①的任意一个

#法1

SELECT last_name,employee_id,job_id,salary

FROM employees

WHERE salary<ANY(

SELECT salary

FROM employees

WHERE job_id=‘IT_PROG’

)AND job_id<>‘IT_PROG’;

#法2

SELECT last_name,employee_id,job_id,salary

FROM employees

WHERE salary<(

SELECT MAX(salary)

FROM employees

WHERE job_id=‘IT_PROG’

)AND job_id<>‘IT_PROG’;

[](()3、行子查询(结果集一行多列或多行多列)

案例:查询员工编号最小并且工资最高的员工信息

#①查询最小的员工编号

SELECT MIN(employee_id)

FROM employees

#②查询最高工资

SELECT MAX(salary)

FROM employees

#③查询员工信息

SELECT *

FROM employees

WHERE employee_id=(

SELECT MIN(employee_id)

FROM employees

)AND salary=(

SELECT MAX(salary)

FROM employees

);

#法2

SELECT *

FROM employees

WHERE (employee_id,salary)=(

SELECT MIN(employee_id),MAX(salary)

FROM employees

);

[](()(二)、select后面

仅仅支持标量子查询

案例1:查询每个部门的员工个数

SELECT d.*,(

SELECT COUNT(*)

FROM employees e

WHERE e.department_id=d.department_id

)

FROM departments d;

案例2:查询员工号=102的部门名

SELECT (

SELECT department_name

FROM departments d

INNER JOIN employees e

ON d.department_id=e.department_id

WHERE e.employee_id=102

) 部门名;

[](()(三)、from后面

_**特点:

将子查询的结果充当一张表,要求必须起别名**_

案例:查询每个部门的平均工资的工资等级

#①查询每个部门的平均工资

SELECT AVG(salary),department_id

FROM departments

GROUP BY department_id

#②连接①的结果集和job_grades表,筛选条件平均工资between lowest_sal and highest_sal

SELECT ag_dep.*,g.grade_level

FROM (

SELECT AVG(salary) ag,department_id

FROM employees

GROUP BY department_id

) ag_dep

INNER JOIN job_grades g

ON ag_dep.ag BETWEEN lowest_sal AND highest_sal;

[](()(四)、exists后面(相关子查询)

_**语法:

exists(完整的查询语句)

结果:

1<存在>或0<不存在>**_

SELECT EXISTS(SELECT employee_id FROM employees);

案例1:查询有员工的部门名

SELECT department_name

FROM departments d

WHERE EXISTS(

SELECT *

FROM employees e

WHERE d.department_id=e.department_id

);

举报

相关推荐

day-04数组

day-04 CSS听课笔记

DAY-04 至JAVADOC完结

web前端学习day-04

MySQL数据库学习day02

0 条评论