1.T-SQL查询基础
1.1查询机制简介
数据表在接受查询请求的时候,可以简单的认为它将逐行的判断,判断是否符合查询条件.如果符合查询条件就提取出来,然后把所有选中的的行组织在一起,形成另外一个类似于表的结构,构成查询结果,通常叫做记录集(RecordSet)
由于记录集的结构实际上和表的结构类似,都是由行组成的,因此在记录集上依然可以再次进行查询.
1.2 使用SELECT语句进行查询
[语法]
SELECT <列名>
FROM <表名>
[WHERE <查询条件表达式>]
[ORDER BY <排序的列名>[ASC或DESC]]
查询语句一般都在SSMS的查询窗口中进行调试运行
(1)查询所有的数据行和列
用"*"表示所有列
SELECT * FROM Students
(2)查询部分行和列
查询部分列要列举不同的列名,查询部分行要使用WHERE子句进行条件限制
SELECT SCode,SName,SAddress
FROM Students
WHERE SAddress = '河南新乡'
以上的查询语句,将只查询地址为'河南新乡'的学生,并且只显示编号,姓名,和地址列,同理以下语句用来查询地址不是'河南新乡'的学生信息.
SELSCT SCode,SName,SAddress
FROM Students
WHERE SAddress <> '河南新乡'
(3)在查询中使用列的别名
AS子句可以用来改变结果集列的名称,也可以为组合或者计算机的列指定名称,还有一种情况是让标题列的信息更易懂.例如,把SCode列名查询后显示为"学生编号"
在T-SQL中重新命名列名可以使用AS子句,例如
SELECT SCode AS 学生编号 , SName AS 学生姓名 , SAddress AS 学生地址
FROM Students
WHERE SAddress <> '河南新乡'
还有一种情况是使用计算机,合并得到新列的命名.例如,假设在某数据库的雇员表Employees存在FirstName列和LastName列,现需要将这两列合并成一个叫做"姓名"的列,可以使用以下查询语句
SELECT FirstName+'.'+LastName AS 姓名
FROM Employees
重新命名还有一种方法,就是采用"="来命名
SELECT 姓名 = FirstName + '.' + LastName
FROM Employees
(4) 查询空值
在SQL语句中采用"IS NULL"或者"IS NOT NULL"来判断是否为空,因此,如果要查询学生信息表中没有填写E-mail信息的学生,可以使用以下的查询语句:
SELECT SName FROM Students WHERE SEail IS NULL
(5)在查询中使用常量列
SELECT 姓名 = SName,地址= SAddress,'北京新兴桥' AS 学校名称
FROM Students
查询中多出了一列"学校名称",该列的所有数据都是"北京新兴桥"
(6)查询返回限制的行数,一些查询需要返回限制的行数,例如在测试的时候,如果数据库中有上万条记录,而只要检查前面10行数据就可以了,没有必要查询输出全部的数据,以提高查询速度,这时候就要用到显示返回行数的查询.
在T-SQL中,限制行数使用TOP关键字约束,例如,要查询返回众多学生记录中的前五为女生的姓名和地址信息,查询语句为:
SELECT TOP 5 SName,SAddress
FROM Students WHERE SSex = 0
还有一种情况是需要从表中按一定的百分比提取记录,这时候还需要用到PERCENT关键字来限制,例如,要提取20%女生数据如下
SELECT TOP 20 PERCENT SName,SAddress
FROME Students WHERE SSex = 0;
2.查询排序
2.1如何使用ORDER BY
如果需要按照一定顺序排列查询语句选中的列,则需要使用ORDER BY子句,并且排序可以是升序(ASC)或者降序(DESC),如果不指定ASC或者DESC,记录集默认按照ASC升序排序
上面所讲过的SQL语句,都可以在其后面再加上ORDER BY 来进行排序
例如,查询学生的成绩的时候,如果把所有的成绩都降低10%后加5分,在查询及及格的成绩并按照成绩高低来进行排列,SQL语句如下
SELECT StudentID AS 学生编号,(Score*0.9+5) AS 综合成绩
FROM Score
WHERE (Score*0.9+5)>60
ORDER BY Score
还可以按照多个列进行排序,例如要在学生成绩排序的基础上,在按照课程ID 进行排序
SELECT StudentIS AS 学生编号,CourseID AS 课程ID , Score AS 成绩
FROM Score
WHERE Score > 60
ORDER BY Course,Score
3.在查询中使用函数
3.1字符串函数
字符串函数用于对字符串数据进行处理,并返回一个字符串或者数字
函数名 | 描述 | 举例 |
---|---|---|
CHARINDEX | 用来寻找一个指定的字符串在另一个字符串中的起始位置 | SELECT CHARINDEX('NAME','My name is Tom',1) 返回4 |
LEN | 返回传递给它的字符串长度 | SELECT LEN('SQL Server 课程') 返回12 |
UPPER | 把传递给它的字符串转换为大写 | SELECT UPPER('SQL Server 课程') 返回SQL SERVER 课程 |
LTRIM | 清除字符左边的空格 | SELECT LTRIM(' 张三') 返回张三 |
RTRIM | 清除字符右边的空格 | SELECT LTRIM(' 张三 ') 返回 张三 |
RIGHT | 从字符串右边返回指定数目的字符 | SELECT RIGHT('买买提.图尔松',3) 返回 图尔松 |
REPLACE | 替换一个字符串中的字符 | SELECT REPLACE('莫勒克切.杨可','可','兰') 放回莫勒克切.杨兰 |
STUFF | 在一个字符串中,删除指定长度的字符,并且在改位置插入一个新的字符串 | SELECT STUFF('ABCDEFG',2,3,'我的音乐我的世界') 返回 A我的音乐我的世界EFG |
3.2 日期函数
函数名 | 描述 | 举例 |
---|---|---|
GETDATE | 取得当前的系统日期 | SELECT GETDATE() 返回:今天的日期 |
DATEADD | 将指定的数值添加到指定的日期部分后的日期 | SELECT DATEADD(mm,4,'01/01/2009') 返回:以当前的日期格式返回05/01/2009 |
DATEDIFF | 两个日期之间的指定日期部分的间隔 | SELECT DATEDIFF(mm,'01/01/2009','05/01/2009') 返回:4 |
DATENAME | 日期中指定日期部分字符串形式 | SELECT DATENAME(dw,'01/01/2000') 返回:Saturday或者星期六 |
DATEPART | 日期中指定日期部分的整数形式 | SELECT DATEPART(day,'01/15/2000') 返回:15 |
SQL Server可识别的日期部分参数及其缩写
year -- yy,yyyy
quarter -- qq,q
mouth -- mm,m
dayofyear -- dy,y
day -- dd,d
week -- wk,ww
weekday -- dw,w
hour -- hh
minute -- mi,n
second -- ss,s
millisecond -- ms
3.3 数学函数
函数名 | 描述 | 举例 |
---|---|---|
RAND | 返回从0到1之间的随机float值 | SELECT RAND() 返回:0.78964646874667 |
ABS | 取数值表达式的绝对值 | SELECT ABS(-43) 返回:43 |
CEILING | 向上取整,取大于或者等于指定数值,表达式的最小整数 | SELECT CEILING(43.5) 返回:44 |
FLOOR | 向下取整,取小于于或者等于指定数值,表达式的最小整数 | SELECT CEILING(43.5) 返回:43 |
POWER | 取数值表达式的幂值 | SELECT POWER(5,2) 返回:25 |
ROUND | 将数值表达式四舍五入为指定精度 | SELECT ROUND(43.543,1) 返回:43.500 |
SIGN | 对于正数返回+1,对于负数返回-1,对于0则返回0 | SELECT SIGN(-43) 返回:-1 |
SQRT | 取浮点表达式的平方根 | SELECT SQRT(9) 返回:3 |
3.4系统函数
函数名 | 描述 | 举例 |
---|---|---|
CONVERT | 用来转变数据类型 | SELECT CONVERT(VARCHAR(5),12345) 返回:字符串:12345 |
CURRENT_USER | 返回当前用户的名字 | SELECT CURRENT_USER 返回:你登录的用户名 |
DATALENGTH | 返回用于指定表达式的字节数 | SELECT DATALENGTH ('中国A联盟') 返回:5 |
HOST_NAME | 返回当前用户登录的计算机名字 | SELECT HPST_NAME 返回:你所登录的计算机的名字 |
SYSTEM_USER | 返回当前所登录的用户名称 | SELECT SYSTEM_USER 返回:你当前锁登录的用户名称 |
USER_NAME | 从给定的用户IS返回用户名 | SELECT USER_NAME 返回:从任意数据库中返回"dbo" |