菜单

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

2019年8月16日 - MySQL

先是看下边一条相比较到位语句,都以比较宽泛的非常重要字。

明天和豪门一块儿来分享一下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(串, 开第一地方,
长度):重回从字符串左侧’起首地点’起数据为’长度’的字符串。个中表明式能够是字符串或二进制串或含字段名或字符型变量的表明式。在此地要小心一下SUBSTRAV4ING()函数无法用于TEXT
和IMAGE 数据类型;

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

Len(串)
:重返表达式的尺寸。注意它回到的是字符数,并不是字节数。不总计串尾空格;

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

Replace(‘串1′,’串2′,’串3’):用串3替换串第11中学出现的装有串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.像上边的 “YEA福特Explorer(orderdate)” SQL Server 只对它运维二遍 
能分辨查询中重复使用的一模二样表明式

6.最佳别使用 select * 即便你要查询 全数字段。

7.施用 order by 对有恢宏再度的字段实行排序是于事无补的  例如对日期进行排序
那样一个排序选10条 会有七个被感到是对的结果
所以大家要确认保证排序字段的多寡独一性, 以及在 select distinct  时 排序
会导致 单个结实对应三个源数据行。

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图