SQL从入门到起飞:完整学习数据库与100+练习题
下面我将创建一个完整的SQL学习数据库,包含多个数据表和丰富的示例数据,以及100+道从基础到高级的SQL练习题。
数据库设计
首先创建一个名为sql_mastery
的数据库,包含以下表:
- students - 学生信息表
- courses - 课程信息表
- teachers - 教师信息表
- departments - 院系信息表
- enrollments - 选课记录表
- scores - 成绩表
- library - 图书馆藏书表
- borrow_records - 借阅记录表
- classrooms - 教室信息表
- schedules - 课程安排表
- clubs - 社团信息表
- club_members - 社团成员表
- events - 活动信息表
- event_participants - 活动参与表
创建数据库和表
-- 创建数据库
CREATE DATABASE IF NOT EXISTS sql_mastery;
USE sql_mastery;-- 创建院系表
CREATE TABLE departments (department_id INT PRIMARY KEY AUTO_INCREMENT,department_name VARCHAR(50) NOT NULL,building VARCHAR(50),budget DECIMAL(15, 2)
);-- 创建教室表
CREATE TABLE classrooms (classroom_id INT PRIMARY KEY AUTO_INCREMENT,room_number VARCHAR(20) NOT NULL,building VARCHAR(50),capacity INT,has_projector BOOLEAN DEFAULT FALSE
);-- 创建教师表
CREATE TABLE teachers (teacher_id INT PRIMARY KEY AUTO_INCREMENT,first_name VARCHAR(50) NOT NULL,last_name VARCHAR(50) NOT NULL,email VARCHAR(100) UNIQUE,hire_date DATE,department_id INT,title VARCHAR(50),salary DECIMAL(10, 2),FOREIGN KEY (department_id) REFERENCES departments(department_id)
);-- 创建学生表
CREATE TABLE students (student_id INT PRIMARY KEY AUTO_INCREMENT,first_name VARCHAR(50) NOT NULL,last_name VARCHAR(50) NOT NULL,email VARCHAR(100) UNIQUE,enrollment_date DATE,date_of_birth DATE,department_id INT,scholarship DECIMAL(10, 2) DEFAULT 0,FOREIGN KEY (department_id) REFERENCES departments(department_id)
);-- 创建课程表
CREATE TABLE courses (course_id INT PRIMARY KEY AUTO_INCREMENT,course_code VARCHAR(20) NOT NULL,course_name VARCHAR(100) NOT NULL,credits INT,teacher_id INT,department_id INT,prerequisite_id INT NULL,FOREIGN KEY (teacher_id) REFERENCES teachers(teacher_id),FOREIGN KEY (department_id) REFERENCES departments(department_id),FOREIGN KEY (prerequisite_id) REFERENCES courses(course_id)
);-- 创建课程安排表
CREATE TABLE schedules (schedule_id INT PRIMARY KEY AUTO_INCREMENT,course_id INT,classroom_id INT,day_of_week ENUM('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'),start_time TIME,end_time TIME,FOREIGN KEY (course_id) REFERENCES courses(course_id),FOREIGN KEY (classroom_id) REFERENCES classrooms(classroom_id)
);-- 创建选课记录表
CREATE TABLE enrollments (enrollment_id INT PRIMARY KEY AUTO_INCREMENT,student_id INT,course_id INT,enrollment_date DATE,semester ENUM('Fall', 'Spring', 'Summer'),academic_year YEAR,FOREIGN KEY (student_id) REFERENCES students(student_id),FOREIGN KEY (course_id) REFERENCES courses(course_id)
);-- 创建成绩表
CREATE TABLE scores (score_id INT PRIMARY KEY AUTO_INCREMENT,enrollment_id INT,midterm_score DECIMAL(5,2),final_score DECIMAL(5,2),assignment_score DECIMAL(5,2),total_score DECIMAL(5,2) GENERATED ALWAYS AS (COALESCE(midterm_score * 0.3, 0) + COALESCE(final_score * 0.5, 0) + COALESCE(assignment_score * 0.2, 0)) STORED,exam_date DATE,FOREIGN KEY (enrollment_id) REFERENCES enrollments(enrollment_id)
);-- 创建图书馆藏书表
CREATE TABLE library (book_id INT PRIMARY KEY AUTO_INCREMENT,isbn VARCHAR(20),title VARCHAR(200) NOT NULL,author VARCHAR(100),publisher VARCHAR(100),publish_year INT,category VARCHAR(50),total_copies INT,available_copies INT
);-- 创建借阅记录表
CREATE TABLE borrow_records (record_id INT PRIMARY KEY AUTO_INCREMENT,student_id INT,book_id INT,borrow_date DATE,due_date DATE,return_date DATE,fine_amount DECIMAL(8,2) DEFAULT 0,FOREIGN KEY (student_id) REFERENCES students(student_id),FOREIGN KEY (book_id) REFERENCES library(book_id)
);-- 创建社团表
CREATE TABLE clubs (club_id INT PRIMARY KEY AUTO_INCREMENT,club_name VARCHAR(100) NOT NULL,established_date DATE,faculty_advisor_id INT,budget DECIMAL(10,2),FOREIGN KEY (faculty_advisor_id) REFERENCES teachers(teacher_id)
);-- 创建社团成员表
CREATE TABLE club_members (membership_id INT PRIMARY KEY AUTO_INCREMENT,club_id INT,student_id INT,join_date DATE,role ENUM('President', 'Vice President', 'Treasurer', 'Secretary', 'Member'),FOREIGN KEY (club_id) REFERENCES clubs(club_id),FOREIGN KEY (student_id) REFERENCES students(student_id)
);-- 创建活动表
CREATE TABLE events (event_id INT PRIMARY KEY AUTO_INCREMENT,event_name VARCHAR(100) NOT NULL,organizer_club_id INT,event_date DATE,location VARCHAR(100),budget DECIMAL(10,2),FOREIGN KEY (organizer_club_id) REFERENCES clubs(club_id)
);-- 创建活动参与表
CREATE TABLE event_participants (participation_id INT PRIMARY KEY AUTO_INCREMENT,event_id INT,student_id INT,registration_date DATE,attended BOOLEAN DEFAULT FALSE,FOREIGN KEY (event_id) REFERENCES events(event_id),FOREIGN KEY (student_id) REFERENCES students(student_id)
);
插入示例数据
-- 插入院系数据
INSERT INTO departments (department_name, building, budget) VALUES
('计算机科学', '科技楼', 500000.00),
('数学', '理学楼', 350000.00),
('物理', '理学楼', 400000.00),
('文学', '人文楼', 300000.00),
('历史', '人文楼', 280000.00),
('经济学', '社科楼', 450000.00),
('外语', '国际楼', 320000.00);-- 插入教室数据
INSERT INTO classrooms (room_number, building, capacity, has_projector) VALUES
('101', '科技楼', 50, TRUE),
('102', '科技楼', 60, TRUE),
('201', '科技楼', 40, FALSE),
('301', '科技楼', 100, TRUE),
('101', '理学楼', 70, TRUE),
('102', '理学楼', 80, FALSE),
('201', '人文楼', 60, TRUE),
('301', '人文楼', 90, TRUE),
('101', '社科楼', 55, FALSE),
('201', '国际楼', 65, TRUE);-- 插入教师数据
INSERT INTO teachers (first_name, last_name, email, hire_date, department_id, title, salary) VALUES
('刘', '教授', 'liu@email.com', '2010-08-15', 1, '教授', 85000.00),
('陈', '副教授', 'chen@email.com', '2015-03-20', 1, '副教授', 70000.00),
('杨', '讲师', 'yang@email.com', '2018-07-10', 2, '讲师', 60000.00),
('黄', '教授', 'huang@email.com', '2008-05-12', 3, '教授', 90000.00),
('徐', '副教授', 'xu@email.com', '2013-11-05', 4, '副教授', 68000.00),
('朱', '讲师', 'zhu@email.com', '2019-02-18', 5, '讲师', 58000.00),
('高', '教授', 'gao@email.com', '2005-09-01', 6, '教授', 92000.00),
('林', '副教授', 'lin@email.com', '2016-06-25', 7, '副教授', 65000.00),
('王', '讲师', 'wang@email.com', '2020-01-10', 1, '讲师', 55000.00),
('张', '教授', 'zhang@email.com', '2007-03-15', 2, '教授', 88000.00);-- 插入学生数据
INSERT INTO students (first_name, last_name, email, enrollment_date, date_of_birth, department_id, scholarship) VALUES
('张', '明', 'zhangming@email.com', '2022-09-01', '2003-05-12', 1, 5000.00),
('李', '华', 'lihua@email.com', '2022-09-01', '2002-11-23', 1, 3000.00),
('王', '芳', 'wangfang@email.com', '2022-09-01', '2003-02-14', 2, 2000.00),
('赵', '勇', 'zhaoyong@email.com', '2022-09-01', '2002-08-30', 3, 0.00),
('钱', '静', 'qianjing@email.com', '2022-09-01', '2003-01-19', 4, 1500.00),
('孙', '亮', 'sunliang@email.com', '2022-09-01', '2002-12-05', 5, 0.00),
('周', '梅', 'zhoumei@email.com', '2022-09-01', '2003-04-27', 6, 2500.00),
('吴', '涛', 'wutao@email.com', '2023-09-01', '2004-07-15', 1, 0.00),
('郑', '丽', 'zhengli@email.com', '2023-09-01', '2004-03-22', 2, 1000.00),
('冯', '军', 'fengjun@email.com', '2023-09-01', '2004-09-10', 3, 0.00),
('陈', '雪', 'chenxue@email.com', '2023-09-01', '2004-06-18', 4, 0.00),
('楚', '阳', 'chuyang@email.com', '2023-09-01', '2004-02-28', 5, 2000.00),
('魏', '琳', 'weilin@email.com', '2023-09-01', '2004-11-11', 6, 0.00),
('蒋', '超', 'jiangchao@email.com', '2023-09-01', '2004-10-03', 7, 0.00),
('沈', '洁', 'shenjie@email.com', '2023-09-01', '2004-08-21', 1, 3500.00);-- 插入课程数据
INSERT INTO courses (course_code, course_name, credits, teacher_id, department_id, prerequisite_id) VALUES
('CS101', '计算机基础', 3, 1, 1, NULL),
('CS201', 'Java程序设计', 4, 2, 1, 1),
('CS301', '数据库系统', 4, 9, 1, 2),
('CS401', 'Web开发', 3, 2, 1, 2),
('MATH101', '高等数学', 5, 3, 2, NULL),
('MATH201', '线性代数', 4, 10, 2, 5),
('PHYS101', '大学物理', 4, 4, 3, NULL),
('LIT101', '中国文学史', 3, 5, 4, NULL),
('HIST101', '世界历史', 3, 6, 5, NULL),
('ECON101', '微观经济学', 4, 7, 6, NULL),
('LANG101', '英语精读', 4, 8, 7, NULL),
('CS202', '数据结构', 4, 1, 1, 2),
('MATH301', '概率统计', 4, 10, 2, 6);-- 插入课程安排数据
INSERT INTO schedules (course_id, classroom_id, day_of_week, start_time, end_time) VALUES
(1, 1, 'Monday', '08:00:00', '09:40:00'),
(1, 1, 'Wednesday', '08:00:00', '09:40:00'),
(2, 2, 'Tuesday', '10:00:00', '11:40:00'),
(2, 2, 'Thursday', '10:00:00', '11:40:00'),
(3, 3, 'Monday', '14:00:00', '15:40:00'),
(3, 3, 'Wednesday', '14:00:00', '15:40:00'),
(4, 4, 'Tuesday', '16:00:00', '17:40:00'),
(4, 4, 'Thursday', '16:00:00', '17:40:00'),
(5, 5, 'Monday', '08:00:00', '09:40:00'),
(5, 5, 'Wednesday', '08:00:00', '09:40:00'),
(5, 5, 'Friday', '08:00:00', '09:40:00'),
(6, 6, 'Tuesday', '10:00:00', '11:40:00'),
(6, 6, 'Thursday', '10:00:00', '11:40:00'),
(7, 7, 'Monday', '14:00:00', '15:40:00'),
(7, 7, 'Wednesday', '14:00:00', '15:40:00'),
(8, 8, 'Tuesday', '16:00:00', '17:40:00'),
(9, 9, 'Thursday', '10:00:00', '11:40:00'),
(10, 10, 'Friday', '14:00:00', '15:40:00');-- 插入选课数据
INSERT INTO enrollments (student_id, course_id, enrollment_date, semester, academic_year) VALUES
(1, 1, '2023-02-15', 'Spring', 2023),
(1, 2, '2023-02-15', 'Spring', 2023),
(1, 5, '2023-02-15', 'Spring', 2023),
(2, 1, '2023-02-16', 'Spring', 2023),
(2, 3, '2023-02-16', 'Spring', 2023),
(2, 7, '2023-02-16', 'Spring', 2023),
(3, 5, '2023-02-15', 'Spring', 2023),
(3, 6, '2023-02-15', 'Spring', 2023),
(3, 8, '2023-02-15', 'Spring', 2023),
(4, 7, '2023-02-17', 'Spring', 2023),
(4, 9, '2023-02-17', 'Spring', 2023),
(4, 10, '2023-02-17', 'Spring', 2023),
(5, 8, '2023-02-16', 'Spring', 2023),
(5, 10, '2023-02-16', 'Spring', 2023),
(5, 11, '2023-02-16', 'Spring', 2023),
(6, 9, '2023-02-15', 'Spring', 2023),
(6, 11, '2023-02-15', 'Spring', 2023),
(7, 10, '2023-02-17', 'Spring', 2023),
(7, 11, '2023-02-17', 'Spring', 2023),
(8, 1, '2023-02-16', 'Spring', 2023),
(8, 12, '2023-02-16', 'Spring', 2023),
(9, 5, '2023-02-15', 'Spring', 2023),
(9, 13, '2023-02-15', 'Spring', 2023),
(10, 7, '2023-02-17', 'Spring', 2023),
(11, 8, '2023-02-16', 'Spring', 2023),
(12, 9, '2023-02-15', 'Spring', 2023),
(13, 10, '2023-02-17', 'Spring', 2023),
(14, 11, '2023-02-16', 'Spring', 2023),
(15, 12, '2023-02-15', 'Spring', 2023);-- 插入成绩数据
INSERT INTO scores (enrollment_id, midterm_score, final_score, assignment_score, exam_date) VALUES
(1, 92.5, 88.0, 95.0, '2023-06-15'),
(2, 88.0, 92.5, 90.0, '2023-06-16'),
(3, 95.0, 90.0, 93.0, '2023-06-17'),
(4, 76.5, 80.0, 85.0, '2023-06-15'),
(5, 82.0, 85.5, 88.0, '2023-06-16'),
(6, 91.5, 88.0, 90.0, '2023-06-17'),
(7, 69.0, 75.0, 80.0, '2023-06-15'),
(8, 87.5, 90.0, 92.0, '2023-06-16'),
(9, 93.0, 88.5, 91.0, '2023-06-17'),
(10, 78.5, 82.0, 85.0, '2023-06-15'),
(11, 84.0, 80.0, 82.0, '2023-06-16'),
(12, 79.5, 85.0, 88.0, '2023-06-17'),
(13, 96.0, 92.0, 94.0, '2023-06-15'),
(14, 81.5, 85.0, 87.0, '2023-06-16'),
(15, 90.0, 88.5, 91.0, '2023-06-17'),
(16, 85.5, 90.0, 92.0, '2023-06-15'),
(17, 77.0, 80.0, 83.0, '2023-06-16'),
(18, 88.5, 85.0, 87.0, '2023-06-17'),
(19, 73.0, 78.0, 82.0, '2023-06-15'),
(20, 94.5, 90.0, 92.0, '2023-06-16'),
(21, 82.0, 85.0, 88.0, '2023-06-17'),
(22, 79.0, 83.0, 86.0, '2023-06-15'),
(23, 91.0, 87.0, 89.0, '2023-06-16'),
(24, 86.5, 90.0, 92.0, '2023-06-17'),
(25, 75.0, 80.0, 84.0, '2023-06-15'),
(26, 88.0, 85.0, 87.0, '2023-06-16'),
(27, 92.5, 90.0, 93.0, '2023-06-17'),
(28, 84.0, 88.0, 90.0, '2023-06-15');-- 插入图书馆数据
INSERT INTO library (isbn, title, author, publisher, publish_year, category, total_copies, available_copies) VALUES
('978-7-121-34567-8', '数据库系统概念', 'Abraham Silberschatz', '机械工业出版社', 2019, '计算机', 5, 3),
('978-7-121-34568-5', 'Java核心技术 卷I', 'Cay S. Horstmann', '电子工业出版社', 2018, '计算机', 7, 5),
('978-7-04-051234-5', '高等数学', '同济大学数学系', '高等教育出版社', 2020, '数学', 10, 8),
('978-7-04-051235-2', '物理学基础', 'David Halliday', '高等教育出版社', 2017, '物理', 4, 2),
('978-7-02-014567-8', '中国文学史', '袁行霈', '人民文学出版社', 2014, '文学', 6, 4),
('978-7-101-12345-6', '全球通史', '斯塔夫里阿诺斯', '中华书局', 2016, '历史', 5, 3),
('978-7-111-56789-0', '经济学原理', 'N. Gregory Mankiw', '机械工业出版社', 2020, '经济', 8, 6),
('978-7-121-34569-2', 'Web前端开发', 'Jon Duckett', '电子工业出版社', 2019, '计算机', 5, 2),
('978-7-04-051236-9', '线性代数及其应用', 'David C. Lay', '高等教育出版社', 2018, '数学', 4, 1),
('978-7-5446-5678-9', '高级英语', '张汉熙', '外语教学与研究出版社', 2017, '外语', 6, 4),
('978-7-302-45678-1', '算法导论', 'Thomas H. Cormen', '清华大学出版社', 2019, '计算机', 3, 1),
('978-7-101-13456-9', '中国近代史', '蒋廷黻', '中华书局', 2015, '历史', 4, 2);-- 插入借阅记录数据
INSERT INTO borrow_records (student_id, book_id, borrow_date, due_date, return_date, fine_amount) VALUES
(1, 1, '2023-03-10', '2023-04-10', '2023-04-10', 0),
(1, 2, '2023-03-15', '2023-04-15', NULL, 5.50),
(2, 1, '2023-03-12', '2023-04-12', '2023-04-12', 0),
(3, 3, '2023-03-20', '2023-04-20', '2023-04-20', 0),
(4, 4, '2023-03-25', '2023-04-25', NULL, 8.00),
(5, 5, '2023-04-01', '2023-05-01', '2023-05-01', 0),
(6, 6, '2023-04-05', '2023-05-05', NULL, 12.50),
(7, 7, '2023-04-10', '2023-05-10', '2023-05-10', 0),
(8, 8, '2023-04-15', '2023-05-15', NULL, 7.00),
(9, 9, '2023-04-20', '2023-05-20', '2023-05-20', 0),
(10, 10, '2023-04-25', '2023-05-25', NULL, 3.50),
(11, 11, '2023-05-01', '2023-06-01', '2023-06-01', 0),
(12, 12, '2023-05-05', '2023-06-05', NULL, 10.00),
(1, 3, '2023-05-10', '2023-06-10', '2023-06-10', 0),
(2, 4, '2023-05-15', '2023-06-15', NULL, 6.50);-- 插入社团数据
INSERT INTO clubs (club_name, established_date, faculty_advisor_id, budget) VALUES
('计算机协会', '2015-09-10', 1, 5000.00),
('数学建模社', '2016-03-15', 3, 4000.00),
('文学社', '2014-10-20', 5, 3000.00),
('英语角', '2017-05-12', 8, 3500.00),
('篮球社', '2013-11-08', 4, 6000.00);-- 插入社团成员数据
INSERT INTO club_members (club_id, student_id, join_date, role) VALUES
(1, 1, '2022-10-15', 'President'),
(1, 2, '2022-10-15', 'Vice President'),
(1, 8, '2023-10-20', 'Treasurer'),
(1, 15, '2023-10-20', 'Member'),
(2, 3, '2022-10-16', 'President'),
(2, 9, '2023-10-21', 'Secretary'),
(2, 10, '2023-10-21', 'Member'),
(3, 5, '2022-10-17', 'President'),
(3, 11, '2023-10-22', 'Member'),
(4, 7, '2022-10-18', 'President'),
(4, 14, '2023-10-23', 'Vice President'),
(5, 4, '2022-10-19', 'President'),
(5, 6, '2022-10-19', 'Treasurer'),
(5, 12, '2023-10-24', 'Member'),
(5, 13, '2023-10-24', 'Member');-- 插入活动数据
INSERT INTO events (event_name, organizer_club_id, event_date, location, budget) VALUES
('编程大赛', 1, '2023-04-15', '科技楼101', 2000.00),
('数学竞赛', 2, '2023-05-20', '理学楼201', 1500.00),
('诗歌朗诵会', 3, '2023-03-25', '人文楼301', 1000.00),
('英语演讲比赛', 4, '2023-06-10', '国际楼101', 1800.00),
('篮球联赛', 5, '2023-05-05', '体育馆', 3000.00);-- 插入活动参与数据
INSERT INTO event_participants (event_id, student_id, registration_date, attended) VALUES
(1, 1, '2023-04-01', TRUE),
(1, 2, '2023-04-01', TRUE),
(1, 8, '2023-04-02', TRUE),
(1, 15, '2023-04-02', FALSE),
(2, 3, '2023-05-01', TRUE),
(2, 9, '2023-05-01', TRUE),
(2, 10, '2023-05-02', FALSE),
(3, 5, '2023-03-15', TRUE),
(3, 11, '2023-03-16', TRUE),
(4, 7, '2023-05-25', TRUE),
(4, 14, '2023-05-26', TRUE),
(5, 4, '2023-04-20', TRUE),
(5, 6, '2023-04-20', TRUE),
(5, 12, '2023-04-21', TRUE),
(5, 13, '2023-04-21', FALSE);
100+ SQL练习题
基础查询 (20题)
- 查询所有学生的基本信息
- 查询所有课程的名称和学分
- 查询所有教师的基本信息
- 查询所有院系的基本信息
- 查询计算机科学系的所有学生
- 查询所有男生的信息(假设有性别字段)
- 查询奖学金大于2000的学生
- 查询2022年入学学生的信息
- 查询姓"张"的学生信息
- 查询邮箱地址包含"edu"的学生
- 查询学分大于3的课程
- 查询教授职称为"教授"的教师
- 查询工资在60000到80000之间的教师
- 查询容量大于60的教室
- 查询有投影仪的教室
- 查询图书馆中计算机类别的书籍
- 查询2018年后出版的书籍
- 查询可用副本数大于0的书籍
- 查询借阅记录中尚未归还的图书
- 查询罚款金额大于5元的借阅记录
聚合与分组 (20题)
- 查询每个院系的学生数量
- 查询每个院系的平均奖学金
- 查询每个教师教授的课程数量
- 查询每门课程的选课人数
- 查询每门课程的平均成绩
- 查询每个学生的平均成绩
- 查询每个学生的选课数量
- 查询每个院系的教师数量
- 查询每个院系的预算总额
- 查询每个社团的成员数量
- 查询每个社团的预算
- 查询每个活动的参与人数
- 查询每个学生借阅书籍的数量
- 查询每本书的借阅次数
- 查询每个月的借阅数量
- 查询每个类别书籍的平均出版年份
- 查询每个院系学生的平均年龄
- 查询每个职称的教师平均工资
- 查询每个教室的使用次数
- 查询每个学期的选课人数
连接查询 (20题)
- 查询学生及其所在院系的信息
- 查询课程及其授课教师的信息
- 查询选课记录及其对应的学生和课程信息
- 查询成绩及其对应的学生和课程信息
- 查询借阅记录及其对应的学生和书籍信息
- 查询社团及其指导老师的信息
- 查询社团成员及其所在社团的信息
- 查询活动及其组织社团的信息
- 查询活动参与记录及其对应的学生和活动信息
- 查询课程安排及其对应的教室和课程信息
- 查询有前置课程的课程及其前置课程信息
- 查询每个学生及其辅导员的信息(假设有辅导员字段)
- 查询每个院系及其所在楼宇的信息
- 查询每本书及其出版社的信息
- 查询每个学生及其借阅的书籍信息
- 查询每门课程及其上课地点和时间
- 查询每个教师及其所在院系和教授的课程
- 查询每个活动及其参与学生的信息
- 查询每个社团及其成员的信息
- 查询每个教室及其安排的课程信息
高级查询 (20题)
- 查询成绩高于90分的学生和课程信息
- 查询没有选课的学生
- 查询没有学生的院系
- 查询没有教授课程的教师
- 查询选修了所有课程的学生
- 查询每门课程成绩最高的学生信息
- 查询平均成绩高于85分的学生
- 查询成绩排名前5的学生
- 查询借阅次数最多的前5本书
- 查询参与活动最多的前5个学生
- 查询奖学金最高的3个学生
- 查询工资最高的5个教师
- 查询预算最高的3个社团
- 查询容量最大的5个教室
- 查询最受欢迎的5门课程(按选课人数)
- 查询最活跃的5个社团(按活动数量)
- 查询借阅时间最长的5条记录
- 查询罚款金额最高的5条借阅记录
- 查询成绩进步最大的学生(比较期中期末成绩)
- 查询每个院系成绩最好的学生
子查询与复杂查询 (20题)
- 查询选了"数据库系统"课程的学生
- 查询没有选"Java程序设计"课程的学生
- 查询选了某教师所教的所有课程的学生
- 查询至少选修了两门课程的学生
- 查询选修了课程但没有参加考试的学生
- 查询参加了活动但没有借阅过书籍的学生
- 查询借阅了所有计算机类书籍的学生
- 查询没有参加任何社团的学生
- 查询参加了所有社团活动的学生
- 查询同一院系中奖学金最高的学生
- 查询同一课程中成绩高于平均成绩的学生
- 查询选课数量超过院系平均选课数量的学生
- 查询成绩比上学期有提高的学生
- 查询借阅书籍数量超过平均水平的学生
- 查询组织活动最多的社团
- 查询指导社团数量最多的教师
- 查询使用频率最高的教室
- 查询借阅频率最高的书籍类别
- 查询成绩分布最均匀的课程
- 查询学生人数最多的年级
基础查询 (1-20题) 答案
1. 查询所有学生的基本信息
SELECT * FROM students;
2. 查询所有课程的名称和学分
SELECT course_name, credits FROM courses;
3. 查询所有教师的基本信息
SELECT * FROM teachers;
4. 查询所有院系的基本信息
SELECT * FROM departments;
5. 查询计算机科学系的所有学生
SELECT s.*
FROM students s
JOIN departments d ON s.department_id = d.department_id
WHERE d.department_name = '计算机科学';
6. 查询所有男生的信息(假设有性别字段)
-- 如果students表有gender字段
SELECT * FROM students WHERE gender = '男';
-- 如果没有,可以先添加字段
ALTER TABLE students ADD COLUMN gender ENUM('男','女');
UPDATE students SET gender = CASE WHEN student_id % 2 = 0 THEN '男' ELSE '女' END;
7. 查询奖学金大于2000的学生
SELECT * FROM students WHERE scholarship > 2000;
8. 查询2022年入学学生的信息
SELECT * FROM students WHERE YEAR(enrollment_date) = 2022;
9. 查询姓"张"的学生信息
SELECT * FROM students WHERE first_name LIKE '张%';
10. 查询邮箱地址包含"edu"的学生
SELECT * FROM students WHERE email LIKE '%edu%';
11. 查询学分大于3的课程
SELECT * FROM courses WHERE credits > 3;
12. 查询教授职称为"教授"的教师
SELECT * FROM teachers WHERE title = '教授';
13. 查询工资在60000到80000之间的教师
SELECT * FROM teachers WHERE salary BETWEEN 60000 AND 80000;
14. 查询容量大于60的教室
SELECT * FROM classrooms WHERE capacity > 60;
15. 查询有投影仪的教室
SELECT * FROM classrooms WHERE has_projector = TRUE;
16. 查询图书馆中计算机类别的书籍
SELECT * FROM library WHERE category = '计算机';
17. 查询2018年后出版的书籍
SELECT * FROM library WHERE publish_year > 2018;
18. 查询可用副本数大于0的书籍
SELECT * FROM library WHERE available_copies > 0;
19. 查询借阅记录中尚未归还的图书
SELECT * FROM borrow_records WHERE return_date IS NULL;
20. 查询罚款金额大于5元的借阅记录
SELECT * FROM borrow_records WHERE fine_amount > 5;
聚合与分组 (21-40题) 答案
21. 查询每个院系的学生数量
SELECT d.department_name, COUNT(s.student_id) as student_count
FROM departments d
LEFT JOIN students s ON d.department_id = s.department_id
GROUP BY d.department_name;
22. 查询每个院系的平均奖学金
SELECT d.department_name, AVG(s.scholarship) as avg_scholarship
FROM departments d
LEFT JOIN students s ON d.department_id = s.department_id
GROUP BY d.department_name;
23. 查询每个教师教授的课程数量
SELECT t.first_name, t.last_name, COUNT(c.course_id) as course_count
FROM teachers t
LEFT JOIN courses c ON t.teacher_id = c.teacher_id
GROUP BY t.teacher_id, t.first_name, t.last_name;
24. 查询每门课程的选课人数
SELECT c.course_name, COUNT(e.student_id) as enrollment_count
FROM courses c
LEFT JOIN enrollments e ON c.course_id = e.course_id
GROUP BY c.course_id, c.course_name;
25. 查询每门课程的平均成绩
SELECT c.course_name, AVG(sc.total_score) as avg_score
FROM courses c
JOIN enrollments e ON c.course_id = e.course_id
JOIN scores sc ON e.enrollment_id = sc.enrollment_id
GROUP BY c.course_id, c.course_name;
26. 查询每个学生的平均成绩
SELECT s.first_name, s.last_name, AVG(sc.total_score) as avg_score
FROM students s
JOIN enrollments e ON s.student_id = e.student_id
JOIN scores sc ON e.enrollment_id = sc.enrollment_id
GROUP BY s.student_id, s.first_name, s.last_name;
27. 查询每个学生的选课数量
SELECT s.first_name, s.last_name, COUNT(e.course_id) as course_count
FROM students s
LEFT JOIN enrollments e ON s.student_id = e.student_id
GROUP BY s.student_id, s.first_name, s.last_name;
28. 查询每个院系的教师数量
SELECT d.department_name, COUNT(t.teacher_id) as teacher_count
FROM departments d
LEFT JOIN teachers t ON d.department_id = t.department_id
GROUP BY d.department_name;
29. 查询每个院系的预算总额
SELECT department_name, budget FROM departments;
30. 查询每个社团的成员数量
SELECT c.club_name, COUNT(cm.student_id) as member_count
FROM clubs c
LEFT JOIN club_members cm ON c.club_id = cm.club_id
GROUP BY c.club_id, c.club_name;
31. 查询每个社团的预算
SELECT club_name, budget FROM clubs;
32. 查询每个活动的参与人数
SELECT e.event_name, COUNT(ep.student_id) as participant_count
FROM events e
LEFT JOIN event_participants ep ON e.event_id = ep.event_id
GROUP BY e.event_id, e.event_name;
33. 查询每个学生借阅书籍的数量
SELECT s.first_name, s.last_name, COUNT(br.record_id) as borrow_count
FROM students s
LEFT JOIN borrow_records br ON s.student_id = br.student_id
GROUP BY s.student_id, s.first_name, s.last_name;
34. 查询每本书的借阅次数
SELECT l.title, l.author, COUNT(br.record_id) as borrow_count
FROM library l
LEFT JOIN borrow_records br ON l.book_id = br.book_id
GROUP BY l.book_id, l.title, l.author;
35. 查询每个月的借阅数量
SELECT YEAR(borrow_date) as year, MONTH(borrow_date) as month, COUNT(*) as borrow_count
FROM borrow_records
GROUP BY YEAR(borrow_date), MONTH(borrow_date)
ORDER BY year, month;
36. 查询每个类别书籍的平均出版年份
SELECT category, AVG(publish_year) as avg_publish_year
FROM library
GROUP BY category;
37. 查询每个院系学生的平均年龄
SELECT d.department_name, AVG(YEAR(CURDATE()) - YEAR(s.date_of_birth)) as avg_age
FROM departments d
JOIN students s ON d.department_id = s.department_id
GROUP BY d.department_name;
38. 查询每个职称的教师平均工资
SELECT title, AVG(salary) as avg_salary
FROM teachers
GROUP BY title;
39. 查询每个教室的使用次数
SELECT c.room_number, c.building, COUNT(s.schedule_id) as usage_count
FROM classrooms c
LEFT JOIN schedules s ON c.classroom_id = s.classroom_id
GROUP BY c.classroom_id, c.room_number, c.building;
40. 查询每个学期的选课人数
SELECT semester, academic_year, COUNT(*) as enrollment_count
FROM enrollments
GROUP BY semester, academic_year
ORDER BY academic_year, semester;
连接查询 (41-60题) 答案
41. 查询学生及其所在院系的信息
SELECT s.*, d.department_name
FROM students s
JOIN departments d ON s.department_id = d.department_id;
42. 查询课程及其授课教师的信息
SELECT c.*, t.first_name, t.last_name
FROM courses c
JOIN teachers t ON c.teacher_id = t.teacher_id;
43. 查询选课记录及其对应的学生和课程信息
SELECT e.*, s.first_name, s.last_name, c.course_name
FROM enrollments e
JOIN students s ON e.student_id = s.student_id
JOIN courses c ON e.course_id = c.course_id;
44. 查询成绩及其对应的学生和课程信息
SELECT sc.*, s.first_name, s.last_name, c.course_name
FROM scores sc
JOIN enrollments e ON sc.enrollment_id = e.enrollment_id
JOIN students s ON e.student_id = s.student_id
JOIN courses c ON e.course_id = c.course_id;
45. 查询借阅记录及其对应的学生和书籍信息
SELECT br.*, s.first_name, s.last_name, l.title
FROM borrow_records br
JOIN students s ON br.student_id = s.student_id
JOIN library l ON br.book_id = l.book_id;
46. 查询社团及其指导老师的信息
SELECT c.*, t.first_name, t.last_name
FROM clubs c
JOIN teachers t ON c.faculty_advisor_id = t.teacher_id;
47. 查询社团成员及其所在社团的信息
SELECT cm.*, s.first_name, s.last_name, c.club_name
FROM club_members cm
JOIN students s ON cm.student_id = s.student_id
JOIN clubs c ON cm.club_id = c.club_id;
48. 查询活动及其组织社团的信息
SELECT e.*, c.club_name
FROM events e
JOIN clubs c ON e.organizer_club_id = c.club_id;
49. 查询活动参与记录及其对应的学生和活动信息
SELECT ep.*, s.first_name, s.last_name, e.event_name
FROM event_participants ep
JOIN students s ON ep.student_id = s.student_id
JOIN events e ON ep.event_id = e.event_id;
50. 查询课程安排及其对应的教室和课程信息
SELECT s.*, c.room_number, c.building, cr.course_name
FROM schedules s
JOIN classrooms c ON s.classroom_id = c.classroom_id
JOIN courses cr ON s.course_id = cr.course_id;
高级查询 (61-80题) 答案
61. 查询成绩高于90分的学生和课程信息
SELECT s.first_name, s.last_name, c.course_name, sc.total_score
FROM students s
JOIN enrollments e ON s.student_id = e.student_id
JOIN courses c ON e.course_id = c.course_id
JOIN scores sc ON e.enrollment_id = sc.enrollment_id
WHERE sc.total_score > 90;
62. 查询没有选课的学生
SELECT s.*
FROM students s
LEFT JOIN enrollments e ON s.student_id = e.student_id
WHERE e.enrollment_id IS NULL;
63. 查询没有学生的院系
SELECT d.*
FROM departments d
LEFT JOIN students s ON d.department_id = s.department_id
WHERE s.student_id IS NULL;
64. 查询没有教授课程的教师
SELECT t.*
FROM teachers t
LEFT JOIN courses c ON t.teacher_id = c.teacher_id
WHERE c.course_id IS NULL;
65. 查询选修了所有课程的学生
SELECT s.first_name, s.last_name
FROM students s
JOIN enrollments e ON s.student_id = e.student_id
GROUP BY s.student_id, s.first_name, s.last_name
HAVING COUNT(DISTINCT e.course_id) = (SELECT COUNT(*) FROM courses);
66. 查询每门课程成绩最高的学生信息
WITH CourseMaxScores AS (SELECT e.course_id,MAX(sc.total_score) as max_scoreFROM enrollments eJOIN scores sc ON e.enrollment_id = sc.enrollment_idGROUP BY e.course_id
)
SELECT c.course_name,s.first_name,s.last_name,sc.total_score
FROM students s
JOIN enrollments e ON s.student_id = e.student_id
JOIN scores sc ON e.enrollment_id = sc.enrollment_id
JOIN courses c ON e.course_id = c.course_id
JOIN CourseMaxScores cms ON e.course_id = cms.course_id AND sc.total_score = cms.max_score;
67. 查询平均成绩高于85分的学生
SELECT s.first_name, s.last_name, AVG(sc.total_score) as avg_score
FROM students s
JOIN enrollments e ON s.student_id = e.student_id
JOIN scores sc ON e.enrollment_id = sc.enrollment_id
GROUP BY s.student_id, s.first_name, s.last_name
HAVING AVG(sc.total_score) > 85;
68. 查询成绩排名前5的学生
SELECT s.first_name, s.last_name, AVG(sc.total_score) as avg_score
FROM students s
JOIN enrollments e ON s.student_id = e.student_id
JOIN scores sc ON e.enrollment_id = sc.enrollment_id
GROUP BY s.student_id, s.first_name, s.last_name
ORDER BY avg_score DESC
LIMIT 5;
69. 查询借阅次数最多的前5本书
SELECT l.title, l.author, COUNT(br.record_id) as borrow_count
FROM library l
JOIN borrow_records br ON l.book_id = br.book_id
GROUP BY l.book_id, l.title, l.author
ORDER BY borrow_count DESC
LIMIT 5;
70. 查询参与活动最多的前5个学生
SELECT s.first_name, s.last_name, COUNT(ep.participation_id) as participation_count
FROM students s
JOIN event_participants ep ON s.student_id = ep.student_id
GROUP BY s.student_id, s.first_name, s.last_name
ORDER BY participation_count DESC
LIMIT 5;
71. 查询奖学金最高的3个学生
SELECT first_name, last_name, scholarship
FROM students
ORDER BY scholarship DESC
LIMIT 3;
72. 查询工资最高的5个教师
SELECT first_name, last_name, salary
FROM teachers
ORDER BY salary DESC
LIMIT 5;
73. 查询预算最高的3个社团
SELECT club_name, budget
FROM clubs
ORDER BY budget DESC
LIMIT 3;
74. 查询容量最大的5个教室
SELECT room_number, building, capacity
FROM classrooms
ORDER BY capacity DESC
LIMIT 5;
75. 查询最受欢迎的5门课程(按选课人数)
SELECT c.course_name, COUNT(e.student_id) as enrollment_count
FROM courses c
JOIN enrollments e ON c.course_id = e.course_id
GROUP BY c.course_id, c.course_name
ORDER BY enrollment_count DESC
LIMIT 5;
76. 查询最活跃的5个社团(按活动数量)
SELECT c.club_name, COUNT(e.event_id) as event_count
FROM clubs c
JOIN events e ON c.club_id = e.organizer_club_id
GROUP BY c.club_id, c.club_name
ORDER BY event_count DESC
LIMIT 5;
77. 查询借阅时间最长的5条记录
SELECT s.first_name, s.last_name, l.title, DATEDIFF(COALESCE(br.return_date, CURDATE()), br.borrow_date) as borrow_days
FROM borrow_records br
JOIN students s ON br.student_id = s.student_id
JOIN library l ON br.book_id = l.book_id
ORDER BY borrow_days DESC
LIMIT 5;
78. 查询罚款金额最高的5条借阅记录
SELECT s.first_name, s.last_name, l.title, br.fine_amount
FROM borrow_records br
JOIN students s ON br.student_id = s.student_id
JOIN library l ON br.book_id = l.book_id
ORDER BY br.fine_amount DESC
LIMIT 5;
79. 查询成绩进步最大的学生(比较期中期末成绩)
SELECT s.first_name,s.last_name,c.course_name,sc.midterm_score,sc.final_score,(sc.final_score - sc.midterm_score) as improvement
FROM students s
JOIN enrollments e ON s.student_id = e.student_id
JOIN scores sc ON e.enrollment_id = sc.enrollment_id
JOIN courses c ON e.course_id = c.course_id
WHERE sc.midterm_score IS NOT NULL AND sc.final_score IS NOT NULL
ORDER BY improvement DESC
LIMIT 5;
80. 查询每个院系成绩最好的学生
WITH DepartmentTopStudents AS (SELECT d.department_id,s.student_id,AVG(sc.total_score) as avg_score,RANK() OVER (PARTITION BY d.department_id ORDER BY AVG(sc.total_score) DESC) as rank_in_deptFROM departments dJOIN students s ON d.department_id = s.department_idJOIN enrollments e ON s.student_id = e.student_idJOIN scores sc ON e.enrollment_id = sc.enrollment_idGROUP BY d.department_id, s.student_id
)
SELECT d.department_name,s.first_name,s.last_name,dts.avg_score
FROM DepartmentTopStudents dts
JOIN students s ON dts.student_id = s.student_id
JOIN departments d ON dts.department_id = d.department_id
WHERE dts.rank_in_dept = 1;
子查询与复杂查询 (81-100题) 答案
81. 查询选了"数据库系统"课程的学生
SELECT s.first_name, s.last_name
FROM students s
JOIN enrollments e ON s.student_id = e.student_id
JOIN courses c ON e.course_id = c.course_id
WHERE c.course_name = '数据库系统';
82. 查询没有选"Java程序设计"课程的学生
SELECT s.first_name, s.last_name
FROM students s
WHERE s.student_id NOT IN (SELECT e.student_idFROM enrollments eJOIN courses c ON e.course_id = c.course_idWHERE c.course_name = 'Java程序设计'
);
83. 查询选了某教师所教的所有课程的学生
-- 假设教师ID为2
SELECT s.first_name, s.last_name
FROM students s
WHERE NOT EXISTS (SELECT c.course_idFROM courses cWHERE c.teacher_id = 2AND c.course_id NOT IN (SELECT e.course_idFROM enrollments eWHERE e.student_id = s.student_id)
);
84. 查询至少选修了两门课程的学生
SELECT s.first_name, s.last_name, COUNT(e.course_id) as course_count
FROM students s
JOIN enrollments e ON s.student_id = e.student_id
GROUP BY s.student_id, s.first_name, s.last_name
HAVING COUNT(e.course_id) >= 2;
85. 查询选修了课程但没有参加考试的学生
SELECT s.first_name, s.last_name, c.course_name
FROM students s
JOIN enrollments e ON s.student_id = e.student_id
JOIN courses c ON e.course_id = c.course_id
LEFT JOIN scores sc ON e.enrollment_id = sc.enrollment_id
WHERE sc.score_id IS NULL;
86. 查询参加了活动但没有借阅过书籍的学生
SELECT s.first_name, s.last_name
FROM students s
JOIN event_participants ep ON s.student_id = ep.student_id
LEFT JOIN borrow_records br ON s.student_id = br.student_id
WHERE br.record_id IS NULL
GROUP BY s.student_id, s.first_name, s.last_name;
87. 查询借阅了所有计算机类书籍的学生
SELECT s.first_name, s.last_name
FROM students s
WHERE NOT EXISTS (SELECT l.book_idFROM library lWHERE l.category = '计算机'AND l.book_id NOT IN (SELECT br.book_idFROM borrow_records brWHERE br.student_id = s.student_id)
);
88. 查询没有参加任何社团的学生
SELECT s.first_name, s.last_name
FROM students s
LEFT JOIN club_members cm ON s.student_id = cm.student_id
WHERE cm.membership_id IS NULL;
89. 查询参加了所有社团活动的学生
SELECT s.first_name, s.last_name
FROM students s
WHERE NOT EXISTS (SELECT e.event_idFROM events eWHERE e.event_id NOT IN (SELECT ep.event_idFROM event_participants epWHERE ep.student_id = s.student_id)
);
90. 查询同一院系中奖学金最高的学生
WITH DepartmentTopScholarship AS (SELECT department_id,MAX(scholarship) as max_scholarshipFROM studentsGROUP BY department_id
)
SELECT d.department_name,s.first_name,s.last_name,s.scholarship
FROM students s
JOIN departments d ON s.department_id = d.department_id
JOIN DepartmentTopScholarship dts ON s.department_id = dts.department_id AND s.scholarship = dts.max_scholarship;
91. 查询同一课程中成绩高于平均成绩的学生
SELECT c.course_name,s.first_name,s.last_name,sc.total_score,(SELECT AVG(sc2.total_score) FROM scores sc2 JOIN enrollments e2 ON sc2.enrollment_id = e2.enrollment_id WHERE e2.course_id = c.course_id) as course_avg
FROM students s
JOIN enrollments e ON s.student_id = e.student_id
JOIN courses c ON e.course_id = c.course_id
JOIN scores sc ON e.enrollment_id = sc.enrollment_id
WHERE sc.total_score > (SELECT AVG(sc2.total_score) FROM scores sc2 JOIN enrollments e2 ON sc2.enrollment_id = e2.enrollment_id WHERE e2.course_id = c.course_id
);
92. 查询选课数量超过院系平均选课数量的学生
WITH DepartmentAvgCourses AS (SELECT s.department_id,AVG(course_count) as avg_coursesFROM (SELECT s.student_id, s.department_id, COUNT(e.course_id) as course_countFROM students sLEFT JOIN enrollments e ON s.student_id = e.student_idGROUP BY s.student_id, s.department_id) student_coursesGROUP BY department_id
)
SELECT s.first_name,s.last_name,d.department_name,COUNT(e.course_id) as course_count,dac.avg_courses
FROM students s
JOIN departments d ON s.department_id = d.department_id
JOIN enrollments e ON s.student_id = e.student_id
JOIN DepartmentAvgCourses dac ON s.department_id = dac.department_id
GROUP BY s.student_id, s.first_name, s.last_name, d.department_name, dac.avg_courses
HAVING COUNT(e.course_id) > dac.avg_courses;
93. 查询成绩比上学期有提高的学生
-- 假设有学期字段,这里简化处理
SELECT s.first_name,s.last_name,c.course_name,sc1.total_score as previous_score,sc2.total_score as current_score,(sc2.total_score - sc1.total_score) as improvement
FROM students s
JOIN enrollments e1 ON s.student_id = e1.student_id
JOIN enrollments e2 ON s.student_id = e2.student_id
JOIN courses c ON e1.course_id = c.course_id AND e2.course_id = c.course_id
JOIN scores sc1 ON e1.enrollment_id = sc1.enrollment_id
JOIN scores sc2 ON e2.enrollment_id = sc2.enrollment_id
WHERE e1.semester = 'Fall' AND e2.semester = 'Spring'
AND e1.academic_year = 2022 AND e2.academic_year = 2023
AND sc2.total_score > sc1.total_score;
94. 查询借阅书籍数量超过平均水平的学生
WITH StudentBorrowCounts AS (SELECT s.student_id,COUNT(br.record_id) as borrow_countFROM students sLEFT JOIN borrow_records br ON s.student_id = br.student_idGROUP BY s.student_id
),
AvgBorrowCount AS (SELECT AVG(borrow_count) as avg_countFROM StudentBorrowCounts
)
SELECT s.first_name,s.last_name,sbc.borrow_count,abc.avg_count
FROM students s
JOIN StudentBorrowCounts sbc ON s.student_id = sbc.student_id
CROSS JOIN AvgBorrowCount abc
WHERE sbc.borrow_count > abc.avg_count;
95. 查询组织活动最多的社团
SELECT c.club_name, COUNT(e.event_id) as event_count
FROM clubs c
JOIN events e ON c.club_id = e.organizer_club_id
GROUP BY c.club_id, c.club_name
ORDER BY event_count DESC
LIMIT 1;
96. 查询指导社团数量最多的教师
SELECT t.first_name, t.last_name, COUNT(c.club_id) as club_count
FROM teachers t
JOIN clubs c ON t.teacher_id = c.faculty_advisor_id
GROUP BY t.teacher_id, t.first_name, t.last_name
ORDER BY club_count DESC
LIMIT 1;
97. 查询使用频率最高的教室
SELECT c.room_number, c.building, COUNT(s.schedule_id) as usage_count
FROM classrooms c
JOIN schedules s ON c.classroom_id = s.classroom_id
GROUP BY c.classroom_id, c.room_number, c.building
ORDER BY usage_count DESC
LIMIT 1;
98. 查询借阅频率最高的书籍类别
SELECT l.category, COUNT(br.record_id) as borrow_count
FROM library l
JOIN borrow_records br ON l.book_id = br.book_id
GROUP BY l.category
ORDER BY borrow_count DESC
LIMIT 1;
99. 查询成绩分布最均匀的课程
WITH CourseScoreStats AS (SELECT c.course_id,c.course_name,COUNT(sc.score_id) as score_count,STDDEV(sc.total_score) as score_stddevFROM courses cJOIN enrollments e ON c.course_id = e.course_idJOIN scores sc ON e.enrollment_id = sc.enrollment_idGROUP BY c.course_id, c.course_nameHAVING COUNT(sc.score_id) > 5
)
SELECT course_name, score_stddev
FROM CourseScoreStats
ORDER BY score_stddev ASC
LIMIT 1;
100. 查询学生人数最多的年级
SELECT YEAR(enrollment_date) as enrollment_year, COUNT(*) as student_count
FROM students
GROUP BY YEAR(enrollment_date)
ORDER BY student_count DESC
LIMIT 1;
学习建议
- 从简单的SELECT查询开始,逐步掌握WHERE、GROUP BY、HAVING、ORDER BY等子句
- 学习JOIN的不同类型和应用场景
- 掌握聚合函数和分组查询
- 学习子查询和常用函数
- 实践复杂查询和数据分析
- 学习视图、存储过程等高级功能
- 尝试优化查询性能
- 定期复习和实践,解决实际问题
通过这个完整的数据库和100+练习题,你可以系统地学习SQL从基础到高级的所有知识点,真正实现从入门到起飞的目标!