ACCP V4.01
第四章数据查询 (1)
ACCP V4.02
回顾
SQL分为数据操作语言、数据控制语言和数据定义语言;
T-SQL是 SQL的扩展
通配符经常与 LIKE一起使用来进行非精确的限制;
一次插入多行数据,可以使用 INSERT…SELECT…,
SELECT…INTO… 或者 UNION关键字来实现
标识列不能插入指定的数据值
使用 UPDATE更新数据,一般都有限制条件
使用 DELETE删除数据时,不能删除被外键值所引用的数据行
使用 TRUNCATE TABLE来删除所有数据时,效率要比
DELETE语句高
上面的数据操作语句在程序中会经常使用到
ACCP V4.03
目标
理解查询的机制
使用 SELECT语句进行条件查询
在查询中返回限制行、进行查询排序
在查询中使用表达式、运算符和函数
ACCP V4.04
什么是查询?
Application Logic
客户程序查询请求查询结果集
SQL SERVERA B C D E F G
SELECT * FROM SALES
查询产生一个虚拟表,看到的是表形式显示的结果,但结果并不真正存储,每次执行查询只是现从数据表中提取数据,并按照表的形式显示出来
ACCP V4.05
怎么查的?
学员编号 学员姓名 地址 所在班级 ……,
001 张明全 湖南长沙 S201
002 李菲 湖北宜昌 S202
003 于寄谦 甘肃天水 S204
004 刘国正 山东荷泽 S201
005 周接轮 台湾新竹 S204
006 巩小妹 香港龙湾 S203
007 巩大妹 香港龙湾 S203
008 张明敏 北京顺义 S202
009 矛十八 四川棉阳 S204
010 罗林光 陕西临潼 S202
011 司马坡 新疆喀什 S201
S202陕西临潼罗林光010
…S202湖北宜昌李菲002
S202北京顺义张明敏008
SELECT * FROM StudentsH
WHERE 所在班级 = ‘S202’
ACCP V4.06
思考
既然查询得到的“结果集”的结构类似于一张表,那么可以在“结果集”上继续进行查询吗?
ACCP V4.07
编写查询语句之前 …
ACCP V4.08
查询
SELECT <列名 >
FROM <表名 >
[WHERE <查询条件表达式 >]
[ORDER BY <排序的列名 >[ASC或 DESC]]
列名称
SELECT
SCode,
SName,
SAddress
表名
FROM
Students
过滤条件
WHERE
SSEX = 0
排序条件
ORDER BY
SCode
SELECT SCode,SName,SAddress
FROM Students
WHERE SSEX = 0
ORDER BY SCode
ACCP V4.09
数据查询 -基础查询全部的行和列
SELECT * FROM Students
查询部分行
SELECT SCode,SName,SAddress FROM Students
WHERE SAddress = '河南新乡 '
SELECT SCode,SName,SAddress FROM Students
WHERE SAddress <> '河南新乡 '
ACCP V4.010
数据查询 -列名使用 AS来命名列
SELECT SCode AS 学员编号,SName AS学员姓名,SAddress
AS 学员地址
FROM Students
WHERE SAddress <> '河南新乡 '
SELECT FirstName+'.'+LastName AS '姓名 '
FROM Employees
使用 =来命名列
SELECT '姓名 ' = FirstName+'.'+LastName
FROM Employees
ACCP V4.011
数据查询 -空行常量列查询空行
SELECT SName FROM Students WHERE SEmail IS NULL
使用常量列
SELECT 姓名 =SName,地址 = SAddress,'河北新龙 ' AS 学校名称
FROM Students
思考:非空行怎么查?
ACCP V4.012
数据查询 -限制行数限制固定行数
SELECT TOP 5 SName,SAddress
FROM Students WHERE SSex = 0
返回百分之多少行
SELECT TOP 20 PERCENT SName,SAddress
FROM Students WHERE SSex = 0
ACCP V4.013
数据查询 -排序 2-1
升序排列
SELECT StudentID As 学员编号,(Score*0.9+5) As 综合成绩
FROM Score
WHERE (Score*0.9+5)>60
ORDER BY Score
降序排列
SELECT Au_Lname +'.' +Au_fName AS EMP
From Authors Union
SELECT fName +'.'+ LName AS EMP
From Employee
ORDER BY EMP DESC
ACCP V4.014
数据查询 -排序 2-2
按多列排序
SELECT StudentID As 学员编号,Score As 成绩
FROM Score
WHERE Score>60
ORDER BY Score,CourseID
思考:排序中的字段,可以使用表达式吗?
—— 如果不可以,请说明原因;
—— 如果可以,请举例说明;
ACCP V4.015
SQL Server中的函数相当于 C语言中的内部函数
字符串函数
日期函数
数学函数
系统函数
ACCP V4.016
字符串函数
SELECT STUFF('ABCDEFG',2,3,'我的音乐我的世界 ')
返回,A我的音乐我的世界 EFG
在一个字符串中,删除指定长度的字符,
并在该位置插入一个新的字符串
STUFF
SELECT CHARINDEX('ACCP','My Accp Course',1 )
返回,4
用来寻找一个指定的字符串在另一个字符串中的起始位置
CHARINDEX
举例描述函数名
SELECT LEN('SQL Server课程 ')
返回,12
返回传递给它的字符串长度LEN
SELECT LOWER('SQL Server课程 ')
返回,sql server课程把传递给它的字符串转换为小写LOWER
SELECT UPPER('sql server课程 ')
返回,SQL SERVER课程把传递给它的字符串转换为大写UPPER
SELECT LTRIM (' 周智宇 ')
返回:周智宇 (后面的空格保留)
清除字符左边的空格LTRIM
SELECT RTRIM (' 周智宇 ')
返回,周智宇(前面的空格保留)
清除字符右边的空格RTRIM
SELECT RIGHT('买卖提,吐尔松 ',3)
返回:吐尔松从字符串右边返回指定数目的字符RIGHT
SELECT REPLACE('莫乐可切,杨可 ','可 ','兰 ')
返回:莫乐兰切,杨兰替换一个字符串中的字符REPLACE
ACCP V4.017
日期函数
SELECT DATEPART(day,’01/15/2000’)
返回,15
日期中指定日期部分的整数形式
DATEPART
SELECT GETDATE()
返回:今天的日期取得当前的系统日期GETDATE
举例描述函数名
SELECT DATEADD(mm,4,’01/01/99’)
返回:以当前的日期格式返回 05/01/99
将指定的数值添加到指定的日期部分后的日期
DATEADD
SELECT
DATEDIFF(mm,’01/01/99’,’05/01/99’)
返回,4
两个日期之间的指定日期部分的区别
DATEDIFF
SELECT DATENAME(dw,’01/01/2000’)
返回,Saturday
日期中指定日期部分的字符串形式
DATENAME
ACCP V4.018
数学函数
SELECT SQRT(9)
返回,3
取浮点表达式的平方根Sqrt
SELECT ABS(-43)
返回,43
取数值表达式的绝对值ABS
举例描述函数名
SELECT CEILING(43.5)
返回,44
返回大于或等于所给数字表达式的最小整数
CEILING
SELECT POWER(5,2)
返回,25
取数值表达式的幂值POWER
SELECT ROUND(43.543,1)
返回,43.5
将数值表达式四舍五入为指定精度
ROUND
SELECT SIGN(-43)
返回,-1
对于正数返回 +1,对于负数返回 -1,对于 0 则返回 0
Sign
SELECT FLOOR(43.5)
返回,43
取小于或等于指定表达式的最大整数
FLOOR
ACCP V4.019
系统函数
SELECT USER_NAME(1)
返回:从任意数据库中返回,dbo”
从给定的用户 I D返回用户名USER_NAME
SELECT CONVERT (VARCHAR (5),
12345)
返回,字符串 12345
用来转变数据类型CONVERT
举例描述函数名
SELECT CURRENT_USER
返回,你登录的用户名返回当前用户的名字CURRENT_USER
SELECT DATALENGTH ('中国 A盟 ')
返回,7
返回用于指定表达式的字节数
DATALENGTH
SELECT HOST_NAME()
返回:你所登录的计算机的名字返回当前用户所登录的计算机名字
HOST_NAME
SELECT SYSTEM_USER
返回:你当前所登录的用户名返回当前所登录的用户名称SYSTEM_USER
ACCP V4.020
案例分析 1— 要求
某公司印了一批充值卡,卡的密码是随机生成的,现在出现这个问题:
卡里面的,O和 0”(哦和零),i和 1”(哎和一),用户反映说看不清楚,公司决定,把存储在数据库中的密码中所有的“哦”都改成
“零”,把所有的,i”都改成,1”;
请编写 SQL语句实现以上要求;
数据库表名,Card;密码字段名,PassWord;
ACCP V4.021
案例分析 1— 分析
这是更新语句,需要使用 UPDATE语句;
因为牵涉到字符串的替换,需要使用到 SQL Server中的函数 Replace;
ACCP V4.022
案例分析 1— T-SQL
两行 SQL语句
Update Card Set PassWord = Replace(密码,'O','0')
Update Card Set PassWord = Replace(密码,'i','1')
一行 SQL语句
Update Card
Set PassWord = Replace(Replace(密码,'O','0'),'i','1')
ACCP V4.023
案例分析 2— 要求
在数据库表中有以下字符数据,如:
13-1,13-2,13-3,13-10,13-100,13-108,13-18,13-11,13-
15,14-1,14-2
现在希望通过 SQL语句进行排序,并且首先要按照前半部分的数字进行排序,然后再按照后半部分的数字进行排需,
输出要排成这样:
13-1,13-2,13-3,13-10,13-11,13-15,13-18,13-100,13-
108,14-1,14-2
数据库表名,SellRecord;字段名,ListNumber;
ACCP V4.024
案例分析 2— 分析
这是查询语句,需要使用 SELECT语句
需要使用到 ORDER BY进行排序,并且在 ORDER BY的排序列中,也需要重新计算出排序的数字来
前半部分的数字,可以从先找到,-”符号的位置,然后,
取其左半部分,最后再使用 Convert函数将其转换为数字:
Convert(int,Left(ListNumber,CharIndex('-',ListNumber)-1))
后半部分的数字,可以先找到,-”符号的位置,然后把从第一个位置到该位置的全部字符替换为空格,最后再使用
Convert函数将其转换为数字:
Convert(int,Stuff(ListNumber,1,Charindex('-',ListNumber),''))
ACCP V4.025
案例分析 2— T-SQL
,,,,,,,,,,,,,,SELECT ListNumber
FROM SellRecord
ORDER BY
Convert(int,Left(ListNumber,CharIndex('-',ListNumber)-1)),
Convert(int,Stuff(ListNumber,1,Charindex('-',ListNumber),''))
思考:还有其他的计算出排序列方法吗?
ACCP V4.026
总结
查询将逐行筛选表中的数据,最后符合要求的记录重新组合成“记录集”,记录集的结构类似于表结构
判断一行中的数据项是否为空,使用 IS NULL
使用 ORDER BY进行查询记录集的排序,并且可以按照多个列进行排序
在查询中,可以使用常量、表达式、运算符
在查询中使用函数,能够像在程序中那样处理查询得到的数据项