在数据驱动的今天,SQL 早已不再是程序员的专属技能。无论是后端开发、数据分析,还是产品运营,掌握 SQL 都能让你在处理数据时游刃有余。很多人初学 SQL,被各种概念——DDL、DML、DCL,还有眼花缭乱的运算符——弄得一头雾水。其实,只要理清脉络,你会发现 SQL 是一门逻辑清晰、表达力极强的语言。本文将从零开始,带你系统掌握 SQL 的核心知识,包括数据定义、数据操作,以及各类运算符的实战运用,助你快速上手数据库操作。
一、SQL 的三大类别与基本规范
SQL 语句按其功能可以分为三大类,理解这种分类有助于我们建立清晰的学习框架。
第一类是 DDL(数据定义语言),它负责定义数据库的结构,就像建造房屋时先打好地基、砌好墙。常用的 DDL 语句包括 CREATE(创建)、ALTER(修改)、DROP(删除)。这些操作针对的是数据库和表本身,而不是里面的数据。
第二类是 DML(数据操作语言),它负责处理表中的数据,好比入住后对家具的摆放、增减。主要包括 INSERT(增)、DELETE(删)、UPDATE(改)、SELECT(查)。由于查询使用频率极高,有时 SELECT 也被单独划为 DQL(数据查询语言)。
第三类是 DCL(数据控制语言),它负责权限与事务管理,如 GRANT(授权)、COMMIT(提交)、ROLLBACK(回滚),是数据库管理员常用的工具。
在实际书写 SQL 时,有一些通用的规范能让你的代码更健壮、更易读。MySQL 对大小写不敏感,但建议统一使用小写,并保持关键字大写,以提升可读性。命名表名、字段名时,尽量使用英文、数字和下划线,避免使用关键字和特殊符号。如果不小心使用了 MySQL 的保留字(如 order、group),需要用反引号(飘号)将其括起来,否则 SQL 会报错。注释是代码的重要组成部分,MySQL 支持三种注释:单行注释可以用 # 或 --(注意 -- 后面要有一个空格),多行注释则用 /* ... */。
二、DDL 实战:定义数据库与表的结构
2.1 数据库的操作
在开始操作数据之前,首先要有一个数据库。创建数据库的语句是 CREATE DATABASE,建议加上 IF NOT EXISTS 来避免重复创建时报错。例如:
CREATE DATABASE IF NOT EXISTS atguigu;查看当前服务器下有哪些数据库,可以使用 SHOW DATABASES;。想使用某个数据库,则执行 USE atguigu;。如果想查看某个数据库的详细定义信息(比如字符集、校对规则),可以用 SHOW CREATE DATABASE atguigu;。
如果数据库的字符集需要调整,可以使用 ALTER DATABASE 语句。例如将数据库字符集改为 utf8mb4(这是目前最推荐的字符集,支持 emoji):
ALTER DATABASE atguigu CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;需要注意的是,修改数据库的字符集只影响之后创建的表,之前已经存在的表不受影响。
删除数据库要格外谨慎,因为这是不可逆的操作。一般建议加上 IF EXISTS 避免删除不存在的库时报错:
DROP DATABASE IF EXISTS atguigu;2.2 数据表的操作
数据库有了,接下来就是创建表。创建表时需要指定字段名和对应的数据类型,这是最关键的步骤。一个简单的例子:
CREATE TABLE teacher ( tid INT, tname VARCHAR(5), salary DOUBLE, weight DOUBLE(5,2), birthday DATE, gender ENUM('男','女'));这里,INT 表示整型,VARCHAR(5) 表示长度不超过 5 的变长字符串,DOUBLE 是浮点数,DOUBLE(5,2) 表示总长度 5 位,小数占 2 位(如 123.45),DATE 用于存储日期,ENUM('男','女') 是枚举类型,值只能从给定的选项中选择。选择合适的数据类型不仅能节省存储空间,还能提升查询效率。
创建表后,可以通过 DESC teacher; 查看表结构,了解每个字段的类型、是否允许为空等。也可以用 SHOW CREATE TABLE teacher; 查看完整的建表语句,这有助于了解表的所有设置(如引擎、字符集、索引等)。
在实际开发中,表结构可能需要调整,这时无需删除重建,用 ALTER TABLE 即可灵活修改。添加字段时,可以指定添加到末尾、开头,或者某个字段之后:
ALTER TABLE teacher ADD address VARCHAR(200); -- 末尾添加ALTER TABLE teacher ADD age INT FIRST; -- 开头添加ALTER TABLE teacher ADD heart_rate FLOAT AFTER age; -- age字段之后添加修改字段可以改变数据类型、字段名,或者调整字段位置。例如将 heart_rate 的数据类型改为 DOUBLE,或将其重命名为 bpm 并移动到表开头:
ALTER TABLE teacher MODIFY heart_rate DOUBLE;ALTER TABLE teacher CHANGE heart_rate bpm DOUBLE FIRST;删除字段同样使用 ALTER TABLE:
ALTER TABLE teacher DROP address;如果需要修改表名,可以用 ALTER TABLE teacher RENAME teacher_info; 或者 RENAME TABLE teacher_info TO teacher;,两种写法均可。
三、DML 实战:增删改查数据的艺术
有了表结构,接下来就是操作数据了。DML 是我们日常使用最频繁的部分。

3.1 插入数据
插入数据用 INSERT INTO 语句。最直接的方式是省略字段列表,但值的顺序、类型、个数必须与表结构完全一致:
INSERT INTO teacher VALUES(1, '张三', '男', '1990-01-01', 10000, '12345678901');更推荐的方式是明确指定字段列表,这样即使表结构将来发生变化(比如新增了默认值字段),当前语句依然能正常工作,可读性也更好:
INSERT INTO teacher(id, name, gender) VALUES(2, '李四', '男');当需要插入多条数据时,可以用逗号分隔多组值,一次插入多条记录,效率远高于循环单条插入:
INSERT INTO teacher VALUES(3, '王五', '男', '1990-01-01', 10000, '12345678901'),(4, '赵六', '男', '1990-01-01', 10000, '12345678901');3.2 删除数据
删除数据有两种方式:DELETE 和 TRUNCATE,它们的底层机制截然不同。
DELETE 用于删除指定条件的行,如果不加 WHERE 条件,则会删除表中所有数据,但表结构依然保留。例如:
DELETE FROM teacher WHERE name = '郑十'; -- 删除特定行DELETE FROM teacher; -- 删除所有行DELETE 是一条一条删除记录的,它支持事务,在事务提交之前可以回滚。而且它不会重置自增主键的计数。
TRUNCATE 则是一种更彻底的清空方式:它会先删除整个表,再重新创建一个结构完全相同的空表,因此效率极高。但它不支持事务回滚,并且会重置自增主键。如果你确定要清空整张表且不需要回滚,TRUNCATE 是首选:
TRUNCATE teacher;3.3 更新数据
更新数据使用 UPDATE 语句,同样需要配合 WHERE 条件,否则会修改整张表。例如,将姓名为“周八”的员工的性别、薪资等信息更新:
UPDATE teacher SET gender = '男', salary = 100000 WHERE name = '周八';如果要对所有员工涨薪,可以省略 WHERE:
UPDATE teacher SET salary = salary + 10000;切记:在执行 UPDATE 或 DELETE 之前,最好先用相同的 WHERE 条件执行一次 SELECT,确认影响的数据范围,避免误操作。
3.4 查询数据
SELECT 是 SQL 中最强大的部分,基本语法是:
SELECT 字段列表 FROM 表名 WHERE 条件;其中 WHERE 条件是可选的。我们还可以为字段或表达式取别名,使结果更易读:
SELECT id AS 编号, name "姓名" FROM teacher;别名中的 AS 可以省略,如果别名包含空格,需要用双引号括起来(表的别名不能有空格且不能用引号)。
当查询结果中有重复行时,可以使用 DISTINCT 去重:
SELECT DISTINCT gender FROM teacher;四、运算符:让查询条件精准可控
在 WHERE 子句中,我们需要用各种运算符来构造条件。MySQL 提供了丰富的运算符,理解它们的使用细节,才能写出正确高效的查询。
4.1 算术运算符
算术运算符包括 +(加)、-(减)、*(乘)、/(除)、DIV(整除)、% 或 MOD(取余)。需要注意的是,MySQL 中的 + 号只做加法运算,没有字符串拼接的功能。例如 SELECT "hello" + "world"; 的结果是 0,因为字符串被自动转换为数字(0)后再相加。如果需要拼接字符串,必须使用 CONCAT() 函数。
另一个重要特性是 NULL 值污染:任何算术运算中,只要有一个操作数是 NULL,结果就是 NULL。例如 SELECT 2 + NULL; 的结果是 NULL。这在计算时往往不是我们想要的,需要借助 IFNULL 函数来处理(后面会讲到)。
4.2 比较运算符
比较运算符用于判断大小或是否相等,常见的有 >、<、>=、<=、=、!= 或 <>。需要注意的是,= 和 != 不能用于判断 NULL,因为 NULL 代表“未知”,任何与 NULL 的比较结果都是 NULL,而不是 TRUE 或 FALSE。例如 SELECT NULL = NULL; 的结果是 NULL,而不是 1。判断 NULL 必须使用专用的 IS NULL 或 IS NOT NULL。
4.3 区间与集合范围比较
当需要判断一个值是否在某个区间内时,可以用 BETWEEN ... AND ...,它包含边界值,等价于 >= 和 <= 的组合。例如 salary BETWEEN 10000 AND 15000 等价于 salary >= 10000 AND salary <= 15000。反之,NOT BETWEEN 则表示不在区间内。
当需要判断一个值是否属于某个集合时,可以用 IN (...),例如 address IN ('北苑', '望京', '龙泽'),等价于 address = '北苑' OR address = '望京' OR address = '龙泽'。同样,NOT IN 表示不在集合中。
4.4 模糊匹配运算符
当查询条件不精确时,比如“名字里包含‘冰’字”,就需要用到 LIKE 运算符,配合两个通配符:% 代表任意个(包括 0 个)任意字符,_ 代表恰好一个任意字符。
例如 ename LIKE '%冰%' 会匹配所有名字中包含“冰”的记录;ename LIKE '李%' 匹配以“李”开头的名字;ename LIKE '_红%' 匹配第二个字是“红”的名字(如“陈红”“李红”)。
4.5 逻辑运算符
逻辑运算符用于组合多个条件,包括 AND(与)、OR(或)、NOT(非)、XOR(异或)。AND 的优先级高于 OR,因此复杂条件建议用括号明确优先级。例如,查询薪资高于 15000 且性别为男的员工:WHERE salary > 15000 AND gender = '男'。查询薪资高于 15000 或者部门 ID 为 1 的员工:WHERE salary > 15000 OR did = 1。XOR 表示异或,即两个条件有且仅有一个成立时结果为真。
4.6 处理 NULL 值的专用运算符
前面提到,= 无法判断 NULL,因此 MySQL 提供了 IS NULL 和 IS NOT NULL。例如,查询奖金比例为 NULL 的员工:WHERE commission_pct IS NULL。另外还有一个安全等于运算符 <=>,它可以用来比较 NULL,NULL <=> NULL 的结果是 1,但通常 IS NULL 更直观。
在实际计算中,为了规避 NULL 带来的结果也为 NULL 的问题,经常使用 IFNULL 函数。例如计算实发工资:salary + salary * IFNULL(commission_pct, 0),这样当 commission_pct 为 NULL 时,就按 0 计算,避免整个表达式变成 NULL。
4.7 位运算符
位运算符用于对整数的二进制位进行操作,包括 <<(左移)、>>(右移)、&(按位与)、|(按位或)、^(按位异或)、~(按位取反)。它们常用于权限控制、状态标志等场景。例如 3 << 1 表示将二进制 011 左移一位得到 110,即 6。
五、综合示例:将所学串联起来
为了巩固理解,我们来看一个综合示例。假设我们有一个员工表 t_employee,包含字段 ename、salary、gender、did(部门ID)、commission_pct(奖金比例)等。我们可以写出以下查询:
-- 查询薪资在 10000 到 15000 之间,并且名字以“李”开头的员工SELECT ename, salaryFROM t_employeeWHERE salary BETWEEN 10000 AND 15000 AND ename LIKE '李%';-- 查询薪资高于 15000,或者部门为 1,但两者不能同时满足(异或)SELECT ename, salary, didFROM t_employeeWHERE (salary > 15000) XOR (did = 1);-- 计算每个员工的实发工资,如果奖金比例为 NULL,则按 0 计算SELECT ename, salary, commission_pct, salary + salary * IFNULL(commission_pct, 0) AS actual_salaryFROM t_employee;总结
SQL 的学习是一场从“会写”到“会想”的进阶。回顾本文,我们从三个层次构建了知识体系:
第一层是 分类与规范,明确了 DDL、DML、DCL 的职责边界,并养成了良好的书写习惯(如命名规范、注释、反引号的使用)。
第二层是 DDL 与 DML 的实战,掌握了数据库与表的创建、修改、删除,以及数据的增删改查。特别要注意 TRUNCATE 与 DELETE 的区别,以及 UPDATE 和 DELETE 时必须谨慎使用 WHERE 条件。
第三层是 运算符的深入应用,算术运算中要警惕 NULL 污染,比较运算中判断 NULL 必须用 IS NULL,模糊查询用好 % 和 _,逻辑运算时用括号明确优先级,以及用 IFNULL 优雅地处理空值。
SQL 的魅力在于,它用简洁的语法表达出复杂的数据逻辑。掌握了这些基础,你就拥有了与数据库对话的能力。后续还可以继续学习分组、排序、子查询、连接查询、索引优化等进阶内容,逐步成为一名数据库操作的高手。希望这篇文章能成为你 SQL 学习路上的坚实一步。