ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Mysql子查询

2021-05-31 18:55:41  阅读:154  来源: 互联网

标签:salary employees 查询 job Mysql id SELECT


子查询

文章目录

含义:

出现在其他语句中的select语句,称为子查询或内查询

外部的查询语句,称为主查询或外查询

分类

按子查询出现的位置:

​ select后面:

只支持标量子查询

​ from后面:

支持表子查询

​ where或having后面:※

		>标量子查询(单行)√
		>
		>列子查询(多行)√
		>
		>行子查询

​ exists后面(相关子查询)

​ 表子查询

按结果集的行列数不同:

标量子查询(结果集只有一行一列)

列子查询(结果集只有一列多行)

行子查询(结果集有一行多列)

表子查询(结果集一般为多行多列)

一. where或having后面

1.标量子查询(单行子查询)

2.列子查询(多行子查询)

3.行子查询(多列多行)

特点:①子查询放在小括号内

②子查询一般放在条件的右侧

③标量子查询,一般搭配着单行操作符使用

<> <= >= = <>

列子查询,一般搭配着多行操作符使用

in,any,some,all

④子查询的执行优先于主查询的执行,主查询的条件用到了子查询的结果

案例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和工资

①查询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 department_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
)

里面需要的是单个,但出现多个,sql语法报错

[Err] 1242 - Subquery returns more than 1 row

多行子查询

返回多行,使用多行比较操作符

操作符 含义
IN/NOT IN 等于列表中任意一个
ANY | SOME 和子查询返回某一个值比较
ALL 和子查询返回的所有值比较

any相当于min,all是相当于max

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

①查询location_id是1400或1700的部门编号

SELECT distinct department_id
FROM departments
WHERE location_id IN(1400,1700);

②查询员工姓名,要求部门号是①列表中的某一个

SELECT last_name
FROM employees
WHERE department_id IN(
SELECT distinct department_id
FROM departments
WHERE location_id IN(1400,1700)
);

二,select后面的子查询

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

SELECT d.,(
SELECT COUNT(
)
FROM employees e
WHERE e.department_id=d.department_id
) 个数
FROM departments d;

三,from后面

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

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

SELECT AVG(salary), department_id
FROM employees
GROUP BY department_id;

select * FROM job_grades

②连接①的结果集合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 WHERE salary=30000
)

标签:salary,employees,查询,job,Mysql,id,SELECT
来源: https://blog.51cto.com/u_13985831/2836898

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有