MySQL ------ 子查询(十三)
查询(query):任何SQL 都是查询,但此术语一般指select 语句
子查询(subquery):嵌套在查询中的查询,MySQL4.1 引入对子查询的支持。
子查询一般用于跨表查询,习惯上,外层的查询称为父查询,圆括号中嵌入的查询称为子查询。SQL语句执行时先执行子查询部分,求出子查询部分的值,再执行整个父查询,返回最后的结果。
-- 子查询在where 子句中的一般用法 select ······ from 表1 where 字段1 比较运算符 (子查询) -- 子查询语句必须放在圆括号里面,比较运算符包括(>,=,<,>=,<=) -- 将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个
子查询作为where 条件的一部分,还可以与update、insert,delete 一块使用
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、查询顺序从内到外
END!!
1、子查询可以嵌套在SQL 语句中任何表达式出现的位置。
在select 语句中 ,子查询可以被嵌套在select 语句的列、表和查询条件中,即selec 子句、from 子句、where 子句、group 子句和 having 子句中
(1)、嵌套在select语句的select 子句中的子查询语法格式
select (子查询) from 表名 -- 子查询结果为单行单列,但不必指定列别名
(2)、嵌套在select语句的from 子句中的子查询语法格式:
select * from (子查询) as 表的别名 -- 子查询嵌套在from 子句中必须为表执行别名,一般返回多行多列数据记录,可以当做一个临时表
2、只出现在子查询中而没有出现在父查询中的表不能包含在输出列中
多层嵌套子查询的最终数据集只包含父查询(最外层查询)的select 子句中出现的字段,而子查询的数据结果通常会作为其外层子查询数据源或用于数据判断条件