知识点:理解查询的机制、使用select语句进行条件查询、掌握order by排序,熟悉常用的系统函数。
1、T-SQL 查询机制
生活中也有很多查询,比如查询考试成绩地域60分的,要进行补考;查询身高大于175cm的男生可以参加某项活动……
对于程序员来说,大多数情况下是针对数据库已有的数据进行查询,以获得数据。那么数据库是如何进行查询的呢?其实可以理解为“筛选”,将符合条件的数据抽取出来。
数据库在接收到查询请求的时候,可以简单理解为它将“逐行判断”,判断是否符合查询条件。如果符合查询条件,就把数据抽取出来,然后把所有被选中的行组织在一起,形成另外一个类似于表的结构,构成查询的结果,通常叫做记录集。
由于记录集的结构实际上和表的结构类似,都是由行组成的,因此在记录集上依然可以进行再次查询。
举例:查询学生信息表中,性别为“女”的学生
查询结果:
2、使用select语句进行查询
使用SELECT语句查询数据(简单格式),语法:
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提供了一些内部函数,函数做什么用的?实现不同的功能,比如返回字符串的长度、通过出生日期和系统日期计算当前年龄……不同类别的函数都可以和 SELECT、UPDATE、INSERT 语句联合使用,常用的函数有以下几个分类:字符串函数、日期函数、数学函数、系统函数。
字符串函数:用于控制返回给用户的字符串。如:获取字符串的长度、将字符串转换为大写、替换字符等
日期函数:用于操作日期指。如:获取当前系统日期、两个日期之间的指定日期部分的间隔
数学函数:用于对数值进行代数运算。如:返回从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
====================这里是结束分割线========================