SqlServer之基本增删改查(4)

子查询


子查询允许我们将多次查询写出一条查询语句。比如,我们需要完成下列几条查询:

1.检索订单中运费大于1000块的所有订单的订单号
2.检索具有前一步骤列出的订单的客户ID
3.检索上一步骤返回的客户的信息

上面的每一个步骤我们都可以使用一条查询语句来完成,但是如果我们使用子查询,则可以将上述查询汇总成一条SQL语句。

单独查询

我们先依次完成上述任务

SELECT  [CustomerID]
  FROM  [dbo].[Orders]
  WHERE [Freight]>700

查找订单中运费大于1000的订单号

SELECT  [CustomerID]
  FROM  [dbo].[Orders]
  WHERE [OrderID] IN (10540)

查找该订单号的客户的ID

  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)

是的,我们只需要将结果替换成第一个步骤的代码,就可以完成嵌套查询。

查找该订单号的客户的ID

同理,将所有步骤嵌套:

  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'

查询结果

小结


这就是基础查询的所有部分了,下一部分主要讲述插入数据。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值