SQL必知必会 - 子查询/组合查询

目录

一、子查询的要点

1 定义

2 查询顺序

3 其他注意事项

二、 子查询过滤

三、子查询作为计算字段

四、组合查询 UNION


一、子查询的要点

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注意点
  1. union连接的每个查询语句要有相同的列和表达式(顺序可以不一样)
  2. union是自动去重的,即对结果的并集
  3. 要返回所有包括重复的匹配行,可以用UNION ALL
  4. 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升序排序。数据源表头如下:

iddevice_idgenderageuniversitygpaactive_days_within_30question_cntanswer_cnt

语句应输出的表头如下:

device_iduniversitygpa

 查询语句如下( 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;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值