面試經典數據庫查詢題目(學生、課程、選課)


這是前幾天一剛畢業的朋友的面試題,算是面試常遇到的sql經典題目,記錄一下(如圖)

在此我在電腦數據庫上建立了對應的表結構及數據,以供檢驗sql語句正誤。

建表語句:

  • 學生表(student_info)

DROP TABLE IF EXISTS `student_info`;
CREATE TABLE `student_info` (
`no` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`sex` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`age` int(10) NULL DEFAULT NULL,
`dept` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`no`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `student_info` VALUES ('1612101', '李勇', '男', 21, '數學系');
INSERT INTO `student_info` VALUES ('1612102', '劉晨', '男', 23, '數學系');
INSERT INTO `student_info` VALUES ('1612103', '王敏', '女', 21, '信息工程系');
INSERT INTO `student_info` VALUES ('1612104', '張立', '男', 20, '信息工程系');

  • 課程表(course_info)

DROP TABLE IF EXISTS `course_info`;
CREATE TABLE `course_info` (
`no` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`hours` int(10) NULL DEFAULT NULL,
PRIMARY KEY (`no`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `course_info` VALUES ('C01', '計算機導論', 70);
INSERT INTO `course_info` VALUES ('C02', 'VC++', 90);
INSERT INTO `course_info` VALUES ('C03', '計算機網絡', 80);
INSERT INTO `course_info` VALUES ('C04', '數據庫基礎', 105);
INSERT INTO `course_info` VALUES ('C05', '高等數學', 180);
INSERT INTO `course_info` VALUES ('C06', '數據結構', 72);

  • 選課表(choice_info)

DROP TABLE IF EXISTS `choice_info`;
CREATE TABLE `choice_info` (
`student_no` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`course_no` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`grade` int(10) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `choice_info` VALUES ('1612101', 'C01', 90);
INSERT INTO `choice_info` VALUES ('1612101', 'C02', 86);
INSERT INTO `choice_info` VALUES ('1612101', 'C05', 84);
INSERT INTO `choice_info` VALUES ('1612102', 'C01', 85);
INSERT INTO `choice_info` VALUES ('1612102', 'C03', 91);
INSERT INTO `choice_info` VALUES ('1612102', 'C06', 76);
INSERT INTO `choice_info` VALUES ('1612103', 'C04', 80);
INSERT INTO `choice_info` VALUES ('1612103', 'C03', 82);

 

對應各個表中的數據根據圖中提供進行插入

1.查詢學生都選修了哪些課程,要求列出課程名、課程號、選修人數以及最好成績;

SELECT
     course.`name`,
     course.`no`,
     COUNT(choice.course_no) `count`,
     MAX(choice.grade) Maxgrade
FROM
     course_info course,
     choice_info choice
WHERE
     choice.course_no = course.`no`
GROUP BY
     choice.course_no;

2.統計每個學生的選課門數,並按選課門數的遞減順序顯示(注:題為每個學生,故包含未選課學生)

SELECT
     student.`name`,
     COUNT(choice.course_no) `count`
FROM
     choice_info choice
RIGHT JOIN student_info student ON choice.student_no = student. NO
GROUP BY
     student.no
ORDER BY
     COUNT(choice.course_no) DESC;

3.查詢選課門數超過2門的學生的平均成績和選課門數;

SELECT
     a.`name`,
     a.avg,
     a.count
FROM
     (
         SELECT
             student.`name` `name`,
             IFNULL(AVG(choice.grade), 0) `avg`,
             COUNT(choice.course_no) `count`
         FROM
             student_info student
         LEFT JOIN choice_info choice ON choice.student_no = student.`no`
         GROUP BY
             student.`no`
     ) a
WHERE
     a.count > 2;

4.查詢有考試成績的所有學生的姓名、修課名稱及考試成績,並將查詢結果放到一張新的永久表(假設新表名為tb_rel_new)中

注:此題包含新建表和插入查詢數據

  • 查詢

SELECT
     a.`name` studentName,
     course.`name` courseName,
     a.grade
FROM
     course_info course
LEFT JOIN (
     SELECT
         student.`name` `name`,
         choice.grade grade,
         choice.course_no courseNo
     FROM
         student_info student
     RIGHT JOIN choice_info choice ON choice.student_no = student.`no`
) a ON a.courseNo = course.`no`;

  • 創建tb_rel_new表

CREATE TABLE `tb_rel_new` (
     `studentName` VARCHAR (255) DEFAULT NULL,
     `courseName` VARCHAR (255) DEFAULT NULL,
     `grade` INT (10) DEFAULT NULL
) ENGINE = INNODB DEFAULT CHARSET = utf8;

  • 插入數據

INSERT INTO tb_rel_new (
     studentName,
     courseName,
     grade
) SELECT
     a.`name` studentName,
     course.`name` courseName,
     a.grade
FROM
     course_info course
LEFT JOIN (
     SELECT
         student.`name` `name`,
         choice.grade grade,
         choice.course_no courseNo
     FROM
         student_info student
     RIGHT JOIN choice_info choice ON choice.student_no = student.`no`
) a ON a.courseNo = course.`no`;

 

總結:此題主要考察數據庫sql基礎,面試中要快速理清數據關系,問題便迎刃而解。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM