数据库原理-第3章:数据查询
Posted 可能自洽
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库原理-第3章:数据查询相关的知识,希望对你有一定的参考价值。
数据查询
1.1 单表查询
例1 查询全体学生的学号与姓名
SELECT Sno, Sname
FROM Student;
例2 查询全体学生的姓名、学号、所在系
SELECT Sname, Sno, Sdept
FROM Student;
例3 查询全体学生的详细记录。
SELECT Sno, Sname, Ssex,Sage, Sdept
FROM Student;
或
SELECT *
FROM Student;
例4 查全体学生的姓名及其出生年份
SELECT Sname, 2021-Sage
FROM Student;
例5 查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名
SELECT Sname, 'Year of Birth: ', 2021-Sage, LOWER(Sdept)
FROM Student;
例6-1 查询选修了课程的学生学号
SELECT Sno
FROM SC;
例6-2 查询选修了课程的学生学号
SELECT DISTINCT Sno
FROM SC;
例7 查询所有年龄在20岁以下的学生姓名及其年龄。
SELECT Sname, Sage
FROM Student
WHERE Sage < 20;
或
SELECT Sname, Sage
FROM Student
WHERE NOT Sage >= 20;
例8-1 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。
SELECT Sname, Sdept, Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
例8-2 查询年龄不在20~23岁之间的学生姓名、系别和年龄。
SELECT Sname, Sdept, Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
例9-1 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别
SELECT Sname, Ssex
FROM Student
WHERE Sdept IN ( ‘IS’, ‘MA’, ‘CS’ );
例9-2 查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。
SEL ECT Sname, Ssex
FROM Student
WHERE Sdept NOT IN ( ‘IS’, ‘MA’, ‘CS’ );
例10-1 查询所有姓刘学生的姓名、学号和性别
SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname LIKE ‘刘%’;
例10-2 查询所有不姓刘的学生姓名、学号和性别
SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname NOT LIKE ‘刘%’;
例11 查询姓"欧阳"且全名为三个汉字的学生的姓名
SELECT Sname
FROM Student
WHERE Sname LIKE ‘欧阳__’;
例12 查询名字中第2个字为"阳”字的学生的姓名和学号
SELECT Sname, Sno
FROM Student
WHERE Sname LIKE ‘__阳%’;
例13 查询DB_Design课程的课程号和学分(使用换码字符将通配符转义为普通字符)
SELECT Cno, Ccredit
FROM Course
WHERE Cname LIKE 'DB\\_Design' ESCAPE '\\';
/* 当查询的内容中含字符“_”,需在字符“_”前加字符“\\”,并在最后用ESCAPE ‘\\’
此时’DB_Design’中的“_”就变为非通配符 */
例14 查询以"DB_ "开头,且倒数第3个字符为i的课程的详细情况
SELECT *
FROM Course
WHERE Cname LIKE 'DB\\_%i__' ESCAPE '\\';
例15 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号
SELECT Sno, Cno
FROM SC
WHERE Grade IS NULL;
涉及空值的查询:使用谓词IS NULL或IS NOT NULL。“IS NULL”不能用“= NULL”代替
例16 查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列
SELECT Sno, Grade
FROM SC
WHERE Cno=‘3’ ORDER BY Grade DESC;
例17 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列
SELECT *
FROM Student
ORDER BY Sdept, Sage DESC;
例18 查询学生总人数
SELECT COUNT(*)
FROM Student;
例19 查询选修了课程的学生人数
SELECT COUNT(DISTINCT Sno)
FROM SC;
注:用DISTINCT以避免重复计算学生人数
例20 计算1号课程的学生平均成绩
SELECT AVG(Grade)
FROM SC
WHERE Cno=‘1’;
例21 查询选修1号课程的学生最高分数
SELECT MAX(Grade)
FROM SC
WHERE Cno=‘1’;
例22 求各个课程号及相应的选课人数
SELECT Cno, COUNT(Sno)
FROM SC
GROUP BY Cno;
例23 查询选移了3门以上课程的学生学号
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) >3;
例24 查询有3门以上课程是90分以上的学生的学号及(90分以上的)课程数
SELECT Sno, COUNT(*)
FROM SC
WHERE Grade>=90
GROUP BY Sno
HAVING COUNT( *)>=3;
1.2 连接查询
例1-1 查询每个学生及其选修课程的情况
SELECT Student.* , SC.*
FROM Student, SC
WHERE Student.Sno = SC.Sno;
例1-2 对例1-1用自然连接完成。
SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
FROM Student, SC
WHERE Student.Sno = SC.Sno;
例2 查询每一门课的间接先修课(即先修课的先修课 )
SELECT FIRST.Cno, SECOND.Cpno
FROM Course FIRST, Course SECOND
WHERE FIRST.Cpno = SECOND.Cno;
例3 查询每个学生及其选修课程的情况包括没有选修课程的学—用外连接操作
SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
FROM Student LEFT OUT JOIN SC
ON (Student.Sno=SC.Sno);
例4 查询选修2号课程且成绩在90分以上的所有学生的学号、姓名
SELECT Student.Sno, Student.Sname
FROM Student, SC
WHERE Student.Sno = SC.Sno
AND SC.Cno= ‘2’
AND SC.Grade > 90;
例5 查询每个学生的学号、姓名、选修的课程名及成绩
SELECT Student.Sno, Sname, Cname, Grade
FROM Student, SC, Course
WHERE Student.Sno = SC.Sno
AND SC.Cno = Course.Cno;
1.3 嵌套查询
例1 查询与“刘晨”在同一个系学习的学生
SELECT Sno, Sname, Sdept
FROM Student
WHERE Sdept IN
(
SELECT Sdept
FROM Student
WHERE Sname='刘晨’
);
例2-1 查询选修了课程名为“信息系统”的学生学号和姓名
SELECT Sno, Sname
FROM Student
WHERE Sno IN
(
SELECT Sno
FROM SC
WHERE Cno IN
(
SELECT Cno
FROM Course
WHERE Cname=‘信息系统’
)
);
例2-2 用连接查询
SELECT Student.Sno, Sname
FROM Student, SC, Course
WHERE Student.Sno = SC.Sno
AND SC.Cno = Course.Cno
AND Course.Cname='信息系统’;
1.4 集合查询
UNION: 将多个查询结果合并起来时,系统自动去掉重复元组
UNION ALL:将多个查询结果合并起来时,保留重复元组
例1-1 查询计算机科学系的学生及年龄不大于19岁的学生
SELECT *
FROM Student
WHERE Sdept= ‘CS’
UNION
SELECT *
FROM Student
WHERE Sage<=19;
例1-2
SELECT DISTINCT *
FROM Student
WHERE Sdept= ‘CS’
OR Sage<=19;
例2-1 查询选修了课程1或者选修了课程2的学生
SELECT Sno
FROM SC
WHERE Cno=‘1’
UNION
SELECT Sno
FROM SC
WHERE Cno= ‘2’ ;
例2-2
SELECT DISTINCT Sno
FROM SC
WHERE Cno=‘1’
OR Cno=’ 2’;
例3-1 查询计算机科学系中年龄不大于19岁的学生
SELECT *
FROM Student
WHERE Sdept=‘CS’
INTERSECT
SELECT *
FROM Student
WHERE Sage<=19;
例3-2
SELECT
FROM Student
WHERE Sdept= ‘CS’
AND Sage<=19;
例4-1 查询计算机科学系的学生与年龄不大于19岁的学生的差集。
SELECT *
FROM Student
WHERE Sdept=‘CS’
EXCEPT
SELECT *
FROM Student
WHERE Sage <=19;
例4-2 本例实际上是查询计算机科学系中年龄大于19岁的学生
SELECT *
FROM Student
WHERE Sdept= ‘CS’
AND Sage>19;
1.5 基于派生表的查询
例1 找出每个学生超过他自己选修课程平均成绩的课程号
SELECT Sno, Cno
FROM SC, (SELECT Sno, Avg(Grade) FROM SC GROUP BY Sno) AS Avg_sc(avg_sno,avg_grade)
WHERE SC.Sno = Avg_SC.avg_Sno
AND SC.Grade >=Avg_SC.avg_grade ;
例2 查询所有选修了1号课程的学生姓名
SELECT Sname
FROM Student, (SELECT Sno FROM SC WHERE Cno=‘1’) AS SC1
WHERE Student.Sno = SC1.Sno;
以上是关于数据库原理-第3章:数据查询的主要内容,如果未能解决你的问题,请参考以下文章
[架构之路-23]:目标系统 - 系统软件 - C语言的结构与程序的工作原理 - 数据类型与数据定义(待续)