分享

MySQL基础知识——子查询

 一劫书生 2024-03-11 发布于河南

什么是子查询

子查询(Sub Query)或者说内查询(Inner Query),也可以称作嵌套查询(Nested Query),是一种嵌套在其他 SQL 查询的 WHERE 子句中的查询。

子查询用于为主查询返回其所需数据,或者对检索数据进行进一步的限制。

子查询可以在 SELECT、INSERT、UPDATE 和 DELETE 语句中,同 =、<、>、>=、<=、IN、BETWEEN 等运算符一起使用。

使用子查询必须遵循以下几个规则:

  • 子查询必须括在圆括号中。

  • 子查询的 SELECT 子句中只能有一个列,除非主查询中有多个列,用于与子查询选中的列相比较。

  • 子查询不能使用 ORDER BY,不过主查询可以。在子查询中,GROUP BY 可以起到同 ORDER BY 相同的作用。

  • 返回多行数据的子查询只能同多值操作符一起使用,比如 IN 操作符。

  • SELECT 列表中不能包含任何对 BLOB、ARRAY、CLOB 或者 NCLOB 类型值的引用。

  • 子查询不能直接用在集合函数中。

  • BETWEEN 操作符不能同子查询一起使用,但是 BETWEEN 操作符可以用在子查询中。


SELECT子查询语句

通常情况下子查询都与 SELECT 语句一起使用,其基本语法如下所示:

SELECT column_name [,column_name]

FROM  table1 [,table2]

WHERE column_name OPERATOR

(SELECT column_name [,column_name]      

FROM table1 [,table2 ]

[WHERE])


示例数据表

考虑 Customers表和Orders表,表中记录如下所示:

表Customers

表Orders

子查询实例

现在,让我们试一下在 SELECT 语句中进行子查询:

  1. SELECT * FROM Customers
  2. WHERE 客户ID IN
  3. (SELECT 客户ID FROM Orders
  4. WHERE 员工ID=9)

上述语句的执行结果如下所示:

上述语句是先获取订单表Orders中员工ID=9的发货记录,我们发现有两条记录,其中这两条记录对应的客户ID是3和4,而在外层客户Customers表中我们需要找到Orders表中返回的客户ID是3和4所对应的记录,那就是我们查询出的结果了。

注意:在WHERE子句中使用子查询(如这里所示),应该保证SELECT语句具有与WHERE子句中相同数目的列。通常,子查询将返回单个列并且与单个列匹配,但如果需要也可以使用多个列。


INSERT 子查询语句

子查询还可以用在 INSERT 语句中。INSERT 语句可以将子查询返回的数据插入到其他表中。子查询中选取的数据可以被任何字符、日期或者数值函数所修饰。

其基本语法如下所示:

INSERT INTO 

table_name [(column1 [,column2])]           

SELECT [*|column1 [,column2]           

FROM table1 [,table2]

[WHERE VALUE OPERATOR]


示例:

考虑与 Customers表拥有相似结构的 Customers_bak表。现在要将 上面查询的结果插入到Customers_bak表中

  1. INSERT INTO Customers_bak
  2. SELECT * FROM Customers
  3. WHERE 客户ID IN
  4. (SELECT 客户ID FROM Orders
  5. WHERE 员工ID=9)

查询一下Customers_bak的结果,会发现和上面的结果一致。


UPDATE子查询语句

子查询可以用在 UPDATE 语句中。当子查询同 UPDATE 一起使用的时候,既可以更新单个列,也可更新多个列。

其基本语法如下:

UPDATE table

SET column_name = new_value

[WHERE OPERATOR [VALUE]

(SELECT COLUMN_NAME   

FROM TABLE_NAME)

[WHERE)]

示例:

下面的示例将 Customers表中在Orders表里有发货的客户,他们所在的城市要加一个“市”字。

  1. UPDATE Customers
  2. SET 城市=城市 '市'
  3. WHERE 客户ID IN
  4. (SELECT 客户ID FROM Orders)

这将影响4行数据,随后 Customers表中的记录将如下所示:


DELETE 子查询语句

如同前面提到的其他语句一样,子查询还可以同 DELETE 语句一起使用。

其基本语法如下所示:

DELETE FROM TABLE_NAME

[ WHERE OPERATOR [VALUE]

(SELECT COLUMN_NAME   

FROM TABLE_NAME)

[WHERE)]

示例:

假设我们想删除在Orders表中有购买记录的客户信息,可以这样写

  1. DELETE FROM Customers
  2. WHERE 客户ID IN
  3. (SELECT 客户ID FROM Orders)

这将影响4行数据,随后 Customers表中的记录将如下所示:

相关子查询

是指涉及外部查询的子查询

例如:要查询每个客户的订单数量,我们可以这样写:

  1. SELECT 
  2. `姓名`,
  3. `客户ID`,
  4. (
  5. SELECT COUNT(*)
  6. FROM orders o
  7. WHERE o.`客户ID`=c.`客户ID` 
  8. ) AS '数量'
  9. FROM customers c

结果为:

这里使用SELECT COUNT(*)对表中的行进行计数,并且通过提供一条WHERE子句来匹配某个特定的客户ID 。其中相关就是通过WHERE里面的匹配条件来确定联系的。

  1. ——End——
  2. 后台回复关键字:1024,获取一份精心整理的技术干货
  3. 后台回复关键字:进群,带你进入高手如云的交流群。
  4. 推荐阅读
  5. 为什么阿里巴巴禁止使用存储过程?
  6. 一份非常完整的 MySQL 规范,速速收藏!
  7. 数据库中为什么不推荐使用外键约束
  8. 阿里规定超过3张表,禁止JOIN,为何?
  9. MySQL 常用命令手册
  10. 这是一个能学到技术的公众号,欢迎关注

点击「阅读原文」了解SQL训练营

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多