MySQL笔记之子查询使用介绍

 更新时间:2013年05月03日 15:32:03   作者:  
子查询是将一个查询语句嵌套在另一个查询语句中,内层查询语句的查询结果,可以为外层查询语句提供查询条件

子查询是将一个查询语句嵌套在另一个查询语句中

内层查询语句的查询结果,可以为外层查询语句提供查询条件

因为在特定情况下,一个查询语句的条件需要另一个查询语句来获取

参考表:employee

 

参考表:department

带IN关键字的子查询
复制代码 代码如下:

mysql> SELECT * FROM employee
    -> WHERE d_id IN
    -> (SELECT d_id FROM department);
+------+------+--------+------+------+--------------------+
| num  | d_id | name   | age  | sex  | homeaddr           |
+------+------+--------+------+------+--------------------+
|    1 | 1001 | 张三   |   26 | 男   | 北京市海淀区         |
|    2 | 1001 | 李四   |   24 | 女   | 北京市昌平区         |
|    3 | 1002 | 王五   |   25 | 男   | 湖南长沙市           |
+------+------+--------+------+------+--------------------+
 rows in set (0.00 sec)

此处首先查询出department表中所有d_id字段的信息,并将结果作为条件

接着查询employee表中以d_id为条件的所有字段信息

NOT IN的效果与上面刚好相反

带比较运算符的子查询

复制代码 代码如下:

mysql> SELECT d_id, d_name FROM department
    -> WHERE d_id!=
    -> (SELECT d_id FROM employee WHERE age=24);
+------+-----------+
| d_id | d_name    |
+------+-----------+
| 1002 | 生产部    |
| 1003 | 销售部    |
+------+-----------+
 rows in set (0.00 sec)

这里查询出了哪些部门没有年龄为24岁的员工,看起来有点复杂

此外,运算符还有很多,这里不再赘述


带EXISTS关键字的子查询

EXISTS关键字表示存在。使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值,如果内层查询语句查询到满足条件的记录,就返回true,否则返回false

当返回的值为true时,外层查询语句将进行查询,否则不进行查询

复制代码 代码如下:

mysql> SELECT * FROM employee
    -> WHERE EXISTS
    -> (SELECT d_name FROM department WHERE d_id=1004);
Empty set (0.00 sec)

此处内层循环并没有查询到满足条件的结果,因此返回false,外层查询不执行

NOT EXISTS刚好与之相反

当然,EXISTS关键字可以与其他的查询条件一起使用

条件表达式与EXISTS关键字之间用AND或者OR来连接

复制代码 代码如下:

mysql> SELECT * FROM employee
    -> WHERE age>24 AND EXISTS
    -> (SELECT d_name FROM department WHERE d_id=1003);
+------+------+--------+------+------+--------------------+
| num  | d_id | name   | age  | sex  | homeaddr           |
+------+------+--------+------+------+--------------------+
|    1 | 1001 | 张三   |   26 | 男   | 北京市海淀区         |
|    3 | 1002 | 王五   |   25 | 男   | 湖南长沙市           |
+------+------+--------+------+------+--------------------+
 rows in set (0.00 sec)

带ANY关键字的子查询

ANY关键字表示满足其中任一条件

复制代码 代码如下:

mysql> SELECT * FROM employee
    -> WHERE d_id!=ANY
    -> (SELECT d_id FROM department);
+------+------+--------+------+------+--------------------+
| num  | d_id | name   | age  | sex  | homeaddr           |
+------+------+--------+------+------+--------------------+
|    1 | 1001 | 张三   |   26 | 男   | 北京市海淀区         |
|    2 | 1001 | 李四   |   24 | 女   | 北京市昌平区         |
|    3 | 1002 | 王五   |   25 | 男   | 湖南长沙市           |
|    4 | 1004 | Aric   |   15 | 男   | England            |
+------+------+--------+------+------+--------------------+
 rows in set (0.00 sec)

带ALL关键字的子查询

ALL关键字表示满足其中所有条件

复制代码 代码如下:

mysql> SELECT * FROM employee
    -> WHERE d_id>=ALL
    -> (SELECT d_id FROM department);
+------+------+------+------+------+----------+
| num  | d_id | name | age  | sex  | homeaddr |
+------+------+------+------+------+----------+
|    4 | 1004 | Aric |   15 | 男   | England  |
+------+------+------+------+------+----------+
 row in set (0.00 sec)

暂时不明白这两条语句是什么意思,到时候再补上


UNION合并查询结果

复制代码 代码如下:

mysql> SELECT d_id FROM employee
    -> UNION
    -> SELECT d_id FROM department;
+------+
| d_id |
+------+
| 1001 |
| 1002 |
| 1004 |
| 1003 |
+------+
 rows in set (0.00 sec)

合并比较好理解,也就是将多个查询的结果合并在一起,然后去除其中的重复记录

如果想保存重复记录可以使用UNION ALL语句

相关文章

  • vs如何读取mysql中的数据并解决中文乱码问题

    vs如何读取mysql中的数据并解决中文乱码问题

    这篇文章主要介绍了vs如何读取mysql中的数据并解决中文乱码问题,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • MySQL如何获取当前时间与日期间隔

    MySQL如何获取当前时间与日期间隔

    这篇文章主要介绍了MySQL如何获取当前时间与日期间隔问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Mysql数据库库操作大全

    Mysql数据库库操作大全

    本文介绍了如何在MySQL中创建、备份和修改数据库,以及如何查看和指定数据库的编码集和校验集,还涵盖了对表的操作,包括创建、查看、插入、查询和删除表,以及对数据的排序,感兴趣的朋友跟随小编一起看看吧
    2026-03-03
  • 教你解决往mysql数据库中存入汉字报错的方法

    教你解决往mysql数据库中存入汉字报错的方法

    这篇文章主要介绍了Mysql基础之教你解决往数据库中存入汉字报错的方法,文中有非常详细的代码示例,对正在学习mysql的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-05-05
  • Mysql8公用表表达式CTE详解

    Mysql8公用表表达式CTE详解

    这篇文章主要介绍了Mysql8公用表表达式CTE详解,公用表表达式(或通用表表达式)简称为CTE,CTE可以理解成一个可以复用的子查询,当然跟子查询还是有点区别的,CTE可以引用其他CTE,但子查询不能引用其他子查询,需要的朋友可以参考下
    2023-08-08
  • windows 下忘记mysql root密码的更改方法

    windows 下忘记mysql root密码的更改方法

    mysql数据库忘记了root密码是件很痛苦的事,本文介绍如何解决windows环境下mysql服务器忘记root密码的解决方法,需要的朋友可以参考下
    2016-10-10
  • JDBC MySQL 连接 URL完整权威示例指南

    JDBC MySQL 连接 URL完整权威示例指南

    这篇文章主要介绍了JDBC MySQL 连接 URL完整权威示例指南,本文结合实例代码给大家讲解的非常详细,感兴趣的朋友跟随小编一起看看吧
    2026-03-03
  • windows服务器下备份mysql数据库的脚本分享

    windows服务器下备份mysql数据库的脚本分享

    这篇文章主要为大家详细介绍了windows服务器下备份mysql数据库的脚本,本文主要以5.7版本为例,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2025-12-12
  • 对MySql经常使用语句的全面总结(必看篇)

    对MySql经常使用语句的全面总结(必看篇)

    下面小编就为大家带来一篇对MySql经常使用语句的全面总结(必看篇)。小编觉的挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • MySQL中正则表达式用法示例详解

    MySQL中正则表达式用法示例详解

    MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配,这篇文章主要介绍了MySQL中正则表达式用法,需要的朋友可以参考下
    2025-06-06

最新评论