西北工业大学数据库系统实验一SQL练习

department(dNo,dName,officeRoom,homepage)
student(sNo,sName,sex,age,dNo)
course(cNo,cName,cPNo,credit,dNo)
sc(sNo,cNo,score,recordDate)

Query
一、单表
(1)查询所有年龄大于等于20岁的学生学号、姓名;
SELECT sNO, sName FROM student WHERE age >= 20;

(2)查询所有姓钱的男生学号、姓名、出生年份;
SELECT sNO, sName, 2023-age FROM student WHERE sName LIKE '钱%' AND sex = '男';

(3)查询所有学分大于3的课程名称;
SELECT cName FROM course WHERE credit >= 3;

(4)查询所有没有被分配到任何学院的学生姓名;
SELECT sName FROM student WHERE dNo IS NULL;

(5)查询所有尚未设置主页的学院名称。
SELECT dName FROM department WHERE homepage IS NULL;

二、聚集
(1)查询各个学院的平均年龄;
SELECT dNo, AVG(age) FROM student GROUP BY dNo;

(2)查询每个学生选修课程的平均分;
SELECT sNo, AVG(score) FROM course GROUP BY sNo;

(3)查询各课程的平均分;
SELECT cNo, AVG(score) FROM course GROUP BY cNo;

(4)查询各学院开设的课程门数;
SELECT dNo, COUNT(cNo) FROM course GROUP BY dNo;

(5)查询各门课程选修人数。
SELECT cNo, COUNT(dNo) FROM sc GROUP BY cNo;

三、多表
(1)查询“信息学院”所有学生学号与姓名;
SELECT sNo, sName FROM student WHERE dNo IN(SELECT dNo FROM department WHERE dName = '信息学院');

(2)查询“软件学院”开设的所有课程号与课程名称;
SELECT cNo, cName FROM course WHERE dNo IN(SELECT dNo FROM department WHERE dName = '软件学院');

(3)查询与“陈丽”在同一个系的所有学生学号与姓名;
SELECT sNo, sName FROM student WHERE dNo IN(SELECT dNo FROM student WHERE sName = '陈丽');

(4)查询与“张三”同岁的所有学生学号与姓名;
SELECT sNo, sName FROM student WHERE age IN(SELECT age FROM student WHERE sName = '张三');

(5)查询与“张三”同岁且不与“张三”在同一个系的学生学号与姓名;
SELECT sNo, sName FROM student WHERE age IN(SELECT age FROM student WHERE sName = '张三' AND dNo NOT IN(SELECT dNo FROM student WHERE sName = '张三'));

(6)查询学分大于“离散数学”的所有课程名称;
SELECT cName FROM course WHERE credit >= (SELECT credit FROM course WHERE sName = '离散数学');

(7)查询选修了课程名为“组合数学”的学生人数;
SELECT COUNT(sNo) FROM sc WHERE cNo IN(SELECT cNo FROM course WHERE cName = '' 组合数学);

(8)查询没有选修“离散数学”的学生姓名;
SELECT sName FROM student WHERE sNo NOT IN(SELECT sNo FROM sc WHERE cNo IN(SELECT cNo FROM course WHERE cName = '离散数学'));

(9)查询与“算法设计与分析”、“移动计算”学分不同的所有课程名称;
SELECT cName FROM course WHERE credit NOT IN(SELECT credit FROM course WHERE cName = 算法分析与设计'' or '移动计算');

(10)查询平均分大于等于90分的所有课程名称;
SELECT cName FROM course WHERE cNo IN(SELECT cNo FROM sc WHERE (SELECT AVG(score) FROM course GROUP BY cNo) >= 90);

(11)查询选修了“离散数学”课程的所有学生姓名与成绩;
SELECT student.sName, sc.score FROM student,sc WHERE student.sNo = sc.sNo AND sc.cNo=(SELECT cNo FROM course WHERE cName='离散数学');

(12)查询“王兵”所选修的所有课程名称及成绩;
SELECT course.cName, sc.score FROM course, sc WHERE course.cNo = sc.cNo AND student.sNo = (SELECT sNo FROM sudent WHERE sName='王兵');

(13)查询所有具有不及格课程的学生姓名、课程名与成绩;
SELECT student.sName, course.cName, sc.score FROM stuednt, course, sc WHERE student.sNo = sc.sNo AND course.cNo = sc.cNo AND sc.score < 60;

(14)查询选修了“文学院”开设课程的所有学生姓名;
SELECT sName FROM student, course, department, sc WHERE student.sNo = sc.sNo AND sc.cNo = course.cNo AND course.dNo = department.dNo AND department.dName = '文学院';

(15)查询“信息学院”所有学生姓名及其所选的“信息学院”开设的课程名称。
SELECT s.sName,c.cName
FROM student s,course c,sc
WHERE c.cNo = sc.cNo 
AND s.sNo = sc.sNo 
AND s.dNo IN(
            SELECT dNo
                FROM department
                WHERE dName = '信息学院'
)
AND c.cNo IN(
            SELECT cNo
            FROM course
            WHERE dNo in(
                        SELECT dNo
                        FROM department
                        WHERE dName='信息学院'
            )
);

四、综合
(1)查询所有学生及其选课信息(包括没有选课的学生);
SELECT s.sName,s.sNo,c.cName,c.cNo
FROM student s,course c,sc
WHERE s.sNo=sc.sNo and c.cNo=sc.cNo;

(2)查询“形式语言与自动机”先修课的课程名称;
SELECT cName
FROM course
WHERE cNo IN(
              SELECT cPNo
              FROM course
              WHERE cName = '形式语言与自动机'
);

(3)查询“形式语言与自动机”间接先修课课程名称;
SELECT cName
FROM course
WHERE cNo IN(
              SELECT cPNo 
              FROM course
              WHERE cNo in(
                           SELECT cPNo
                           FROM course
                           WHERE cName = '形式语言与自动机'
              )
);

(4)查询先修课为编译原理数学的课程名称;
SELECT cName
FROM course
WHERE cPNo IN(
            SELECT cNo
            FROM course
            WHERE cName = '编译原理数学'
);

(5)查询间接先修课为离散数学的课程名称;
SELECT cName
FROM course
WHERE cPNo IN(
              SELECT cNo 
              FROM course
              WHERE cPNo in(
                           SELECT cNo
                           FROM course
                           WHERE cName = '离散数学'
              )
);

(6)查询所有没有先修课的课程名称;
SELECT cName FROM course WHERE cPNo IS NULL;

(7)查询所有没选修“形式语言与自动机”课程的学生姓名;
SELECT sName
FROM student
WHERE sNo IN(
            SELECT sNo
            FROM sc
            WHERE cNo NOT IN(
                        SELECT cNo
                        FROM course
                        WHERE cName = '形式语言与自动机'
            )
);

(8)查询仅仅选修了离散数学一门课程的学生姓名;
SELECT sName
FROM student
WHERE sNo IN(
            SELECT sNo
            FROM sc
            WHERE cNo IN(
                        SELECT cNo
                        FROM course
                        WHERE cName = '离散数学'
            )
)
AND sNo NOT IN(
            SELECT sNo
            FROM sc
            WHERE cNo NOT IN(
                        SELECT cNo
                        FROM course
                        WHERE cName = '离散数学'
            )
);

(9)查询所有选修了“形式语言与自动机”但没选修其先修课的学生姓名;
SELECT sName
FROM student
WHERE sNo IN(
            SELECT sNo
            FROM sc
            WHERE cNo IN(
                        SELECT cNo
                        FROM course
                        WHERE cName = '形式语言与自动机'
            )
)
AND sNo NOT IN(
            SELECT sNo
            FROM sc
            WHERE cNo IN(
                        SELECT cPNo
                        FROM course
                        WHERE cName = '形式语言与自动机'
            )
);

(10)查询选修课程总学分大于等于28的学生姓名及其选修课程总学分;
SELECT s.sName,sum(credit)
FROM student s,course c,sc
WHERE s.sNo = sc.sNo and sc.cNo = c.cNo
GROUP BY s.sNo
Having sum(credit)>=28                            

(11)查询选修了3门以上课程且成绩都大于85分的学生学号与姓名;
SELECT sNo,sName
FROM student
WHERE sNo IN(
            SELECT sNo
            FROM sc
            WHERE score >= 85
            GROUP BY sNo
            Having count(cNo) > 3
);    

(12)查询恰好选修了3门课并且都及格的学生姓名;
SELECT sName
FROM student
WHERE sNo IN(
            SELECT sNo
            FROM sc
            WHERE score >= 60
            GROUP BY sNo
            Having count(cNo) = 3 AND count(cNo) = count(score >= 60)
);    

(13)查询人数多于6的学院名称及其学生人数;
SELECT d.dName, count(s.sNo)
FROM department d, student s, sc
WHERE d.dno = s.dno
GROUP BY d.dno
Having count(s.sNo) > 6;

(14)查询平均成绩高于王兵的学生姓名;
SELECT s.sName
FROM student s, sc
WHERE s.sNo = sc.sNo
GROUP BY s.sNo
Having avg(score) > (
                SELECT avg(score)
                FROM student INNER JOIN sc
                ON student.sNo = sc.sNo AND sName = '王兵'
);
    
(15)查询所有选修了离散数学并且选修了编译原理课程的学生姓名
SELECT sName
FROM student
WHERE sNo IN(
            SELECT sNo
            FROM sc
            WHERE cNo IN(
                        SELECT cNo
                        FROM course
                        WHERE cName = '离散数学'
            )
)
AND sNo IN(
            SELECT sNo
            FROM sc
            WHERE cNo IN(
                        SELECT cNo
                        FROM course
                        WHERE cName = '编译原理'
            )
);

(16)查询软件学院离散数学课程平均分;
SELECT avg(score)
FROM sc
WHERE cNo IN (
            SELECT cNo
            FROM course
            WHERE cName='离散数学'

AND sNo IN (
        SELECT sNo
        FROM student
        WHERE dNo IN (
                    SELECT dNo
                          FROM department
                          WHERE dName = '软件学院'
          )
);

(17)查询年龄与“软件学院”所有学生年龄都不相同学生姓名及其年龄和学院;
SELECT sName,age,dName
FROM student LEFT OUTER JOIN department
ON student.dNo = department.dNo
WHERE age NOT IN (
                  SELECT age
                  FROM student
                  WHERE dNo IN (
                        SELECT dNo
                                FROM department 
                                WHERE dName ='软件学院'
                  )
);

(18)查询各学院选修同一门课人数大于4的学院、课程及选课人数;
SELECT department.dNo,dName,course.cNo,cName,count(student.sNo)
FROM department JOIN student
ON department.dNo = student.dNo AND student.sno = sc.sno AND sc.cNo = course.cNo
GROUP BY department.dNo,course.cNo
HAVING count(student.sNo) > 4

(19)查询仅仅选修了“高等数学”一门课程的学生姓名;(学号、姓名及所在学院名称)
SELECT sName(sNo, sName, dNo)
FROM student
WHERE sNo IN(
            SELECT sNo
            FROM sc
            WHERE cNo IN(
                        SELECT cNo
                        FROM course
                        WHERE cName = '高等数学'
            )
)
AND sNo NOT IN(
            SELECT sNo
            FROM sc
            WHERE cNo NOT IN(
                        SELECT cNo
                        FROM course
                        WHERE cName = '高等数学'
            )
);
同第八题

(20)查询平均学分积小于70分的学生姓名。
SELECT sName,sum(sc.score*course.credit)/sum(course.credit)
FROM student INNER JOIN sc INNER JOIN course
GROUP BY Nno
HAVING (sum(sc.score*course.credit)/sum(course.credit)) < 70;

(21)查询选修了“信息学院”开设全部课程的学生姓名。                                        
SELECT sName
FROM student
WHERE NOT EXISTS(
  SELECT *
  FROM course
  WHERE course.dNo = '信息学院' AND NOT EXISTS(
    SELECT *
    FROM sc
    WHERE sc.sNo = student.sNo AND sc.cNo = course.cNo
  )
);

(21)查询选修了“杨佳伟”同学所选修的全部课程的学生姓名。
SELECT sName
FROM student
WHERE NOT EXISTS(          
  SELECT *
  FROM course
  WHERE course.cNo IN (SELECT cNo FROM sc WHERE sNo IN(SELECT sNo FROM student WHERE sName = '杨佳伟'))NOT EXISTS(
    SELECT *
    FROM sc
    WHERE sc.sNo = student.sNo AND sc.cNo = course.cNo
  )
);

五、DDL练习
1、创建2张表,信息如下:
      图书(编号,书名,作者,ISBN,出版社编号,版本,出版日期)。主码为编号,ISBN唯一。出版社编号为外码,参照出版社编号。
      出版社(编号,名称,地址,电话)。主码为编号。
要求:(1)创建表的同时创建约束;
creat table book
(
    bNo int,
    bName varchar(32),
    bAuthor varchar(32),
    bISBN varchar(32),
    pNo varchar(32),
    bVersion varchar(32),
    bPublicDate date,
    PRIMARY KEY (bNo),
    FOREIGN KEY (pNo) REFERENCES publicHouse(pNo)
);
creat table publisher(
    pNo int,
    pName varchar(32),
    pAddress varchar(32),
    pTelephone varchar(32),
    PRIMARY KEY (pNo)
);

      (2)删除所创建的表;
drop table book CASCADE;
drop table publisher CASCADE;

      (3)重新创建表,在表创建之后增加约束。
creat table book
(
    bNo int,
    bName varchar(32),
    bAuthor varchar(32),
    bISBN varchar(32),
    pNo varchar(32),
    bVersion varchar(32),
    bPublicDate date,
    --PRIMARY KEY (bNo),
    --FOREIGN KEY (pNo) REFERENCES publisher(pNo)
);
creat table publisher(
    pNo int,
    pName varchar(32),
    pAddress varchar(32),
    pTelephone varchar(32),
    PRIMARY KEY (pNo)
    --PRIMARY KEY (pNo)
);

alter table publisher add PRIMARY KEY (pNo);
alter table book add PRIMARY KEY (bNo);
alter table book add FOREIGN KEY (pNo) REFERENCES publisher (pNo);

2、
(1)分别向两张表中各插入2行数据。
insert into book values ('01','001','李希凡','ISBN-123456789','01','1.0.0','2023-05-07');
insert into book values ('02','002','李希凡','ISBN-987654321','02','1.0.0','2023-05-07');
insert into publisher values ('01','01出版社','长安','18605825979');
insert into publisher values ('02','02出版社','长安','18605825979');

(2)将其中一个出版社地址变更一下。
update publisher set pAddress='太仓' where pName='02出版社';

(3)删除所插入数据。
delet from book;
delet from publisher;

3、
(1)创建一个软件学院所有选修了“离散数学”课程的学生视图,并通过视图插入一行数据。
CREATE VIEW test as
SELECT *
FROM student
WHERE sNo in(
            SELECT s.sNo
            FROM student s,department d,course c,sc
            WHERE d.dName='软件学院' and d.dNo=s.dNo and c.cName='离散数学' and c.cNo=sc.cNo and sc.sNo=s.sNo);

insert into test VALUES('2020303002','李希凡','男',21,'01');

(2)创建一个各门课程平均分视图。
CREATE VIEW avg_score as
SELECT c.*,avg(score)
FROM sc INNER JOIN course c
GROUP BY c.cNo;

4、创建一张学生平均成绩表s_score(sNo,sName,avgscore),并通过子查询插入所有学生数据。
create table s_score(
        sNo CHAR(6),
        sName CHAR(20),
        avgscore INT);
INSERT into s_score(sNo,sName,avgscore)
SELECT sNo,sName,avg(score)
FROM sc INNER JOIN student s
GROUP BY sNo, sName;

DCL
尝试将多条SQL语句组成一个事务执行,体验提交和回滚操作。


 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部