码迷,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 子句嵌在另一个TSQL 句中,一般情况下,子查询用于另一个SELECTINSERTUPDATE 或者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 字段并命名sdateemp_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 OUTERJOINRight join:

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

格式:from tablea right join tableb on 条件

select*

from Production.Productas a rightjoin Production.ProductReview as b

on a.ProductID= b.ProductID

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

3 、全外接(FULL OUTERJOINFull 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,若不存在,返回 Falseobject.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
迷上了代码!