SQL 基础:数据库的“普通话“
SQL 基础:数据库的"普通话"
一句话总结:SQL(Structured Query Language)是操作关系数据库的标准语言,核心就是四大操作:查(SELECT)、增(INSERT)、删(DELETE)、改(UPDATE),配合 CREATE、ALTER、DROP 管理表结构。
一、SQL 是什么?
如果把数据库比作一座仓库,SQL 就是仓库管理员使用的标准操作手册。
- SQL = Structured Query Language(结构化查询语言)
- 诞生于 1974 年,由 IBM 的 Donald Chamberlin 和 Raymond Boyce 设计
- 1986 年成为 ANSI 标准,1987 年成为 ISO 标准
- 几乎所有关系数据库都支持 SQL(MySQL、PostgreSQL、Oracle、SQL Server 等)
🌟 特点:SQL 是声明式语言(Declarative Language),你只需要告诉数据库"想要什么结果",至于"怎么实现",由数据库优化器决定。这和 C/Java 等命令式语言完全不同。
二、SQL 的分类
SQL 语句通常分为四大类:
| 类别 | 全称 | 常用语句 | 用途 |
|---|---|---|---|
| DDL | Data Definition Language | CREATE, ALTER, DROP | 定义/修改表结构 |
| DML | Data Manipulation Language | SELECT, INSERT, UPDATE, DELETE | 操作数据 |
| DCL | Data Control Language | GRANT, REVOKE | 控制权限 |
| TCL | Transaction Control Language | COMMIT, ROLLBACK | 控制事务 |
今天先讲最实用的 DDL 和 DML。
三、DDL:创建和管理表
3.1 CREATE TABLE:创建表
CREATE TABLE 学生 (
学号 CHAR(10) PRIMARY KEY, -- 主键
姓名 VARCHAR(20) NOT NULL, -- 非空
性别 CHAR(2) DEFAULT '男', -- 默认值
年龄 INT CHECK (年龄 >= 0 AND 年龄 <= 120),
专业 VARCHAR(30),
系号 CHAR(2) REFERENCES 系(系号) -- 外键
);
3.2 常用数据类型
| 类型 | 说明 | 示例 |
|---|---|---|
INT | 整数 | 年龄 INT |
FLOAT / DOUBLE | 浮点数 | 价格 FLOAT |
DECIMAL(p,s) | 精确小数 | 金额 DECIMAL(10,2) |
CHAR(n) | 固定长度字符串 | 学号 CHAR(10) |
VARCHAR(n) | 可变长度字符串 | 姓名 VARCHAR(20) |
DATE | 日期 | 出生日期 DATE |
DATETIME | 日期时间 | 下单时间 DATETIME |
BOOLEAN | 布尔值 | 是否毕业 BOOLEAN |
TEXT | 长文本 | 备注 TEXT |
💡 CHAR vs VARCHAR:CHAR(10) 固定占 10 字节,不足补空格;VARCHAR(20) 最多 20 字节,实际用多少占多少。姓名用 VARCHAR,学号用 CHAR(长度固定)。
3.3 ALTER TABLE:修改表结构
-- 添加新列
ALTER TABLE 学生 ADD 手机号 VARCHAR(15);
-- 修改列类型
ALTER TABLE 学生 ALTER COLUMN 年龄 TYPE SMALLINT; -- PostgreSQL
ALTER TABLE 学生 MODIFY 年龄 SMALLINT; -- MySQL
-- 删除列
ALTER TABLE 学生 DROP COLUMN 手机号;
-- 重命名列
ALTER TABLE 学生 RENAME COLUMN 姓名 TO 学生姓名; -- 部分数据库支持
3.4 DROP TABLE:删除表
-- 删除整个表(数据+结构全部消失,慎用!)
DROP TABLE 学生;
-- 只清空数据,保留表结构
TRUNCATE TABLE 学生;
⚠️
DROP和TRUNCATE都是高危操作,生产环境务必先备份!
四、DML:操作数据的四大金刚
4.1 INSERT:插入数据
-- 插入完整一行
INSERT INTO 学生 VALUES ('2024001', '张三', '男', 20, '计算机', '01');
-- 插入指定列(未指定的列用默认值或 NULL)
INSERT INTO 学生 (学号, 姓名, 性别, 年龄)
VALUES ('2024002', '李四', '女', 19);
-- 批量插入
INSERT INTO 学生 (学号, 姓名, 性别, 年龄) VALUES
('2024003', '王五', '男', 21),
('2024004', '赵六', '女', 20),
('2024005', '孙七', '男', 19);
4.2 SELECT:查询数据(最常用!)
SELECT 是 SQL 中最复杂、最灵活的语句,占据了日常 SQL 使用的 80% 以上。
基础查询
-- 查询所有列
SELECT * FROM 学生;
-- 查询指定列
SELECT 学号, 姓名, 专业 FROM 学生;
-- 去重查询
SELECT DISTINCT 专业 FROM 学生; -- 列出所有不同的专业
-- 起别名(让结果更美观)
SELECT 姓名 AS name, 年龄 AS age FROM 学生;
条件查询:WHERE 子句
-- 比较运算
SELECT * FROM 学生 WHERE 年龄 > 19;
SELECT * FROM 学生 WHERE 专业 = '计算机';
-- 范围查询
SELECT * FROM 学生 WHERE 年龄 BETWEEN 18 AND 22;
SELECT * FROM 学生 WHERE 专业 IN ('计算机', '软件工程');
-- 模糊查询(% 匹配任意字符,_ 匹配单个字符)
SELECT * FROM 学生 WHERE 姓名 LIKE '张%'; -- 姓张的
SELECT * FROM 学生 WHERE 姓名 LIKE '_三'; -- 名是三,单姓
-- 空值查询
SELECT * FROM 学生 WHERE 专业 IS NULL; -- 专业未填的
SELECT * FROM 学生 WHERE 专业 IS NOT NULL; -- 专业已填的
-- 逻辑组合
SELECT * FROM 学生
WHERE 专业 = '计算机' AND 年龄 > 19;
SELECT * FROM 学生
WHERE 专业 = '计算机' OR 专业 = '软件工程';
排序:ORDER BY
-- 升序(默认)
SELECT * FROM 学生 ORDER BY 年龄;
-- 降序
SELECT * FROM 学生 ORDER BY 年龄 DESC;
-- 多列排序
SELECT * FROM 学生 ORDER BY 专业 ASC, 年龄 DESC; -- 先按专业升序,再按年龄降序
限制结果数量:LIMIT / TOP
-- MySQL / PostgreSQL
SELECT * FROM 学生 LIMIT 10; -- 前 10 条
SELECT * FROM 学生 LIMIT 5 OFFSET 10; -- 跳过 10 条,取 5 条(第 11-15 条)
-- SQL Server
SELECT TOP 10 * FROM 学生;
-- Oracle
SELECT * FROM 学生 WHERE ROWNUM <= 10;
4.3 UPDATE:修改数据
-- 修改单条记录
UPDATE 学生 SET 年龄 = 21 WHERE 学号 = '2024001';
-- 修改多条记录
UPDATE 学生 SET 专业 = '人工智能' WHERE 专业 = '计算机';
-- 修改多个列
UPDATE 学生 SET 年龄 = 年龄 + 1, 专业 = '软件工程' WHERE 学号 = '2024001';
⚠️ 极其重要的警告:UPDATE 必须加 WHERE 条件!不加 WHERE 会修改全表数据!
4.4 DELETE:删除数据
-- 删除指定记录
DELETE FROM 学生 WHERE 学号 = '2024005';
-- 删除符合条件的记录
DELETE FROM 学生 WHERE 年龄 < 18;
⚠️ 同样极其重要的警告:DELETE 也必须加 WHERE 条件!不加 WHERE 会清空全表!
五、SQL 书写规范与最佳实践
5.1 大小写规范
- SQL 关键字用大写:
SELECT,FROM,WHERE - 表名、列名用小写:
student,name,age - 常数用单引号:
'男','计算机'
实际上大多数数据库不区分大小写,但这是良好的编码习惯。
5.2 格式化建议
-- 推荐写法:关键字独占一行,对齐
SELECT
s.学号,
s.姓名,
d.系名
FROM
学生 s
JOIN
系 d ON s.系号 = d.系号
WHERE
s.年龄 > 19
ORDER BY
s.学号 DESC
LIMIT 10;
5.3 安全建议
| 操作 | 建议 |
|---|---|
| UPDATE / DELETE | 永远先写 WHERE,再补 SET / DELETE FROM |
| 批量操作 | 先 SELECT 确认影响范围,再执行 UPDATE/DELETE |
| 生产环境 | 修改前备份,或在事务中执行 |
六、动手练习
练习 1:建表并插入数据
创建"图书"表,包含:图书号(主键)、书名、作者、出版社、价格、出版日期。
然后插入 5 本书的数据。
练习 2:综合查询
基于上面的学生表和图书表,完成以下查询:
- 查询所有年龄大于 20 的学生
- 查询所有姓"张"的学生
- 查询所有专业为"计算机"或"软件工程"的学生,按年龄降序排列
- 查询价格最高的 3 本书
- 查询哪些出版社有图书(去重)
练习 3:安全操作训练
假设你误执行了以下语句,会有什么后果?如何补救?
UPDATE 学生 SET 年龄 = 18; -- 没有 WHERE!
DELETE FROM 学生; -- 没有 WHERE!
七、常见错误与排错
| 错误信息 | 原因 | 解决 |
|---|---|---|
Duplicate entry | 主键或唯一键重复 | 检查插入值是否已存在 |
Cannot add or update a child row | 外键约束失败 | 检查外键值在父表中是否存在 |
Data too long | 字符串超出定义长度 | 使用 VARCHAR 或缩短数据 |
Column count doesn't match | INSERT 列数与值数量不匹配 | 检查列名和 VALUES 的数量 |
Table doesn't exist | 表名写错或未创建 | 检查表名拼写和数据库选择 |
Unknown column | 列名写错 | 检查列名拼写 |
八、下篇预告
下一篇,我们将学习 SQL 进阶操作——多表连接(JOIN)、子查询、聚合函数(COUNT/SUM/AVG)、分组(GROUP BY)和视图(VIEW)。这些是实际工作中最常用的技能,也是 SQL 从"会用"到"熟练"的分水岭。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)