2022年数据库查询操作详解可用 .pdf
一 、数 据 查 询 - 单 表 查 询(1) 查 询语 句 格式Select all|distinct ,From ,where group by having order by asc|desc ; 注: all|distinct 中 all 为缺省值,取消结果中的重复列则用distinct;asc|desc中 asc为缺省值, 表示按照升序排列。对于空值, 若按照升序排,则含空值的元组显示在最后面;若按降序排,则空值的元组最先显示。(2) 查 询指 定 列a)查询部门表dept 中所有部门的详细信息,并且列名用汉字表示。 selectDNO, DNAME, ADDR fromdept; b)查询部门表dept 中人力资源部的部门编号。selectDNO fromdept whereDNAME = 人力资源部 ;中各个列的先后顺序可以与表中的顺序不一致. (3) 查 询全 部 列查询全体学生的详细记录Select * From Student ; (4) 将 查询 结 果的 列 名用 别 名显 示查询部门表dept 中所有部门的详细信息,并且列名用汉字表示。 selectDNO 部门编号, DNAME 部门名称, ADDR 部门地址fromdept; (5) 在 查询 的 结果 中 插入 新 的一 列 用来 显 示指 定 的 内容Select Sname NAME , Year of Birth:BIRTH ,Sbirth BIRTHDAY ,Sdept DEPARTMENT From Stuent ; 则显示的结果中, 每个元组的第二列均为” Year of Birth: ” ,此列在原数据库中是不存在的. (6) 查 询经 过 计算 的 值Select 子句的 不仅可以是表中的属性列,也可以是表达式。例:查询全体学生的姓名及其出生年月Select Sname ,2004 Sage /*当时年份减去年龄为出生年月名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 8 页 - - - - - - - - - From Stufent ; (7) 设 置查 询 显示 的 字母 全 为大 写 (或 小 写) Select Sname , Year of Birth: ,2004 Sage ,LOWER(Sdept) From Student ; 此时 Sdept 显示的结果全为小写Select Sname , Year of Birth: ,2004 Sage ,UPPER(Sdept) From Student ; 注:要设置查询表中的属性列名的大小写可以用LOWER,UPPER 。(8) 消 除取 值 重复 的 行a)查询雇员表empl 中出现的所有部门编号,要求无重复。selectdistinctDNO fromEMPL ; b)查询项目表proj 中所有项目名称。selectPNAME fromPROJ 等价于select all PNAME fromPROJ (9) 查 询满 足 条件 的 元组常用的查询条件查询条件谓词比较=, , = , = ,!= , ,! , ! ,NOT+ 上述比较运算符确定范围Between and ,not between and 确定集合In , not in 字符匹配Like ,not like 空值NULL ,NOT NULL 多重条件 (逻辑运算 ) And ,or ,not 注: Between 后是范围的下限,and 后是范围的上限.查询结果中包含上下限的结果. a)查询成绩不及格的学生的学号Select distinct Sno From SC Where Grade 60 ; b)查询年龄在20 到 30(包含 20 及 30)之间的学生的姓名、系别和年龄Select Sname ,Sdept ,Sage From Student Where Sage between 20 and 30 ;c)查询计算科学系(CS) , 数学系 (MA) ,信息系 (IS)学生的姓名和性别名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 8 页 - - - - - - - - - Select Sname ,Ssex From Student Where Sdept in ( CS , MA , IS ) ; (10) 含 通 配符 ” %” 的 查询%(百分号 ):代表任意长度 (长度可以为0)的字符串, 例如 a%b 代表以 a 开头且以 b 结尾的任意长度的字符串,acb ,afdsagasdsab ,ab都满足。例:查询雇员表empl 中姓名以“伟“字结尾的员工信息。select* fromEMPL whereENAME like% 伟;(11) 含 通 配符 ” _” 的 查 询_(下划线 ):代表任意单个字符,例a_b 代表以 a 开头且以b 结尾的长度为3 的字符串。例:查询姓“欧阳”且全名3 个汉字的学生的姓名Select Sname From Student Where Sname like 欧阳 _ ; 注:一个汉字占两个字符的位置(12) 字 符 串本 身 含通 配 符 的查 询使用使用escape 。查询以 ” DB_” 开头,且倒数第三个字符为i 的课程的详细情况。Select * From Student Where Cname like DB_%i_ escape ; 注: escape 表示 ” 为换码字符,则第一个” _” 是普通的字符,后两个” _” 表示通配符。(13) 涉 及 空值 的 查询例:查询所有有成绩的学生的学号Select Sno From SC Where Grade IS NULL ; 注:此处“ IS”不能用 ” =” 替代(14) 带 排 序的 查 询查询工作表job 中的工作信息,结果按工作天数升序排列。select* fromJOB orderbyDAYS asc; 等价于select* fromJOB 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 8 页 - - - - - - - - - orderbyDAYS asc; 查询雇员表empl 中所有员工的详细信息,结果按员工姓名降序排列。select* fromEMPL orderbyENAME desc;(15) 含 聚 集函 数 的查 询聚集函数主要有:Count (distinct|all *) / 统计元组个数Count (distinct|all ) / 统计一列中值的个数Sum (distinct|all ) / 计算一列值的总和(此列必须是数值型) Avg (distinct|all ) / 计算一列值的平均值(此列必须是数值型) Max (distinct|all ) / 求一列值中的最大值Min (distinct|all ) / 求一列值中的最小值注: distinct|all 缺省时为all. 在聚集函数遇到空值时,除count(*)外,都跳过空值而只处理非空值. 例:查询1 号课程的学生的最高分数Select max(Grade) From SC Where Cno = 1 ; (16) 到 GROUP BY 子 句 的 查 询a)求各个课程号及相应的选课人数select Cno ,count(Sno) from SC group by Cno ; b)查询选修了3 们以以上的课程的学生的学号select Sno from SC croup by Sno having count(*) 3 ; 注: where 子句与having子句短语的区别在于作用对象不同。Where 子句作用于基本表或视图,从中选择满足条件的元组;having子句作用与组,从中选择满足条件的组。二 、数 据 查 询 - 连 接 查 询若一个查询同时设计两个以上的表,则称之为连接查询。(1) 等 值 与 非等 值 连接 查 询格式如下:. . 其中主要的比较运算符有:= , ,= ,= ,!=(或) 等. 此外连接谓词还可以有如下的形式:. between . and . 当连接运算符为=时,称为等值连接,否则称为非等值连接。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 8 页 - - - - - - - - - 注:当属性列在查询的所有表中是唯一的时候则可以去掉前面的表名,否则必须加上表名。例:查询每个学生及其选修课程的情况. Select Student.* ,SC.* From Student ,SC Where Student.Sno = SC.Sno ; (2) 自 身 连 接例:查询每一门课程的间接先修课(即先修课的先修课) 分析: 此时为 Course表的自身连接, 故要为 Course表去两个别名, 一个是 first, 一个是 second。Select first.Cno ,second.Cno From Course first ,Course second Where first.Cpno = second.Cno ; (3) 外 连接在上例中,没有显示200215123 和 200215125 两个学生的信息,原因在于他们没有选课。有时想以Student 表为主体列出每个学生的基本情况及其选课情况,则需要使用外连接。用外连接做上面的例题:Select Student.Sno ,Sname ,Ssex ,Sage ,Sdept ,Cno ,Cgrade From Student LEFT JOIN SC ON (Student.Sno = Sc.Sno) ;/* 也可以用USING来去掉上面结果中的重复值:From Student LEFT JOIN SC USING(Sno) ; */ 注:做链接列出左边关系(如本例 )中的所有元组,右外连接列出右边关系中的所有元组。(4) 复 合条 件 连接在上面的例子中, where 子句中只有一个条件, 即连接谓词。 Where 也可以有多个连接条件,称为符合条件连接。例:查询选修2 号课程且成绩在90 分以上的所有学生Select Student.Sno ,Sname From Student ,SC Where Student.Sno = SC.Sno AND/* 连接谓词 */ SC.Cno = 2 AND SC.Grade 90 ; /* 其它限制条件*/ 例:查询每个学生的学号、姓名、选修课程名及成绩Select Student.Sno ,Sname ,Cname ,Grade From Student ,SC ,Course Where Student.Sno = SC.Sno and SC.Cno = Course.Cno ;三 、数 据 查 询 - 集 合 查 询集合查询操作主要包括并操作UNION、交操作INTERSECT 和差操作EXCEPT 。注:多个集合操作的个查询结果的列数必须相同,对应项的数据类型也必须相同。(1) 并 操 作 UNION 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 8 页 - - - - - - - - - 使用 UNION 将多个查询结果并起来时,系统会自动的去掉重复元组;如果要保留重复元组,则可以使用UNION ALL操作符。例:查询计算机科学系的学生及年龄不大于19 岁的学生 . Select * From Student Where Sdept = CS Union Select * From Student Where Sage = 19 ; 例:查询选修了1 号课程或者2 号课程的学生Select Sno From SC Where Cno = 1Union Select Sno From SC Where Cno = 2 ; (2) 交 操作 (INTERSECT) 例:查询计算机科学系的学生与年龄不大于19 岁的学生的交集Select * From Student Where Sdept = CS Intersect Select * From Student Where Sage = 19 ; 等价于Select * From Student Where Sdept = CS and Sage = 19 ; (3) 差 操作 (EXCEPT) 例:查询计算机科学系的学生与年龄不大于19 岁的学生的差集Select * From Student Where Sdept = CS Except Select * 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 8 页 - - - - - - - - - From Student Where Sage = (select AVG(Grade) /* 某个学生的平均成绩*/ From SC y Where y.Sno = x.Sno) ; (3) 带 有 ANY(SOME) 或 ALL 谓 词 的子 查 询子查询返回单值可以用比较运算符,但是但会多值要用NAY 或 ALL 谓词修饰。而使用ANY或 ALL谓词时则必须同时使用比较运算符。例:查询其他系中比计算机科学系某一学生年龄小的学生的姓名及年龄Select Sname ,Sage From Student Where Sage any (select Sage From Student Where Sdept = CS ) And Sdept CS ; 例:查询其他系中比计算机科学系所有学生年龄都小的学生的姓名及年龄Select Sname ,Sage From Student Where Sage all (select Sage 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 8 页 - - - - - - - - - From Student Where Sdept = CS ) And Sdept CS ; (4) 带 有 EXITS 或 NOT EXITS 谓 词的 子 查 询例:查询所有选修了1 号课程的学生的姓名Select Sname From Student Where not exits (select * From Student Where Sno = Student.Sno and Cno = 1 ) ; 例:查询选修了全部课程的学生的姓名Select Sname From Student Where not exits (select * From Course Where not exits(select * From SC Where Sno = Student.Sno and Cno = Course.Cno) ; 例:查询了至少选修了学生200215122 选修的全部课程的学生的号码Select distinct Sno From SC SCX Where not exits(select * From SC SCY Where SCY .Sno = 200215122 and not exits(select * from SC SCZ where SCZ.Sno = SCX.Sno and SCZ.Cno = SCY.Cno) ; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 8 页 - - - - - - - - -