SQL练习--某书第四章 表表达式

本文深入探讨了SQL中的派生表概念及其应用场景,包括派生表的OrderBy限制、与LIMIT结合使用的方法、子查询优化技巧以及递归查询等高级主题。通过具体实例,解析了如何利用派生表解决复杂查询需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

20190422更新 着重3-2有空4-2

第一种:派生表

 (就是子查询感觉变成一个表)从这个表from或者join

是需要特别注意,派生表的orderby一点作用都没有,不能用!!

能用orderby的情况:点那个orderby和limit一起使用的时候,子表达式可以用

按理说下面代码第二个方式但是确实可以,因为orderby和limit一起~~~

-- cid的为02的前三名
SELECT SUM(t1.s_score)
  FROM (
SELECT s1.s_id,s1.s_score
  FROM Score s1
 WHERE s1.c_id = '02'
   AND (SELECT COUNT(*) FROM Score s2
		 WHERE s1.c_id = s2.c_id
           AND s2.s_score > s1.s_score) < 3) AS t1;

SELECT SUM(t1.s_score)
  FROM (
SELECT s_score
FROM score
 WHERE c_id = '02'
 ORDER BY s_score DESC
 LIMIT 3) t1

 

第二特别注意:

使用派生表的一个最常见情景就是,selelct子句处理之前的查询语句中无法引用select子句分配的列别名,因为selelct执行在他们之后

情景3:多个嵌套引用

---------------------------为了表达方便,可以用with+表名+As的形式

 

# 1-1.
SELECT empid,Max(orderdate) AS maxorderdate
  FROM Sales.Orders
 GROUP BY empid;
  
#1-2.
             
SELECT so2.empid,so2.orderdate,so2.orderid,so2.custid
  FROM Sales.Orders AS so2
  JOIN (
        SELECT empid,Max(orderdate) AS maxorderdate
          FROM Sales.Orders
		 GROUP BY empid)AS so1
	ON so2.empid = so1.empid
   AND so2.orderdate = so1.maxorderdate;

-- 特别注意:为什么第二题不像第一题那样直接一个呢?alter
-- 因为groupby的特性,你在select里面不能出现多于的列

#2-1
SELECT orderid,orderdate,custid,empid,
       ROW_NUMBER() OVER(ORDER BY orderdate,orderid) AS rownum
  FROM Sales.Orders;
  
#2-2
SELECT so.orderid,so.orderdate,so.custid,so.empid,so.rownum
  FROM (
       SELECT orderid,orderdate,custid,empid,
              ROW_NUMBER() OVER(ORDER BY orderdate,orderid) AS rownum
         FROM Sales.Orders
        ) AS so
  WHERE so.rownum BETWEEN 11 AND 20;
  
-- 特别注意,为什么我不这样呢
SELECT orderid,orderdate,custid,empid,
       ROW_NUMBER() OVER(ORDER BY orderdate,orderid) AS rownum
  FROM Sales.Orders
 WHERE so.rownum BETWEEN 11 AND 20;
-- 因为select执行顺序在where之后,所有where里面的rownum无法执行

#3.递归 
WITH EmpsCTE AS
(
SELECT empid,mgrid,firstname,lastname
  FROM HR.Employees
 WHERE empid = 9
 UNION ALL
SELECT P.empid,P.mgrid,P.firstname,P.lastname
  FROM EmpsCTE AS C
  JOIN HR.Employees AS P
    ON C.mgrid = P.empid
    )
SELECT  empid,mgrid,firstname,lastname
  FROM EmpsCTE
#4.1
SELECT so.empid,YEAR(sod.orderdate),SUM(sod.qty) AS qty
  FROM Sales.Orders
  JOIN Sales.OrderDetails
    ON so.orderid = sod.orderid
 GROUP BY empid,YEAR(sod.orderdate);
 
 #4.2
SELECT sv.empid,sv.orderyear,sv.qty,
      SELECT SUM(qty)
		FROM Sales.VempOrders AS sv2
	   WHERE sv1.empid = sv2.empid
         AND sv2.orderyear <= sv1.orderyear)AS runqty
   FROM Sales.VemOrders AS sv
  ORDER BY sv1.empid,sv1.orderyear;
 GROUP BY empid,YEAR(sv.orderdate)

重点1-2,2-2,3-2,4-2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值