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 语句通常分为四大类:

类别全称常用语句用途
DDLData Definition LanguageCREATE, ALTER, DROP定义/修改表结构
DMLData Manipulation LanguageSELECT, INSERT, UPDATE, DELETE操作数据
DCLData Control LanguageGRANT, REVOKE控制权限
TCLTransaction Control LanguageCOMMIT, ROLLBACK控制事务

今天先讲最实用的 DDLDML


三、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 学生;

⚠️ DROPTRUNCATE 都是高危操作,生产环境务必先备份!


四、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 matchINSERT 列数与值数量不匹配检查列名和 VALUES 的数量
Table doesn't exist表名写错或未创建检查表名拼写和数据库选择
Unknown column列名写错检查列名拼写

八、下篇预告

下一篇,我们将学习 SQL 进阶操作——多表连接(JOIN)、子查询、聚合函数(COUNT/SUM/AVG)、分组(GROUP BY)和视图(VIEW)。这些是实际工作中最常用的技能,也是 SQL 从"会用"到"熟练"的分水岭。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐