需要记住的SQL查询语句

结果合并显示
--合并重复行(过滤)
 SELECT * FROM a
 UNION
 SELECT *  FROM b
  
--不合并重复行(不过滤)
 SELECT * FROM a
 UNION ALL
 SELECT * FROM b
  
--合并重复行(过滤)
 SELECT *
 FROM (
 SELECT * FROM a
 UNION
 SELECT * FROM b) AS t
 ORDER BY 字段名
 
--不合并重复行(不过滤)
 SELECT *
 FROM (
 SELECT * FROM a
 UNION ALL
 SELECT * FROM b) AS t
 ORDER BY 字段名
 
内容关联显示
--内容相交
SELECT * FROM tableA INNER JOIN tableB
ON tableA.name = tableB.name

--内容合并
SELECT * FROM tableA FULL OUTER JOIN tableB
ON tableA.name = tableB.name

--左表保全,右表值对应就显示
SELECT * FROM tableA LEFT OUTER JOIN tableB
ON tableA.name = tableB.name

子查询
 通常来讲,子查询按照子查询所返回数据的类型,可以分为三种,分别为:
返回一张数据表(Table)
返回一列值(Column)
返回单个值(Scalar)

子查询作为数据源使用
比如这个语句:
SELECT     P.ProductID, P.Name, P.ProductNumber, M.Name AS ProductModelName
FROM         Production.Product AS P INNER JOIN
(SELECT     Name, ProductModelID
 FROM          Production.ProductModel) AS M 
ON P.ProductModelID = M.ProductModelID
上述子查询语句将ProductModel表中的子集M,作为数据源(表)和Product表进行内连接。
作为数据源使用也是子查询最简单的应用。当然,当子查询作为数据源使用时,也分为相关子查询和无关子查询

子查询作为选择条件使用
作为选择条件的子查询是那些只返回一列(Column)的子查询,如果作为选择条件使用,即使只返回单个值,也可以看作是只有一行的一列.比如:
我想取得总共请病假天数大于68小时的员工:
SELECT [FirstName],[MiddleName],[LastName]
FROM [AdventureWorks].[Person].[Contact]
WHERE ContactID = ANY
  (SELECT EmployeeID
  FROM [AdventureWorks].[HumanResources].[Employee]
  WHERE SickLeaveHours>68)
使用IN和NOT IN关键字是不安全的,通常情况下,最好使用EXISTS,NOT EXISTS,JOIN关键字来进行替代. 除了IN之外,用于选择条件的关键字还有ANY和ALL,这两个关键字和其字面意思一样. 和"<",">",”="连接使用
  
在作为ANY和ALL关键字在子查询中使用时,所实现的效果如下
=ANY 和IN等价
<>ALL 和NOT IN等价
>ANY 大于最小的(>MIN)
<ANY 小于最大的(<MAX)
>ALL 大于最大的(>MAX)
<ALL 小于最小的(<MIN)
=ALL关键字很少使用,这个的效果在子查询中为如果只有一个返回值,则和“=”相等,而如果有多个返回值,结果为空
  
相关子查询和EXISTS关键字
前面所说的查询都是无关子查询(Uncorrelated subquery),子查询中还有一类很重要的查询是相关子查询(Correlated subquery),也叫重复子查询比如,还是上面那个查询,用相关子查询来写:
我想取得总共请病假天数大于68天的员工:
SELECT [FirstName]
      ,[MiddleName]
      ,[LastName]
FROM [AdventureWorks].[Person].[Contact] c
WHERE EXISTS
  (SELECT *
  FROM [AdventureWorks].[HumanResources].[Employee] e
  WHERE c.ContactID=e.ContactID AND e.SickLeaveHours>68)
结果和使用IN关键字的查询结果相同: 
  
子查询作为计算列使用
当子查询作为计算列使用时,只返回单个值(Scalar) 。用在SELECT语句之后,作为计算列使用。同样分为相关子查询和无关子查询
相关子查询的例子比如:我想取得每件产品的名称和总共的销量
SELECT [Name],
      (SELECT COUNT(*) FROM AdventureWorks.Sales.SalesOrderDetail S
      WHERE S.ProductID=P.ProductID) AS SalesAmount
FROM [AdventureWorks].[Production].[Product] P




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值