第09周 SQL语言基础与单表数据检索
第9周 · SQL 语言基础与单表数据检索
前面几周都在"搭结构"(建库、建表、加约束)。这周开始真正用 SQL 操控数据——核心就是 SELECT 查询。查询是 3+证书考试的重头戏,也是日常用得最多的语句。
一、知识点:SQL 语言四大类
| 分类 | 全称 | 作用 | 代表语句 |
|---|---|---|---|
| DDL | 数据定义语言 | 定义结构 | CREATE / ALTER / DROP |
| DML | 数据操纵语言 | 增删改数据 | INSERT / UPDATE / DELETE |
| DQL | 数据查询语言 | 查询数据 | SELECT |
| DCL | 数据控制语言 | 权限管理 | GRANT / REVOKE |
这周主角是 DQL 的 SELECT。
二、操作教程:先准备数据(INSERT)
要查得先有数据。向 student 插入几条记录(不写 sid,让它自增):
USE school;
CREATE TABLE student (
sid INT NOT NULL,
sname VARCHAR(20) NOT NULL,
sage INT,
sgender VARCHAR(4),
sdept VARCHAR(30)
);
INSERT INTO student(sname, sage, sgender, sdept) VALUES
('张伟', 19, '男', '计算机系'),
('李娜', 20, '女', '软件工程系'),
('王芳', 18, '女', '计算机系'),
('刘强', 21, '男', '网络工程系');
INSERT是 DML,正式的系统讲数据更新在第15周;这里只为后面查询有数据可玩。
三、操作教程:SELECT 基本结构
最朴素的查询:
SELECT 列名 FROM 表名;
例:查所有学生的姓名和年龄
SELECT sname, sage FROM student;
SELECT 执行逻辑:先 FROM 定位表 → 再 SELECT 决定显示哪些列。查询只"看"数据,不修改数据。
四、知识点:查所有列 * 与指定列(投影)
SELECT * FROM student; -- * 表示所有列
SELECT sname, sdept FROM student; -- 只取需要的列(投影)
生产环境尽量写具体列名,少用
*:① 只取要的,省传输;② 表结构变了*可能带出不该暴露的列。
五、操作教程:列别名 AS
给查询结果的中文/易读列名:
SELECT sname AS 姓名, sage AS 年龄 FROM student;
AS可以省略,写成sname 姓名也行;别名只是显示用,不改表里真名。
六、操作教程:DISTINCT 去重
想知道"学生都分布在哪些系",每个系只列一次:
SELECT DISTINCT sdept FROM student;
结果只返回不重复的系名(计算机系、软件工程系、网络工程系)。
DISTINCT作用于后面所有选定列的组合。写SELECT DISTINCT sname, sdept是对"姓名+系"去重,不是只去重系。
七、操作教程:LIMIT 限制行数
只要看前几行(常用于翻页、抽样):
SELECT * FROM student LIMIT 3; -- 前 3 行
SELECT * FROM student LIMIT 2, 3; -- 从第 3 行起(偏移2)取 3 行
LIMIT m, n中m是偏移量(从0开始),n是取几行。
八、综合实操:作业三题
-- 题1:插入3条 + 查所有列 + 投影两列
INSERT INTO student(sname, sage, sgender, sdept) VALUES
('张伟',19,'男','计算机系'),
('李娜',20,'女','软件工程系'),
('王芳',18,'女','计算机系');
SELECT * FROM student;
SELECT sname, sage FROM student;
-- 题2:条件查询(WHERE 下一周细讲,这里先会用)
SELECT * FROM student WHERE sdept = '计算机系';
-- 题3:去重查所有系
SELECT DISTINCT sdept FROM student;
九、易混点排查表
| 现象 | 解决方法 |
|---|---|
SELECT * 列太多看花眼 |
改用具体列名投影,只取需要的 |
| DISTINCT 没去重 | 确认是否多列组合导致"组合不重复";只想对单列去重就只选那列 |
| 别名中文乱码/报错 | 用反引号或确保客户端字符集 utf8mb4 |
| LIMIT 偏移算错 | 记住偏移从 0 开始:LIMIT 2,3 是第3行起取3行 |
| 查不出来以为数据没了 | 查询不改数据;用 SELECT * 确认表真有数据 |
| 字符串没加引号 | 文本值必须单引号 '计算机系',数字不用 |
十、小测验(自测)
SELECT *和SELECT 列名有什么区别?什么时候不该用*?- 给
sname起中文别名"姓名"的 SQL 怎么写?AS能省略吗? SELECT DISTINCT sdept FROM student;返回什么?DISTINCT作用在哪些列?- 只取前 3 行学生的 SQL 是什么?
SELECT会修改表里的数据吗?
【声明】本文由 AI 辅助生成,仅供 MySQL 数据库教学参考,如有疑误以教材为准。
浙公网安备 33010602011771号