zoukankan      html  css  js  c++  java
  • 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语句时极有用, 但必须注意限制有歧义性的列名。

  • 相关阅读:
    io流(input output)
    Mybatis实例
    框架(mybatis概念及环境搭建
    easyui试做窗口.不完整
    while (rs.next()) 与 if(rs.next())的区别
    json名词解释
    jQuery2
    去除inline-block元素间间距的N种方法
    jQuery的deferred对象详解
    js基础知识集锦
  • 原文地址:https://www.cnblogs.com/featherwit/p/13374643.html
Copyright © 2011-2022 走看看