目录1. 什么是 SQL2. 环境准备新手推荐二、SQL 入门核心语法CRUD1. 数据库与表操作DDL2. 数据操作DML增删改3. 数据查询DQL最核心的 SELECT1基础查询2条件查询WHERE3排序ORDER BY4聚合函数5分组查询GROUP BY6分页查询三、SQL 进阶多表操作与高级语法1. 多表连接JOIN核心连接类型2. 子查询3. 常用高级语法1CASE WHEN条件分支2事务TRANSACTION3索引INDEX四、SQL 优化进阶必备五、实战练习总结SQL语句是操作数据库的核心无论是Mysql、PostgreSQL、SQL Server、Oracle都需要通过SQL语句进行操作。因此只要掌握了SQL语句今后不论遇到什么类型的关系型数据库都能利用SQL语句进行增删改查。1. 什么是 SQL在学习SQL语句之前我们先来了解一下什么是SQL语句。SQLStructured Query Language是结构化查询语言用于管理和操作关系型数据库如 MySQL、PostgreSQL、SQL Server、Oracle核心能力包括数据查询最常用数据新增 / 修改 / 删除数据库 / 表结构管理权限控制等简单来说SQL是一种用于操作关系型数据库的语言。如同java和C编写程序一样SQL不同的点在于操作数据库。如果读者有高级编程语言的基础的话对于SQL语句的学习会更加得心应手。2. 环境准备新手推荐本地安装 MySQL Navicat/DBeaver可视化工具在线使用 SQL Fiddle、DB Fiddle 等在线数据库平台无需安装即可练习下面是一些常见的SQL语句能够帮助你从0到1掌握SQL语句。SQL语句不区分大小写即对大小写不敏感因此以下大写字母均可以改为小写二、SQL 入门核心语法CRUD1. 数据库与表操作DDL先掌握如何创建 / 查看 / 删除数据库和表这是操作数据的基础。-- 1. 数据库操作 CREATE DATABASE IF NOT EXISTS test_db; -- 创建数据库避免重复 USE test_db; -- 切换到目标数据库 DROP DATABASE IF EXISTS test_db; -- 删除数据库 -- 2. 表操作以学生表为例 CREATE TABLE IF NOT EXISTS student ( id INT PRIMARY KEY AUTO_INCREMENT, -- 主键自增 name VARCHAR(50) NOT NULL, -- 姓名非空 age INT, -- 年龄 gender VARCHAR(10), -- 性别 score DECIMAL(5,2), -- 分数5位数字2位小数 create_time DATETIME DEFAULT CURRENT_TIMESTAMP -- 创建时间默认当前时间 ); -- 查看表结构 DESC student; -- 修改表添加字段 ALTER TABLE student ADD COLUMN class VARCHAR(20); -- 删除表 DROP TABLE IF EXISTS student;2. 数据操作DML增删改-- 1. 新增数据INSERT -- 方式1指定字段 INSERT INTO student (name, age, gender, score, class) VALUES (张三, 18, 男, 90.5, 高一(1)班); -- 方式2批量新增 INSERT INTO student (name, age, gender, score, class) VALUES (李四, 17, 女, 88.0, 高一(1)班), (王五, 18, 男, 95.5, 高一(2)班); -- 2. 修改数据UPDATE必须加WHERE否则修改全表 UPDATE student SET score 92.0, class 高一(1)班 WHERE id 2; -- 3. 删除数据DELETE必须加WHERE否则删除全表 DELETE FROM student WHERE id 3; -- 清空表自增主键重置 TRUNCATE TABLE student;3. 数据查询DQL最核心的 SELECT查询是 SQL 最常用的功能从简单到复杂逐步掌握1基础查询-- 查询所有字段*生产环境尽量避免指定字段更高效 SELECT * FROM student; -- 查询指定字段 SELECT name, age, score FROM student; -- 去重查询DISTINCT SELECT DISTINCT class FROM student; -- 别名AS简化字段/表名 SELECT name AS 姓名, age AS 年龄, score AS 分数 FROM student AS s;2条件查询WHERE-- 基本条件、、、、、!/ SELECT * FROM student WHERE score 90; -- 多条件AND且、OR或、NOT非 SELECT * FROM student WHERE age 17 AND gender 女; -- 范围查询BETWEEN...AND... SELECT * FROM student WHERE score BETWEEN 85 AND 95; -- 模糊查询LIKE%任意字符_单个字符 SELECT * FROM student WHERE name LIKE 张%; -- 姓张的所有名字 SELECT * FROM student WHERE name LIKE 张_; -- 姓张且名字2个字 -- 空值判断IS NULL / IS NOT NULL SELECT * FROM student WHERE age IS NOT NULL; -- 枚举查询IN SELECT * FROM student WHERE class IN (高一(1)班, 高一(2)班);3排序ORDER BY-- 升序ASC默认、降序DESC SELECT * FROM student ORDER BY score DESC, age ASC;4聚合函数用于统计数据常用COUNT计数、SUM求和、AVG平均、MAX最大、MIN最小-- 统计总人数 SELECT COUNT(*) AS 总人数 FROM student; -- 统计男生人数COUNT指定字段避免NULL SELECT COUNT(id) AS 男生人数 FROM student WHERE gender 男; -- 平均分、总分、最高分 SELECT AVG(score) AS 平均分, SUM(score) AS 总分, MAX(score) AS 最高分 FROM student;5分组查询GROUP BY结合聚合函数按指定字段分组统计-- 按班级分组统计每个班的人数、平均分 SELECT class AS 班级, COUNT(*) AS 人数, AVG(score) AS 平均分 FROM student GROUP BY class; -- 分组后筛选HAVING区别于WHEREWHERE筛选行HAVING筛选分组 SELECT class AS 班级, COUNT(*) AS 人数 FROM student GROUP BY class HAVING COUNT(*) 5; -- 筛选人数大于5的班级6分页查询不同数据库语法略有差异新手重点掌握 MySQL-- MySQLLIMIT 起始位置从0开始, 条数 SELECT * FROM student LIMIT 0, 10; -- 第1页每页10条 SELECT * FROM student LIMIT 10, 10; -- 第2页每页10条 -- SQL ServerTOP / OFFSET...FETCH SELECT TOP 10 * FROM student; -- OracleROWNUM SELECT * FROM (SELECT *, ROWNUM rn FROM student) WHERE rn BETWEEN 1 AND 10;三、SQL 进阶多表操作与高级语法1. 多表连接JOIN当数据分布在多张表时如学生表 成绩表 课程表需要连接查询先创建关联表示例-- 课程表 CREATE TABLE course ( cid INT PRIMARY KEY AUTO_INCREMENT, cname VARCHAR(50) NOT NULL -- 课程名 ); -- 成绩表关联学生和课程 CREATE TABLE score ( sid INT, -- 关联student.id cid INT, -- 关联course.cid score DECIMAL(5,2), PRIMARY KEY (sid, cid), -- 复合主键 FOREIGN KEY (sid) REFERENCES student(id), -- 外键约束 FOREIGN KEY (cid) REFERENCES course(cid) );核心连接类型-- 内连接INNER JOIN只返回两表匹配的数据 SELECT s.name AS 学生姓名, c.cname AS 课程名, sc.score AS 分数 FROM student s INNER JOIN score sc ON s.id sc.sid INNER JOIN course c ON sc.cid c.cid; -- 左连接LEFT JOIN返回左表所有数据右表无匹配则为NULL SELECT s.name AS 学生姓名, c.cname AS 课程名, sc.score AS 分数 FROM student s LEFT JOIN score sc ON s.id sc.sid LEFT JOIN course c ON sc.cid c.cid; -- 右连接RIGHT JOIN返回右表所有数据左表无匹配则为NULL -- 全连接FULL JOIN返回两表所有数据MySQL不支持需用UNION模拟2. 子查询将一个查询结果作为另一个查询的条件 / 数据源分为标量子查询返回单个值列子查询返回一列行子查询返回一行表子查询返回多行多列-- 标量子查询查询分数高于平均分的学生 SELECT name, score FROM student WHERE score (SELECT AVG(score) FROM student); -- 列子查询查询高一(1)班的所有学生成绩 SELECT * FROM score WHERE sid IN (SELECT id FROM student WHERE class 高一(1)班); -- 表子查询将子查询结果作为临时表 SELECT t.name, t.平均分 FROM ( SELECT class, AVG(score) AS 平均分 FROM student GROUP BY class ) t WHERE t.平均分 90;3. 常用高级语法1CASE WHEN条件分支-- 给分数分级 SELECT name, score, CASE WHEN score 90 THEN 优秀 WHEN score 80 THEN 良好 WHEN score 60 THEN 及格 ELSE 不及格 END AS 等级 FROM student;2事务TRANSACTION保证多步操作要么全成功要么全失败如转账START TRANSACTION; -- 开启事务 UPDATE account SET balance balance - 100 WHERE id 1; UPDATE account SET balance balance 100 WHERE id 2; COMMIT; -- 提交事务生效 -- ROLLBACK; -- 回滚出错时撤销操作3索引INDEX提升查询效率新手重点掌握创建语法-- 创建索引针对查询频繁的字段 CREATE INDEX idx_student_name ON student(name); -- 查看索引 SHOW INDEX FROM student; -- 删除索引 DROP INDEX idx_student_name ON student;四、SQL 优化进阶必备** 避免 SELECT ***只查询需要的字段减少 IO 和内存消耗索引优化主键 / 外键自动建索引查询频繁的字段如 WHERE、JOIN、ORDER BY建索引避免在索引字段上做函数 / 运算如WHERE YEAR(create_time) 2024会失效索引减少全表扫描WHERE 条件尽量命中索引避免OR、%开头的LIKE分页优化大数据量分页用LIMIT 偏移量, 条数时偏移量越大越慢可改为WHERE id 上一页最大id LIMIT 10避免大事务事务越长锁占用时间越久容易引发并发问题。五、实战练习SQL语句的精通需要进行大量的练习以下是一些学习的建议和推荐练习的平台。推荐新手通过以下方式巩固练习经典 SQL 题LeetCode 数据库题库简单 / 中等难度、牛客网 SQL 专项模拟业务场景如 “统计每个班级的男女比例”、“查询不及格的学生及对应课程”。总结核心基础SQL 的核心是 CRUD其中SELECT查询是重点必须掌握条件、排序、聚合、分组、分页等基础语法进阶核心多表连接JOIN是处理关联数据的关键子查询和 CASE WHEN 能解决复杂业务逻辑实战关键写 SQL 时要注意效率索引、避免全表扫描生产环境中UPDATE/DELETE必须加 WHERE 条件避免误操作。