MySQL(八)子查询和分组查询

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语句返回的全部结果。