SQL Server数据库第四课:数据库查询机制、使用select语句进行条件查询,掌握order by排序,熟悉常用的系统函数

版权声明:王迪 https://blog.csdn.net/dnruanjian/article/details/89310442

知识点:理解查询的机制、使用select语句进行条件查询、掌握order by排序,熟悉常用的系统函数。

1、T-SQL 查询机制

        生活中也有很多查询,比如查询考试成绩地域60分的,要进行补考;查询身高大于175cm的男生可以参加某项活动……

        对于程序员来说,大多数情况下是针对数据库已有的数据进行查询,以获得数据。那么数据库是如何进行查询的呢?其实可以理解为“筛选”,将符合条件的数据抽取出来。

        数据库在接收到查询请求的时候,可以简单理解为它将“逐行判断”,判断是否符合查询条件。如果符合查询条件,就把数据抽取出来,然后把所有被选中的行组织在一起,形成另外一个类似于表的结构,构成查询的结果,通常叫做记录集

        由于记录集的结构实际上和表的结构类似,都是由行组成的,因此在记录集上依然可以进行再次查询。

举例:查询学生信息表中,性别为“女”的学生

查询结果:

 

2、使用select语句进行查询

使用SELECT语句查询数据(简单格式),语法:

扫描二维码关注公众号,回复: 5960883 查看本文章

select 列名 

from 表名 

[where  查询条件表达式 ]

[order by 排序的列名 [asc 或 desc]];

  • 列名:可以查询一列数据,也可以查询多列数据,如果是多列,列名与列名 之间用英文逗号隔开
  • 表名:从哪个表中查询数据,要指明。
  • where子句:where是可选项,如果不限制,则查询返回所有行的数据。
  • order by子句:order by是可选项,对查询结果进行排序。

2.1 使用SELECT语句查询表中所有数据

语法:select * from 表名;

  • * 表示所有的列

前提条件:至少有一个数据库表,才能查询。

前期准备:这里为了方便后续查询,完整的创建了数据库、数据库表、并且向表中插入几行数据。

--创建一个数据库
create database SchoolDB;
--使用数据库
use SchoolDB;
--创建数据库表
create table Student(
	StudentNo int primary key identity(1831301,1),      --每一列设置完成以后,用英文逗号隔开
	Names nvarchar(30) not null,
	Gender char(2) not null,
	Age int not null,
	Major int not null,
	Works nvarchar(20)                                  --最后一列不需要逗号
);
--一次插入多行数据
insert into Student(Names,Gender,Age,Major,Works)
select '倪大红','男',28,1,'都挺好' union                --每一行数据以select开头,union结尾
select '谢娜','女',17,3,'快乐大本营' union
select '姚晨','女',18,1,'都挺好' union
select '蔡徐坤','男',16,1,'偶像练习生' union
select '杨幂','女',18,1,'三生三世' union
select '李彦宏','男',24,4,'百度' union
select '马化腾','男',25,4,'腾讯QQ' union
select '何炅','男',21,3,'快乐大本营' union
select '李荣浩','男',18,2,'模特' ;                      --最后一行数据,不需要union

此时表中已有数据信息,使用select语句查询表中所有信息

--查询表中所有信息
select * from Student;

2.2 查询部分行或列

select 列名1,列名2,列名3,……

from student

where Major=1 ;

举例:查询表中专业代号是1的学生信息,显示学生的编号、姓名、年龄。

select StudentNo,Names,Age
from Student
where Major=1;

思考:查询满足多个条件的数据信息

举例:查询专业代号为1,且性别是女,的学生信息,显示学生编号、姓名、性别

--查询专业代号为1,且性别是女,的学生信息,显示学生编号、姓名、性别
select StudentNo,Names,Gender
from Student
where Major=1 and Gender='女';

思考:查询专业代号为1或者4,且性别是男,的学生信息,显示学生编号、姓名、性别、专业代号

select StudentNo,Names,Gender,Major
from Student
where (Major=1 or Major=4) and Gender='男';      --可以适当运用小括号进行条件设置

查询结果:

2.3 查询结果显示列的别名

举例:查询表中专业代号是1的学生,显示学生编号、姓名、专业三列信息,并且给这三列起个别名。

注意:有3种方法,给新的记录集里面的列起别名:

  • 列名 as 别名
  • 别名=列名
  • 列名 空格 别名

别名的另外一种使用情况:计算、合并得到新列的命名。

注意:列名1+’.’+列名2 as 别名;别名=列名1+’.’+列名2

  •       +连接的数据类型必须兼容。(即数字和数字类型可以合并,字符和字符类型可以合并)
  •       如果+连接字符型数据,结果为字符串数据的连接。(示例中用英文符号.进行字符分隔)
  •       如果+连接数值型数据,结果为数值的和。
select Names,StudentNo,Major,Age,Names+'.'+Works as 姓名作品,专业年龄 = Major+Age
from Student
where Major=1;

注意:此处举例并不恰当,一般是进行有意义的合并。如将考试成绩的不同列进行合并、如将姓和名分开的内容进行合并等。

2.4 查询空值

前期准备:往数据库里插入一行有空值的数据。

--插入一行有空值的数据
insert into Student values ('张三','男',18,2,null );   --输入null和''是有区别的,null表示什么都没有
insert into Student values ('李四','女',18,2,'' );     --输入'',表示输入空的字符串

查询信息表中某一列的值是否为空或者不为空用is null 或者 is not null来判断

注意:观察查询结果,只有一行数据显示出来,为什么?(空字符串也是一种内容,就像我们输入框里敲一个空格,看起来是空白,但实际上占用空间了)

测试:查询作品列有数据的信息

2.5 在查询的记录集中新添加常量列

适用情况:数据中本来没有某一列的数据,但是查询给出记录集的时候,新增加一列

--查询学号、姓名、性别,并增加一列地址为“湖北武汉”
select StudentNo,Names,Gender,'湖北武汉'as 地址
from Student;

注意:查询所有数据行时,不能使用此语句

2.6 查询返回限制的行数

适用情况:数据较多时,查询返回数据只取前10行或者前20%

--查询表中前5个学生的信息
select top 5 * from Student;
--查询表中20%的学生信息
select top 20 percent * from Student;
--查询表中前5个学生的学号、姓名、性别
select top 5 StudentNo,Names,Gender from Student;

注意:按百分比提取记录,top 20 percent

 

2.7 对查询结果进行排序

适用情况:对查询结果进行排序,使用order by 列名 [ASC 或 DESC]

ASC表示升序,也是默认值,DESC表示降序。

--查询学生的学号、姓名、性别、年龄,并按年龄降序排列
select StudentNo,Names,Gender,Age 
from Student
order by Age desc;

2.8 查询时同时使用where和border by子句

注意:当同时使用where子句和order by子句时,where子句必须放在order by子句的前面。即先筛选出符合条件的结果,再对结果进行排序。

-- 查询年龄小于21岁的学生,编号、姓名、年龄、并按照年龄进行升序排列
select StudentNo,Names,Age
from Student
where Age<21
order by Age asc;

思考:年龄为18的有多个学生?能否设置先按年龄排序,年龄相同的再按姓名排序?

-- 查询年龄小于21岁的学生,编号、姓名、年龄、并按照年龄进行升序排列,年龄相同的数据,再按照姓名进行升序排列
select StudentNo,Names,Age
from Student
where Age<21
order by Age asc,Names asc;

总结:排序时,可以有多个列设置。order by 列名1 asc,列名2 desc……

3、在查询中使用函数

       SQL Server提供了一些内部函数,函数做什么用的?实现不同的功能,比如返回字符串的长度、通过出生日期和系统日期计算当前年龄……不同类别的函数都可以和 SELECTUPDATEINSERT 语句联合使用,常用的函数有以下几个分类:字符串函数、日期函数、数学函数、系统函数。

字符串函数:用于控制返回给用户的字符串。如:获取字符串的长度、将字符串转换为大写、替换字符等

日期函数:用于操作日期指。如:获取当前系统日期、两个日期之间的指定日期部分的间隔

数学函数:用于对数值进行代数运算。如:返回从0到1之间的随机数、将数值表达式四舍五入为指定精度

系统函数:获取有关SQL Server中对象和设置的系统信息。如:转变数据类型、返回当前所登录的用户名称(欢迎xxx登录)

 

3.1 字符串函数

字符串函数哟用于对字符串数据进行处理,并返回一个字符串或数字。

函数名 描述 举例 返回结果 备注
charindex 用来寻找一个制定的字符串,在另一个字符串中的起始位置。 select charindex ('test','this Test is test'); 6 对查询的字符串大小写不敏感
select charindex ('test','this Test is test',7); 14
len 返回传递给它的字符串的长度 select len('SQL Server 课程');  13 空格也会计算一个长度
upper 把传递给它的字符串转换为大写 select upper ('SQL Server 课程');  'SQL SERVER 课程' 只对英文起作用
ltrim 清除字符左边的空格 select ltrim(' SQL Server 课程 ');  'SQL Server 课程 ' 只删除最左边的空格
rtrim 清除字符右边的空格 select rtrim(' SQL Server 课程 ');  ' SQL Server 课程' 只删除最右边的空格
right 从字符串右边开始,返回指定数目的字符 select right(' SQL Server 课程 ',3);   '课程 ' 空格也包括在内
replace 将字符串中的某个字符,替换成指定的字符 select replace(' SQL Server 课程 ','S','s');  ' sQL server 课程 '  
stuff 在一个字符串中,从指定位置开始,删除指定长度的字符,并在该位置插入一个新的字符串 select stuff(' SQL Server 课程 ',3,2,'测试');    ' S测试 Server 课程 '  

3.1.1  Charindex用来寻找一个指定的字符串在另一个字符串中的起始位置

 

select charindex('test','this Test is test');     --不指定位置时,默认从第一个字符串开始计算,返回结果:6
select charindex('test','this Test is test',7);   --数字7,代表从第7个字符串开始计算,返回结果:14
select charindex('a','helloabc');                 --返回6
select charindex('a','Ahelloabc');                --返回1

注意:对查询的字符串大小写不敏感对空格也计算字符;可以指定从第几个字符开始计算

总结语法:charindex(‘指定的字符串’,’要查询的字符串’,从第几个字符串开始查询);

 

3.1.2  Len返回传递给它的字符串长度(计算字符串长度)

--len函数:返回传递给它的字符串长度,返回结果:int类型
select len('SQL Server 课程');      --返回结果:13(注意:空格也计算)
select len('sqlserver');            --返回9
select LEN('sql server');           --返回10
select LEN('sql课程');              --返回5
select LEN('sql,c#');               --返回6
select works ,len(works) as 作品字符长度 from Student;   --在表中的应用

注意:返回长度,空格也计算一个;中文占用一个;标点符号也会占用一个

总结语法:len(‘要查询长度的字符串’);

适用场景:用户注册账号时,检验输入密码是否满足长度要求。

 

3.1.3   Upper将传递给它的字符串转换为大写

select upper ('SQL Server 课程');   --返回结果:'SQL SERVER 课程'

注意:仅对英文起作用

总结语法:upper(‘要转换的字符串’);

3.1.4  Ltrim清除字符串左边的空格

select ltrim(' SQL Server 课程 ');  --返回结果:'SQL Server 课程 '

注意:从字符串起始位置开始清除左边的空格,字符串中间的空格不会清除

总结语法:ltrim(‘要清除左边空格的字符串’);

3.1.5   Rtrim清除字符串右边的空格

select rtrim(' SQL Server 课程 ');  --返回结果:' SQL Server 课程'

注意:清除右边空格,结果展现不明显,可以用两个语法对比。

语法: rtrim(‘要清除右边空格的字符串’);

3.1.6  Right从字符串右边返回指定数目的字符串

select right(' SQL Server 课程 ',3);  --数字3,代表从字符串右边开始,返回3个字符,空格也计算在内。返回结果: '课程 '

注意:从字符串最后边开始计数,从1开始计数

总结语法:right(‘指定的字符串’,要提取的字符数量);

思考:求email列的域名([email protected]

select right('[email protected]',len('[email protected]')-charindex('@','[email protected]'));  --返回结果:'qq.com'

解题思路:

  • 第一步:先计算email的总长度,然后计算包括@在内的前面字符串的长度
  • 第二步:总长度—@前面的长度=域名的长度
  • 第三步:利用right得出email右边的字符(域名长度的字符即域名)

3.1.7  Replace替换一个字符串中的字符

select replace(' SQL Server 课程 ','S','s');           --返回结果:' sQL server 课程 '
select replace(' SQL Server 课程 ','课程','数据库');   --返回结果: ' SQL Server 数据库 '
select replace(' SQL Server 课程 ','数据库','课程');   --返回结果: ' SQL Server 课程 '
select replace(' SQL Server 课程 ',' ','-');           --返回结果:'-SQL-Server-课程-'

总结语法:replace(‘指定的字符串’,‘字符串中原有的字符’, ‘替换以后的字符’);

适用场景:批量替换列值中的某个字符串(用到更新数据)

--replace函数应用:将数据库表Student中Names列中,将“李”替换成“li”
update Student set Names=replace(Names,'李','li');

3.1.8  Stuff在一个字符串中,从指定位置,删除指定长度的字符,并在该位置插入一个新的字符串

--stuff函数:在一个字符串中,从指定位置开始,删除指定长度的字符,并在该位置插入一个新的字符串
select stuff(' SQL Server 课程 ',3,2,'测试');          --返回结果:' S测试 Server 课程 '

总结语法:replace(‘指定的字符串’,指定的位置数字,删除字符串的长度数字, ‘新插入的字符串’);

3.2 日期函数

        日期函数用于操作日期值,我们不能直接对日期运用数学函数(如加减乘除和取模),为什么?因为日期有年月日,如果要执行“当前日期+1”,sql无法理解是增加一年、一月、还是一日。那在现实生活中,如果要计算怎么办?比如登录账号多次失败以后,系统提示一天后才能再次登录。我们可以借助日期函数,来提取年月日,以便分别进行操作。

函数名 描述 举例 返回结果
getdate 获取当前的系统日期 select getdate(); 2019-04-20 18:46:48.040
dateadd 将指定的数值添加到,指定日期部分后的日期(在指定日期上添加日、月、年) select dateadd(yy,1,'2019-04-20');      2020-04-20 00:00:00.000
select dateadd(mm,2,'2019-04-20');      2019-06-20 00:00:00.000
select dateadd(dd,1,'04/20/2019');     2019-04-21 00:00:00.000
select dateadd(dd,4,getdate());         2019-04-24 19:37:54.223
datediff 两个日期之间的指定日期部分的间隔(比如计算两个年份、月份、日期的结果)返回的是整数 select datediff(yy,'1999-11-23',getdate());  20
select datediff(mm,'1999-11-23',getdate()); 233
select (datediff(mm,'1999-11-23',getdate())/12);  19
datename 获取日期中指定日期部分的字符串形式(将系统时间转换成字符串) select datename(dw,'2019-04-20'); 星期六
select datename(qq,getdate());  2
select datename(dy,getdate());  110
select datename(wk,getdate());  16
datepart 获取日期中指定日期部分的整数形式 select datepart(yy,getdate());  2019
select datepart(mm,'2019-04-20'); 4
select datepart(dd,getdate()); 20

3.2.1  Getdate取得当前的系统日期

--Getdate函数:获取当前的系统日期
select getdate();              --返回结果:2019-04-20 18:46:48.040

总结语法:getdate();

3.2.2 Dateadd将指定的数值添加到指定日期部分后的日期(在指定日期上添加日、月、年)

--dateadd函数:将指定的数值添加到,指定日期部分后的日期(在指定日期上添加日、月、年)
select dateadd(yy,1,'2019-04-20');     --返回结果:2020-04-20 00:00:00.000
select dateadd(mm,2,'2019-04-20');     --返回结果:2019-06-20 00:00:00.000
select dateadd(dd,1,'04/20/2019');     --返回结果:2019-04-21 00:00:00.000
select dateadd(dd,4,getdate());        --返回结果:2019-04-24 19:37:54.223

总结语法:dateadd(指明要加在日期的哪个部分,要增加的数字,‘日期’);

3.2.3  Datediff两个日期之间的指定日期部分的间隔(精确计算年龄)返回的是整数

--datediff两个日期之间的指定日期部分的间隔(比如计算两个年份、月份、日期的结果(常用来精确计算年龄))返回的是整数
select datediff(yy,'1999-11-23',getdate());           --返回结果:20
select datediff(mm,'1999-11-23',getdate());           --返回结果:233
select (datediff(mm,'1999-11-23',getdate())/12);      --返回结果:19  

总结语法:datediff(指明计算日期的哪个部分差,‘日期1’,‘日期2’);

3.2.4  Datename日期中指定日期部分的字符串形式(将系统时间转换成字符串)返回的是字符串

--datename函数:获取日期中指定日期部分的字符串形式(将系统时间转换成字符串)返回的是字符串
select datename(dw,'2019-04-20');   --获取星期几,返回结果:星期六
select datename(qq,getdate());      --获取季度,返回结果:2
select datename(dy,getdate());      --获取本年已过天数,返回结果:110
select datename(wk,getdate());      --获取本年第几个星期,返回结果:16

总结语法:datename(要返回的日期部分,‘日期’’);

3.2.5   Datepart日期中指定日期部分的整数形式,返回的是整数

--datepart函数:获取日期中指定日期部分的整数形式,返回的是整数
select datepart(yy,getdate());         --获取年份 ,返回结果:2019
select datepart(mm,'2019-04-20');      --获取月份,返回结果:4
select datepart(dd,getdate());         --获取日期,返回结果:20

总结语法:datepart(要返回的日期部分,‘日期’);

                                                    日期部分参数及其缩写

日期部分参数 缩写 日期部分参数 缩写 日期部分参数 缩写
年:year yy,yyyy 季度:quarter wk,ww 小时:hour hh
月:month mm,m 第几周:week qq,q 分钟:minute mi,n
日:date dd,d 星期几:weekday dw,w 秒钟:second ss,s

3.3 数学函数

        数学函数用于对数值型数据进行处理,并返回处理结果。

函数名 描述 语法 返回结果 备注
rand 返回从0到1之间的随机float值 rand(); float 可以乘10、100……以获得更大的float
abs 取数值表达式的绝对值 abs(要取绝对值的负数); 正数  
ceiline 天花板,向上取整数,取大于或等于指定数值、表达式的最小整数 ceiling(数值或表达式); 整数 注意:对负数取ceiling值
floor 地板,向下取整数,取小于或等于指定数值、表达式的最大整数 floor(数值或表达式); 整数 注意:对负数取floor值
round 将数值表达式四舍五入为指定精度 round(数值,要返回的精度); 数字 配合fand()函数,生成0到100以内的随机整数
sign 对于整数返回1,负数返回-1,对于0则返回0 sign(数字); 1或者-1或者0  
sqrt 取浮点表达式的平方根 sqrt(数值或表达式); 数字  
power 取数值表达式的幂值 power(数字1,数字2); 数字 求数字1的数字2次方
--数学函数
--rand函数:返回从0到1之间的随机float值,返回的是float
select rand();        --返回从0到1之间的随机float值
select rand()*100;    --返回从0到100以内的随机float值

--abs函数:取数值表达式的绝对值,返回的是正数
select abs(-5);       --返回结果:5
select abs(5);        --返回结果:5
select abs(0);        --返回结果:0

--ceiling函数:天花板,向上取整数,取大于或等于指定数值、表达式的最小整数
select ceiling(1.7);        --返回结果:2
select ceiling(1);          --返回结果:1
select ceiling(-1.7);       --返回结果:-1

--floor函数:地板,向下取整数,取小于或等于指定数值、表达式的最大整数
select floor(1.7);        --返回结果:1
select floor(1);          --返回结果:1
select floor(-1.7);       --返回结果:-2

--round函数:将数值表达式四舍五入为指定精度 语法:round(数值,要返回的精度);
select round(1.500,1);          --返回结果:1.500
select round(1.630,0);          --返回结果:2.000
select round(1.6366,2);         --返回结果:1.6400

--sign函数:对于整数返回1,负数返回-1,对于0则返回0
select sign(-5);               --返回结果:-1       
select sign(5);                --返回结果:1   
select sign(0);                --返回结果:0   
select sign(3-5);              --返回结果:-1 (表达式:4-5=-2,所以返回-1)

--sqrt函数:取浮点表达式的平方根
select sqrt(9);                --返回结果:3 
select sqrt(4.84);             --返回结果:2.2 

--power函数:取数值表达式的幂值
select power(3,3);                --返回结果:27
select power(3,2);                --返回结果:9

3.4  系统函数

        系统函数用来获取有关SQL Server中对象和设置的系统信息,后期我们学习c#需要连接数据库的时候会用到。

函数名 描述 语法 返回结果 备注
convert 用来转变数据类型 convert(要转换成的类型,被转换的日期,日期的格式); 字符串 一般用在将日期类型转换成字符串类型
datalength 返回指定表达式的字节数 datalength(表达式);  整数 注意:len和datalength的区别
host_name 返回当前用户所登录的计算机名字 select host_name();    右键“此电脑”,属性,查看计算机名字
system_user 返回当前服务器的登录名 select system_user;    
current_user 返回数据库用户名 select current_user;   注意:如果该数据库没有创建用户名,就代表使用的是默认用户名dbo
--系统函数
--convert函数:用来转变数据类型(一般用在将日期类型转换成字符串类型)
select convert(varchar(10),getdate(),112);       --返回结果:20190420
select convert(varchar(10),getdate(),111);       --返回结果:2019/04/20
       --注意:112/111/110表示日期类型yymmdd、yy/mm/dd、mm-dd-yy
select convert(varchar(5),12345);                --返回结果:12345(注意:此时已是字符串类型数据)
select convert(varchar(5),12345)+'abc';          --返回结果:12345abc(注意:先将数字12345转换为字符串,然后用加号连接两个字符串)
select convert(int,'123')+3;                     --返回结果:126(注意:先将字符串123转换为整型,然后数字123+3=126)

--datalength函数:返回指定表达式的字节数
select datalength('sql课程');       --返回结果:7
select len('sql课程');              --返回结果:5

--host_name函数:返回当前用户所登录的计算机名字
select host_name();                 --返回结果:LAPTOP-IN3E6IJP

--system_user函数:返回当前服务器的登录名
select system_user;                 --返回结果:返回当前服务器登录名sa

--current_user函数:返回数据库用户名
select current_user;                --返回结果:dbo

==此文所有SQL语句

--创建一个数据库
create database SchoolDB;
--使用数据库
use SchoolDB;
--创建数据库表
create table Student(
	StudentNo int primary key identity(1831301,1),      --每一列设置完成以后,用英文逗号隔开
	Names nvarchar(30) not null,
	Gender char(2) not null,
	Age int not null,
	Major int not null,
	Works nvarchar(20)                                  --最后一列不需要逗号
);
--一次插入多行数据
insert into Student(Names,Gender,Age,Major,Works)
select '倪大红','男',28,1,'都挺好' union                --每一行数据以select开头,union结尾
select '谢娜','女',17,3,'快乐大本营' union
select '姚晨','女',18,1,'都挺好' union
select '蔡徐坤','男',16,1,'偶像练习生' union
select '杨幂','女',18,1,'三生三世' union
select '李彦宏','男',24,4,'百度' union
select '马化腾','男',25,4,'腾讯QQ' union
select '何炅','男',21,3,'快乐大本营' union
select '李荣浩','男',18,2,'模特' ;                      --最后一行数据,不需要union

--查询表中所有信息
select * from Student;


--查询表中专业代号是1的学生信息,显示学生的编号、姓名、年龄
select StudentNo,Names,Age
from Student
where Major=1;

--查询专业代号为1,且性别是女,的学生信息,显示学生编号、姓名、性别
select StudentNo,Names,Gender
from Student
where Major=1 and Gender='女';

--在查询记录集中显示列的别名
select StudentNo as 学号 , 姓名 =Names , Major 专业
from Student
where major=1;

--查询专业代号是1的学生,显示姓名、学号、专业、年龄,
--并将姓名和作品相加后作为新的列显示
--将专业和年龄相加后作为新的列显示
select Names,StudentNo,Major,Age,Names+'.'+Works as 姓名作品,专业年龄 = Major+Age
from Student
where Major=1;

--插入一行有空值的数据
insert into Student values ('张三','男',18,2,null );   --输入null和''是有区别的,null表示什么都没有
insert into Student values ('李四','女',18,2,'' );     --输入'',表示输入空的字符串


--查询作品列为空的数据
select * from Student where Works is null;

--查询作品列有数据的信息
select * from Student where Works is not null;

--查询学号、姓名、性别,并增加一列地址为“湖北武汉”
select StudentNo,Names,Gender,'湖北武汉'as 地址
from Student;

--查询表中前5个学生的信息
select top 5 * from Student;
--查询表中20%的学生信息
select top 20 percent * from Student;
--查询表中前5个学生的学号、姓名、性别
select top 5 StudentNo,Names,Gender from Student;

--查询学生的学号、姓名、性别、年龄,并按年龄降序排列
select StudentNo,Names,Gender,Age 
from Student
order by Age desc;

-- 查询年龄小于21岁的学生,编号、姓名、年龄、并按照年龄进行升序排列
select StudentNo,Names,Age
from Student
where Age<21
order by Age asc;

--SQL查询中使用函数
--字符串函数
--charindex函数:用来寻找一个指定的字符串,在另一个字符串中的起始位置,返回结果:int类型
select charindex('test','this Test is test');     --不指定位置时,默认从第一个字符串开始计算,返回结果:6
select charindex('test','this Test is test',7);   --数字7,代表从第7个字符串开始计算,返回结果:14
select charindex('a','helloabc');                 --返回6
select charindex('a','Ahelloabc');                --返回1


--len函数:返回传递给它的字符串长度,返回结果:int类型
select len('SQL Server 课程');      --返回结果:13(注意:空格也计算)
select len('sqlserver');            --返回9
select LEN('sql server');           --返回10
select LEN('sql课程');              --返回5
select LEN('sql,c#');               --返回6
select works ,len(works) as 作品字符长度 from Student;   --在表中的应用

--upper函数:把传递给它的字符串转换为大写,返回结果:字符串
select upper ('SQL Server 课程');   --返回结果:'SQL SERVER 课程'

--ltrim函数:清除字符左边的空格,返回结果:字符串
select ltrim(' SQL Server 课程 ');  --返回结果:'SQL Server 课程 '

--rtrim函数:清除字符右边的空格,返回结果:字符串
select rtrim(' SQL Server 课程 ');  --返回结果:' SQL Server 课程'

----结合ltrim函数和rtrim函数,去除字符串左右的空格
select ltrim(rtrim(' SQL Server 课程 '));     --返回结果:'SQL Server 课程'

--right函数:从字符串右边开始,返回指定数目的字符,空格也包括在内
select right(' SQL Server 课程 ',3);  --数字3,代表从字符串右边开始,返回3个字符,空格也计算在内。返回结果: '课程 '
--right函数应用:查询email的域名,如[email protected],域名是qq.com
select right('[email protected]',len('[email protected]')-charindex('@','[email protected]'));  --返回结果:'qq.com'
/*
说明:1、获取email字符串中,域名的长度:总长度-@字符前面的长度=域名的长度
2、利用right函数,获取email字符串中,从右边返回指定长度(域名长度)的字符,即为域名。
*/


--replace函数:将字符串中的某个字符,替换成指定的字符
select replace(' SQL Server 课程 ','S','s');           --返回结果:' sQL server 课程 '
select replace(' SQL Server 课程 ','课程','数据库');   --返回结果: ' SQL Server 数据库 '
select replace(' SQL Server 课程 ','数据库','课程');   --返回结果: ' SQL Server 课程 '
select replace(' SQL Server 课程 ',' ','-');           --返回结果:'-SQL-Server-课程-'
--replace函数应用:将数据库表Student中Names列中,将“李”替换成“li”
update Student set Names=replace(Names,'李','li');

--stuff函数:在一个字符串中,从指定位置开始,删除指定长度的字符,并在该位置插入一个新的字符串
select stuff(' SQL Server 课程 ',3,2,'测试');          --返回结果:' S测试 Server 课程 '



--日期函数
--Getdate函数:获取当前的系统日期
select getdate();              --返回结果:2019-04-20 18:46:48.040

--dateadd函数:将指定的数值添加到,指定日期部分后的日期(在指定日期上添加日、月、年)
select dateadd(yy,1,'2019-04-20');     --返回结果:2020-04-20 00:00:00.000
select dateadd(mm,2,'2019-04-20');     --返回结果:2019-06-20 00:00:00.000
select dateadd(dd,1,'04/20/2019');     --返回结果:2019-04-21 00:00:00.000
select dateadd(dd,4,getdate());        --返回结果:2019-04-24 19:37:54.223

--datediff两个日期之间的指定日期部分的间隔(比如计算两个年份、月份、日期的结果(常用来精确计算年龄))返回的是整数
select datediff(yy,'1999-11-23',getdate());           --返回结果:20
select datediff(mm,'1999-11-23',getdate());           --返回结果:233
select (datediff(mm,'1999-11-23',getdate())/12);      --返回结果:19  

--datename函数:获取日期中指定日期部分的字符串形式(将系统时间转换成字符串)返回的是字符串
select datename(dw,'2019-04-20');   --获取星期几,返回结果:星期六
select datename(qq,getdate());      --获取季度,返回结果:2
select datename(dy,getdate());      --获取本年已过天数,返回结果:110
select datename(wk,getdate());      --获取本年第几个星期,返回结果:16

--datepart函数:获取日期中指定日期部分的整数形式,返回的是整数
select datepart(yy,getdate());         --获取年份 ,返回结果:2019
select datepart(mm,'2019-04-20');      --获取月份,返回结果:4
select datepart(dd,getdate());         --获取日期,返回结果:20


--数学函数
--rand函数:返回从0到1之间的随机float值,返回的是float
select rand();        --返回从0到1之间的随机float值
select rand()*100;    --返回从0到100以内的随机float值

--abs函数:取数值表达式的绝对值,返回的是正数
select abs(-5);       --返回结果:5
select abs(5);        --返回结果:5
select abs(0);        --返回结果:0

--ceiling函数:天花板,向上取整数,取大于或等于指定数值、表达式的最小整数
select ceiling(1.7);        --返回结果:2
select ceiling(1);          --返回结果:1
select ceiling(-1.7);       --返回结果:-1

--floor函数:地板,向下取整数,取小于或等于指定数值、表达式的最大整数
select floor(1.7);        --返回结果:1
select floor(1);          --返回结果:1
select floor(-1.7);       --返回结果:-2

--round函数:将数值表达式四舍五入为指定精度 语法:round(数值,要返回的精度);
select round(1.500,1);          --返回结果:1.500
select round(1.630,0);          --返回结果:2.000
select round(1.6366,2);         --返回结果:1.6400

--sign函数:对于整数返回1,负数返回-1,对于0则返回0
select sign(-5);               --返回结果:-1       
select sign(5);                --返回结果:1   
select sign(0);                --返回结果:0   
select sign(3-5);              --返回结果:-1 (表达式:4-5=-2,所以返回-1)

--sqrt函数:取浮点表达式的平方根
select sqrt(9);                --返回结果:3 
select sqrt(4.84);             --返回结果:2.2 

--power函数:取数值表达式的幂值
select power(3,3);                --返回结果:27
select power(3,2);                --返回结果:9


--系统函数
--convert函数:用来转变数据类型(一般用在将日期类型转换成字符串类型)
select convert(varchar(10),getdate(),112);       --返回结果:20190420
select convert(varchar(10),getdate(),111);       --返回结果:2019/04/20
       --注意:112/111/110表示日期类型yymmdd、yy/mm/dd、mm-dd-yy
select convert(varchar(5),12345);                --返回结果:12345(注意:此时已是字符串类型数据)
select convert(varchar(5),12345)+'abc';          --返回结果:12345abc(注意:先将数字12345转换为字符串,然后用加号连接两个字符串)
select convert(int,'123')+3;                     --返回结果:126(注意:先将字符串123转换为整型,然后数字123+3=126)

--datalength函数:返回指定表达式的字节数
select datalength('sql课程');       --返回结果:7
select len('sql课程');              --返回结果:5

--host_name函数:返回当前用户所登录的计算机名字
select host_name();                 --返回结果:LAPTOP-IN3E6IJP

--system_user函数:返回当前服务器的登录名
select system_user;                 --返回结果:返回当前服务器登录名sa

--current_user函数:返回数据库用户名
select current_user;                --返回结果:dbo

====================这里是结束分割线========================

猜你喜欢

转载自blog.csdn.net/dnruanjian/article/details/89310442