1 SQL 任务逐条手写
1.1 任务一:创建 student 表
在创建表时,考虑到 id 是主键需要自增,createTime 是创建时间,我们可以让系统自动获取当前的默认时间(DEFAULT CURRENT_TIMESTAMP),这样后续插入数据时就不用手动写时间了。
SQL
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '学生ID,主键自增',
name VARCHAR(50) NOT NULL COMMENT '姓名',
age INT COMMENT '年龄',
gender VARCHAR(10) COMMENT '性别',
className VARCHAR(50) COMMENT '班级名称',
score INT COMMENT '分数',
createTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) COMMENT = '学生信息表';1.2 任务二:添加 5 条以上数据
我们一次性插入 7 条测试数据,把男女比例、各种分数和年龄段都覆盖到,方便后面的统计查询:
SQL
INSERT INTO student (name, age, gender, className, score) VALUES
('小红', 19, '女', 'className A', 78),
('小明', 18, '男', 'className B', 80),
('智者', 21, '男', 'className C', 78),
('你好', 20, '女', 'className C', 81),
('棒棒', 19, '男', 'className A', 78),
('小丽', 18, '女', 'className B', 55), -- 不及格女生
('阿强', 19, '男', 'className B', 45); -- 不及格男生1.3 任务三:统计男女生分别人数
这里需要用到分组函数 GROUP BY 按性别进行归类统计:
SQL
SELECT gender, COUNT(*) AS '总人数'
FROM student
GROUP BY gender;1.4 任务四:查找年龄在 18~20 之间女生的信息
在 SQL 中,表示范围推荐使用 BETWEEN ... AND ...(包含左右边界):
SQL
SELECT * FROM student
WHERE gender = '女' AND age BETWEEN 18 AND 20;1.5 任务五:统计分数不及格同学人数
满分通常按 100 分算,低于 60 分即为不及格。这里只需要统计满足条件的行数:
SQL
SELECT COUNT(*) AS '不及格人数'
FROM student
WHERE score < 60;1.6 任务六:修改年龄小于 20 且性别为男的同学分数为 80
修改数据使用 UPDATE 语句,多个条件之间使用 AND 连接:
SQL
UPDATE student
SET score = 80
WHERE age < 20 AND gender = '男';1.7 任务七:高级分组统计
这个任务逻辑比较复杂,考核的是 SQL 执行顺序的核心要点:
-
“不及格的人不参与分组”:说明要在分组前进行过滤,必须写在
WHERE后面。 -
“平均分数低于 80 分的组不展示”:说明是对分组后的聚合结果进行过滤,必须写在
HAVING后面。
SQL
SELECT gender, COUNT(*) AS '分组人数', AVG(score) AS '平均分数'
FROM student
WHERE score >= 60 -- 1. 过滤掉不及格的人,他们不参与分组
GROUP BY gender -- 2. 按照男女生分组
HAVING AVG(score) >= 80; -- 3. 过滤掉平均分低于80分的组1.8 任务八:删除 id 等于 1, 5, 7 的学生信息
当要同时删除多个指定 id 的数据时,使用 IN 关键字是最优雅、最高效的写法:
SQL
DELETE FROM student
WHERE id IN (1, 5, 7);2 在 Navicat 中运行的避坑小贴士
-
提示一:在 Navicat 的同一个查询窗口里,你可以把这 8 段语句一口气全部粘贴进去。
-
提示二:运行的时候,建议用鼠标刮选(选中)其中某一段特定的 SQL,然后点击上面的 “运行” “运行已选择的”。按照从上到下的顺序,先建表、再插数据、最后做查询和修改,这样绝对不会报错!