01. 子查询

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

  1. 查询(query): 任何SQL语句都是查询,但此术语一般指SELECT语句
  2. SQL还允许创建子查询(subquery),即嵌套在其他查询中的查询

02. 利用子查询进行过滤

订单存储:对于包含订单号、客户ID、订单日期的每个订单,orders表存储一行;各订单的物品存储在相关的orderitems表中,orders表不存储客户信息,它只存储客户的ID,实际的客户信息存储在customers表中。

  1. 列出订购物品TNT2的所有客户:
    1.1 检索包含物品TNT2的所有订单的编号;
    数据库入门:MySQL必知必会(十四)使用子查询
    1.2 检索具有前一步骤列出的订单编号的所有客户的ID;
    数据库入门:MySQL必知必会(十四)使用子查询
    1.3 检索前一步骤返回的所有客户ID的客户信息;
    数据库入门:MySQL必知必会(十四)使用子查询
  2. 将1.1和1.2变为子查询,组合两个查询:
    数据库入门:MySQL必知必会(十四)使用子查询
    数据库入门:MySQL必知必会(十四)使用子查询
    2.1 在SELECT语句中,子查询总是从内向外处理
    2.2 在处理上面的SELECT语句时,MySQL实际上执行了两个操作
  3. 可以把其中的WHERE子句转换为子查询而不是硬编码这些客户ID:
    数据库入门:MySQL必知必会(十四)使用子查询
    3.1 列必须匹配: 在WHERE子句中使用子查询,应该保证SELECT语句具有与WHERE子句中相同数目的列
    3.2 虽然子查询一般与IN操作符结合使用,但也可以用于测试等于(=)不等于(<>) 等。

03. 作为计算字段使用子查询

使用子查询的另一方法是创建计算字段:假如需要显示customers表中每个客户的订单总数,订单与相应的客户ID存储在orders表中。

  1. 从customers表中检索客户列表;
  2. 对于检索出的每个客户,统计其在orders表中的订单数目;
    数据库入门:MySQL必知必会(十四)使用子查询
  3. 相关子查询(correlated subquery): 涉及外部查询的子查询;
    数据库入门:MySQL必知必会(十四)使用子查询
  4. 任何时候只要列名可能有多义性,就必须使用这种语法 (表名和列名由一个句点分隔)

04.下一篇:联结表

相关文章: