1、子查询函数
一、子查询(subquery):嵌套在其余查询中的查询。测试
例如:select user_id from usertable where mobile_no in (select mobile_no from mobile where mobile_id = '10086');编码
这条SQL语句中,括号内为从mobile表汇总检索mobile_id为10086的全部行中的mobile_no列,括号外为从user_table表中检索mobile_id为10086的全部行中的user_id列;spa
PS:select语句中,子查询老是从内向外处理(实际上,MySQL执行了2个select操做),where子句中使用子查询,必须保证select语句具备与where子句中相同数目的列;调试
子查询通常与in操做符结合使用,但也可用于测试等于(=)、不等于(<>)等。排序
格式化SQL:包含子查询的select语句通常相较来讲阅读和调试更为不方便,特别是它比较复杂的状况下,所以把子查询分解为多行而且适当缩进,能极大的简化子查询的使用。io
二、使用计算字段使用子查询table
例如:select user_name,user_id,(select count(*)) mobile
from orders where orders_cust_id = usertable_user_id)select
as orders
from usertable
order by user_name;
这条SQL语句对usertable表中每一个用户返回3列:user_name,user_id和orders,orders是一个计算字段,由圆括号内的子查询创建,它对检索出的每一个用户执行一次,
子查询中where子句它使用了彻底限定表名,它告诉SQL比较orders表和usertable表中的user_id列。
相关子查询(correlated subquery):涉及外部查询的子查询(任什么时候候只要列名可能存在多叉性,就必须使用这种语法[表名和列名有一个句点分隔])。
PS:使用子查询创建查询的最可靠方法是逐渐进行(首先创建最内层的查询,确认后用硬编码数据创建外层查询,由内到外)
2、组合查询
MySQL容许执行多个查询(多条select语句),并将结果做为单个查询结果集返回,这些组合查询称为并(union)或复合查询(compound query)。
如下两种基本状况,须要使用组合查询:
①在单个查询中从不一样表返回相似结构的数据;
②对单个表执行多个查询,按单个查询返回数据;
一、union
union可将多条select语句的结果组合成单个结果集,例子以下
select user_id, mobile_id, mobile_num
from mobiletables
where mobile_num = 10086
union
select user_id, mobile_id, mobile_num
from mobuletables
where user_id in (10000,10010);
这条SQL语句中,union指示MySQL执行两条select语句,并把输出组合成单个查询结果集。
union使用规则:
①union必须由两条或以上的select语句组成,语句之间用关键字union分隔;
②union中每一个查询必须包含相同的列、表达或汇集函数(各个列不须要以相同的次序列出);
③列数据类型必须兼容:类型不用彻底相同,但必须是DBMS能够隐含的转换类型;
④union自动从查询结果集中去除重复的行(这是union的默认行为,若是想返回全部匹配行,可以使用union all)
二、union all
union自动从查询结果集中去除重复的行,若是想返回全部匹配行,可以使用union all;例子以下:
select user_id, mobile_id, mobile_num
from mobiletables
where mobile_num = 10086
union all
select user_id, mobile_id, mobile_num
from mobuletables
where user_id in (10000,10010);
union和where的区别:
union几乎能够完成与多个where条件相同的工做。union all为union的一种形式,它完成where子句完成不了的工做(若是须要每一个条件匹配行所有出现,则必须使用union all)。
三、对组合查询结果排序
select语句的输出用order by子句排序,在用union组合查询时,只能使用一条order by子句,它必须出如今最后一条select语句以后。
select user_id, mobile_id, mobile_num
from mobiletables
where mobile_num = 10086
union all
select user_id, mobile_id, mobile_num
from mobuletables
where user_id in (10000,10010)
order by user_id, mobile_num;
MySQL将用它来排序全部的select语句返回的全部结果。