《数据库系统概论》知识点总结 第三章sql语言例题

第三章 sql数据库操作

例题1:建立一个“学生表”Student

CREATE TABLE Student(
    Sno CHAR(9) PRIMARY KEY,
    Sname CHAR(20) UNIQUE,
    Ssex CHAR(2),
    Sage SMALLINT,
    Sdept CHAR(20)
);

系统执行玩这个sql语句之后就在数据库中建立一个新的空的“学生”表,并将“学生”表的定义以及相关约束条件存放在数据字典中。

例题2:建立一个“课程”表Course

CREATE TABLE Course(
    Cno CHAR(4) PRIMARY KEY,
    Cname CHAR(40) NOT NULL,
    Cpno CHAR(4),
    Ceredit SAMLLINT,
    FOREIGN KEY (Cpno) REFERENCE Course(Cno)
);  //Cpno是外码,被参照表示Course,被参照列是Cno

例题3:建立一个学生表SC

CREATE TABLE SC(
    Sno CHAR(9),
    Cno CHAR(4),
    Grade SMALLINT,
    PRIMARY KEY(Sno,Cno),
    FOREIGN KEY (Sno) REFERENCE Student(Sno),
    FOREIGN KEY (Cno) REFERENCE Course(Cno)
);

例题4:限制删除

DROP TABLE Student RESTRICT;

如果存在依赖于Student表的对象的话,那么删除将会报错,删除会失败,这些依赖包括:被其他表的约束所引用,视图,触发器,或者存储过程和函数。

例题5:无限制删除

DROP TABLE Student CASCADE;

Student表一旦被删除,不仅数据和表的定义会被删除,在表上建立的索引,触发器等对象也会一并被删除。

例题6:将SC表的SCno索引名改为SCSno

ALTER INDEX SCno RENAME TO SCSno;

例题7:删除Student表的Stusname索引

DROP INDEX Stusname;

例题8:查询全体学生的详细信息

SELECT * FROM Student;

或者

SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;

例题9:查询全体学生的姓名,出生年份和所在院系,要求用小写字母表示系名

SELECT Sname,'Year of birth:',2018-Sage,LOWER(Sdept)
FROM Student;

例题10:查询结果里面包含了重复的行,我们要删除重复的行

SELECT DISTINCT Sno
FROM SC; 

默认的查询属性是ALL,也就是查询所有的记录

例题11:查询计算机科学系全体学生名单

SELECT Sname
FROM Student
WHERE Sdept='CS';

例题12:查询所有年龄在20-30岁之间(包括20和30)的学生的姓名,系别,年龄

SELECT Sname,Sdept,Ssex
FROM Student
WHERE Sage BETWEEN 20 AND 30;

例题13:查询所有姓刘的学生的姓名,学号和性别

SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE '刘%';

例题14:查询姓名中第二个字为阳的学生姓名和学号

SELECT Sname,Sno
FROM Student
WHERE Sname LIKE '_阳%';

例题15:查询课程DB_Design课程的课程号和学分

SELECT Cno,Ceredit
FROM Course
WHERE Cname LIKE 'DB\_Design' ESCAPE '\';

ESCAPE '\'表示'\'为转义符号,也就是_就是普通的下划线。

例题16:查询课程号以DB_开头且倒数第三个字符为i的课程的课程号

SELECT *
FROM Course
WHERE Cname LIKE 'DB\_%i__'ESCAPE'\';

例题17:查询三个系学生的信息

SELECT Sname,Ssex
FROM Student
WHERE Sdept='IS' OR Sdept='MA' OR Sdept='CS';

SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ('IS','MA','CS');

例题18:查询学号为3的同学的信息,按照分数降序排序

SELECT Sno,Grade
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC;  

例题19:两个属性排序的情况

SELECT *
FROM Student
ORDER BY Sdept,Sage DESC;

ORDER BY 中缺省的属性是升序排序。

聚集函数汇总:

COUNT() 统计一列中值的个数

SUM() 计算一列值的总和

AVG() 计算一列值的平均值

MAX() 求一列值中的最大值

MIN() 求一列值中的最小值

例题20:查询选修了课程的学生人数

SELECT COUNT(DISTINCT Sno)
FROM SC;

例题21:查询选修了1号课程的学生的平均成绩

SELECT AVG(Grade)
FROM SC
WHERE Cno='1';

例题22:求各课程号及相应选课人数

SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;

例题23:查询选修了三门以上课程的学生学号

SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) > 3;

这个例题是选根据Sno进行分组然后再计算分组之后记录的数量。

PS:聚集函数是不可以写在WHERE的判断条件的

例题24:查询每个学生及其选修课程的情况

SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno=SC.Sno;

例题25:查询选修了2号课程且成绩在90分以上的学生的学号和姓名

SELECT Student.Sno,Sname
FROM Student,SC
WHERE Student.Sno=SC.Sno AND 
SC.Sno='2' AND SC.Grade>90;

例题26:进行自身连接,查询课程的先修课的先修课

首先给Course命名,第一个对象命名为FIRST,第二个命名为SECOND

SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno=SECOND.Cno;

例题27:进行外链接查询

SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno);

左外链接列出左边关系中的所有情况,右外链接列出右边关系中的所有情况。

例题28:查询学生的学号,姓名,选修课名以及成绩(多表连接)

SELECT Student.Sno,Sno,Sname,Grade
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;

例题29:嵌套查询,查询与‘刘晨’在同一个系学习的学生

SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN
(
    SELECT Sdept
    FROM Student
    WHERE Sname='刘晨';
)

括号中会返回一个结果集交给外层循环中的WHERE进行条件判断。

例题30:查询选修了课程名为‘信息系统’的学生学号和姓名

SELECT Sno,Sname
FROM Student
WHERE Sno IN(
    SELECT Sno
    FROM SC
    WHERE Cno IN (
        SELECT Cno
        FROM Course
        WHERE Cname='信息系统'
)
);

例题31:找出每个学生超过他自己选修课程平均成绩的课程号

SELECT Sno,Cno
FROM SC X
WHERE Grade>=(
    SELECT AVG(Grade)
    FROM SC Y
    WHERE Y.Sno=X.Sno
);

例题32:查询非计算机系学生中年龄小于计算机系中任意一个学生的学生的姓名和年龄

SELECT Sname,Sage
FROM Student
WHERE Sage < ANY(
    SELECT Sage
    FROM Student
    WHERE Sdept='CS'
)
AND Sdept <> 'CS';

任意就是ANY,所有的话就是ALL。

例题33:查询所有选修了1号课程的学生的姓名

SELECT Sname
FROM Student
WHERE EXISTS(
    SELECT *
    FROM SC
    WHERE Sno=Studnet.Sno AND Cno='1'
);

例题34:查询至少选修了学生201215122选修的全部课程的学生号码

题目的语义也可以表达为:不存在这样的课程y,学生201215122选修了,但是学生x没有选修

推演过程如下

SELECT Sno
FROM SC SCX
WHERE NOT EXISTS(
    SELECT *
    FROM SC SCY
    WHERE Sno='201215122' AND 
    NOT EXISTS(
        SELECT *
        FROM SC SCZ
        WHERE SCZ.Sno=SCX.Sno AND
              SCZ.Con=SCY.Cno
)
);

例题35:查询选修课程1和选修课程2学生的并集

SELECT Sno
FROM SC
WHERE Cno='1'
UNION
SELECT Sno
FROM SC
WHERE Cno='2';

例题36:查询计算机系学生以及年龄不大于19岁学生的交集

SELECT *
FROM Student
WHERE Sdept='CS'
INTERSECT
SELECT *
FROM Student
WHERE Sage<=19;

例题37:查询计算机系学生与年龄不大于19岁学生的差集

SELECT *
FROM Student
WHERE Sdept='CS'
EXCEPT
SELECT *
FROM Student
WHERE Sage<=19;

例题38:插入一条选课记录(‘201215122’,‘1’)

INSERT INTO
SC(Cno,sno)
VALUES('201215122','1');

例题39:对每个系,求学生的平均年龄,并把结果插入数据库中

INSERT INTO Dept_age(Sdept,Avg_age)
SELECT Sdept,AVG(age)
FROM Student
GROUP BY Sdept;

例题40:将学生201215122的年龄改为22

UPDATE Student
SET Sage=22
WHERE Sno='201215122';

例题41:删除计算机系所有学生的选课记录

DELETE 
FROM SC
WHERE Sno IN (
    SELECT Sno
    FROM Student
    WHERE Sdept='CS'
);

例题42:选出选修了1号课程且成绩不及格或者缺考的学生的学号

SELECT Sno
FROM SC
WHERE Cno='1' AND Grade < 60
UNION
SELECT Sno
FROM SC
WHERE Cno='1' AND Grade IS NULL;

例题43:建立信息系学生视图,并且保证进行信息的删除和修改时任然只对这个视图作用

CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS'
WITH CHECK OPTION;

例题44:将学生的学号和平均成绩定义为一个视图

CREATE VIEW S_G(Sno,Gavg)
AS
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno;

例题45:查询S_G视图中平均分为90分以上的学生的学号和平均分

SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90;

PS:数据的物理独立性是指用户的应用程序不依托于数据库的物理结构构件,比如一个应用程序可以使用两个api相同的数据库来储存数据;数据的逻辑独立性是指数据表进行重构时(比如添加一个新的字段),应用程序不受影响。

猜你喜欢

转载自blog.csdn.net/haohulala/article/details/82623856