目录
1. 什么是 SQL
2. 环境准备(新手推荐)
二、SQL 入门:核心语法(CRUD)
1. 数据库与表操作(DDL)
2. 数据操作(DML):增删改
3. 数据查询(DQL):最核心的 SELECT
(1)基础查询
(2)条件查询(WHERE)
(3)排序(ORDER BY)
(4)聚合函数
(5)分组查询(GROUP BY)
(6)分页查询
三、SQL 进阶:多表操作与高级语法
1. 多表连接(JOIN)
核心连接类型:
2. 子查询
3. 常用高级语法
(1)CASE WHEN:条件分支
(2)事务(TRANSACTION)
(3)索引(INDEX)
四、SQL 优化(进阶必备)
五、实战练习
总结
SQL语句是操作数据库的核心,无论是Mysql、PostgreSQL、SQL Server、Oracle都需要通过SQL语句进行操作。因此,只要掌握了SQL语句,今后不论遇到什么类型的关系型数据库都能利用SQL语句进行增删改查。
1. 什么是 SQL
在学习SQL语句之前,我们先来了解一下什么是SQL语句。
SQL(Structured 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 入门:核心语法(CRUD)
1. 数据库与表操作(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(区别于WHERE:WHERE筛选行,HAVING筛选分组)
SELECT
class AS 班级,
COUNT(*) AS 人数
FROM student
GROUP BY class
HAVING COUNT(*) > 5; — 筛选人数大于5的班级
(6)分页查询
不同数据库语法略有差异,新手重点掌握 MySQL:
— MySQL:LIMIT 起始位置(从0开始), 条数
SELECT * FROM student LIMIT 0, 10; — 第1页,每页10条
SELECT * FROM student LIMIT 10, 10; — 第2页,每页10条
— SQL Server:TOP / OFFSET…FETCH
SELECT TOP 10 * FROM student;
— Oracle:ROWNUM
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. 常用高级语法
(1)CASE 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 优化(进阶必备)
- 主键 / 外键自动建索引,查询频繁的字段(如 WHERE、JOIN、ORDER BY)建索引;
- 避免在索引字段上做函数 / 运算(如WHERE YEAR(create_time) = 2024会失效索引);
五、实战练习
SQL语句的精通需要进行大量的练习,以下是一些学习的建议和推荐练习的平台。
推荐新手通过以下方式巩固:
网硕互联帮助中心







评论前必须登录!
注册