這是前幾天一剛畢業的朋友的面試題,算是面試常遇到的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基礎,面試中要快速理清數據關系,問題便迎刃而解。