码迷,mamicode.com
首页 > 数据库 > 详细

27. SQL -- TSQL(SELECT语句的使用,子查询,连接,通配符 )(3)

时间:2015-04-01 20:13:32      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:通配符

  • 通配符:

通配符一般是通过LIKE 使用的。

T-SQL 中支持四种通配符,如表所示:

运算 符 含 义

%

代表零个或多个任意字符

_

代表一个任意字符

[]

指定范围内的任意单个字符

[^]

不在指定范围内的任意单个字符

例如,

“AB%”表示以AB 开始的任意字符串;

“_cd”表示以cd 结尾的三个字符的字符串;

“[ef]%”表示以e 或f 开始的任意字符串;

“[s-v]ing”表示开始是s 到v,结尾是ing,长度为四个字符的字符串;

“m[^c]%”表示以m 开始且第二个字符不是c 的任意字符串。

 

例1:查询emp_id字段以P10 开始的任意字符串

select*

from TimeRecords

where emp_id like ‘P10%‘

例2:查询emp_id字段以P10 开始及以10 结尾的任意字符串

select*

from TimeRecords

where emp_id like ‘P10%10‘

例3:查询emp_id字段以P10 开始及以9 结尾的任意字符串

select*

from TimeRecords

where emp_id like ‘p10%[9]‘

例4:查询emp_id字段以P10 开始及以0-9 结尾的任意字符串

select*

from TimeRecords

where emp_id like ‘p10%[0-9]‘

例5:查询emp_id字段以P10 开始及不以0-4 结尾的任意字符串

select*

from TimeRecords

where emp_id like ‘p10%[^0-4]‘

例6:查询emp_id字段不是以P10 开始的任意字符串

select*

from TimeRecords

where emp_id not like ‘P10%‘

  • 常见查询类型:

查询所有的数据行和列select * from TimeRecords

查询部分行列——条件查询 加where

在查询中使用列名as 别名

查询空行is null

在查询中使用常量列demo‘ as col1

查询返回限制的行数top \TOP 50 PERCENT \TOP 接收变量

  • select 查询语句基本使用:

SELECTselect_list

[INTO new_table ]

FROMtable_source

[WHERE search_condition ]

[GROUP BY group_by_expression ]

[HAVING search_condition ]

[ORDER BY order_expression [ ASC | DESC ] ]

1)、如果查询表中所有列的信息,用“*”代替列名。

select* from TimeRecords

2)、查询指定的列,并应用别名

selectclock_id as clock,

join_idas joinid,

card_idas card

from TimeRecords

3)、为表名指定别名。

select

clock_idas clock,

card_idas card

from TimeRecords as tire

或者

selectclock_id clock,

card_idcard

from TimeRecords tire

4)、消除结果集中重复的行。

selectdistinct clock_id as clock

from TimeRecords

5)、查询返回限制的行数

返回前10 行的内容:

selecttop 10 *

from TimeRecords

返回总表的1%的内容:

selecttop 1 percent *

from TimeRecords

 

6)、使用带条件的查询:

a. 基于比较条件查询:

select*

from TimeRecords

where clock_id = ‘105‘

条件:=,>,>=,<,<=,<>

 

b. 基于范围条件查询:

BETWEEN关键词BETWEEN AND

select*

from TimeRecords

where sign_time between ‘2011-06-13‘ and ‘2011-06-15‘

c. 基于列表条件查询:

IN关键词

select*

from TimeRecords

where clock_id in (103,105)

andemp_id = ‘P0802604‘

d. 基于字符串匹配条件的查询:

Like 关键词

select*

from TimeRecords

where emp_id not like ‘P10%‘

字符串可包含通配符:_、%、[]、^

e. 基于未知值(NULL)查询:

空值实际是指一种未知的,不存在,不可应用的资料,通常用NULL表示。

select*

from TimeRecords

where depart_id is null

f. 基于多个条件选择查询结果:

在WHERE语句中,可以用逻辑运算符来连接多个条件,构成一个复杂条件进行查询。主要有三个逻辑运算符:

AND :它连接两个条件,如果两个条件都成立,则组合起来的条件成立。

OR :它连接两个条件,如果其中一个条件成立,则组合条件成立。

NOT :它引出一个条件,将该条件的值取反。

AND:

select* from TimeRecords

where clock_id = ‘105‘

andemp_id = ‘P0802604‘

OR:

select* from TimeRecords

where clock_id = ‘105‘

or emp_id = ‘P0802604‘

NOT:

select* from TimeRecords

where not clock_id = ‘105‘

  • 对查询结果进行分组:

a. 关键字:GROUP BY

Group By 语句从英文的字面意义上理解就是―根据(by)一定的规则进行分组(Group)‖。它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。利用GROUP BY 可以按一定的条件对查询到的结果进行分组,再对每一组数据计算统计。

Group By [Expressions]:

这个恐怕是Group By 语句最常见的用法了,Group By +[分组字段](可以有多个)。在执行了这个操作以后,数据集将根据分组字段的值将一个数据集划分成各个不同的小组。

格式:SELECT select_list

FROM table_source

WHERE search_condition

GROUP BY group_by_expression

例:select COUNT (*)

from TimeRecords

where clock_id = ‘105‘

groupby emp_id

b. 关键字:HAVING

HAVING 子句用来向使用GROUP BY 子句的查询中添加过滤准则,语法与WHERE一样,但WHERE 是针对单个行而言,HAVING 是针对一组而言。

区别:

○1 、查询时,先滤掉不满足WHERE 中条件的记录,而HAVING 子句在分组之后使用。

○2 、HAVING 可以在子句中包含聚合函数,但WHERE 不行。

比如:查看每一种卖出商品的总数,卖出数量大于30.

select spid,sum(shl) as shl from ywmxk

group by spid

having sum(shl)>30

c. COMPUTE 与COMPUTE BY

COMPUTE 子句可以用来计算汇总资料。

比如:查看日期1994/09/13 以后卖出商品的总数,

select spid,shl as shl

from ywmxk

where djbh like ‘jha%‘

compute sum(shl)

COMPUTE BY 可以按给定的条件将查询结果分组,并为每组计算汇总资料

select spid,shl

from ywmxk

where djbh like ‘jha%‘

order by spid

compute sum(shl) by spid

若使用了COMPUTE BY,则必须使用ORDER BY,并且COMPUTE BY 后面出现

的列的顺序必须与ORDER BY 后出现的顺序相同。

  • 子查询:

子查询有两种类型:简单型和关联型。

子查询是指SELECT 子句嵌在另一个T-SQL 语句中,一般情况下,子查询用于另一个SELECT,INSERT,UPDATE 或者DELETE 语句中的WHERE 或HAVING 短语中。

例:

selectsdate,COUNT(userid) as cnt

from

( select CONVERT (char(10),sign_time,121) as sdate,

emp_idas userid

from TimeRecords

where convert (char(10),sign_time,121)>‘2011-06-10‘

groupby CONVERT(char(10),sign_time,121),emp_id ) as a

groupby sdate

orderby sdate

语句解释:

从TimeRecords 表中,查询出匹配sign_time 字段大于‘2011-06-10 的sign_time 字段并命名别名为sdate, emp_id 字段并命名别名为userid,并对sign_time 及emp_id 字段进行分组,且将查询结果作为虚拟表为命名别名为a,从表a 中对sdate 字段进行分组,筛选出sdate 字段及对userid 字段进行count(计数)并命名别名为int,最终对查询结果

进行排序.

连接查询(等值查询):

select*

from TimeRecords as a , TimeRecords_2as b

where a.clock_id= b.clock_id

  • 外连接,交叉连接和自连接

连接查询是关系数据库中最主要的查询,主要包括内连接、外连接和交叉连接等。通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。

内连接的连接查询结果集中仅包含满足条件的行,内连接是SQL Server 缺省的连接方式,可以把INNER JOIN 简写成JOIN,根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种;交叉连接的连接查询结果集中包含两个表中所有行的组合;

 

外连接的连接查询结果集中既包含那些满足条件的行,还包含其中某个表的全部行,有3种形式的外连接:左外连接、右外连接、全外连接。

 

a. 交叉连接(CROSS JOIN)

交叉连接即笛卡儿乘积,是指两个关系中所有元组的任意组合。一般情况下,交叉查询是没有实际意义的。

格式:from tablea cross join tableb

例:

select*

from Production.Productas a crossjoin Production.ProductReview as b

where a.ProductID= b.ProductID

上面查询将2 个关系表的内容组合成一个表

b. 内连接查询(INNER JOIN ON)

内连接是一种最常用的连接类型。内连接查询实际上是一种任意条件的查询。使用内连接时,如果两个表的相关字段满足连接条件,则从这两个表中提取数据并组合成新的记录,也就是说,在内连接查询中,只有满足条件的元组才能出现在结果关系中根据比较方式分为:

○1 、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结、果中列出被连接表中的所有列,包括其中的重复列。

○2 、不等连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。

○3 、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。

格式:from tablea join tableb on 比较条件

例:

select*

from Production.Productas a joinProduction.ProductReview as b

on a.ProductID= b.ProductID

c. 自连接查询

如果在一个连接查询中,涉及到的两个表都是同一个表,这种查询称为自连接查询。同一张表在FROM 字句中多次出现,为了区别该表的每一次出现,需要为表定义一个别名。自连接是一种特殊的内连接,它是指相互连接的表在物理上为同一张表,但可以在逻辑上分为两张表.

格式:from tablea join tablea as tableb on 比较条件

例:

select*

from Production.Productjoin Production.Product as a

on Production.Product.ProductID = a.ProductID

where a.ProductID= ‘937‘

d.外联结:对于绝大多数的查询执行,当用户在多个表检索资料时标准的内部联结就足够了。但有些情况是当用户要检索的信息在两个表中没有公共资料时,使用外联结和交叉联结是很有用的。内连接的查询结果都是满足连接条件的元组。但是,有时我们也希望输出那些不满足连接条件的元组的信息,外连接是只限制一张表中的数据必须满足连接条件,而另一张表中的数据可以不满足连接条件的连接方式。

外联结的类型:左联结,右联结,全外联结。左联结和右联结的不同之处仅在于FROM 短语中表排列次序不同。全外联结是同时使用左联接和右联接。

○1 、左外连接(LEFT OUTER JOIN) Left join:

如果在连接查询中,连接管子左端的表中所有的元组都列出来,并且能在右端的表中找到匹配的元组,那么连接成功。如果在右端的表中,没能找到匹配的元组,那么对应的元组是空值(NULL)。这时,查询语句使用关键字LEFT OUTER JOIN,也就是说,

左外连接的含义是限制连接关键字右端的表中的数据必须满足连接条件,而不关左端的表中的数据是否满足连接条件,均输出左端表中的内容。

格式:from tablea lift join tableb on 比较条件

select*

from Production.ProductReviewas b leftjoin Production.Product as a

on a.ProductID= b.ProductID

以上查询结果将先显示连接端左边所有内容,并显示右边表中,满足比较条件的项.

○2 、右外连接(RIGHT OUTERJOIN)Right join:

右外连接与左外连接类似,只是右端表中的所有元组都列出,限制左端表的数据必须满足连接条件,而不管右端表中的数据是否满足连接条件,均输出表中的内容。

格式:from tablea right join tableb on 比较条件

select*

from Production.Productas a rightjoin Production.ProductReview as b

on a.ProductID= b.ProductID

以上查询结果将先显示连接端右边所有内容,并显示左边表中,满足比较条件的项.

○3 、全外连接(FULL OUTERJOIN)Full join:

全外连接查询的特点是左、右两端表中的元组都输出,如果没能找到匹配的元组,就使用NULL 来代替。

格式:from tablea full join tableb on 比较条件

全外连接查询中所有表中的元组信息都得到了保留

  • 多表查询应用:

a. 复合条件连接where a.id=b.id and a.name=b.name

b. 嵌套查询where a.id in (select id from tb1)

c. 将查询结果集作为table 再连接查询

from tb1 a ,(select * from tb2) b where a.id=b.id

d. 带有exists 谓词的子查询

Exists 方法,描述如果在Dictionary 对象中指定的关键字存在,返回True,若不存在,返回 False。语法object.Exists(key),Exists方法语法有如下几部分:部分描述Object 必需的。始终是一个Dictionary 对象的名字。Key 必需的。在Dictionary 对象中搜索的 Key 值.

EXISTS 在SQL 中的作用:检验查询是否返回数据.

 

与关键词‖IN―的区别

IN:确定给定的值是否与子查询或列表中的值相匹配。

EXISTS:指定一个子查询,检测行的存在。

exits 相当于存在量词:表示集合存在,也就是集合不为空只作用一个集合.例如

exist P 表示P 不空时为真; not existP 表示p 为空时,为真;in 表示一个标量和一元关系的关系。

例如:s in P 表示当s 与P 中的某个值相等时,为真; s not in P 表示s 与P

中的每一个值都不相等时,为真。

in 是把外表和内表作hash join,而exists 是对外表作loop,每次loop 再对内

表进行查询。绝对的认为exists 比in 效率高的说法是不准确的。这要看关联表的数据量大小.如果查询的两个表大小相当,那么用in 和exists 差别不大。

如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的

用in;

例:使用exists:

select*

from Production.Productas a

where exists

(select *

from Production.ProductReviewas b

where b.ProductID= a.ProductID )

使用in:

select*

from Production.Productas a

where a.ProductIDin

(select ProductID

from Production.ProductReviewas b)

not in 和not exists

如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;

而not extsts 的子查询依然能用到表上的索引。

所以无论那个表大,用not exists 都比not in 要快。e. 使用union:

将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中的所有查询的全部行。这与使用联接组合两个表中的列不同。使用UNION 组合两个查询的结果集的两个基本规则是:

l 所有查询中的列数和列的顺序必须相同。

l 数据类型必须兼容。

例:union all:

selecttop 100 a.clock_id clock,a.emp_idemp,a.join_id joid

from TimeRecords a

union all

selecttop 100 b.clock_id ,b.emp_id,b.join_id

from TimeRecords_2 b

将TimeRecords 表和TimeRecords_2 表中的字段合成一个结果集(可能有重复数据,不过效率较

高)

union:

selecttop 100 a.clock_id clock,a.emp_idemp,a.join_id joid

from TimeRecords a

union

selecttop 100 b.clock_id ,b.emp_id,b.join_id

from TimeRecords_2 b

将TimeRecords 表和TimeRecords_2 表中的字段合成一个结果集(没有有重复数据,效率较union

all 低点)

本文出自 “Ricky's Blog” 博客,请务必保留此出处http://57388.blog.51cto.com/47388/1627384

27. SQL -- TSQL(SELECT语句的使用,子查询,连接,通配符 )(3)

标签:通配符

原文地址:http://57388.blog.51cto.com/47388/1627384

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!