云计算百科
云计算领域专业知识百科平台

SQL语句从入门到精通:只看这一篇就够了!

目录

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 优化(进阶必备)

  • ** 避免 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 条件,避免误操作。
  • 赞(0)
    未经允许不得转载:网硕互联帮助中心 » SQL语句从入门到精通:只看这一篇就够了!
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!