SQL 基础核心知识点梳理
2026-03-30
运维
00

目录

SQL 基础核心知识点梳理
一、数据库常用数据类型
(一)数值型:存储数字数据
(二)字符串型:存储文本数据
(三)日期时间型:存储时间相关数据
(四)特殊类型:满足个性化存储需求
二、SQL 核心语句:单表 CRUD 全解析
先定义示例表结构
(一)新增(Create):INSERT 语句
1. 基础语法
2. 实操示例
3. 注意事项
(二)查询(Read):SELECT 语句
1. 完整语法结构
2. 基础查询示例
3. 关键注意点
(三)更新(Update):UPDATE 语句
1. 基础语法
2. 实操示例
3. 安全操作建议
(四)删除(Delete):DELETE 语句
1. 基础语法
2. 实操示例
3. 补充说明
(五)多表连接查询:关联不同表的数据
三、SQL 常用核心命令
(一)数据库与表的基础操作
1. 数据库操作
2. 表操作
(二)索引操作:提升查询速度
四、SQL 基础语法规范与避坑指南
(一)通用语法规范
(二)常见避坑点
五、SQL 入门实操建议
总结

SQL 基础核心知识点梳理

SQL(Structured Query Language,结构化查询语言)是操作关系型数据库的标准语言,无论是数据查询、插入、更新,还是数据库表结构的创建与修改,都离不开 SQL。SQL Server、MySQL、Oracle 等主流关系型数据库管理系统均兼容 SQL 核心语法,仅在细节上略有差异。本文将从数据类型、核心查询语法、常用操作命令、语法规范等维度,系统梳理 SQL 基础知识点,帮新手搭建完整的 SQL 知识框架,快速实现从入门到上手。

一、数据库常用数据类型

数据类型是数据库表设计的基础,决定了列能存储的数据种类、范围和存储效率。不同数据库(如 SQL Server、MySQL)的数据类型命名略有差异,但核心分类一致,主要分为数值型字符串型日期时间型特殊类型四大类。

(一)数值型:存储数字数据

数值型是最常用的数据类型之一,按是否包含小数可分为整数型浮点型,需根据数值范围选择对应类型,避免存储空间浪费或数据溢出。

类型分类具体类型(SQL Server/MySQL)取值范围适用场景
整数型INT/INT-2^31 ~ 2^31-1(约 ±21 亿)存储年龄、数量、编号等常规整数
整数型BIGINT/BIGINT-2^63 ~ 2^63-1(约 ±9e18)存储超大整数,如订单号、用户 ID(避免 INT 溢出)
整数型SMALLINT/SMALLINT-2^15 ~ 2^15-1(约 ±3 万)存储范围较小的整数,如性别(1/0)、状态码
整数型TINYINT/TINYINT0 ~ 255(SQL Server);-128~127(MySQL)存储极小整数,如评分(1-5)、开关状态(0/1)
浮点型DECIMAL(M,N)/DECIMAL(M,N)定点数,M 为总位数,N 为小数位数(如 DECIMAL (10,2) 表示最多 10 位,其中 2 位小数)存储金额、精度要求高的数值(如单价、工资)
浮点型FLOAT/FLOAT单精度浮点数,精度约 7 位存储精度要求不高的小数,如身高、体重
浮点型DOUBLE/DOUBLE双精度浮点数,精度约 15 位存储精度要求较高的小数,如科学计算数据

注意:浮点型(FLOAT/DOUBLE)存在精度丢失问题,金融、财务类数据必须使用 DECIMAL,避免计算误差。

(二)字符串型:存储文本数据

字符串型用于存储字符、文本类数据,核心区别在于 “固定长度” 和 “可变长度”,需根据内容长度特性选择,平衡存储效率和查询性能。

类型特点适用场景注意事项
CHAR(n)固定长度,n 为字符数(1~8000),不足补空格长度固定的文本,如手机号(11 位)、身份证号(18 位)、邮编(6 位)查询速度快,但易浪费存储空间
VARCHAR(n)可变长度,n 为最大字符数(1~8000),仅占用实际字符空间长度不固定的文本,如姓名、地址、商品名称节省存储空间,查询速度略低于 CHAR
TEXT/TINYTEXT/MEDIUMTEXT/LONGTEXT可变长度,无字符数上限(不同类型容量不同)存储大段文本,如文章内容、备注、日志不能直接用于索引,查询效率较低
NCHAR/NVARCHAR统一字符编码(Unicode),支持多语言(如中文、英文、日文)存储包含多语言的文本,如用户名、产品描述占用空间是 CHAR/VARCHAR 的 2 倍,需按需使用

(三)日期时间型:存储时间相关数据

日期时间型用于记录时间信息,不同数据库的类型命名差异较大,但核心功能一致,需注意格式和取值范围。

类型(SQL Server)类型(MySQL)格式适用场景
DATEDATEYYYY-MM-DD仅存储日期,如生日、下单日期
TIMETIMEHH:MM
仅存储时间,如打卡时间、会议时长
DATETIMEDATETIMEYYYY-MM-DD HH:MM
存储日期 + 时间,如订单创建时间、登录时间
SMALLDATETIME-YYYY-MM-DD HH:MM
(范围更小)
存储精度要求不高的日期时间
DATETIME2DATETIME2YYYY-MM-DD HH:MM
.fffffff
高精度日期时间,支持 7 位小数
TIMESTAMPTIMESTAMPYYYY-MM-DD HH:MM
自动记录数据修改时间,时区敏感

常用示例

展开代码
-- 创建表时指定日期时间类型 CREATE TABLE OrderInfo ( OrderID INT PRIMARY KEY, OrderDate DATE, -- 下单日期 CreateTime DATETIME -- 订单创建完整时间 );

(四)特殊类型:满足个性化存储需求

除上述基础类型外,数据库还提供特殊类型适配特定场景:

  1. BOOLEAN/BIT:存储布尔值(TRUE/FALSE 或 1/0),如是否启用(1 = 启用,0 = 禁用);
  2. BLOB:存储二进制数据,如图片、音频、视频等文件;
  3. ENUM(MySQL):枚举类型,限定列值只能是预定义的枚举值,如性别(' 男 ',' 女 ')、订单状态(' 待付款 ',' 已付款 ',' 已发货 ');
  4. JSON(MySQL/Oracle):存储 JSON 格式数据,适合存储非结构化或半结构化数据,如用户偏好设置。

二、SQL 核心语句:单表 CRUD 全解析

CRUD 是数据库操作的核心,分别对应查询(Read)、新增(Create)、更新(Update)、删除(Delete),所有操作均围绕单表或多表展开,本节先聚焦单表 CRUD,详细讲解语法规则和实操示例(以下示例均基于Student学生表,表结构如下):

先定义示例表结构

为统一示例场景,先创建Student学生表,后续 CRUD 操作均基于此表:

展开代码
CREATE TABLE Student ( Sno INT PRIMARY KEY AUTO_INCREMENT, -- 学号,主键自增 Sname VARCHAR(20) NOT NULL, -- 姓名,非空 Sex CHAR(1) DEFAULT '男', -- 性别,默认男 Age TINYINT, -- 年龄 ClassName VARCHAR(30), -- 班级名称 Phone VARCHAR(11), -- 手机号 CreateTime DATETIME DEFAULT CURRENT_TIMESTAMP -- 创建时间,默认当前时间 );

(一)新增(Create):INSERT 语句

用于向表中插入一条或多条数据,核心是保证列值与数据类型匹配,且满足约束(如非空、主键唯一)。

1. 基础语法

展开代码
-- 方式1:指定列插入(推荐,可读性高,适配表结构变更) INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...); -- 方式2:不指定列(需按表的列顺序填写所有值,不推荐) INSERT INTO 表名 VALUES (值1, 值2, ...); -- 方式3:批量插入(高效,减少IO次数) INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...), ...;

2. 实操示例

展开代码
-- 示例1:指定列插入单条数据(仅填必填/核心列) INSERT INTO Student (Sname, Sex, Age, ClassName) VALUES ('张三', '男', 18, '高一(1)班'); -- 示例2:利用默认值插入(性别用默认值“男”,创建时间用默认当前时间) INSERT INTO Student (Sname, Age, ClassName) VALUES ('李四', 19, '高一(2)班'); -- 示例3:批量插入3条数据 INSERT INTO Student (Sname, Sex, Age, ClassName, Phone) VALUES ('王五', '女', 18, '高一(1)班', '13800138000'), ('赵六', '男', 17, '高一(2)班', '13900139000'), ('钱七', '女', 18, '高一(1)班', '13700137000');

3. 注意事项

  • 非空列(如Sname)必须赋值,否则报错;
  • 主键列若为自增(AUTO_INCREMENT),插入时可省略,数据库自动生成;
  • 日期时间列可手动赋值(格式YYYY-MM-DD HH:MM:SS),或用CURRENT_TIMESTAMP取当前时间。

(二)查询(Read):SELECT 语句

数据查询是 SQL 最核心的功能,用于从表中提取符合条件的数据,灵活度最高,完整语法如下:

1. 完整语法结构

展开代码
SELECT [DISTINCT] <目标列名序列> -- DISTINCT去重,*代表所有列 FROM <表名> [AS 别名] -- 指定数据来源,AS可省略 [WHERE <行选择条件>] -- 筛选符合条件的行 [GROUP BY <分组依据列>] -- 对查询结果分组 [HAVING <组筛选条件>] -- 对分组后的结果筛选(支持聚合函数) [ORDER BY <排序依据列> [ASC/DESC]] -- 对结果集排序,ASC升序(默认),DESC降序 [LIMIT <行数>] -- MySQL:限制返回行数;SQL Server用TOP N

2. 基础查询示例

展开代码
-- 示例1:查询所有列的所有数据(测试/小表用,大表禁止用*) SELECT * FROM Student; -- 示例2:查询指定列(姓名、年龄、班级) SELECT Sname, Age, ClassName FROM Student; -- 示例3:列起别名(提升可读性) SELECT Sname AS 姓名, Age AS 年龄, ClassName AS 班级 FROM Student; -- 示例4:去重查询(查询所有班级名称,不重复) SELECT DISTINCT ClassName FROM Student; -- 示例5:条件筛选(查询高一(1)班的女生) SELECT Sname, Age FROM Student WHERE ClassName = '高一(1)班' AND Sex = '女'; -- 示例6:范围筛选(查询年龄18~19岁的学生) SELECT Sname, Age FROM Student WHERE Age BETWEEN 18 AND 19; -- 示例7:模糊查询(查询姓“张”的学生) SELECT Sname, ClassName FROM Student WHERE Sname LIKE '张%'; -- 示例8:排序(按年龄降序,年龄相同按姓名升序) SELECT Sname, Age FROM Student ORDER BY Age DESC, Sname ASC; -- 示例9:限制返回行数(MySQL:只返回前2条数据) SELECT * FROM Student LIMIT 2; -- 示例10:分组统计(统计每个班级的学生人数) SELECT ClassName AS 班级, COUNT(*) AS 人数 FROM Student GROUP BY ClassName; -- 示例11:分组筛选(统计人数大于2的班级) SELECT ClassName AS 班级, COUNT(*) AS 人数 FROM Student GROUP BY ClassName HAVING COUNT(*) > 2;

3. 关键注意点

  • WHERE筛选,在分组前执行;HAVING筛选分组结果,在分组后执行,且支持聚合函数;
  • NULL值判断必须用IS NULL/IS NOT NULL,不能用=/!=
  • 模糊查询中%开头会导致索引失效,尽量避免(如%张三)。

(三)更新(Update):UPDATE 语句

用于修改表中已存在的数据,核心是必须加 WHERE 条件,否则会更新全表数据!

1. 基础语法

展开代码
UPDATE 表名 SET 列1=值1, 列2=值2, ... -- 多个列用逗号分隔 [WHERE 条件]; -- 筛选要更新的行,必加!

2. 实操示例

展开代码
-- 示例1:更新单条数据(将学号1的学生年龄改为20) UPDATE Student SET Age = 20 WHERE Sno = 1; -- 示例2:更新多条数据(将高一(1)班所有学生的年龄加1) UPDATE Student SET Age = Age + 1 WHERE ClassName = '高一(1)班'; -- 示例3:更新多列数据(修改学号2的学生姓名和手机号) UPDATE Student SET Sname = '李小四', Phone = '13600136000' WHERE Sno = 2; -- 示例4:结合默认值/函数更新(将未填手机号的学生手机号设为默认值) UPDATE Student SET Phone = '未填写' WHERE Phone IS NULL;

3. 安全操作建议

  • 执行 UPDATE 前,先执行 SELECT 验证条件是否正确(如SELECT * FROM Student WHERE ClassName = '高一(1)班');
  • 生产环境更新数据时,建议开启事务(BEGIN → 执行 UPDATE → 验证数据 → COMMIT/ROLLBACK),避免误操作。

(四)删除(Delete):DELETE 语句

用于删除表中已存在的数据,同样必须加 WHERE 条件,否则会清空全表!

1. 基础语法

展开代码
DELETE FROM 表名 [WHERE 条件]; -- 筛选要删除的行,必加!

2. 实操示例

展开代码
-- 示例1:删除单条数据(删除学号3的学生) DELETE FROM Student WHERE Sno = 3; -- 示例2:删除多条数据(删除高一(2)班年龄小于18的学生) DELETE FROM Student WHERE ClassName = '高一(2)班' AND Age < 18; -- 示例3:删除空值数据(删除未填写手机号的学生) DELETE FROM Student WHERE Phone IS NULL;

3. 补充说明

  • DELETE仅删除数据,保留表结构;若需清空全表且重置自增主键,用TRUNCATE TABLE 表名(效率更高,但不可恢复);
  • 执行 DELETE 前,务必用 SELECT 验证条件,避免误删;
  • 生产环境删除数据建议用 “逻辑删除”(如新增IsDelete列,值为 1 表示删除,0 表示正常),而非物理删除。

(五)多表连接查询:关联不同表的数据

实际业务中,数据通常分散在多个表中,需通过 “连接” 整合,核心连接类型:

连接类型含义示例
INNER JOIN(内连接)仅返回两表匹配的记录Student JOIN SC ON Student.Sno = SC.Sno
LEFT JOIN(左连接)返回左表所有记录 + 右表匹配记录(无匹配则右表列值为 NULL)Student LEFT JOIN SC ON Student.Sno = SC.Sno
RIGHT JOIN(右连接)返回右表所有记录 + 左表匹配记录Student RIGHT JOIN SC ON Student.Sno = SC.Sno
FULL JOIN(全连接)返回两表所有记录(无匹配则对应列值为 NULL)Student FULL JOIN SC ON Student.Sno = SC.Sno
展开代码
-- 先创建选课表SC,用于多表连接示例 CREATE TABLE SC ( Sno INT, -- 学号 Cno INT, -- 课程号 Grade TINYINT, -- 成绩 PRIMARY KEY (Sno, Cno), -- 复合主键 FOREIGN KEY (Sno) REFERENCES Student(Sno) -- 外键关联学生表 ); -- 内连接查询学生姓名及对应的选课成绩 SELECT Student.Sname, SC.Cno, SC.Grade FROM Student INNER JOIN SC ON Student.Sno = SC.Sno; -- 左连接查询所有学生(包括未选课的)及选课成绩 SELECT Student.Sname, SC.Cno, SC.Grade FROM Student LEFT JOIN SC ON Student.Sno = SC.Sno;

三、SQL 常用核心命令

(一)数据库与表的基础操作

1. 数据库操作

展开代码
-- 创建数据库(指定字符集,避免中文乱码) CREATE DATABASE SchoolDB CHARACTER SET utf8mb4; -- 选择要操作的数据库 USE SchoolDB; -- 删除数据库(谨慎执行!) DROP DATABASE SchoolDB;

2. 表操作

展开代码
-- 修改表:添加列 ALTER TABLE Student ADD Email VARCHAR(50); -- 修改表:修改列类型 ALTER TABLE Student MODIFY COLUMN Email VARCHAR(100); -- 修改表:删除列 ALTER TABLE Student DROP COLUMN Email; -- 删除表(谨慎执行!) DROP TABLE Student;

(二)索引操作:提升查询速度

索引是数据库优化的核心手段,为频繁查询的列创建索引,可大幅提升查询效率。

展开代码
-- 为学生表的姓名列创建索引 CREATE INDEX idx_student_name ON Student(Sname); -- 删除索引 DROP INDEX idx_student_name ON Student;

索引使用原则

  1. 适合创建:频繁查询的列、主键列、外键列;
  2. 避免创建:频繁更新的列、数据量小的表、重复值多的列(如性别)。

四、SQL 基础语法规范与避坑指南

(一)通用语法规范

  1. 大小写:SQL 关键字(SELECT、FROM、WHERE)不区分大小写,建议大写(提升可读性);表名、列名的大小写取决于数据库(MySQL 默认不区分,SQL Server 区分);
  2. 分号:作为语句结束符,建议每条语句末尾添加(支持批量执行);
  3. 注释:单行注释用--,多行注释用/* ... */
  4. 别名:用AS为列 / 表起别名,AS 可省略,如SELECT Sname 姓名 FROM Student

(二)常见避坑点

  1. NULL 值处理:聚合函数(除 COUNT (*))会忽略 NULL 值,如AVG(Grade)仅计算非空成绩的平均值;
  2. GROUP BY 陷阱:SELECT 中的列必须是 GROUP BY 的分组列或聚合函数,否则会报错;
  3. LIKE 性能:模糊查询以%开头(如%张三)会导致索引失效,尽量避免;
  4. 数据类型匹配:查询时需保证条件值与列类型一致,如WHERE Sno = '1'(字符型)和WHERE Sno = 1(数值型)的区别。

五、SQL 入门实操建议

  1. 环境搭建:新手推荐使用 MySQL + Navicat(可视化工具),或在线 SQL 练习平台(如 SQLZoo、LeetCode 数据库题库);
  2. 练习思路:从单表 CRUD→多表连接→分组统计→复杂条件筛选,循序渐进;
  3. 核心原则:先明确需求,再拆解步骤(如 “统计每个班级的女生人数”→ 先筛选女生→按班级分组→统计人数);
  4. 调试技巧:复杂查询可分步执行(先查基础数据,再添加筛选 / 分组),用注释临时屏蔽部分子句。

总结

  1. 单表 CRUD 是 SQL 的基础核心:INSERT(新增) 需匹配列类型和约束,SELECT(查询) 需灵活运用 WHERE/HAVING/ORDER BY/GROUP BY,UPDATE/DELETE(更新 / 删除) 必须加 WHERE 条件避免误操作;
  2. 选择数据类型时需兼顾 “业务需求” 和 “存储效率”,如金额用 DECIMAL、长文本用 TEXT、固定长度文本用 CHAR;
  3. 编写 SQL 时需遵守语法规范,规避 NULL 值判断、索引失效、分组筛选等常见坑点,多实操是掌握 SQL 的关键。

掌握以上基础知识点后,可进一步学习子查询、存储过程、事务、视图等进阶内容,逐步实现从 “会用” 到 “用好” SQL 的进阶。

本文作者:zzz

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!