美文网首页
SQL经典试题,自己一一做过(有所改动)

SQL经典试题,自己一一做过(有所改动)

作者: Coder_Cat | 来源:发表于2018-06-29 09:26 被阅读37次

    题目

    • 设有一数据库,包括四个表:学生表课程表分数表 以及教师信息表
    1.建表
    • 四个表的结构分别如下面表一至表四所示。用SQL语句创建四个表并完成相关题目。
    关键字 数据类型 可否为空 含义
    s_no VARCHAR() 学号(主键)
    s_name VARCHAR() 姓名
    s_sex VARCHAR() 性别
    s_birthday DATETIME 出生年月日
    s_class VARCHAR() 班级

    表一:学生表

    关键字 数据类型 可否为空 含义
    s_no VARCHAR() 学号(主键)
    s_name VARCHAR() 姓名
    s_sex VARCHAR() 性别
    s_birthday DATETIME 出生年月日
    s_class VARCHAR() 班级
    关键字 数据类型 可否为空 含义
    c_no VARCHAR() 课程编号(主键)
    c_name VARCHAR() 课程名称
    t_no VARCHAR() 授课老师编号

    表二:课程表

    关键字 数据类型 可否为空 含义
    c_no VARCHAR() 课程编号(主键)
    c_name VARCHAR() 课程名称
    t_no VARCHAR() 授课老师编号
    关键字 数据类型 可否为空 含义
    s_no VARCHAR() 学号(外键)
    c_no VARCHAR() 课程编号(外键)
    degree VARCHAR() 分数

    表三:分数表

    关键字 数据类型 可否为空 含义
    s_no VARCHAR() 学号(外键)
    c_no VARCHAR() 课程编号(外键)
    degree VARCHAR() 分数
    关键字 数据类型 可否为空 含义
    t_no VARCHAR() 老师编号(主键)
    t_name VARCHAR() 姓名
    t_sex VARCHAR() 性别
    t_birthday DATETIME 出生年月日
    t_prof VARCHAR() 职位
    depart VARCHAR() 所在部门

    表四:教师信息表

    关键字 数据类型 可否为空 含义
    t_no VARCHAR() 老师编号(主键)
    t_name VARCHAR() 姓名
    t_sex VARCHAR() 性别
    t_birthday DATETIME 出生年月日
    t_prof VARCHAR() 职位
    depart VARCHAR() 所在部门
    • 建表
    -- 学生
    CREATE TABLE `学生`(
    `s_no` VARCHAR(3) NOT NULL COMMENT '学号',
    `s_name` VARCHAR(4) NOT NULL COMMENT '姓名',
    `s_sex` VARCHAR(2) NOT NULL COMMENT '性别',
    `s_birthday` DATETIME  COMMENT '出生年月日' , 
    `s_class` VARCHAR(5) NOT NULL COMMENT '班级'
    )ENGINE=MyISAM CHARSET=utf8;
    -- 课程
    CREATE TABLE `课程`(
    `c_no` VARCHAR(5) NOT NULL COMMENT '课程编号',  
    `c_name` VARCHAR(10) NOT NULL COMMENT '课程名称', 
    `t_no` VARCHAR(10) NOT NULL  COMMENT '授课老师编号'
    )ENGINE=MyISAM CHARSET=utf8;
    -- 分数
    CREATE TABLE `分数`(
    `s_no` VARCHAR(3) NOT NULL COMMENT '学号', 
    `c_no` VARCHAR(5) NOT NULL COMMENT '课程编号', 
    `degree` NUMERIC(10, 1) NOT NULL COMMENT '分数'
    )ENGINE=MyISAM CHARSET=utf8;
    -- 老师
    CREATE TABLE `教师` (
    `t_no` VARCHAR(3) NOT NULL COMMENT '老师编号', 
    `t_name` VARCHAR(4) NOT NULL COMMENT'姓名',
    `t_sex` VARCHAR(2) NOT NULL COMMENT '性别', 
    `t_birthday` DATETIME COMMENT '出生年月日', 
    `t_prof` VARCHAR(6) COMMENT '职位', 
    `depart` VARCHAR(10) NOT NULL COMMENT '所在部门'
    )ENGINE=MyISAM CHARSET=utf8;
    
    2.插入数据
    INSERT INTO `学生`(s_no,s_name,s_sex,s_birthday,s_class) VALUES(108 ,'曾华' ,'男' ,'1977-09-01',95033);
    INSERT INTO `学生` VALUES(105 ,'匡明' ,'男' ,'1975-10-02',95031);
    INSERT INTO `学生` VALUES (107 ,'王丽' ,'女' ,'1976-01-23',95033);
    INSERT INTO `学生` VALUES (101 ,'李军' ,'男' ,'1976-02-20',95033);
    INSERT INTO `学生` VALUES (109 ,'王芳' ,'女' ,'1975-02-10',95031);
    INSERT INTO `学生` VALUES (103 ,'陆君' ,'男' ,'1974-06-03',95031);
    
    INSERT INTO `课程` VALUES('3-105' ,'计算机导论',825);
    INSERT INTO `课程` VALUES('3-245' ,'操作系统' ,804);
    INSERT INTO `课程` VALUES('6-166' ,'数据电路' ,856);
    INSERT INTO `课程` VALUES('9-888' ,'高等数学' ,100);
    
    INSERT INTO `分数` VALUES(103,'3-245',86);
    INSERT INTO `分数` VALUES(105,'3-245',75);
    INSERT INTO `分数` VALUES(109,'3-245',68);
    INSERT INTO `分数` VALUES(103,'3-105',92);
    INSERT INTO `分数` VALUES(105,'3-105',88);
    INSERT INTO `分数` VALUES(109,'3-105',76);
    INSERT INTO `分数` VALUES(101,'3-105',64);
    INSERT INTO `分数` VALUES(107,'3-105',91);
    INSERT INTO `分数` VALUES(108,'3-105',78);
    INSERT INTO `分数` VALUES(101,'6-166',85);
    INSERT INTO `分数` VALUES(107,'6-106',79);
    INSERT INTO `分数` VALUES(108,'6-166',81);
    
    INSERT INTO `教师` VALUES(804,'李诚','男','1958-12-02','副教授','计算机系');
    INSERT INTO `教师` VALUES(856,'张旭','男','1969-03-12','讲师','电子工程系');
    INSERT INTO `教师` VALUES(825,'王萍','女','1972-05-05','助教','计算机系');
    INSERT INTO `教师` VALUES(831,'刘冰','女','1977-08-14','助教','电子工程系');
    
    3.查询数据题目

    1、 查询学生表中的所有记录的s_name、s_sex和s-class列。
    2、 查询教师所有的单位即不重复的depart列(去重后的教师职业)。
    3、 查询学生表的所有记录。
    4、 查询分数表中成绩在60到80之间的所有记录。
    5、 查询分数表中成绩为85,86或88的记录。
    6、 查询学生表中“95031”班或性别为“女”的同学记录。
    7、 以s_class降序查询学生表的所有记录。
    8、 以c_no升序、degree降序查询分数表的所有记录。
    9、 查询“95031”班的学生人数。
    10、查询分数表中的最高分的学生学号和课程号。
    11、查询‘3-105’号课程的平均分。
    12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
    13、查询最低分大于70,最高分小于90的s_no列。
    14.查询分数在70到90之间不包括70和90分的s_no列。
    15、查询所有学生的s_name、c_no和degree列。(INNER JOIN 关键字在表中存在至少一个匹配时返回行)
    16、查询所有学生的s_name、c_name和degree列。
    17、查询“95033”班所选课程的平均分。
    18、假设使用如下命令建立了一个分数等级表,并设置分数等级:
    CREATE TABLE 等级(
    low TINYINT COMMENT '最低分',
    upp TINYINT COMMENT '最高分',
    rank CHAR(1) COMMENT '等级'
    );
    INSERT INTO 等级 VALUES(90,100,'A');
    INSERT INTO 等级 VALUES(80,89,'B');
    INSERT INTO 等级 VALUES(70,79,'C');
    INSERT INTO 等级 VALUES(60,69,'D');
    INSERT INTO 等级 VALUES(0,59,'E');
    现查询所有同学的s_no、c_no和rank列。
    19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
    20、查询分数中选学一门以上课程的同学中分数为非最高分成绩的记录。
    21、查询和学号为101的同学同年出生的所有学生的s_no、s_name和s_birthday列。
    22、查询“张旭“教师任课的学生成绩。
    23、查询选修某课程的同学人数多于5人的教师姓名。
    24、查询95033班和95031班全体学生的记录。
    25、查询存在有85分以上成绩的课程c_no.
    26、查询出“计算机系“教师所教课程的成绩表。
    27、查询“计算机系”与“电子工程系“不同职称的教师的t_name 和 t_prof。
    28、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的c_no、s_no和degree,并按degree从高到低次序排序。
    29、查询所有教师和同学的name、sex和birthday.
    30、查询所有“女”教师和“女”同学的name、sex和birthday.
    31、查询成绩比该课程平均成绩低的同学的成绩表。
    32、查询所有任课教师的t_name和depart.
    33 查询所有未讲课的教师的t_name和depart.
    34、查询至少有2名男生的班号。
    35、查询学生表中不姓“王”的同学记录。
    36、查询学生表中每个学生的姓名和年龄。
    37、查询学生表中最大和最小的s_birthday日期值。
    38、以班号和年龄从大到小的顺序查询Student表中的全部记录。
    39、查询“男”教师及其所上的课程。
    40、查询最高分同学的s_no、c_no和degree列。
    41、查询和“李军”同性别的所有同学的s_name。
    42、查询和“李军”同性别并同班的同学s_name。
    43、查询所有选修“计算机导论”课程的“男”同学的成绩表。

    4.答案

    1、 查询学生表中的所有记录的s_name、s_sex和s-class列。

    SELECT s_name,s_sex,s_class FROM 学生;
    

    2、 查询教师所有的单位即不重复的depart列(去重后的教师职业)。

    SELECT DISTINCT depart FROM 教师;
    

    3、 查询学生表的所有记录。

    SELECT * FROM 学生;
    

    4、 查询分数表中成绩在60到80之间的所有记录。

    SELECT * FROM 分数  WHERE degree BETWEEN 60 AND 80;
    

    5、 查询分数表中成绩为85,86或88的记录。

    SELECT * FROM 分数 WHERE degree IN(85,86,88);
    

    6、 查询学生表中“95031”班或性别为“女”的同学记录。

    SELECT * FROM 学生 WHERE s_class = 95031 OR s_sex = '女';
    

    7、 以s_class降序查询学生表的所有记录。

    SELECT * FROM 学生 ORDER BY `s_class` DESC;
    

    8、 以c_no升序、degree降序查询分数表的所有记录。

    SELECT * FROM 分数  ORDER BY c_no ,degree DESC; /*默认升序*/
    

    9、 查询“95031”班的学生人数。

    SELECT  COUNT(1) AS StnNum FROM 学生 WHERE s_class = '95031';
    

    10、查询分数表中的最高分的学生学号和课程号。

    SELECT s_no,c_no FROM 分数 ORDER BY degree DESC LIMIT 1; 
    

    11、查询‘3-105’号课程的平均分。

    SELECT AVG(degree) FROM 分数 WHERE c_no = '3-105';
    

    12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。

    SELECT c_no, AVG(degree) FROM 分数 WHERE c_no LIKE '3%' GROUP BY c_no HAVING COUNT(s_no) >= 5;
    

    13、查询最低分大于70,最高分小于90的s_no列。

    SELECT s_no FROM 分数 GROUP BY s_no HAVING max(degree) < 90 AND min(degree)>70;
    

    14.查询分数在70到90之间不包括70和90分的s_no列。

    SELECT s_no FROM 分数 WHERE degree > 70 AND degree < 90;
    

    15、查询所有学生的s_name、c_no和degree列。(INNER JOIN 关键字在表中存在至少一个匹配时返回行)

    SELECT s_name,c_no,degree FROM 学生 INNER JOIN 分数 ON 学生.s_no = 分数.s_no ORDER BY s_name;
    

    16、查询所有学生的s_name、c_name和degree列。

    SELECT s_name,c_name,degree FROM 学生 INNER JOIN 分数 ON(学生.s_no = 分数.s_no) INNER JOIN 课程 ON(分数.c_no = 课程.c_no) ORDER BY c_name;
    

    17、查询“95033”班所选课程的平均分。

    SELECT c_name ,avg(degree) FROM 学生 INNER JOIN 分数 ON(学生.s_no = 分数.s_no) INNER JOIN 课程 ON(分数.c_no = 课程.c_no) WHERE s_class = '95033' GROUP BY 课程.c_no ORDER BY c_name;
    

    18、假设使用如下命令建立了一个分数等级表,并设置分数等级:
    CREATE TABLE 等级(
    low TINYINT COMMENT '最低分',
    upp TINYINT COMMENT '最高分',
    rank CHAR(1) COMMENT '等级'
    );
    INSERT INTO 等级 VALUES(90,100,'A');
    INSERT INTO 等级 VALUES(80,89,'B');
    INSERT INTO 等级 VALUES(70,79,'C');
    INSERT INTO 等级 VALUES(60,69,'D');
    INSERT INTO 等级 VALUES(0,59,'E');
    现查询所有同学的s_no、c_no和rank列。

    SELECT s_no,c_no,rank FROM 分数 INNER JOIN 等级 ON(分数.degree >= 等级.low AND 分数.degree <= 等级.upp) ORDER BY s_no; 
    

    19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。

    SELECT s1.s_no,s1.degree FROM 分数 AS s1 INNER JOIN 分数 AS s2 ON(s1.c_no = s2.c_no AND s1.degree > s2.degree) WHERE s1.c_no ='3-105' AND s2.s_no = '109' ORDER BY s1.s_no;
    

    20、查询分数中选学一门以上课程的同学中分数为非最高分成绩的记录。

    SELECT * FROM 分数 GROUP BY s_no HAVING count(c_no)>1 AND degree != max(degree);
    

    21、查询和学号为101的同学同年出生的所有学生的s_no、s_name和s_birthday列。

    SELECT s1.s_no,s1.s_name,s1.s_birthday FROM 学生 AS s1 INNER JOIN 学生 AS s2 ON(YEAR(s1.s_birthday) = YEAR(s2.s_birthday)) WHERE s2.s_no = '101';
    

    22、查询“张旭“教师任课的学生成绩。

    SELECT 学生.s_no, s_name,c_name,degree 
    FROM 教师 
    INNER JOIN 课程 ON(教师.t_no = 课程.t_no) 
    INNER JOIN 分数 ON(课程.c_no = 分数.c_no) 
    INNER JOIN 学生 ON(分数.s_no = 学生.s_no) 
    WHERE 教师.t_name = '张旭' 
    ORDER BY degree; 
    

    23、查询选修某课程的同学人数多于5人的教师姓名。

    SELECT t_name 
    FROM 教师 
    INNER JOIN 课程 ON(.教师.t_no = 课程.t_no) 
    INNER JOIN 分数 ON(课程.c_no = 分数.c_no)
    WHERE 课程.c_no IN (SELECT c_no FROM 分数 GROUP BY(c_no) HAVING count(分数.s_no) > 5)
    ORDER BY 教师.t_no;
    

    24、查询95033班和95031班全体学生的记录。

    SELECT *
    FROM 学生
    WHERE s_class = '95033' OR s_class = '95031'
    ORDER BY s_class;
    或者
    SELECT *
    FROM 学生
    WHERE s_class IN('95033','95031') 
    ORDER BY s_class;
    

    25、查询存在有85分以上成绩的课程c_no.

    SELECT c_no
    FROM 分数
    WHERE degree > '85';
    

    26、查询出“计算机系“教师所教课程的成绩表。

    SELECT t_name,c_name ,s_name ,degree
    FROM 教师
    INNER JOIN 课程 ON(教师.t_no = 课程.t_no) 
    INNER JOIN 分数 ON(课程.c_no = 分数.c_no)
    INNER JOIN 学生 ON(学生.s_no = 分数.s_no)
    WHERE depart = '计算机系' 
    ORDER BY  t_name;
    

    27、查询“计算机系”与“电子工程系“不同职称的教师的t_name 和 t_prof。

    SELECT t_name,t_prof
    FROM 教师
    WHERE depart = '计算机系'
    AND t_prof NOT IN (
    SELECT t_prof
    FROM 教师
    WHERE depart = '电子工程系'
    )
    UNION
    SELECT t_name,t_prof
    FROM 教师
    WHERE depart = '电子工程系'
    AND t_prof NOT IN (
    SELECT t_prof
    FROM 教师
    WHERE depart = '计算机系'
    );
    或者
    SELECT t_name,t_prof 
    FROM 教师 a 
    WHERE t_prof NOT IN(
    SELECT t_prof 
    FROM 教师 b 
    WHERE a.depart!=b.depart
    );
    

    28、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的c_no、s_no和degree,并按degree从高到低次序排序。

    SELECT c_no,s_no,degree 
    FROM 分数
    WHERE c_no = '3-105' AND degree > ANY(
    SELECT degree 
    FROM 分数
    WHERE c_no = '3-245'
    )
    ORDER BY degree DESC;
    

    29、查询所有教师和同学的name、sex和birthday.

    SELECT s_name,s_sex,s_birthday
    FROM 学生
    UNION
    SELECT t_name,t_sex,t_birthday
    FROM 教师;
    

    30、查询所有“女”教师和“女”同学的name、sex和birthday.

    SELECT s_name,s_sex,s_birthday
    FROM 学生
    WHERE s_sex = '女'
    UNION
    SELECT t_name,t_sex,t_birthday
    FROM 教师
    WHERE t_sex = '女';
    

    31、查询成绩比该课程平均成绩低的同学的成绩表。

    SELECT * 
    FROM 分数 AS s1
    WHERE s1.degree < (
    SELECT avg(degree) 
    FROM  分数 AS s2 
    )
    ORDER BY degree;
    或
    SELECT * 
    FROM 分数 AS s1
    WHERE s1.degree BETWEEN 0 AND (
    SELECT avg(degree) 
    FROM  分数 AS s2 
    )
    ORDER BY degree;
    

    32、查询所有任课教师的t_name和depart.

    SELECT t_name,depart 
    FROM 教师
    WHERE t_no IN(
    SELECT t_no
    FROM 课程
    );
    

    33 查询所有未讲课的教师的t_name和depart.

    SELECT t_name,depart 
    FROM 教师
    WHERE t_no NOT IN(
    SELECT t_no
    FROM 课程
    );
    

    34、查询至少有2名男生的班号。

    SELECT s_class
    FROM 学生
    WHERE s_sex = '男'
    GROUP BY s_class 
    HAVING count(s_no) > 1;
    

    35、查询学生表中不姓“王”的同学记录。

    SELECT * 
    FROM 学生
    WHERE s_name NOT LIKE('王%');
    

    36、查询学生表中每个学生的姓名和年龄。

    SELECT s_name,YEAR(now()) - YEAR(s_birthday) AS s_age 
    FROM 学生;
    

    37、查询学生表中最大和最小的s_birthday日期值。

    SELECT max(s_birthday) AS maxb, min(s_birthday) AS minb
    FROM 学生;
    

    38、以班号和年龄从大到小的顺序查询Student表中的全部记录。

    SELECT * FROM 学生 ORDER BY s_class DESC, s_birthday ASC;
    

    39、查询“男”教师及其所上的课程。

    SELECT t_name,c_name
    FROM 课程
    INNER JOIN 教师 ON (教师.t_no = 课程.t_no)
    WHERE t_sex = '男';
    

    40、查询最高分同学的s_no、c_no和degree列。

    SELECT s_no,c_no,degree
    FROM 分数
    GROUP BY c_no
    HAVING degree = max(degree);
    

    41、查询和“李军”同性别的所有同学的s_name.

    SELECT s1.s_name
    FROM 学生 s1
    INNER JOIN 学生 s2 ON(s1.s_sex = s2.s_sex)
    WHERE s2.s_name = '李军';
    

    42、查询和“李军”同性别并同班的同学s_name.

    SELECT s1.s_name
    FROM 学生 s1
    INNER JOIN 学生 s2 ON(s1.s_sex = s2.s_sex AND s1.s_class = s2.s_class)
    WHERE s2.s_name = '李军';
    

    43、查询所有选修“计算机导论”课程的“男”同学的成绩表

    SELECT * 
    FROM 分数
    WHERE s_no IN(
    SELECT s_no 
    FROM 学生
    WHERE s_sex = '男')
    AND c_no IN(
    SELECT c_no 
    FROM 课程
    WHERE c_name = '计算机导论'
    );
    

    相关文章

      网友评论

          本文标题:SQL经典试题,自己一一做过(有所改动)

          本文链接:https://www.haomeiwen.com/subject/bmmoyftx.html