MySQL基础之使用子查询

子查询

SELECT语句是SQL的查询语句, 目前我们所看到的SELECT语句都是简单查询, 即从单个数据库表中检索数据的单条语句。

任何SQL语句都是查询。但查询一般指的都是SELECT语句

SQL还允许创建子查询, 即嵌套在其他查询中的查询。

利用子查询进行过滤

可以使用子查询把3个查询组合成一条语句。

MariaDB [crashcourse]> SELECT cust_name, cust_contact FROM customers WHERE cust_id IN (SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id='TNT2'));
+----------------+--------------+
| cust_name      | cust_contact |
+----------------+--------------+
| Coyote Inc.    | Y Lee        |
| Yosemite Place | Y Sam        |
+----------------+--------------+
2 rows in set (0.001 sec)

MariaDB [crashcourse]> 

在WHERE中子句中使用子查询能够编写出功能强大并且灵活的SQL语句。对于能嵌套的子查询的数目没有限制, 不过在实际使用时由于性能的限制, 不能嵌套太多的查询。

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

使用子查询并不总是执行这种类型的数据检索的最有效的方法, 应该它的性能较低

作为计算字段使用子查询

使用子查询的另一方法是创建计算字段

MariaDB [crashcourse]> SELECT cust_name, cust_state, (SELECT COUNT(*) FROM orders WHERE orders.cust_id=customers.cust_id) AS orders FROM customers ORDER BY cust_name;
+----------------+------------+--------+
| cust_name      | cust_state | orders |
+----------------+------------+--------+
| Coyote Inc.    | MI         |      2 |
| E Fudd         | IL         |      1 |
| Mouse House    | OH         |      0 |
| Wascals        | IN         |      1 |
| Yosemite Place | AZ         |      1 |
+----------------+------------+--------+
5 rows in set (0.003 sec)

MariaDB [crashcourse]> 

子查询中的WHERE子句与前面使用的WHERE子句稍有不同, 因为它使用了完全限定列名。如果不使用完全限定列名那么会产生歧义, 从而导致结果错误。

虽然子查询在构造这种SELECT语句时极有用, 但必须注意限制有歧义性的列名。

原文地址:https://www.cnblogs.com/featherwit/p/13374643.html