子查询
子查询允许我们将多次查询写出一条查询语句。比如,我们需要完成下列几条查询:
1.检索订单中运费大于1000块的所有订单的订单号
2.检索具有前一步骤列出的订单的客户ID
3.检索上一步骤返回的客户的信息
上面的每一个步骤我们都可以使用一条查询语句来完成,但是如果我们使用子查询,则可以将上述查询汇总成一条SQL语句。
单独查询
我们先依次完成上述任务
SELECT [CustomerID]
FROM [dbo].[Orders]
WHERE [Freight]>700
SELECT [CustomerID]
FROM [dbo].[Orders]
WHERE [OrderID] IN (10540)
SELECT CustomerID, CompanyName, ContactName, ContactTitle, Address, City, Region, PostalCode, Country, Phone, Fax
FROM [dbo].Customers
WHERE [CustomerID] IN ('QUICK')
合并
首先我们来合并第一个步骤和第二个步骤
SELECT [CustomerID]
FROM [dbo].[Orders]
WHERE [OrderID] IN
(SELECT [OrderID]
FROM [dbo].[Orders]
WHERE [Freight]>1000)
是的,我们只需要将结果替换成第一个步骤的代码,就可以完成嵌套查询。
同理,将所有步骤嵌套:
SELECT CustomerID, CompanyName, ContactName, ContactTitle, Address, City, Region, PostalCode, Country, Phone, Fax
FROM [dbo].Customers
WHERE [CustomerID] IN (SELECT [CustomerID]
FROM [dbo].[Orders]
WHERE [OrderID] IN
(SELECT [OrderID]
FROM [dbo].[Orders]
WHERE [Freight]>1000))
用于计算字段的子查询
我们前面知道了计算字段,现在我们将把这项技术运用到子查询中,使其能够完成我们期望的结果:
SELECT CompanyName,ContactName,(SELECT COUNT(*)
FROM [dbo].[Orders]
WHERE [dbo].[Customers].CustomerID=[dbo]. [Orders].CustomerID) AS orders
FROM [dbo].[Customers]
我们假设,数据库是循环遍历一个表来检索数据的,那么上述查询语句则首先遍历Customer表,当检索一条数据时,就抽取他的CompanyName和ContactName属性,后来,它看到了这个子查询表达式。
遇到这个子查询表达式后,当前查询的这一条数据就代表了[dbo].[Customers]表,子查询语句就根据这条信息检索Orders表,并把结果计算出来,组成了第三条字段,完成了这次信息检索:
联结表
联结表将多个表的数据联结在一次查询,最典型的例子是直接将表放在FROM语句中查询,这样的返回结果是笛卡尔积,但这样的结果往往都不是我们想要的结果。
SELECT CompanyName,ContactName,OrderDate
FROM [dbo].[Customers],[dbo].[Orders]
WHERE [dbo].[Customers].CustomerID = [dbo].[Orders].CustomerID
ORDER BY CompanyName
内部联结
刚才的示例展示了一种内部联结的方式,不过它有更加正规的语句:
SELECT CompanyName,ContactName,OrderDate
FROM [dbo].[Customers] INNER JOIN [dbo].[Orders]
ON [dbo].[Customers].CustomerID = [dbo].[Orders].CustomerID
ORDER BY CompanyName
我们将逗号替换成了INNER JOIN关键字,WHERE换成了ON关键字,但结果没有变化
可以依照格式联结多个表进行查询
连接多个表将导致性能下降
外联结
有时候我们想查看订单的顾客所在的地区在哪里,但有些顾客并没有填写这个信息,这个时候我们就可以用到外联结,他可以联结一个表中所有的行,就算没有关联。如果要联结右边的所有行,则将关键字改为RIGTH,左边则为LEFT。
SELECT [dbo].[Orders].Freight,[dbo].[Customers].Region
FROM [dbo].[Customers] LEFT JOIN [dbo].[Orders]
ON [dbo].[Customers].CustomerID = [dbo].[Orders].CustomerID
ORDER BY CompanyName
组合查询
组合查询非常简单,他就是将两条查询语句的结果合并在一起,比如这条组合查询:
SELECT [CompanyName]
,[ContactName]
FROM [dbo].[Customers]
WHERE [City] = 'Berlin'
UNION
SELECT [CompanyName]
,[ContactName]
FROM [dbo].[Customers]
WHERE [Country]='Germany'
他只是将城市为Berlin和国家为Germany的顾客检索出来了,另外一说,组合查询会自动剔除相同的查询结果,如果你不想这么做,可以在UNION后面加上ALL关键字。
SELECT [CompanyName]
,[ContactName]
FROM [dbo].[Customers]
WHERE [City] = 'Berlin'
UNION ALL
SELECT [CompanyName]
,[ContactName]
FROM [dbo].[Customers]
WHERE [Country]='Germany'
小结
这就是基础查询的所有部分了,下一部分主要讲述插入数据。