您的位置:首页 > 数据库

需要记住的SQL查询语句

2016-04-30 16:28 399 查看
结果合并显示
--合并重复行(过滤)
 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: