第4章-查询语句和视图
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
选择查询IN 选择查询
格式: 格式: IN <值表 值表>, NOT IN <值表 值表> 值表 值表 <值表 :用逗号分隔的一组取值 值表>: 值表 例:查询成绩为85、86或88的选课记录。 select * from se where grade in ( 85,86,88 );
选择查询IN 选择查询
单表查询
查询全部 投影运算 包含计算列 选择运算 分组统计 排序 综合
1、查询全部属性列 、
例:查询全部学生的所有属性。 。 select stdid,stdname,stdsex,sideid,classid,dept,birthday from student 或 select * from student
Group by
例:查询每个系的男女生人数。 select dept,stdsex,count(*) from student group by dept,stdsex
对查询结果分组 (续)
GROUP BY子句的作用对象是查询的中间结果表 子句的作用对象是查询的中间结果表 分组方法:按指定的一列或多列值分组, 分组方法 : 按指定的一列或多列值分组 , 值相等的为 一组 使用GROUP BY子句后, SELECT子句的列名列表中 子句后, 使用 子句后 子句的列名列表中 只能出现分组属性和集函数
SELECT子句的<目标列表达式>可以是: SELECT子句的<目标列表达式>可以是: 子句的
算术表达式 字符串常量 函数 列别名
包含计算列-续 包含计算列 续
例:查询每个学生的姓名、出生年份、所在系(小写)。 select stdname name,'year of birth: ’ birth, year(birthday) birthday ,lower(dept) department from student
使用聚合函数 (续)
例:查询学生总人数。 select count(*) from student; ; 例:查询选修了课程的学生人数。 select count(distinct stdid) from se; ; 注:用distinct以避免重复计算学生人数 以避免重复计算学生人数
使用聚合函数
2、投影运算 、
例:查询全体学生的姓名、性别、所在系。
select stdname,stdsex,dept from student
例:列出有选课的学生的学号。
select distinct stdid from se
3、包含计算列 、
例:查询所有学生的学号、姓名、年龄。 select stdid,stdname,year(getdate())-year(birthday) from student 或 select stdid as ‘学号’,stdname as ‘姓名’, year(getdate())-year(birthday) as ‘年龄’ from student
LIKE
匹配模板为含通配符的字符串
% (百分号 代表任意长度(长度可以为0)的字符串 百分号) 百分号 代表任意长度(长度可以为 ) 表示以a开头 结尾的任意长度的字符串。 例:a%b表示以 开头,以b结尾的任意长度的字符串。如 表示以 开头, 结尾的任意长度的字符串 acb,addgb,ab 等都满足该匹配串 , , _ (下横线 代表任意单个字符 下横线) 下横线 表示以a开头 结尾的长度为3的任意字符串 例:a_b表示以 开头,以b结尾的长度为 的任意字符串。如 表示以 开头, 结尾的长度为 的任意字符串。 acb,afb等都满足该匹配串 , 等都满足该匹配串
WHERE、GROUP BY和HAVING 、 和
执行WHERE子句,从表中选取行 由GROUP BY对选取的行进行分组 执行聚合函数 执行HAVING子句选取满足条件的分组
使用GROUP BY子句分组 使用 子句分组
例: 求选修人数超过5人并以‘c’开头的课程号及其平均分。 select eleid as '课程号 课程号',avg(grade) as '平均分 平均分' 课程号 平均分 from se where eleid like ‘c%' group by eleid having count(*)>5
4、选择运算 、
查 询条 件 比 较 谓 词 =, ,<,>= <= !=,<> !>, ; > , , , !< NOT+ 上述比较运算符 BETWEEN AND ,NOT BETWEEN AND IN NOT IN , LIKE NOT LIKE , IS NULL IS NOT NULL , AND OR ,
选择查询IS 选择查询 [NOT ] NULL
使用谓词 IS NULL 或 IS NOT NULL “IS NULL” 不能用 “= NULL” 代替 例: 某些学生选修课程后没有参加考试,所以有选课记录, 但没有考试成绩。查询缺少成绩的学生的学号和相应的 课程号。 select stdid,eleid from se where grade is null; ;
确定范围 确定集合 字符匹配 空 值 多重条件
WHERE子句常用的查询条件 子句常用的查询条件
选择运算—between and 选择运算
例:查询成绩在60-80之间的选课记录。 select * from se where grade>=60 and grade<=80; ; 或 select * from se where grade between 60 and 80; ;
例 : 查询既不是信息系、数学系,也不是计算机科学系 的学生的姓名和性别。 select stdname,stdsex , from student where dept not in ( 'is','ma','cs' ); , ,
选择查询- 选择查询-like
[NOT] LIKE ‘<匹配串 匹配串>’ [ESCAPE ‘ <换码字符 换码字符>’] 匹配串 换码字符 <匹配串 :指定匹配模板,匹配模板:固定字符串或 匹配串>:指定匹配模板,匹配模板: 匹配串 含通配符的字符串
示例数据库P87 示例数据库
student(stdid,stdname,stdsex,sideid,classid,dept,birt hday) elective(eleid,elename,credit,tid) se(stdid,eleid,grade) teacher(tid,tname)
多重条件查询
例: 查询信息系(IS)、数学系(MA)和计算机科学系(CS) 学生的姓名和性别。 select stdname,stdsex , from student where dept in ( 'is','ma','cs' ) , , 可改写为: 可改写为: select stdname,stdsex , from student where dept= ' is ' or dept= ' ma' or dept= ' cs '; ;
5、分组统计 、
根据某些列的列值进行分组,这些列的列值相同的为 一组,然后对每一组应用聚合函数进行统计。
聚合函数
计数 COUNT([DISTINCT|ALL] *) COUNT([DISTINCT|ALL] <列名>) 计算总和 SUM([DISTINCT|ALL] <列名>) 计算平均值 AVG([DISTINCT|ALL] <列名>) 求最大值 MAX([DISTINCT|ALL] <列名>) 求最小值 MIN([DISTINCT|ALL] <列名>) ( – DISTINCT短语:在计算时要取消指定列中的重复值 短语: 短语 – ALL短语:不取消重复值,为缺省值 短语: 短语 不取消重复值,
name --------李勇 刘晨 王名 张立 birth ------------brithday -----------department
-----------cs ma is cs
Year of Birth: 1976 Year of Birth: 1977 Year of Birth: 1978 Year of Birth: 1977
LIKE
例:查询所有姓刘学生的姓名、学号和性别。 select stdname,stdid,stdsex , , from student where stdname like ‘刘%’; 刘 ; 例:查询所有不姓刘的学生姓名。 。 select stdname,stdid,stdsex , , from student where stdname not like '刘%'; 刘 ;
例:查询选修1号课程的平均分。 select avg(grade) from se where eleid= ' 1 '; ;
对查询结果分组
使用GROUP BY子句分组,细化集函数的作用对象 子句分组, 使用 子句分组 未对查询结果分组, 未对查询结果分组,集函数将作用于整个查询结果 对查询结果分组后,集函数将分别作用于每个组 对查询结果分组后,
多重条件查询
用逻辑运算符AND和 OR来联结多个查询条件 和 用逻辑运算符 来联结多个查询条件
AND的优先级高于 的优先级高于OR 的优先级高于 可以用括号改变优先级
多重条件查询
例: 查询计算机系年龄在20岁以下的学生姓名。 select stdname from student where dept= 'cs' and year(getdate()) –year(birthday)<20; ;
like
匹配模板为含通配符的字符串( 匹配模板为含通配符的字符串(续) 例: 查询名字中第2个字为"阳"字的学生的姓名和学号。 select stdname,stdid , from student where stdname like '_阳%'; 阳 ;
LIKE
使用换码字符将通配符转义为普通字符 当用户要查询的字符串本身就含有 % 或 _ 时,要使用 ESCAPE '<换码字符>' 短语对通配符进行转义。 例:查询以"DB_"开头,且倒数第3个字符为 i的课程的详细 情况。 select * from elective where elename like 'db\_%i_ _' escape ' \ ';
语法说明
SELECT子句:指定要显示的属性列 子句: 子句 TOP n:指定从查询结果集中输出前 行 :指定从查询结果集中输出前n行 INTO子句:查询去向 子句: 子句 FROM子句:指定查询对象 基本表或视图 子句: 基本表或视图) 子句 指定查询对象(基本表或视图 WHERE子句:指定查询条件 子句: 子句 GROUP BY子句:对查询结果按指定列的值分组,该 子句: 子句 对查询结果按指定列的值分组, 属性列值相等的元组为一个组。 属性列值相等的元组为一个组 。 通常会在每组中作用 集函数。 集函数。 HAVING短语:筛选出只有满足指定条件的组 短语: 短语 ORDER BY子句:对查询结果表按指定列值的升序或 子句: 子句 降序排序
第四章 查询语Fra Baidu bibliotek和视图
计算机信息工程学院
查询语句和视图
4.1 4.2 4.3 4.4 4.5 4.6 4.7 单表查询 数据源中数据表的各种连接 子查询及逻辑运算符 关系集合运算的实现 视图 典型查询实例分析 查询语句小结
4.1 单表查询
SELECT [ALL|DISTINCT] [TOP n]<目标列表达式 目标列表达式> 目标列表达式 [,<目标列表达式 目标列表达式>] … [INTO 新表名 新表名] , 目标列表达式 FROM <表名或视图名 , <表名或视图名 ] … 表名或视图名>[, 表名或视图名 表名或视图名> 表名或视图名 [ WHERE <条件表达式 ] 条件表达式> 条件表达式 [ GROUP BY <列名 列名1> 列名 [ HAVING <条件表达式 ] ] 条件表达式> 条件表达式 [ ORDER BY <列名 列名2> [ ASC|DESC ] ]; 列名 ;