SQL语句练习(Student,Course,SC表)

  • Create table Student 主码,姓名(唯一),性别(男、女),年龄(18—25)

    CREATE TABLE Student          
    	(Sno CHAR(9) PRIMARY KEY,	/* 列级完整性约束条件,Sno是主码*/
         Sname CHAR(20) UNIQUE,		/* Sname取唯一值*/
         Ssex CHAR(2) check (Ssex in ('男','女')),
         Sage SMALLINT check (Sage between 18 and 25),
         Dept CHAR(20)
        );
    
  • Create table Course

    CREATE TABLE Course
         (Cno CHAR(4) PRIMARY KEY,
          Cname CHAR(40),            
          Cpno CHAR(4),              	                      
          Ccredit SMALLINT,
          Semester INT,
          FOREIGN KEY (Cpno) REFERENCES  Course(Cno) 
          ); 	
    
  • Create table SC

    CREATE TABLE SC
          (Sno CHAR(9), 
           Cno CHAR(4),  
           Grade SMALLINTPRIMARY KEY (Sno,Cno), 
           /* 主码由两个属性构成,必须作为表级完整性进行定义*/
           FOREIGN KEY (Sno) REFERENCES Student(Sno),
           /* 表级完整性约束条件,Sno是外码,被参照表是Student */
           FOREIGN KEY (Cno) REFERENCES Course(Cno)
           /* 表级完整性约束条件, Cno是外码,被参照表是Course*/
          );
    
  • 查询“计算机系”学生的详细信息,并按性别升序排列,相同性别按年龄降序排列

    SELECT * FROM Student 
     WHERE Dept = '计算机系'
     ORDER BY Ssex ASC, Sage DESC
    
  • 查询年龄在18-20岁之间的学生详细情况

    SELECT * FROM Student 
     WHERE Sage BETWEEN 18 AND 20
    
  • 查询所有选修了Java课程的学生情况,输出学生的姓名和系别

    SELECT Sname,Dept FROM Student S 
     JOIN SC ON S.Sno = SC.Sno
     JOIN Course C ON C.Cno = SC.cno
     WHERE Cname = 'Java'
    
  • 与刘晨在同一个系学习的学生(自连接;嵌套 IN

    SELECT S2.Sno,S2.Sname,S2.Dept FROM Student S1 
     JOIN Student S2 ON S1.Dept = S2.Dept
     WHERE S1.Sname = '刘晨' AND S2.Sname != '刘晨'
    
    SELECT Sno,Sname,Dept FROM Student
     WHERE Dept IN ( 
       SELECT Dept FROM Student 
         WHERE Sname = '刘晨')
     AND Sname != '刘晨'
    
  • 查询人数在50人以上的系,输出系别,人数,按照人数降序排列Count(sno)

    SELECT Dept,COUNT(Sno) FROM student
     GROUP By Dept
     HAVING COUNT(Sno)>50
     ORDER by COUNT(Sno) DESC /* order by 在 having 子句下方 */
    
  • 查询总成绩600分以上的学生学号,平均成绩Sum()

    SELECT s.Sno FROM Student s /* 须指明是哪个表的 Sno */
     JOIN SC ON s.Sno = SC.Sno /* 两个表都有 Sno */
     GROUP By s.Sno
     HAVING SUM(Grade)>600
    
  • 查询每个学生的平均成绩,输出学号,学生姓名,平均成绩

    SELECT s.Sno,Sname,avg(Grade)平均成绩 FROM Student s
     JOIN SC ON s.Sno = SC.Sno
     GROUP By s.Sno,Sname /* 需要学号、姓名两个因素分组 */
    
  • 查询计算机系没有选课的学生信息

    SELECT Sname,Dept,Cno,Grade FROM Student S 
     LEFT JOIN SC ON S.Sno = SC.Sno
     WHERE Dept = '计算机系' AND SC.Sno IS NULL /* 判空条件和连接条件是同属性 */
    
  • 查询选修了全部课程的学生信息

    SELECT s.Sno,Sname,Dept FROM Student s
     WHERE NOT EXISTS(	/* 2.不存在这样一个课程c.Cno,它没有被s.Sno选 */
       SELECT * FROM Course c 
        WHERE NOT EXISTS(	/* 1.不存在该学生没选的课程 */
          SELECT * FROM SC
    	   WHERE SC.Cno = c.Cno AND SC.Sno = s.Sno))
    
  • 将“计算机系”学生选修课程的成绩置为0 / 成绩加5分

    UPDATE SC 
     SET Grade = 0 /* SET Grade = Grade + 5 */
     WHERE Sno IN
       (SELECT Sno FROM Student
         WHERE Dept = '计算机系')
    
  • 删除“计算机系”全体学生“第2学期”的选课记录

    DELETE FROM SC 
     JOIN Student ON SC.Sno = Student.Sno
     WHERE Dept = '计算机系' AND Semester = 2
    

    更正

    DELETE FROM SC 
     FROM SC JOIN Student ON SC.Sno = Student.Sno
     JOIN Course ON Course.Cno = SC.Cno
     WHERE Dept = '计算机系' AND Semester = 2
    
  • 创建一个“计算机系”学生选课的视图V1,包括学号,姓名,课程名称,成绩

    将查询视图V1的权限授予用户user1

    CREATE VIEW	V1(Sno,Sname,Cname,Grade)
    AS
    SELECT s.Sno,Sname,Cname,Grade FROM Student s 
    JOIN SC ON s.Sno = SC.Sno
    JOIN Course c ON c.Cno = SC.Cno
    
    GRANT SELECT 
     ON VIEW V1 
     TO User1
    /* WITH GRANT OPTION 允许已经获得权限的用户把这种权限再授予其他用户 */
    
  • 将查询每门课程号和平均成绩的权限授权给用户Wang

    GRANT SELECT 
     ON TABLE Course,SC 
     TO Wang
    
  • 将对Student的全部访问权限授予所有用户

    GRANT ALL PRIVILEGES 
     ON TABLE Student 
     TO PUBLIC
    
  • 22
    点赞
  • 136
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
交互式SQL的使用 环境:WINDOWS,Microsoft SQL Server 实验要求: 1,创建Student数据库,包括Students,Courses,SC结构如下: Students(SNO,SNAME,SEX,BDATE,HEIGHT,DEPARTMENT) Courses(CNO,CNAME,LHOUR,CREDIT,SEMESTER) SC(SNO,CNO,GRADE) (注:下划线示主键,斜体示外键),并插入一定数据。 2.完成如下的查询要求及更新的要求。 (1)查询身高大于1.80m的男生的学号和姓名; (2)查询计算机系秋季所开课程的课程号和学分数; (3)查询选修计算机系秋季所开课程的男生的姓名、课程号、学分数、成绩; (4)查询至少选修一门电机系课程的女生的姓名(假设电机系课程的课程号以EE开头); (5)查询每位学生已选修课程的门数和总平均成绩; (6)查询每门课程选课的学生人数,最高成绩,最低成绩和平均成绩; (7)查询所有课程的成绩都在80分以上的学生的姓名、学号、且按学号升序排列; (8)查询缺成绩的学生的姓名,缺成绩的课程号及其学分数; (9)查询有一门以上(含一门)三个学分以上课程的成绩低于70分的学生的姓名; (10)查询1984年~1986年出生的学生的姓名,总平均成绩及已修学分数。 (11) 在STUDENTSC关系中,删去SNO以’01’开关的所有记录。 (12)在STUDENT关系中增加以下记录: (13)将课程CS-221的学分数增为3,讲课时数增为60 3.补充题: (1) 统计各系的男生和女生的人数。 (2) 列出学习过‘编译原理’,‘数据库’或‘体系结构’课程,且这些课程的成绩之一在90分以上的学生的名字。 (3) 列出未修选‘电子技术’课程,但选修了‘数字电路’或‘数字逻辑’课程的学生数。 (4) 按课程排序列出所有学生的成绩,尚无学生选修的课程,也需要列出,相关的学生成绩用NULL示。 (5) 列出平均成绩最高的学生名字和成绩。(SELECT句中不得使用TOP n子句) 4.选做题:对每门课增加“先修课程”的属性,用来示某一门课程的先修课程,每门课程应可记录多于一门的先修课程。要求: 1) 修改结构定义,应尽量避免数据冗余,建立必要的主键,外键。 2) 设计并插入必要的测试数据,完成以下查询: 列出有资格选修数据库课程的所有学生。(该学生已经选修过数据库课程的所有先修课,并达到合格成绩。) 注意:须设计每个查询的测试数据,并在查询之前用INSERT语句插入中。 提交作业形式: 1) 建立Student数据库SQL脚本,插入所有数据项的SQL脚本(包括所有的测试数据)。 2) 完成查询要求的SQL语句脚本。 3) 选做题:须提交修改数据库定义SQL脚本,插入测试数据的SQL脚本以及用于查询的SQL语句
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值