目录
一、子查询的要点
1 定义
- 所有的select语句,都是从单个数据表中检索数据的单条语句,即简单查询。
- 可以通过嵌套,建立子查询,即嵌套在其他查询中的查询语句
- 类似excel中的VLOOKUP函数逻辑
2 查询顺序
- 子查询的处理顺序:从内往外。先执行括号里面的语句
- 最外侧的查询为所需要返回的最终数据
3 其他注意事项
- 能嵌套的子查询,没有数目限制,但只能查询单列数据
- 常用于where语句的IN字符中
二、 子查询过滤
范例步骤①
范例说明:orders表包括订单编号、客户ID、订单日期;customers表包含顾客的所有实际信息,包括客户ID; 现需要列出购买了商品为RGAN01的所有顾客ID
- 解法1:分成多个查询语句
SELECT order_num
FROM orderitems
WHERE prod_id='RGAN01';
--假设查询得出的订单编码为20007、2008
SELECT cust_id
FROM orders
WHERE order_num IN(20007,20008);
- 解法2:组合为子查询
SELECT cust_id
FROM orders
WHERE order_num IN( SELECT order_num
FROM orderitems
WHERE prod_id='RGAN01');
范例步骤②
范例说明:在步骤①的基础上,列出购买了商品为RGAN01的所有顾客姓名和联系方式
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='RGAN01'));
三、子查询作为计算字段
范例说明:需得出customers表中每个顾客的订单总数。与订单对应的顾客id在orders表中如下所示,
- ordersss为一个计算字段,由括号内的子查询建成
- orders.cust_id为完全限定列名,中间用点隔开,形式为 表名 . 列名
SELECT cust_name,
cust_state,
( SELECT COUNT(*) AS num_order
FROM orders
WHERE orders.cust_id=customers.cust_id)
AS ordersss
FROM customers;
四、组合查询 UNION
- 组合查询即多条select查询语句,且返回结果只有一个
- 在每个select语句之间,用UNION连接即可
SELECT cust_name,cust_contact,cust_email
FROM customers
WHERE cust_name IN ('LI','IN')
UNION
SELECT cust_name,cust_contact,cust_email
FROM customers
WHRER cust_name = 'FUN4All';
- union注意点
- union连接的每个查询语句要有相同的列和表达式(顺序可以不一样)
- union是自动去重的,即对结果的并集
- 要返回所有包括重复的匹配行,可以用UNION ALL
- union后面只能跟一个order by在最后面
union 和 union all 的例子
SELECT col_name FROM tab_name
UNION
SELECT col_name FROM tab_name
ORDER BY col_name; --union 返回的结果去除重复值
SELECT col_name FROM tab_name
UNION ALL
SELECT col_name FROM tab_name
ORDER BY col_name; --union all 返回的结果保留了重复值
五、附加例题
e.g1. Products表含有字段prod_name代表产品名称,Customers表代表顾客信息,cust_name代表顾客名称。组合 Products 表中的产品名称(prod_name)和 Customers 表中的顾客(cust_name)
查询语句如下
select prod_name from Products
union
select cust_name
as prod_name
from Customers;
e.g2. 需从user_profile表中找到每个学校gpa最低的同学,输出结果按university升序排序。数据源表头如下:
id | device_id | gender | age | university | gpa | active_days_within_30 | question_cnt | answer_cnt |
语句应输出的表头如下:
device_id | university | gpa |
查询语句如下( IN限制的语句是可以添加多个字段的!)
select device_id,
university,
gpa
from user_profile
where (university,gpa)
in ( select university,min(gpa)
from user_profile
group by university )
order by university;