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

SELECT句的使用

  • SELECT序:

AFROM

BWHERE

CGROUPBY

DHAVING

ESELECT

FORDERBY

1)FROM段:

FROM 标识查询的来源表,并理表运算符如果指定了表运算符, 要按从左到右的序,运算符行逐个理。

表运算符有4 JOINAPPLYPIVOTUNPIVOT

在涉及到接运算的查询中(各种join),主要有以下几个步

a. 求笛卡尔积。不是什么型的接运算,首先都是行交叉接(cross join),得出最大的可能果集。如果左表有n 行,右表有m行,则结果集有n x m 行,求笛卡儿,生成虚VT1-J1

b. ON 筛选器。上个步生成的VT1-J1 筛选,根据ON 子句中出谓词进筛选让谓词值为true 的行通了考,插入到VT1-J2

c. 于外接(leftrightfull outer join),需要添加外部行。在上个步中,ON 条件剔除掉了所有不匹配两表的行。但是在外接中,通指定外接的型,需要将其

中的一个或者两个表标记为保留表,并返回表中所有的行。所以这时需要将保留

表中被ON 筛选条件剔除的行重新加入到果集中(些重新加来的表,中称

部行),并将外部行中非保留表的列值标记为NULL,生成VT1-J3一个步,只

有外接才行,于内接(inner join)只需要a b 两个步的。

概括地FROM 段就是预处理的,根据提供的运算符对语句中提到的各个表理(除了joinapplypivotunpivot

2)WHERE 段:

WHERE 段是根据中条件VT1 中的行筛选条件成立的行才会插入到VT2 中。此,因为还没有数据行分,所以在where 子句中不能聚合。也不能引用select 列表中建的名,因SELECT 在后面。

另外,于包含JOIN 查询,到底ON WHERE 子句有什么区应该什么候使用ON子句,什么候使用where 子句?只有于外接,ON where 子句才会存在逻辑,因在外接中,通ON 子句的筛选之后,保留表行外部行添加,where 子句是在外部行添加之后才筛选的。因此,ON 子句对这种外接的情况的筛选,并不是最果,在FROM 段的第三个步会把外部行添加回来的。而于内接,where子句和on 子句作用是完全一的,在哪里筛选都是同种效果,没有其他步。所以在种含有外接的查询,一定要注意ON 筛选where 筛选的区,避免使用了,达不到筛选的效果。另外,于内接,一个不的建是,于两个表都存在的字段筛选,用ON 子句,个表的字段筛选,用where,例如:select * from a inner join b on a.col = b.col where a.col2>1

3)GROUP BY

GROUP 段按照指定的列名列表,将VT2中的行行分,生成VT3。最后每个

只有一行。

4)HAVING

该阶段根据HAVING 子句中出谓词对VT3 的分组进筛选,并将符合条件的插入到VT4中。HAVING 筛选器是唯一能筛选数据的筛选器,ON where 都不行。理由很简单ON where 都是在分之前理的,自然不能组进筛选. 所以HAVING WHERE 的区,也是很而易了。HAVING 只能与 SELECT 句一起使用。HAVING 通常在 GROUP BY 子句中使用。如果不使用 GROUP BY 子句,HAVING 的行WHERE子句一

5)SELECT

段是投影的程,SELECT 子句提到的元素,VT5个步一般按下列行:

a. SELECT 列表中的表达式,生成VT5-1

b. 若有DISTINCT则删VT5-1 中的重复行,生成VT5-2

c. 若有TOP根据ORDER BY子句定逻辑顺序,从VT5-2 选择签名指定

数量或者百分比的行,生成VT5-3

6)ORDER BY

根据ORDER BY子句中指定的列明列表,VT5-3 中的行,行排序,生成游VC6.

集合和游:

SQL 的理是集合,集合是无序的,它只是成的一种逻辑集合。有排序作用ORDER BY子句的查询,可以返回一个象,其中的行按照特定的组织在一起。ANSI 象成cursor)。因一步中,最后返回的是游所以order by 查询,是不能用来定义视图,子查询,公用表等。例如:

SELECT * FROM (SELECT col1,col2 FROM tab_test ORDER BY col1)是无效的,并且将报错当然SQL SERVER 实际查询过程中,有查询优化器来生成实际的工作划。以何序来访问表,使用什么方法和索引,用哪种接方法,都是由查询优化器来决定的。

 

<ul class=\"\\" list-paddingleft-2\">

  • 量:

于一种言来是必不可少的成部分。

量的作用:

§ 为计数器算循环执行的次数或控制循环执行的次数。

§ 保存数据以供控制流测试

§ 保存存储过程返回代要返回的数据或函数返回

§ SQL SERVER 2008 可以在定义变立即赋值

 

Transact-SQL 言允使用两种量:

一种是用自己定的局部(LocalVariable)

另一种是系提供的全局(GlobalVariable)

1)、局部量:

局部量使用自己定量,它的作用范近在程序内部。通常只能在一个批理中或存储过程中使用,用来存从表中查询到的数据,或当作程序程中使用,局部量使用DECLARE 句定,并且指定量的数据型,然后可以使用SETSELECT 为变量初始化;

局部量必以“@”开,而且必先声明后使用。形:@S1

其声明格式如下:

DECLARE @量名[,@量名]

SELECT @局部=

SET @局部=

例:在Demo_DB 数据TimeRecords 表中用名@emp 的局部索所有以P11034

emp_id 打卡信息,代如下:

declare@emp varchar(20)

select@emp = ‘p110343%‘

select* from TimeRecords

whereemp_id like @emp

果:

Id clock_id emp_id join_id depart_id card_id

2385 105 P1103432 12443 01101003 2852036222

2539 105 P1103432 12443 01101003 2852036222

4573 105 P1103432 12443 01101003 2852036222

5557 102 P1103436 12447 01100502 2619730638

注意:如果声明字符型的局部量,一定要在型中指明其最大度,否统认为1

Select set

l select 功能大一点,可以一次多个量同时赋值

l 当源操作数不,目的操作数都等于源操作数(二者此是一的)

l 当源操作数空(NULL,用set ,目的操作数空,用select ,目的操作数不改

declare@s1 varchar(10),@s2varchar(10) ,@s3 varchar(10)

set @s1=10

set @s2=10

set @s3=10

declare@s1 varchar(10),@s2varchar(10) ,@s3 varchar(10)

select@s1=‘10‘, @s2= ‘10‘, @s3= ‘10‘

2)、全局量:

全局量是SQL Server 内部使用的量,起作用范并不局限于某一程序,而是任何程序均可随时调用。全局量通常存一些SQL Server 的配置和效能统计数据。可在程序中用全局量来测试Transact_SQL命令行后的状态值

引用全局,全局量的名字前面要有两个标记符“@@”。不能定与全局量同名的局部.形如:@@s1

全局量及其功能:

全局 功 能

@@CONNECTIONSSQL Server 最近一次启以来登试图的次数

@@CPU_BUSYSQL Server 最近一次启以来CPU Server 的工作时间

@@CURRSOR_ROWS返回在本次接最新打开的游中的行数

@@DATEFIRST返回SETDATEFIRST 参数的当前

@@DBTS数据的惟一时间标记值

@@ERROR生成的最后一个错误,若0 成功

@@FETCH_STATUS最近一条FETCH 句的

@@IDENTITY保存最近一次的插入身份

@@IDLECPU 器最近一次启以来的累闲时间

@@IO_BUSY出操作的累计时间

@@LANGID当前使用的言的ID

@@LANGUAGE当前使用言的名称

@@LOCK_TIMEOUT返回当前的超时设

@@MAX_CONNECTIONSSQL Server 的最大接数量

@@MAX_PRECISION制与数据型的精度级别

@@NESTLEVEL当前用存储过程的嵌套,范围为016

@@OPTIONS返回当前SET 选项的信息

@@PACK_RECEIVED入包数量

@@PACKET_SENT所写的出包数量

@@PACKET_ERRORS与写数据包的错误

@@RPOCID当前存储过程的ID

@@REMSERVER返回程数据的名称

@@ROWCOUNT最近一次查询涉及的行数

@@SERVERNAME本地服器名称

@@SERVICENAME当前运行的服器名称

@@SPID当前程的ID

@@TEXTSIZE当前最大的文本或像数据大小

@@TIMETICKS每一个独立的算机报时信号的(ms)数,报时信号31.25ms 1/32s

@@TOTAL_ERRORS程中的错误数量

@@TOTAL_READ次数(不是高速)

@@TOTAL_WRITE写磁次数

@@TRANCOUNT当前用的活务处

@@VERSION当前SQL Server 的版本号


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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。