前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL数据库,子查询学习,高手必备(四)

MySQL数据库,子查询学习,高手必备(四)

作者头像
用户1289394
发布2021-11-05 09:30:30
3780
发布2021-11-05 09:30:30
举报
文章被收录于专栏:Java学习网

⾏⼦查询(⼦查询结果集⼀⾏多列)

示例

查询员⼯编号最⼩并且⼯资最⾼的员⼯信息,3种⽅式。/*查询员⼯编号最⼩并且⼯资最⾼的员⼯信息*/

/*①查询最⼩的员⼯编号*/

SELECT min(employee_id)

FROM employees;

/*②查询最⾼⼯资*/

SELECT max(salary)

FROM employees;

/*③⽅式1:查询员⼯信息*/

SELECT *

FROM employees a

WHERE a.employee_id = (SELECT min(employee_id)

FROM employees)

AND salary = (SELECT max(salary)

FROM employees);

/*⽅式2*/

SELECT *

FROM employees a

WHERE (a.employee_id, a.salary) = (SELECT

min(employee_id),

max(salary)

FROM employees);

/*⽅式3*/

SELECT *

FROM employees a

WHERE (a.employee_id, a.salary) in (SELECT

min(employee_id),

max(salary)

FROM employees);

⽅式1⽐较常见,⽅式2、3更简洁。

exists后⾯(也叫做相关⼦查询)

1. 语法:exists(完整的查询语句)。

2. exists查询结果:1或0,exists查询的结果⽤来判断⼦查询的结果集中是否有值。3. ⼀般来说,能⽤exists的⼦查询,绝对都能⽤in代替,所以exists⽤的少。

4. 和前⾯的查询不同,这先执⾏主查询,然后主查询查询的结果,在根据⼦查询进⾏过

滤,⼦查询中涉及到主查询中⽤到的字段,所以叫相关⼦查询。

示例1

简单⽰例

mysql> SELECT exists(SELECT employee_id

FROM employees

WHERE salary = 300000) AS 'exists返回1或者0';

+----------------------+

| exists返回1或者0 |

+----------------------+

| 0 |

+----------------------+

1 row in set (0.00 sec)

示例2

查询所有员⼯的部门名称

/*exists⼊门案例*/

SELECT exists(SELECT employee_id

FROM employees

WHERE salary = 300000) AS 'exists返回1或者0';

/*查询所有员⼯部门名*/

SELECT department_name

FROM departments a

WHERE exists(SELECT 1

FROM employees b

WHERE a.department_id = b.department_id);

/*使⽤in实现*/

SELECT department_name

FROM departments a

WHERE a.department_id IN (SELECT department_id

FROM employees);示例3

查询没有员⼯的部门

/*查询没有员⼯的部门*/

/*exists实现*/

SELECT *

FROM departments a

WHERE NOT exists(SELECT 1

FROM employees b

WHERE a.department_id = b.department_id AND

b.department_id IS NOT NULL);

/*in的⽅式*/

SELECT *

FROM departments a

WHERE a.department_id NOT IN (SELECT department_id

FROM employees b

WHERE b.department_id IS NOT NULL);

上⾯脚本中有b.department_id IS NOT NULL,为什么,有⼤坑,向下看。

NULL的⼤坑

示例1

使⽤not in的⽅式查询没有员⼯的部门,如下:

SELECT *

FROM departments a

WHERE a.department_id NOT IN (SELECT department_id

FROM employees b);

运⾏结果:

mysql> SELECT *

-> FROM departments a

-> WHERE a.department_id NOT IN (SELECT department_id

-> FROM employees b);

Empty set (0.00 sec)not in的情况下,⼦查询中列的值为NULL的时候,外查询的结果为空。

建议:建表是,列不允许为空。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习网 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档