需要记住的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
--合并重复行(过滤)
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
相关文章推荐
- oracle SQL竖表转横表
- Oracle 12C高级压缩索引 Advanced Index Compression
- 修改MySQL 5.7.9 新版本的root密码方法
- Mysql导入导出时遇到的问题
- 基于MySQL实现按距离排序、范围查找geoHash
- 关于Oracle 数据库中的sequence
- Mysql中导入和导出数据库
- SQL Server安全(11/11):审核(Auditing)
- Oracle-dos命令下的常用语句
- django 1.9 同步数据库bug
- Mysql优化
- sql server 2008 评估期已过期解决办法
- sql server启动不了, MSSQL 18052错误: 9003,严重度: 20,状态: 1
- Mysql常用命令详解
- SQL 语句积累
- mysql半同步复制搭建及验证测试
- Flask 中的 SQLAlchemy 使用教程
- MySQL级联删除和更新
- NoSQL之Redis(五)--- Redis测试以及其与Spring的集成
- 常见的SQLite语句