资讯专栏INFORMATION COLUMN

T-SQL学习中--子查询

CocoaChina / 1426人阅读

摘要:检索表中价格最低的产品的。检索表中由日本供货商供应的商品的。检索在年月日下过订单的客户的客户编号公司名。下面的语句与上一条语句等阶取得表中工号为的员工及其上司上司的上司的工号,姓名,以及与之的层级关系。

SQLSELECT productid, productname, unitprice
FROM Production.Products
WHERE unitprice =
  (SELECT MIN(unitprice)
   FROM Production.Products);

检索Production.Products表中价格最低的产品的productid, productname, unitprice。

SQLSELECT productid, productname, unitprice
FROM Production.Products
WHERE supplierid IN
  (SELECT supplierid
   FROM Production.Suppliers
   WHERE country = N"Japan");

检索Production.Products表中由日本供货商供应的商品的productid, productname, unitprice。

SQLSELECT categoryid, productid, productname, unitprice
FROM Production.Products AS P1
WHERE unitprice =
  (SELECT MIN(unitprice)
   FROM Production.Products AS P2
   WHERE P2.categoryid = P1.categoryid);

检索Production.Products表中同类产品中价格最低的产品。相当于先检索SELECT categoryid ,MIN(unitprice) FROM production.products GROUP BY categoryid,然后再找出这些价格对应的产品的productid和productname。

SQLSELECT custid, companyname
FROM Sales.Customers AS C
WHERE EXISTS
  (SELECT *
   FROM Sales.Orders AS O
   WHERE O.custid = C.custid
     AND O.orderdate = "20070212");

检索在2007年2月12日下过订单的客户的客户编号、公司名。相当于下面这句SQL:

SQLSELECT custid, companyname 
FROM Sales.Customers AS C 
WHERE custid IN 
    (SELECT custid FROM Sales.Orders
    WHERE orderdate = "20070212");
SQLSELECT custid, companyname
FROM Sales.Customers AS C
WHERE NOT EXISTS
  (SELECT *
   FROM Sales.Orders AS O
   WHERE O.custid = C.custid
     AND O.orderdate = "20070212");

检索没有在2007年2月12日下过订单的客户的客户编号、公司名。相当于下面这句SQL:

SQLSELECT custid, companyname 
FROM Sales.Customers AS C 
WHERE custid NOT IN 
    (SELECT custid FROM Sales.Orders
    WHERE orderdate = "20070212");
SQLSELECT
  ROW_NUMBER() OVER(PARTITION BY categoryid
                    ORDER BY unitprice, productid) AS rownum,
  categoryid, productid, productname, unitprice
FROM Production.Products;

检索Production.Products表的categoryid, productid, productname, unitprice,并把它按商品类的分区块,取得每个商品在各自的商品类中的价格排名(同类商品中最便宜的排在前面)。

SQLSELECT categoryid, productid, productname, unitprice
FROM (SELECT
        ROW_NUMBER() OVER(PARTITION BY categoryid
                          ORDER BY unitprice, productid) AS rownum,
        categoryid, productid, productname, unitprice
      FROM Production.Products) AS D
WHERE rownum <= 2;

取得Production.Products表中同类产品价格最低和次低的商品的categoryid, productid, productname, unitprice。
下面的SQL语句与上一条SQL语句等阶

SQLWITH C AS
(
  SELECT
    ROW_NUMBER() OVER(PARTITION BY categoryid
                      ORDER BY unitprice, productid) AS rownum,
    categoryid, productid, productname, unitprice
  FROM Production.Products
)
SELECT categoryid, productid, productname, unitprice
FROM C
WHERE rownum <= 2;
SQLWITH EmpsCTE AS
(
  SELECT empid, mgrid, firstname, lastname, 0 AS distance
  FROM HR.Employees
  WHERE empid = 9

  UNION ALL

  SELECT M.empid, M.mgrid, M.firstname, M.lastname, S.distance + 1 AS distance
  FROM EmpsCTE AS S
    JOIN HR.Employees AS M
      ON S.mgrid = M.empid
)
SELECT empid, mgrid, firstname, lastname, distance
FROM EmpsCTE;

取得HR.Employees表中工号为9的员工及其上司、上司的上司……的工号,姓名,以及与之的层级关系distance。结果如下表:

empid mgrid firstname lastname distance
9 5 Zoya Dolgopyatova 0
5 2 Sven Buck 1
2 1 Don Funk 2
1 NULL Sara Davis 3

HR.Employee整个数据表的数据如下:

empid mgrid firstname lastname
1 NULL Sara Davis
2 1 Don Funk
3 2 Judy Lew
4 3 Yael Peled
5 2 Sven Buck
6 5 Paul Suurs
7 5 Russell King
8 3 Maria Cameron
9 5 Zoya Dolgopyatova

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/32011.html

相关文章

  • T-SQL进阶:超越基础 Level 2:编写查询

    摘要:首次发布于关于系列本文属于进阶系列进阶超越基础跟随的进阶系列,其涵盖了更多的高级方面的语言,如子查询。两个子查询返回表中的最大。当在子句中使用子查询时,从子查询生成的结果集通常称为派生表。子查询可以独立于外部查询运行,因此有时也称为独 By Gregory Larsen, 2016/01/01 (首次发布于: 2014/01/29) 关于系列 本文属于进阶系列:T-SQL进阶:超越基础...

    ideaa 评论0 收藏0
  • T-SQL学习

    摘要:但是我不明白是什么意思。直到做了下面这个查询才明白所谓的就是对数据表格按的优先级进行排序,取得排序号。但是当值由跳到,或者由跳到的时候,排序号重新从开始计数。 SQLSELECT ROW_NUMBER() OVER (PARTITION BY categoryid ORDER BY unitprice, productid) AS rownum, categoryid, produc...

    CompileYouth 评论0 收藏0
  • SQL Server2012 T-SQL基础教程(一)

    摘要:第二范式继承第一范式的约束,在其基础上增加了必须存在主键进行唯一标识,而且表中的其他列需要依赖主键当存在多个主键的时,不能只依赖主键的一部分,也就是只依赖于其中一个。 T-SQL是标准SQL在SQL Server数据库中的实现。 范式 范式是在表设计时的标准,通常一个表需要遵循以下三个范式;第一范式:数据库中的表的列,必须是原子的,不可以在进行拆分。例如:一个列中存储多个值,一个学生的...

    Tikitoo 评论0 收藏0
  • SQL Server2012 T-SQL基础教程(二)

    摘要:此函数可以用于实现批量删除其中为截取子字符串函数可以从一个字符串中截取一个子字符串。按照指定次数重复一个字符串函数可以按照指定的次数重复一个字符串输出从目标字符串中移除指定字符串,并插入一个替代的新子字符串。 字符串操作函数 1.拼接字符串 拼接字符串可以通过 + 来实现拼接,使用这个方法存在一个缺点,当需要拼接的字符串为NULL时,由于T-SQL中定义NULL + NULL 仍然为 ...

    wujl596 评论0 收藏0
  • T-SQL学习--内联接,外连接,交叉连接

    摘要:交叉连接可以表和表是同一张表取得笛卡尔乘积。下面的查询中,表中没有商品记录的的日本供货商不会被列出来。套用内联接的左外连接查询出日本供货商的所有的产品以及产品类别名。 交叉连接可以表A和表B是同一张表取得笛卡尔乘积。 比如说下面这种写法: SQLSELECT D.n AS theday, S.n AS shiftno FROM dbo.Nums AS D cross JOIN...

    tommego 评论0 收藏0

发表评论

0条评论

CocoaChina

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<