当前位置:首页 > 开发 > 数据库 > 正文

SQL语句及其关键字总结(三)

发表于: 2013-08-27   作者:为了明天而努力   来源:转载   浏览:
摘要:   SQL语句及其关键字总结(三) 1.SQL外部连接 之前我们看到的左连接 (left join),又称内部连接 (inner join)。在这个情况下,要两个表格内都有同样的值,那一笔资料才会被选出。那如果我们想要列出一个表格中每一笔的资料,无论它的值在另一个表格中有没有出现,那该怎么办呢?在这个时候,我们就需要用到 SQL OUTER JOIN (外部连接)

 

SQL语句及其关键字总结(三)

1.SQL外部连接

之前我们看到的左连接 (left join),又称内部连接 (inner join)。在这个情况下,要两个表格内都有同样的值,那一笔资料才会被选出。那如果我们想要列出一个表格中每一笔的资料,无论它的值在另一个表格中有没有出现,那该怎么办呢?在这个时候,我们就需要用到 SQL OUTER JOIN (外部连接) 的指令。

外部连接的语法是依数据库的不同而有所不同的。举例来说,在 Oracle 上,我们会在 WHERE 子句中要选出所有资料的那个表格之后加上一个 "(+)" 来代表说这个表格中的所有资料我们都要。

假设我们有以下的两个表格:

Store_Information 表格

Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999

 

Geography 表格

Region_Name Store_Name
East Boston
East New York
West Los Angeles
West San Diego

 

我们需要知道每一间店的营业额。如果我们用一个普通的连接,我们将会漏失掉 'New York' 这个店,因为它并不存在于 Store_Information 这个表格。所以,在这个情况下,我们需要用外部连接来串联这两个表格:

 

SELECT A1.Store_Name, SUM(A2.Sales) SALES 
FROM Georgraphy A1, Store_Information A2 
WHERE A1.Store_Name = A2.Store_Name (+) 
GROUP BY A1.Store_Name;

我们在这里是使用了 Oracle 的外部连接语法。

结果:

 

Store_Name SALES
Boston 700
New York  
Los Angeles 1800
San Diego 250

 

请注意: 当第二个表格没有相对的资料时,SQL 会传回 NULL 值。在这一个例子中,'New York' 并不存在于 Store_Information 表格,所以它的 "SALES" 栏位是 NULL。 

 

2.Subquery

我们可以在一个 SQL 语句中放入另一个 SQL 语句。当我们在 WHERE 子句或 HAVING 子句中插入另一个 SQL 语句时,我们就有一个 subquery 的架构。 Subquery 的作用是什么呢?第一,它可以被用来连接表格。另外,有的时候 subquery 是唯一能够连接两个表格的方式。

Subquery 的语法如下:

 

SELECT "栏位1" 
FROM "表格" 
WHERE "栏位2" [比较运算素] 
(SELECT "栏位1" 
FROM "表格"
WHERE "条件");

[比较运算素] 可以是相等的运算素,例如 =, >, <, >=, <=. 这也可以是一个对文字的运算素,例如 "LIKE"。

我们就用刚刚在阐述 SQL 连接时用过的例子:

Store_Information 表格

Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999

 

Geography 表格

Region_Name Store_Name
East Boston
East New York
West Los Angeles
West San Diego

 

我们要运用 subquery 来找出所有在西部的店的营业额。我们可以用下面的 SQL 来达到我们的目的:

 

SELECT SUM(Sales) FROM Store_Information
WHERE Store_name IN
(SELECT store_name FROM Geography 
WHERE region_name = 'West');

结果:

 

SUM(Sales)
2050

 

在这个例子中,我们并没有直接将两个表格连接起来,然后由此直接算出每一间西区店面的营业额。我们做的是先找出哪些店是在西区的,然后再算出这些店的营业额总共是多少。 

 

3.UNION

UNION 指令的目的是将两个 SQL 语句的结果合并起来。从这个角度来看, UNION 跟 JOIN 有些许类似,因为这两个指令都可以由多个表格中撷取资料。 UNION 的一个限制是两个 SQL 语句所产生的栏位需要是同样的资料种类。另外,当我们用 UNION 这个指令时,我们只会看到不同的资料值 (类似 SELECTDISTINCT)。

UNION 的语法如下:

 

[SQL 语句 1]
UNION
[SQL 语句 2];

假设我们有以下的两个表格,

Store_Information 表格

Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999

 

Internet Sales 表格

Txn_Date Sales
07-Jan-1999 250
10-Jan-1999 535
11-Jan-1999 320
12-Jan-1999 750

 

而我们要找出来所有有营业额 (Sales) 的日子。要达到这个目的,我们用以下的 SQL 语句:

 

SELECT Txn_Date FROM Store_Information
UNION
SELECT Txn_Date FROM Internet_Sales;

结果:

 

Txn_Date
Jan-05-1999
Jan-07-1999
Jan-08-1999
Jan-10-1999
Jan-11-1999
Jan-12-1999

 

有一点值得注意的是,如果我们在任何一个 SQL 语句 (或是两句都一起) 用 SELECT DISTINCT Txn_Date 的话,那我们会得到完全一样的结果。 

 

4.UNION ALL

UNION ALL 这个指令的目的也是要将两个 SQL 语句的结果合并在一起。 UNION ALL 和 UNION 不同之处在于 UNION ALL 会将每一笔符合条件的资料都列出来,无论资料值有无重复。

UNION ALL 的语法如下:

[SQL 语句 1]
UNION ALL
[SQL 语句 2];

我们用和上一页同样的例子来显示出 UNION ALL 和 UNION 的不同。同样假设我们有以下两个表格,

Store_Information 表格

Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999

 

Internet Sales 表格

Txn_Date Sales
07-Jan-1999 250
10-Jan-1999 535
11-Jan-1999 320
12-Jan-1999 750

 

而我们要找出有店面营业额以及网络营业额的日子。要达到这个目的,我们用以下的 SQL 语句:

 

SELECT Txn_Date FROM Store_Information
UNION ALL
SELECT Txn_Date FROM Internet_Sales;

结果:

 

 

Txn_Date
Jan-05-1999
Jan-07-1999
Jan-08-1999
Jan-08-1999
Jan-07-1999
Jan-10-1999
Jan-11-1999
Jan-12-1999

5.INTERSECT

和 UNION 指令类似,INTERSECT 也是对两个 SQL 语句所产生的结果做处理的。不同的地方是,UNION 基本上是一个 OR (如果这个值存在于第一句或是第二句,它就会被选出),而 INTERSECT 则比较像 AND ( 这个值要存在于第一句和第二句才会被选出)。UNION 是联集,而 INTERSECT 是交集。

INTERSECT 的语法如下:

 

[SQL语句 1]
INTERSECT
[SQL语句 2];

假设我们有以下的两个表格,

Store_Information 表格

Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999

 

Internet Sales 表格

Txn_Date Sales
07-Jan-1999 250
10-Jan-1999 535
11-Jan-1999 320
12-Jan-1999 750

 

而我们要找出哪几天有店面交易和网络交易。要达到这个目的,我们用以下的 SQL 语句:

 

SELECT Txn_Date FROM Store_Information
INTERSECT
SELECT Txn_Date FROM Internet_Sales;

结果:

 

Txn_Date
Jan-07-1999

 

请注意,在 INTERSECT 指令下,不同的值只会被列出一次。 

 

6.MINUS

MINUS 指令是运用在两个 SQL 语句上。它先找出第一个 SQL 语句所产生的结果,然后看这些结果有没有在第二个 SQL 语句的结果中。如果有的话,那这一笔资料就被去除,而不会在最后的结果中出现。如果第二个 SQL 语句所产生的结果并没有存在于第一个 SQL 语句所产生的结果内,那这笔资料就被抛弃。

MINUS 的语法如下:

 

[SQL 语句 1]
MINUS
[SQL 语句 2];

我们继续使用一样的例子:

Store_Information 表格

Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999

 

Internet Sales 表格

Txn_Date Sales
07-Jan-1999 250
10-Jan-1999 535
11-Jan-1999 320
12-Jan-1999 750

 

而我们要知道有哪几天是有店面营业额而没有网络营业额的。要达到这个目的,我们用以下的 SQL 语句:

 

SELECT Txn_Date FROM Store_Information
MINUS
SELECT Txn_Date FROM Internet_Sales;

结果:

 

Txn_Date
Jan-05-1999
Jan-08-1999

'Jan-05-1999', 'Jan-07-1999', 和 'Jan-08-1999' 是 "SELECT Txn_Date FROM Store_Information" 所产生的结果。在这里面,'Jan-07-1999' 是存在于 "SELECT Txn_Date FROM Internet_Sales" 所产生的结果中。因此 'Jan-07-1999' 并不在最后的结果中。

 

请注意,在 MINUS 指令下,不同的值只会被列出一次。 

 

SQL语句及其关键字总结(三)

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
分组的极端情况就是根据所有列分组,那么返回的结果跟没有分组时一样的。 原文链接:http://www.jb51.
原文链接: http://www.jb51.net/article/33535.htm 主要内容是参照 Inside Microsoft SQL Server 20
分组的极端情况就是根据所有列分组,那么返回的结果跟没有分组时一样的。 原文链接:http://www.jb51.
看过牛腩视频后,前17集讲后台代码的编写,尤其讲到查询语句的时候,顿时感觉原来学习过的查询语句
在与数据库打交道中,经常要用到SQL语句。但是往往只用到一些简单的查询语句进行单表中的原始数据查
1.union 和union all 操作符 1)union内部的select语句必须拥有相同的列,列也必须有相似的数字类型
上节我们学习了select语句,这一节主要讲解下insert(插入)语句,还是以tb_Students_info表为例: 现
上节我们学习了select语句,这一节主要讲解下insert(插入)语句,还是以tb_Students_info表为例: 现
1:查询数据库dbName有多少张表 select count(*) from information_schema.tables where table_schem
3.INTERSECT语句和EXCEPT语句 intersect语句可以用来查两个表中的“公共”数据信息,即“交叉”数据
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号