Sql语句汇总【2】

 一.深入讲解SQL UnionUnion All的使用方法

UNION指令的目的是将两个SQL语句的结果合并起来。从这个角度来看, 我们会产生这样的感觉,UNIONJOIN似乎有些许类似,因为这两个指令都可以由多个表格中撷取资料。 UNION的一个限制是两个SQL 语句所产生的栏位需要是同样的资料种类。另外,当我们用 UNION这个指令时,我们只会看到不同的资料值 (类似 SELECT DISTINCT) union只是将两个结果联结起来一起显示,并不是联结两个表……
UNION
的语法如下: [SQL 语句
1]
UNION
[SQL
语句 2] 假设我们有以下的两个表格,
  
Store_Information
表格
   store_name     Sales     Date 
                                  Los Angeles     $1500   Jan-05-1999 
                                 San Diego         $250    Jan-07-1999 
                                 Los Angeles      $300    Jan-08-1999 
                                  Boston            $700    Jan-08-1999
 
Internet Sales
表格
          Date    Sales 
                             Jan-07-1999  $250 
                             Jan-10-1999  $535 
                             Jan-11-1999  $320 
                             Jan-12-1999  $750
而我们要找出来所有有营业额 (sales) 的日子。要达到这个目的,我们用以下的 SQL 语句:

SELECT Date FROM Store_Information
UNION
SELECT Date FROM Internet_Sales
结果
:  
Date 
Jan-05-1999 
Jan-07-1999 
Jan-08-1999 
Jan-10-1999 
Jan-11-1999 
Jan-12-1999
有一点值得注意的是,如果我们在任何一个 SQL 语句 (或是两句都一起) "SELECT DISTINCT Date" 的话,那我们会得到完全一样的结果。

SQL 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  Date 
                                  Los Angeles  $1500  Jan-05-1999 
                                San Diego       $250   Jan-07-1999 
                                Los Angeles    $300   Jan-08-1999 
                                   Boston         $700   Jan-08-1999
 
Internet Sales
表格
   Date        Sales 
                          Jan-07-1999  $250 
                          Jan-10-1999  $535 
                          Jan-11-1999  $320 
                          Jan-12-1999  $750
而我们要找出有店面营业额以及网络营业额的日子。要达到这个目的,我们用以下的SQL语句:

SELECT Date FROM Store_Information
UNION ALL
SELECT Date FROM Internet_Sales
结果
:  
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

二实现跨多个表格的数据进行组合的SQL语句

1
A   B
a   1
b   0
c   3
d   0
e   2
2
A   B
c   0
e   4
合并两个表除去重复的数据(以表2的数据为主),我们将会得到以下的表
:
A   B
a   1
b   0
c   0
d   0
e   4

select A,B from 1 where A not in(select A from 2)
union
select A,B from
2

 

利用"SQL"语句自动生成序号的两种方式

1.首先,我们来介绍第一种方式:
查询的SQL语句如下
:
select row_number() over (order by name) as rowid, sysobjects.[name] from sysobjects
运行的结果
:
rowid   name
1           all_columns
2           all_objects
3           all_parameters
4           all_sql_modules
5           all_views
2.
最后,我们来介绍第二种方式
:
在我们利用这种方式生成自动序号时,Test_Table必须在数据库中不能存在,因为在执行这些SQL语句的时后自动会创建表。

select id=IDENTITY(int,1,1), sysobjects.[name] as name into dbo.Test_Table from sysobjects

 

3.SQL Server数据库中经常用到的identity

    SQL Server中,经常会用到Identity标识列,这种自增长的字段操作起来的确是比较方便。但它有时还会带来一些麻烦。
示例一 :当表中被删除了某些数据的时候,自增长列的编号就不再是一个连线的数列。这种时候我们可以用以下方案来解决。

SET IDENTITY_INSERT [TABLE] [ON|OFF]
允许将显式值插入表的标识列中,当设置为ON时,这时可能在INSERT操作时手工指定插入到标识列中的编号,同时必须在操作完成后,将IDENTITY_INSERT还原成OFF,否则下次插入的时候必须指定编号,那不然就无法完成INSERT

作。
示例二:当表中的记录被全部删除,但此时标识列的值越来越大的时候,如果不加以重置,它还会无休止的增长。这个时候我们就要用到:

DBCC CHECKIDENT
TABLE, [RESEED|NORESEED], [1])
将把指定表的种子值强制重设为1。然而,你可能不想将种子重设为1,在这种情况下,你可以用你想用的种子值替代第三个参数。有时候你可能想知道当前的种子,而不是想重设种子,这时你就要用到NORESEED,而不用再去顾忌第三个参数。 

 

四SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差别
  IN:确定给定的值是否与子查询或列表中的值相匹配。
  IN 关键字使您得以选择与列表中的任意一个值匹配的行。
  当要获得居住在 California、Indiana 或 Maryland 州的所有作者的姓名和州的列表时,就需要下列查询:
  SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID = 1
OR CategoryID = 4 OR CategoryID = 5
  然而,如果使用 IN,少键入一些字符也可以得到同样的结果:
  SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID IN
(1, 4, 5)
  IN 关键字之后的项目必须用逗号隔开,并且括在括号中。
  下列查询在 titleauthor 表中查找在任一种书中得到的版税少于 50% 的所有作者的 au_id,然后从 authors 表中选择 au_id 与
  titleauthor 查询结果匹配的所有作者的姓名:
  SELECT au_lname, au_fname FROM authors WHERE au_id IN (SELECT au_id FROM
titleauthor WHERE royaltyper <50)
  结果显示有一些作者属于少于 50% 的一类。
  NOT IN:通过 NOT IN 关键字引入的子查询也返回一列零值或更多值。
  以下查询查找没有出版过商业书籍的出版商的名称。
  SELECT pub_name FROM publishers WHERE pub_id NOT IN (SELECT pub_id FROM titles
WHERE type = 'business')
  使用 EXISTS 和 NOT EXISTS 引入的子查询可用于两种集合原理的操作:交集与差集。两个集合的交集包含同时属于两个原集合的所有元素。
  差集包含只属于两个集合中的第一个集合的元素。
  EXISTS:指定一个子查询,检测行的存在。
  本示例所示查询查找由位于以字母 B 开头的城市中的任一出版商出版的书名:
  SELECT DISTINCT pub_name FROM publishers WHERE EXISTS (SELECT * FROM titles
WHERE pub_id = publishers.pub_id AND type =
  'business')
  SELECT distinct pub_name FROM publishers WHERE pub_id IN (SELECT pub_id FROM
titles WHERE type = 'business')
  两者的区别:
  EXISTS:后面可以是整句的查询语句如:SELECT * FROM titles
  IN:后面只能是对单列:SELECT pub_id FROM titles
  NOT EXISTS:
  例如,要查找不出版商业书籍的出版商的名称:
  SELECT pub_name FROM publishers WHERE NOT EXISTS (SELECT * FROM titles WHERE
pub_id = publishers.pub_id AND type =
  'business')
  下面的查询查找已经不销售的书的名称:
  SELECT title FROM titles WHERE NOT EXISTS (SELECT title_id FROM sales WHERE
title_id = titles.title_id)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值