子查询
一.子查询:嵌套在其他查询中的查询。
二.利用子查询进行过滤
表orders包含订单号、客户ID、订单日期的每个订单;
表orderitems存储各个订单的物品;
表customers存储客户信息。
如:现在我们要检索出订购物品TNT2的所有客户:
1)检索包含物品TNT2的所有订单号;
2)根据订单号检索出所有客户的ID;
3)根据客户的Id检索出客户信息。
即:select 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'));
注意:1)子查询总是从内向外处理的。
2)在where子句中使用子查询,应该保证select语句具有和where子句相同数目的列(有颜色的地方)。通常,子查询将返回单个列并且与单个列匹配,当然也可以使用多个列。
二.作为计算字段使用子查询
如:要求检索customers表中每个客户的订单总数。订单和相应的客户ID存储在orders表中。
步骤:
1)从customers表中检索出客户列表;
2)对于检索出的每个客户,统计其在orders表中的订单数。
即:select cust_name,cust_state,(select count(*) from orders where orders.cust_id=customers.cust_id) as orders from customers order by cust_name;
组合查询
一、组合查询:mysql允许执行多个查询,并将结果作为单个查询结果返回。
适用情况:1)在单个查询中从不同的表返回类似的数据;2)对单个表执行多个查询,按单个查询返回数据。
使用方式:在每个select之间加上关键字union
使用规则:1)union必须由两条或以上的select语句组成,语句之间用关键字union分隔;2)union中的每个查询必须包含相同的列、表达式或聚集函数(但各个列不需要以相同的次序出现); 3)列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含地转换的类型(例如,不同的数据类型或不同的日期).
例:检索价格小于等于5的所有物品的一个列表,而且还想包括供应商1001和1002生产的所有物品(不考虑价格).
select vend_id,prod_id,prod_price
from products
where prod_price<=5
union
select vend_id,prod_id,prod_price
from products
where vend_id in (1001,1002);
注意:union默认从查询的结果集中自动的去除了重复的行;可以使用union all不取消重复的行。
select vend_id,prod_id,prod_price
from products
where prod_price<=5
union all
select vend_id,prod_id,prod_price
from products
where vend_id in (1001,1002);
对组合查询的结果排序:在使用union组合查询的时候,只能使用一条order by子句,且他必须出现在最后一条select语句之后。如:
select vend_id,prod_id,prod_price
from products
where prod_price<=5
union
select vend_id,prod_id,prod_price
from products
where vend_id in (1001,1002)
order by vend_id,prod_price;