MySQL ------ 子查询(十三)

 查询(query):任何SQL 都是查询,但此术语一般指select 语句

子查询(subquery):嵌套在查询中的查询,MySQL4.1 引入对子查询的支持。

接下来得就比较有意思了,需要你对于表与表之间的关系有所了解,子查询一般用于跨表查询

1、基本使用

-- 多表查询,返回的订单编码,用于下一次查询
select cust_id,order_num from orders where order_num in(  select order_num from orderitems where prod_id='fb');

 顺序的就是从里到外,主要就是查询里面套查询

 注意:

  1、在select 语句中,子查询总是从内向外处理的,先执行的使括号内的查询语句,根据此查询返回的以IN 操作符要求格式传递到外部查询

     2、包含子查询的select 语句难以阅读和调试,可以 在书写的时候,分为多行并适当缩进

--  三个表查,这其中用到了外键的概念 主要就是 prod_id  order_num cust_id
select cust_id,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'));

 上述,三条主要就是根据商品id 找到对应订单编码,根据订单编码找到客户id ,根据客户id 找到客户信息

注意:

  1、where 子句中使用子查询能够编写出功能很强并且很灵活的sql语句,而且对嵌套的子查询数目也没有限制,不过在实际中语句性能的限制,不能嵌套太多(虽然对子查询数目没有限制,但是由于性能原因,不要嵌套太多

  2、where 子句中使用子查询,应保证select 语句具有与where子句相同数目的列(通常子查询返回单个列并与单个列匹配,若有需要也可以使用多个列),从里到外一层一层

  3、虽然子查询一般与IN 操作符结合使用,但也可以与其他操作符结合使用

  4、使用子查询并不总是执行这种类型的数据检索的最有效方法

2、作为计算字段使用子查询

使用子查询的另一种方法就是创建计算字段,就是查询语句放在select 与from 之间

-- 显示customers 表中每个客户的订单总数,订单与相应的客户id 存储在order 表中
 select cust_name,cust_state,( select count(*) from orders where orders.cust_id = customers.cust_id) as orders   from customers order by cust_name;

 此语句中  orders.cust_id = customers.cust_id  使用了完全限定,这个可以理解为  根据  orders表中的 cust_id 这个字段进行查询,值为  customers表中的cust_id 的有几个,

如下所示:

 相关子查询(correlated subquery): 涉及外部查询的子查询。任何时候只要列名可能有多异性,就要使用这种语法(表名点 表中相关列名)。

如果不使用,就是没有完全限定

 两个cust_id 在不同的表中,如果不用完全限定,mysql 假定你是对 order 表中的cust_id 进行自身比较,

 返回的是order 表中的总数,所以必须限制有歧义性的列名。

注意:

  1、多表查询时要使用完全限定

  2、子查询并不是解决这种数据检索的最有效方法,有多种解决方案

  3、用子查询建立查询的最可靠的方法是逐渐 进行,与mysql 的处理方式相同,建议先测试内层查询,在根据返回的数据测试外层,确人正常后在嵌入到子查询,随牺牲了一点时间但保证了正确。

  4、子查询可以用在 select 与from 之间,也可以用在where 子句后

  5、查询顺序从内到外

  

原文地址:https://www.cnblogs.com/obge/p/12972711.html