MySQL学习笔记——子查询

目录

一、子查询

1、子查询引入 

2、称谓的规范

3、子查询的分类

4、单行子查询案例

4.1 单行操作符:=  !=  > >= < <=

4.2 子查询中的空值问题

4.3 非法使用子查询

5、多行子查询

5.1 IN:

5.2 ANY/ALL

5.3 空值问题

6、相关子查询


一、子查询

1、子查询引入 

需求:谁的工资比Abel的高?

方式3: 子查询

SELECT last_name,salary FROM employees WHERE salary>(SELECT salary FROM employees WHERE last_name='Abel');

mysql> SELECT last_name,salary FROM employees WHERE salary>(SELECT salary FROM employees WHERE last_name='Abel');
+-----------+----------+
| last_name | salary   |
+-----------+----------+
| K_ing     | 24000.00 |
| Kochhar   | 17000.00 |
| De Haan   | 17000.00 |
| Greenberg | 12000.00 |
| Russell   | 14000.00 |
| Partners  | 13500.00 |
| Errazuriz | 12000.00 |
| Ozer      | 11500.00 |
| Hartstein | 13000.00 |
| Higgins   | 12000.00 |
+-----------+----------+
10 rows in set (0.00 sec)

2、称谓的规范

外查询(或者主查询)、内查询(或者子查询)。

3、子查询的分类

角度一:从内查询返回的结果的条目数:单行子查询 vs 多行子查询

子查询返回的结果只有一条,叫单行子查询。子查询返回的结果有很多条,叫多行子查询。

角度二:从内查询是否被执行多:相关子查询 vs 不相关子查询

上一个需求内查询每次返回的都是同一个数据,就是不相关子查询。

相关子查询的需求:查询工资大于本部门平均工资的员工信息。

查询的时候里外具有相关性,都要和该员工自己的部门进行比较

不相关子查询的需求:查询工资大于本公司平均工资的员工信息。

查询的时候里外不具有相关性,比较的都是本公司的平均工资,每个员工比较的数据都是一样的。

4、单行子查询案例

4.1 单行操作符:=  !=  > >= < <=

题目:查询工资大于149号员工工资的员工信息

 

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

 

题目3:返回公司工资最少的员工的last_name,job_id和salary

SELECT last_name,job_id,salary FROM employees WHERE salary=(SELECT MIN(salary) FROM employees);

mysql> SELECT last_name,job_id,salary FROM employees WHERE salary=(SELECT MIN(salary) FROM employees);
+-----------+----------+---------+
| last_name | job_id   | salary  |
+-----------+----------+---------+
| Olson     | ST_CLERK | 2100.00 |
+-----------+----------+---------+
1 row in set (0.01 sec)

题目4:查询与141号或174号员工的manager_id和department_id相同的其他员工的employee_id,manager_id,department_id。

方式1:

SELECT employee_id,manager_id,department_id FROM employees WHERE manager_id=(SELECT manager_id FROM employees WHERE employee_id=141) AND department_id=(SELECT department_id FROM employees WHERE employee_id=141) AND employee_id <> 141 ;

mysql> SELECT employee_id,manager_id,department_id FROM employees WHERE manager_id=(SELECT manager_id FROM employees WHERE employee_id=141) AND department_id=(SELECT department_id FROM employees WHERE employee_id=141) AND employee_id <> 141 ;
+-------------+------------+---------------+
| employee_id | manager_id | department_id |
+-------------+------------+---------------+
|         142 |        124 |            50 |
|         143 |        124 |            50 |
|         144 |        124 |            50 |
|         196 |        124 |            50 |
|         197 |        124 |            50 |
|         198 |        124 |            50 |
|         199 |        124 |            50 |
+-------------+------------+---------------+
7 rows in set (0.01 sec)

方式2:了解

题目5:查询最低工资大于50号部门最低的部门id和其最低工资

SELECT department_id,MIN(salary) FROM employees GROUP BY department_id HAVING MIN(salary)>(SELECT MIN(salary) FROM employees WHERE department_id=50);

题目6:显示员工的employee_id,last_name和location,其中若员工的department_id和location_id为1800的department_id相同,则location为'Canada',其余则为‘USA’

SELECT employee_id,last_name,CASE department_id WHEN (SELECT department_id FROM departments WHERE location_id=1800) THEN 'Canada' ELSE 'USA' END "location" FROM employees ;

4.2 子查询中的空值问题

SELECT last_name,job_id FROM employees WHERE job_id=(SELECT job_id FROM employees WHERE last_name='Haas'); //不会报错,不过没有结果

4.3 非法使用子查询

SELECT employee_id,last_name FROM employees WHERE salary=(SELECT MIN(salary) FROm employees GROUP BY department_id); //报错,返回值多余一行结果,不知道等于谁,应该使用多行子查询

5、多行子查询

5.1 IN:

和等于类似,可以再IN的多个值中选

5.2 ANY/ALL

ANY就是任一

ALL就是所有

注意:mysql中,聚合函数不能够嵌套使用,比如如下使用是错误的,但是在Oracle中可以。

错误使用: 

 

 正确使用:

 

5.3 空值问题

6、相关子查询

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值