SELECT [DISTINCT] <目标列表达式>[,<目标列表达式>] …
FROM <表名或视图名>[, <表名或视图名> ] …
WHERE <条件表达式>
GROUP BY <目标列表达式> 或<列名>
HAVING <条件表达式>
ORDER BY <目标列表达式> 或<列名> [ASC|DESC ] ]
SELECT子句:指定结果集中显示的列
FROM子句:指定数据源(基本表、查询结果或视图)
WHERE子句:指定查询条件
GROUP BY子句:对查询结果按指定列分组,列值相等的元组为一个分组。
HAVING短语:为筛选分组指定筛选条件
ORDER BY子句:对查询结果按指定列值排序
一、单表查询概述
1. 查询仅涉及一个表,是一种最简单的查询操作
2. 选择表中的若干列
3. 选择列时指定表达式
4. 选择表中的若干元组
5. 对查询结果排序
6. 使用集函数
7. 对查询结果分组
二、查询指定列—投影操作,选择所有行
【例1】 查询全体学生的学号与姓名。
SELECTSid,Sname
FROMuStudent
【例2】 查询全体学生的姓名、学号、所在班级。
SELECTSname,Sid,gid
FROMuStudent
【例3】 查询全体学生的记录,显示所有列。
SELECT Sid,Sname,Ssexy,Sbdate,gid,stele
FROMuStudent ;
或
SELECT *
FROM uStudent
注:*表示显示所有列
3、 SELECT中使用表达式
可以在SELECT子句中指定表达式,表达式可以是列、常量、函数等通过运算符连接而成的式子
算术表达式:通过+ - * /把数值列(变量、常量)连接起来
【例6】显示每个人、每门课考试成绩加10分后的成绩
SELECTsid,cid,score2+10 FROM uSC
【例7】计算每个人每门的总评成绩(平时占30%,考试占70%)
SELECTsid,cid,score1*0.3+score2*0.7 FROM uSC
字符串表达式
常量:单引号括起来的符号
连接:用加号可以连接字符列、常量或者变量
【例8】显示上课的教室、周次、时间与教室类型
selectroom,week,timeseg,'电教' 类型
fromujobtable
【例9】学号与课程号以下划线连接显示
SELECTsid+'_'+cid,score1*0.3+score2*0.7 sc FROM uSC
常用函数:日期函数、字符串函数等
日期函数:
Getdate():返回当前日期时间,无参数
【例10】显示姓名、出生日期及当前系统日期
SELECTsname,sbdate,getdate() FROM ustudent
Dateadd():返回加上某个数值后的日期时间,参数依次为:单位(day,month等);数值;日期列
【例11】显示姓名、出生第1000天的日期
SELECTsname,dateadd(day,1000,sbdate) FROM ustudent
Datediff():返回第二个日期与第一个日期的差值,参数依次为:单位(day,month等);日期1;日期2;
例12】显示姓名、年龄
SELECTsname,datediff(year,sbdate,getdate()) FROM ustudent
Year():返回日期的年份,参数为日期
【例13】显示姓名、出生年份
SELECTSname,year(sbdate) FROM ustudent
Month():返回日期的月份,参数为日期
【例14】显示姓名、出生月份
SELECTSname,month(sbdate) FROM ustudent
Day():返回日期的天,参数为日期
【例14】显示姓名、出生月份
SELECTSname, day (sbdate) FROM ustudent
字符串函数:
Left()/Right():对指定值从左/右边开始截取指定个数的字符
Substring():对指定值从指定位置开始截取指定个数的字符,注意开始位置是1
Len():指定列中除去尾部的空格后的字符数
Lower()/Upper():大小字母转换
Rtrim()/Ltrim():删除指定列中尾部/首部的空格
Str():把数值转换成字串。如果不指定转换后的长度,默认为10。
【例18】显示学生的生日
SELECTsname,str(month(sbdate))+'月‘
+str(day(sbdate))+'日'
FROMustudent
SELECTsname,ltrim(str(month(sbdate)))+'月‘
+ltrim(str(day(sbdate)))+'日'
FROMustudent
SELECTsname, str(month(sbdate),2))+'月‘
+str(day(sbdate),2)+'日'
FROMustudent
Concat():把多个字串连成一个。
7、数据转换函数:Convert
CONVERT (data_type(length), expression ,style)
data_type:目标数据类型
Expression:要转换的列或者表达式
Style:源类型的编号,SQL SERVER有专门的定义
【例19】显示学生姓名与出生日期
selectsname,convert(varchar(10),sbdate,120)
from ustudent
【例20】:学生成绩保留两位小数
SELECT sid,cid,convert(decimal(6,2),score1*0.33+score1*0.67,0)
FROM uSC
1. 消除重复的行
因为投影操作可能取的是部分列,查询结果中可能会出现完全相同值,在SELECT子句中使用DISTINCT,可以消除重复的查询结果
注意 DISTINCT短语的作用范围是结果集的所有列,检查的是整个行,因此写在SELECT命令动词的后面即可,不能写在每个列的前面
2.查询满足条件的行
1. 使用WHERE子句对查询结果集进行选择,其后面是 条件表达式
2. 条件表达式由列名、自定义变量、常量与查询语句组成
3. 在条件表达式中,常量有专门的表达方式:
4. 数值型常量直接写出,如:12,123.25;
5. 字符常量用单引号括起来,如:’12’,’Data’,’计算机科学’;
6. 日期常量表达方式与字符常量一样,但是格式要按照
yyyy-MM-dd书写,如:’2011-03-14’,’2011-3-14’,’2011/3/14’
常用的查询条件运算符
比较
=,>,<,>=,<=,!=
确定范围
BETWEEN AND , NOT BETWEEN AND
确定集合
IN,NOT IN
字符匹配
LIKE,NOT LIKE
空值
ISNULL ,IS NOT NULL
多重条件
AND,OR
(3) 集合条件—常量列举
(3)集合条件—用SELECT查询作值表
IN右边的SELECT语句必须用括号括起来,并且只能有一个列
IN左边的列与右边的SELECT语句中的列具有可查联系
SELECT语句由内至外依次执行
【例31】查询不及格同学的学号、姓名
selectsid,sname
fromustudent
wheresid in (select sid from usc where score1<60)
【例32】查询与李山同班的同学的学号、姓名
selectsid,sname
fromustudent
wheregid in (select gid from ustudent where sname='李山')
【例33】刚毕业的学生名单
SELECT *
FROMuStudent
WHERE gid IN
(SELECT gid
FROM uGrade
WHERE year(getdate())-gyear<5)
【例34】查询计算机科学与技术系同学的学号与姓名
selectsid,sname
fromustudent
wheregid in (select gid
from ugrade
where did in
(select did
from udept
where dname='计算机科学与技术系‘
)
)
(4) 字符串匹配—精确匹配与模糊匹配
1. 表达式 LIKE ‘<匹配串>’ 或者表达式 NOT LIKE ‘<匹配串>’
<匹配串>:是指固定字符串或含通配符的字符串。当匹配串为固定字符串时,可以用 = 运算符取代 LIKE 谓词,用 != 或 <>运算符取代 NOT LIKE 谓词
通配符
1. % :代表任意多个(可以为0)字符
例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab等都满足该匹配串.
【例41】查询所有姓刘学生的姓名、学号和性别。
SELECT Sname,sid,Ssex
FROM uStudent
WHERE Sname LIKE ‘刘%’;
2. _ :代表任意单个字符
例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串
【例44】 查询名字中第2个字为"阳"字的学生的姓名和学号。
SELECT Sname,sid
FROM uStudent
WHERE Sname LIKE ‘_阳%’;
转义符
ESCAPE‘ <换码字符>’
当用户要查询的字符串本身就含有 % 或 _ 时,要使用ESCAPE ‘<换码字符>’指定转义符,表示该符号是转义符号,其后紧跟的字符是普通的符号,不是通配符。
【例47】显示课程名包含C#_C++的课程名
SELECTcname
FROM uCourse
WHERECname LIKE 'C#\_C++%' ESCAPE '\'
(5) 涉及空值的查询
使用谓词 IS NULL 或 IS NOT NULL
“IS NULL” 不能用 “= NULL” 代替
【例50】某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。
SELECT Sid,Cid
FROM uSC
WHERE score IS NULL;
【例51】查所有有成绩的学生学号和课程号。
SELECT Sid,Cid
FROM uSC
WHERE score IS NOT NULL;
四、对查询结果排序
使用ORDER BY子句
可以按一个或多个属性列排序
升序:ASC;降序:DESC;缺省值为升序
当排序列含空值时
ASC:排序列为空值的元组最后显示
DESC:排序列为空值的元组最先显示
五、查询结果的集运算-求个数与总和
统计计行数
COUNT([DISTINCT] *):计算行数
COUNT([DISTINCT] <列名>):计算指定列上不为NULL的行数
在指定列上计算总和 SUM([DISTINCT] <列名>)
DISTINCT短语:在计算时要取消指定列中的重复值
五、查询结果的集运算
在指定列上计算平均值
AVG([DISTINCT] <列名>)
求最大值:MAX([DISTINCT] <列名>)
求最小值:MIN([DISTINCT] <列名>)
DISTINCT短语:在计算时要取消指定列中的重复值
六、使用GROUP BY子句对查询结果分组
GROUPBY作用:对查询结果按照指定列的值进行分组。
分组的目的
未对查询结果分组,集函数将作用于整个查询结果
对查询结果分组后,集函数将分别作用于每个组
分组方法:按指定的一列或多列值分组,值相等的为一组
SELECT子句只能包含Group By子句后的列名、或者集合函数运算式。
使用HAVING短语筛选最终输出结果
只有满足HAVING短语指定条件的组才输出
HAVING短语与WHERE子句的区别:作用对象不同
WHERE与FROM配合使用,选择满足条件的行,作用于分组运算之前。
HAVING与GROUP BY配合使用,选择满足条件的分组,作用于分组运算之后。