T-SQL:SQL语句处理顺序的坑(四)

发布时间:2018-11-17  栏目:SQL  评论:0 Comments

率先看下面一长长的比较形成语句,都是较普遍的严重性字。

今跟豪门齐声来分享一下SQL语句,T-SQL的用法及语法,以及一些例证,目的是拉大家一同来复习一下T-SQL的主导语句,以便在项目中更高速的使,当然对新手来说即使更应去念与小结了。我个人感觉数据库及时点对程序员来说挺重要,无论是对于JAVA程序员还是DOTNET程序员和其它编程人员来说都是须控制的。为了帮助大家更好之往返顾T-SQL,本人使用空闲的日子整理的一瞬T-SQL的说话和语法。希望对大家有用!

USE Temp;

SELECT empid, YEAR(orderdate) AS orderyear, COUNT(*) AS numorders
FROM Sales.Orders
WHERE custid = 71
GROUP BY empid, YEAR(orderdate)
HAVING COUNT(*) > 1
ORDER BY empid, orderyear;

哼之!我们先行来拘禁几乎独图像:

咱俩来详细分析一下sql语句的逻辑处理顺序,虽然select在各级条告词的首先各类,但实际她是叫最终才处理的

棱形图片 1三角形图片 2正方形图片 3圆形图片 4矩形图片 5梯形图片 6

1.from  

地方这些图都是用T-SQL实现之,文章的末段咱们一道来所以T-SQL画来这些图。

2.where

率先,我们开回忆一下T-SQL的为主语法:

3.group by

函数

abs(x):求绝对值

例:    select abs(-3)     值为:3

sqrt(x)恳请平方根

例:    select sqrt(4)     值为:2.0

rand([0])返回0~1之间的随机float值

floor(X):返回小于或顶X值的最为可怜整数

例:    select floor(34.5)   值为:34

ceiling(X):返回大于或等于X值的最小平头;

例:    select ceiling(34.5)  值为:35

round(x,length):四放弃五切函数,length为正,则针对X小数员数季放弃五抱,length为因,则指向X从小数点左边length号从四放弃五称,若length既为负数且其绝对值超过X整数部分    
数字只数,则函数值为0;

图片 7)

例:    select ROUND(63.567, 1)      值为:63.600

      select ROUND(63.567, -1)     值为:60.000

      select ROUND(63.567, 0)      值为:64.000

      select ROUND(63.567, -3)       值为:0.000

图片 8)

Sign(X):求符号函数,X>0则sign(x)=1;
X=0
则sign(X)=0;X<0 则sign(X)=-1

例:     select sign(-3)        值为:-1

        select sign(3)        值为:1

        select sign(0)         值为:0

Power(X,y):求X的y次方;

例:    select power(4,2)    值为 :16

 

4.having

字符串函数

ASCII(串):返回字符表达式最左端字符的ASCII
码值;

例:    select ASCII('bc')   值为:98

CHAR(ASCII码):用于将ASCII
码转换为字符,如果没有输入0 ~ 255 之间的ASCII
码值,返回值为NULL ;

例:    select char(97)    值为:a

Lower(串):把字符串全部变换为稍写;    

例:    select lower('QingPingGuo')     值为: qingpingguo

Upper(串)
:把字符串全部换为非常写;

例:    select upper('QingPingGuo')    值为: QINGPINGGUO

LTrim(串), RTrim(串):去丢左右空格;

 例(去左空格):  select '博客园'+LTrim('   青苹果   ')+'博客园'    值为:博客园青苹果    博客园

space(个数):返回指定个数的空格;

replicate(串,次数):将串重复指定次数;

例:    select replicate('青苹果',2)    值为:青苹果青苹果

Left(串, 个数):返回就清楚错由左侧开始指定个数的字符;

例:    select left('青苹果在博客园', 4)    值为:青苹果在

Right(串, 个数):返回就知晓错由右边开始指定个数的字符; 

例:    select right('青苹果在博客园', 4)    值为:在博客园

DataLength(串):返回串的字节数长度,计算串尾空格。可以据此其检查varchar,text等的动态长度;

例:    select datalength('青苹果在博客园')    值为:14

SubString(串, 开始位置,
长度):返回从字符串左边’开始位置’起数据也’长度’的字符串。其中表达式可以是字符串或二迈入制串或含字段名或字符型变量的表达式。在此间而留心一下SUBSTRING()函数不克用于TEXT
和IMAGE 数据类型;

例:    select substring('青苹果在博客园',5,2)     值为:博客

Len(串)
:返回表达式的尺寸。注意她回到的是字符数,而未是许节数。不计算串尾空格;

例:    select   len('青苹果cnblogs    ')      值为:10

Replace(‘串1′,’串2′,’串3’):用串3同换串1被出现的备串2字符;

例:    select replace('青苹果在北京','北京','博客园')    值为:青苹果在博客园

Stuff(串1, 开始位置, 长度, 串2):删除串1指定位置上马指定长度的字符串,并于指定位置插入错2;

例:    select stuff('青苹果是程序猿吗?',5,3,'攻城狮')    值为:青苹果是攻城狮吗?

reverse(串)
:将点名的字符串的字符排列顺序颠倒;

例:    select reverse('12345')    值为:54321

charindex(串1,串2):返回串1以串2的起来位置,可于所给出底‘开始位置’进行搜索;

例:    select charindex('guo','qingpingguo')    值为:9

 

5.select

转移函数

所谓转换函数就是管某种数据类型转换的表达式显示转换成任何一样种多少类的函数。
CAST(表达式 AS 数据类型[(长度)])

例:  select  '今天是:' + Cast(GetDate() as char(10))  值为:今天是:07 23 2012

CONVERT(转换后的对象数据类型[(length)],表达式[style])

例:  select  '今天是:' +convert(char(10),getdate())    值为:今天是:07 23 2012

下面来拘禁一个求差值的函数datediff函数;

DATEDIFF(datepart,date1,date2)

例:  select  datediff(yy,'1988.09.14','2012.12.21')  值为:24
    select  datediff(mm,'1988.09.14','2012.12.21')  值为:291

6.order by

聚合函数

聚合函数也不怕是统计函数,它至关重要是针对同样组值进行测算,它的功效分别是:求和(sum)、求最好小(min)、求最好特别(max)、求总行多次(count)、求平均值(avg)

例:   求和:select sum(Name) from TableName
       求最小:select min(Name) from TableName
       求最大:select max(Name) from TableName
      求总数:select count(Name) from TableName
      求平均:select avg(Name) from TableName

7.TOP

T-SQL的局部主要字

Print  通往客户端返回用户信息

例:  print '青苹果'         屏幕上就会显示“青苹果三个字“

Go     
于是来通知SQL一批判语句之了断

Distinct   错开掉重复值

Declare    为此来声称变量

例:  declare @a int

Set    否变量赋值

例:  set @a='青苹果'

While 
以SQL中之所以来循环(好像在SQL中因故来开巡回的重要性字不多)

图片 9)

语法:    WHILE <条件表达式>
                 BEGIN
                    <命令行或程序块>
                   [BREAK]
                   [CONTINUE]
                   [命令行或程序块]
                 END

图片 10)

While比较重大,我们来开只例子加深一下针对While循环的知晓:

图片 11)

declare @a int
set @a=1
while @a<5
begin 
print '青苹果'
set @a=@a+1
end

输出结果:青苹果
     青苹果
     青苹果
     青苹果

图片 12)

if else    判定语句

认清语句用之尚是于多之我们要来做只例证说明一下;

求:a、b、c三独数之尽酷价值?

图片 13)

declare  @a int,@b int,@c int,@max  int
set @a=1 set @b=2 set @c=3 
if  @a>@b               
   set  @max=@a
else
   set  @max=@b
if  @max<@c
   set  @max=@c      
print   @max

输出结果:3

图片 14)

begin end 
所以来设定一个程序块,将于BEGIN…END内之拥有程序视为一个单元执行。

Exists     认清是否留存

Case  
呢是因此来判断的,和IF语句差不多,它的格式为:

 CASE  <运算式>
        WHEN <运算式1> THEN  <结果1>
          … 
           WHEN<运算式n> THEN   <结果n>
          [ELSE  <结果n+1>]
  END

 Return
  用来了时次的施行,返回到直达一个调用它的程序要其他程序。在括号内可指定一个回到值。

Goto标示符 
所以来改变程序执行的流水线,使程序跳到号出标识符的指定的程序实施还累于下实施。要顾的是作跳转目标的标识符可为数字和字符的结缘,但不能不盖“:”结尾,如:“1023:”
“qingpingguo:”

图片 15)

例子:
        declare @a int 
       set @a = 1  
     qingpignguo:       
     print @a       
       set @a = @a + 1 
       while @a < 6   
      goto qingpignguo

输出结果:12345

图片 16)

末了一个被大家看个好游戏的:

Waitfor   
之所以来刹车程序执行,直到等待指定时间之后,或所设定的时刻曾届才继续往下运作程序。

语法:  waitfor {delay '时间'|time '时间'}

解释:

(1)‘时间’必须也DATETIME类型数据,且非可知连日期,如‘10:12:05’

(2)DELAY:用来设定等待的年月长度,最多啊24钟头。(是一个时距离)

(3)TIME:用来设定等待了之时间点(是一个现实的时空)

例子:
    waitfor  delay '00:00:03'
   print '你好,我是青苹果'
   go

以上就是T-SQL的装有内容了,接下去我们来以最后之时日打几独图形:

直角三角形:

图片 17)

declare @a int 
set @a=1
while(@a<11)
begin
print replace(space(@a),' ','*')
set @a=@a+1
end

图片 18)

直角三角形 输出结果:图片 19

 

正方形:

图片 20)

declare @a int
declare @b int
declare @c nvarchar(100)
set @a=1
set @b=1
set @c=''
while (@a<9)
begin
   while (@b<15)
   begin 
    set @c=@c+'*'
    set @b=@b+1
   end
    print @c 
set @a=@a+1
end

图片 21)

 

正方形 输出结果:图片 22

 

菱形:

图片 23)

declare @a int,@b int
set @a=1 set @b=15

if(@b%2!=1)
print '数字必须都是奇数'
else
while(@a<=@b)
begin
if(@a%2=1)
print space((@b-@a)/2)+replace(space(@a),' ','*')+space((@b-@a)/2)
set @a=@a+1
end
set @a=@a-2
while (@a<=@b)
begin
if(@a%2=1)
print space((@b-@a)/2)+replace(space(@a),' ','*')+space((@b-@a)/2)
set @a=@a-1    
if (@a<0)
break
end

图片 24)

菱形 输出结果:图片 25

 

梯形:

图片 26)

declare @a int,@b int
set @a=7 set @b=21
if(@a%2=1)
while(@a<@b)
begin
print space((@b-@a)/2)+replace(space(@a),' ','*')+space((@b-@a)/2)
set @a=@a+2
end

图片 27)

梯形 输出结果:图片 28

 

矩形:

图片 29)

declare @a int
declare @b int
declare @c nvarchar(100)
set @a=1
set @b=1
set @c=''
while (@a<9)
begin
   while (@b<23)
   begin 
    set @c=@c+'*'
    set @b=@b+1
   end
    print @c 
set @a=@a+1
end

图片 30)

矩形 输出结果:图片 31

 

圆形:

图片 32)

declare @a int,@b int
set @a=9 set @b=13

while (@a<=@b)
begin
if(@a%2=1)
print space((@b-@a)/2)+replace(space(@a),' ','*')+space((@b-@a)/2)
set @a=@a+1
end
set @a=@a-1
begin
print space((@b-@a)/2)+replace(space(@a),' ','*')+space((@b-@a)/2)
end
while (@a<=@b)
begin
if(@a%2=1)
print space((@b-@a)/2)+replace(space(@a),' ','*')+space((@b-@a)/2)
set @a=@a-1
if(@a<10)
break
end
set @a=@a-2
begin
print space((@b-@a)/2)+replace(space(@a),' ','*')+space((@b-@a)/2)
end

图片 33)

环输出结果:图片 34

The End!
以上就是本文的备内容,可能勾的不够完美,有欠缺之地方要大家多补充,多多发表意见!谢谢!

在仔细分析每个执行各个代表的意 (它的实际顺序)

FROM Sales.Orders
WHERE custid = 71
GROUP BY empid, YEAR(orderdate)
HAVING COUNT(*) > 1
SELECT empid, YEAR(orderdate) AS orderyear, COUNT(*) AS numorders
ORDER BY empid, orderyear;

1.由 Orders 表查询数据

2.基于规则筛选客户ID等于71之

3.针对性客户id和订单年度 进行分组

  1. 又选出大于一个订单的组

5.回去查询有的数据 以及你要显的字段

6.末段指向客户id 和订单 进行排序

7.输出

输入的键入顺序及拍卖顺序不雷同是生由之,SQL设计师是以吃用户以英文的办法供温馨之呼吁

建议、坑

  1. from 表时  最好给定 库名和表名  Sales.Orders 
    让表显示表示 不用程序检索。
  1. where 子句相当重大  SQL Server 会对where 条件
    进行评估访问请求数据而用的目录,通过索引可以大大减少表扫描时间

而 where 子句检索 完成后 
它回到的凡摸索结果为True的行  ,但始终铭刻, SQL
数据库使用三价值谓词逻辑,也就是说有三只结实。

True,False 或 UNKNOWN ,  返回true 行 并无等同于
不回False  实际上是免回去 False 行 和 UNKNOWN 行
以后会还博客中特意讲NULL。

3.记住除count(*)之外, 
聚合函数还是忽视NULL标记  如果起雷同组数“1,1,3,4,5,null”列名为qty  
表达式Count(*) 返回的是6 但是
Count(qty)

举凡5  count中加以显示值 就会默认寻找都知值 
也足以  count(distinct qty ) 返回的是4 去还  这个 可以为此来 处理 
返回每个不另行统计问题非常方便 它和 select
distinct
有不行非常性区别 以后会仔细讲 也足以
sum(distinct qty
) 是13
也是为此作统计不重复数据。

4.因 group by
属于行处理 在having 先计算所以having 中可以出现  聚合函数 。

5.像上面的 “YEAR(orderdate)” SQL Server 只对她运行一不好 
能辨识查询中重复使用的等同表达式

6.极其好别使用 select * 尽管你而查询 所有字段。

7.使 order by 对产生大气复的字段进行排序是没用的  例如对日期进行排序
这样一个排序选10长长的 会有多单让当是本着之结果
所以我们设保排序字段的多寡唯一性, 以及当 select distinct  时 排序
会导致 单个结实对承诺多单源数据行。

 

留下评论

网站地图xml地图