我学SQL踩过的那些坑(完全入门版)

admin 2026-08-04 07:57:56 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文是面向新手的SQL入门教程,指出SQL本质即查增改删四件事。文章通过类比Excel降低理解门槛,讲解了SELECT、INSERT、UPDATE、DELETE、JOIN、GROUPBY及事务的核心用法,总结了中文标点、漏写分号、UPDATE忘加WHERE等常见报错原因。建议新手按七天计划结合DBeaver与MySQL直接上手实操。 综合评分: 65 文章分类: 其他


cover_image

我学SQL踩过的那些坑(完全入门版)

疆来攻防

2026年7月28日 10:08 四川

在小说阅读器读本章

去阅读

我是怎么被SQL折磨的

三年前,我第一次接触SQL,领导扔给我一个数据后台的账号,说:“查一下上个月的订单数据,下班前给我。”

我打开那个满是英文的界面,看着空白的输入框,脑子一片空白。

于是我打开了搜索引擎,搜“SQL入门教程”。

结果你猜怎么着?跳出来几十篇文章,有的上来就讲什么B树索引、执行计划,我看得云里雾里;有的全是专业术语,“元组”“谓词”“范式”,我连中文都读不顺;还有的贴了一大段代码,完全没有解释,我复制粘贴都跑不通。

折腾了一整天,我还是没查出来那个订单数据。

后来我才明白:大多数SQL教程的问题,是把一个简单的东西讲复杂了。

这篇文章,我拿当初学SQL时做的笔记整理出来的,不拽术语,不堆概念,就讲一个新手真正需要知道的东西。

先忘掉那些专业术语

SQL全称是 Structured Query Language,中文叫“结构化查询语言”。

但你别被这个名字吓到。本质上,SQL就是你和数据库对话的一种方式

你想让数据库干什么,你就写一句什么。就像你跟人说话一样:

  • “给我看看员工表里都有谁” → SELECT * FROM employees
  • “把张三的工资改成8000” → UPDATE employees SET salary=8000 WHERE name='张三'

就是这么个逻辑。SQL的语法非常接近英语,你把它当成一种“给数据库下的指令”就行。

第一件需要搞明白的事:SQL就干四件事

不管你用SQL做什么,归根到底就是四个动作:

| 动作 | 英文 | 中文意思 | | — | — | — | | 查 | SELECT | 从表里拿数据出来看 | | 增 | INSERT | 往表里加新数据 | | 改 | UPDATE | 修改表里已有的数据 | | 删 | DELETE | 从表里移除数据 |

这四个动作合起来有个简称叫 CRUD(Create、Read、Update、Delete)。你平时用SQL,90%以上的时间都在干这四件事。

💡 我当初就是被一堆术语吓住了,什么“数据定义语言”“数据操作语言”,听起来像天书。但说白了,DDL就是管“表长什么样”的,DML就是管“表里有什么数据”的,就这么简单。

第二件需要搞明白的事:数据放在“表”里

数据库里的数据,是存在“表”(table)里的。

表长得跟Excel一模一样——有行有列:

| id | name | department | salary | | — | — | — | — | | 1 | 张三 | 技术部 | 15000 | | 2 | 李四 | 市场部 | 12000 | | 3 | 王五 | 技术部 | 18000 |

  • 列(column)

    叫“字段”,代表一类信息,比如名字、部门、工资。

  • 行(row)

    叫“记录”,代表一条完整的数据,比如张三的全部信息。

记住这个类比:数据库表 ≈ Excel表格。你只要会看Excel,就会看数据库表。


开始写第一句SQL

假设我们有上面那张 employees 表,我们来写第一句SQL。

1. 查所有数据

想知道表里都有什么:

SELECT * FROM employees;

* 是通配符,代表“所有列”。这句话翻译过来就是:“把 employees 表里所有的列、所有的行都给我看看。”

2. 查指定的列

如果你只关心名字和工资:

SELECT name, salary FROM employees;

3. 加条件筛选

你只想看技术部的人:

SELECT * FROM employees WHERE department = '技术部';

WHERE 就是“当……的时候”。这句话就是:“当部门是技术部的时候,把这些人给我看看。”

4. 排序

按工资从高到低排:

SELECT * FROM employees ORDER BY salary DESC;

ORDER BY 是排序,DESC 是倒序(从大到小),ASC 是正序(从小到大)。

踩坑实录:我写的SQL为什么跑不通?

坑一:标点符号用了中文

-- 错误!中文引号、中文分号SELECT * FROM employees WHERE name = '张三’;

中文引号 ‘’、中文分号 ,SQL不认识。所有标点都必须是英文的

坑二:忘记写分号

SELECT * FROM employees   -- 这里少了分号

虽然有些工具不写分号也能跑,但养成习惯,每条语句结尾加 ;

坑三:表名或字段名写错

SELECT * FROM employee;   -- 表名是 employees,少了个 s

SQL对名字很敏感,写错一个字母就报错。

往表里加数据:INSERT

INSERT INTO employees (id, name, department, salary)VALUES (4, '赵六', '技术部', 14000);

注意:数字不加引号,文字和日期要加单引号

批量插入:

INSERT INTO employees (id, name, department, salary) VALUES(5, '孙七', '市场部', 11000),(6, '周八', '技术部', 17000);

改数据:UPDATE

这个最危险,我单独说。

-- 把张三的工资改成16000UPDATE employees SET salary = 16000 WHERE name = '张三';

⚠️ 关键:一定要带 WHERE 如果不带:UPDATE employees SET salary = 16000; —— 所有人的工资都变成16000

我有个同事就是这么干的,把全公司几千人的工资全改成了一个数。好在有备份,折腾了一晚上才恢复。

✅ 我的习惯是:写 UPDATE 之前,先写一句 SELECT 看看 WHERE 条件对不对:SELECT * FROM employees WHERE name = '张三'; —— 先确认是不是这个人UPDATE employees SET salary = 16000 WHERE name = '张三'; 确认无误再更新

删数据:DELETE

同样危险,同样要带 WHERE

DELETE FROM employees WHERE id = 4;   -- 只删 id 为4的

不带 WHERE 就是删全表:

DELETE FROM employees;   -- 表还在,数据全没了

💡 生产环境我几乎不用 DELETE,真需要删数据,我会先备份,或者在数据上加一个 status 字段标记为“已删除”,而不是真的删掉。

多张表怎么关联:JOIN

实际工作中,数据不会全放在一张表里。

比如:

  • employees

    表存员工信息

  • departments

    表存部门信息

员工表里有一个 dept_id 字段,指向部门表的 id

要把两张表的信息拼在一起看:

SELECT employees.name, departments.dept_nameFROM employeesINNER JOIN departments ON employees.dept_id = departments.id;

INNER JOIN 的意思是:两张表都有的数据才显示

如果你想把所有员工都显示出来,哪怕他没有部门:

SELECT employees.name, departments.dept_nameFROM employeesLEFT JOIN departments ON employees.dept_id = departments.id;

LEFT JOIN 的意思是:左边的表(employees)全部显示,右边表(departments)有就显示,没有就空着

💡 我刚开始学 JOIN 的时候,被各种连接搞得头疼。后来我发现,工作中 90% 的场景只用 LEFT JOIN,先把这一个搞明白就够了。

分组统计:GROUP BY

你想看看每个部门有多少人:

SELECT department, COUNT(*) AS 人数FROM employeesGROUP BY department;

COUNT(*) 是“数一数有多少行”,AS 人数 是给这个结果起个名字。

想看看每个部门的平均工资:

SELECT department, AVG(salary) AS 平均工资FROM employeesGROUP BY department;

常用的统计函数:

| 函数 | 作用 | | — | — | | COUNT(*) | 数行数 | | SUM(列) | 求和 | | AVG(列) | 求平均 | | MAX(列) | 最大值 | | MIN(列) | 最小值 |

事务:要么全成功,要么全失败

这是一个非常重要的概念。

比如转账:张三给李四转1000块。

-- 第一步:张三扣1000UPDATE account SET balance = balance - 1000 WHERE name = '张三';-- 第二步:李四加1000UPDATE account SET balance = balance + 1000 WHERE name = '李四';

如果第一步成功了,第二步失败了怎么办?张三的钱扣了,李四没收到,这就出大问题了。

事务就是解决这个问题的

START TRANSACTION;   -- 开始事务UPDATE account SET balance = balance - 1000 WHERE name = '张三';UPDATE account SET balance = balance + 1000 WHERE name = '李四';COMMIT;   -- 确认提交,两步都成功了

如果中间出了错,执行 ROLLBACK,两步都会撤销,回到开始前的状态。

简单说:事务保证多条操作要么一起成功,要么一起失败。

我建议你按这个顺序学

我自己走过弯路,所以给你一个实际可行的学习顺序,不贪多,一周搞定:

第1天 · 环境准备 · 装个DBeaver或者DataGrip,连上测试库

第2天 · SELECT + WHERE + ORDER BY · 只查数据,不加不改

第3天 · INSERTUPDATEDELETE · 在测试库上随便改,改错了也不怕

第4天 · JOIN · 先只学 LEFT JOIN,够用了

第5天 · GROUP BY + 聚合函数 · 做几个统计报表练手

第6天 · 综合练习 · 把前5天串起来,写一个完整的查询

第7天 · 休息+总结 · 把这一周学的整理成自己的笔记

学习建议

  • 不要看书,直接上手写。SQL是“动手”的技能,不是“看书”的技能。
  • 装一个图形化工具(推荐DBeaver),不用记命令行。
  • 找一张真实的数据表(比如订单表、用户表),用真实数据练手,比什么教学demo都管用。

推荐几个我常用的工具

| 工具 | 类型 | 推荐理由 | | — | — | — | | DBeaver | 免费图形化客户端 | 支持所有主流数据库,界面友好 | | MySQL | 免费数据库 | 入门首选,资料最多 | | PostgreSQL | 免费数据库 | 功能更强大,适合进阶 | | DataGrip | 付费(有试用) | JetBrains出品,写SQL体验最好 |

新手我建议:装个MySQL + DBeaver,免费、好装、教程多,遇到问题一搜就有答案。

最后说几句

SQL是我工作中用得最多的技能,没有之一。

我当初花了整整一周才勉强学会查数据,后来又花了一个月才搞明白 JOIN 和事务。但一旦入了门,你会觉得这东西太直白了——你想让数据库干什么,你就写什么,它就会乖乖照做。

别被那些高大上的术语吓住。SQL本质上就是四件事:查、增、改、删。

把这四件事练熟,你已经能搞定绝大部分工作需求了。

如果你在实际操作中遇到问题,欢迎留言问我。踩过的坑我都踩过,或许我能帮你省点时间。

点分享

点收藏

点点赞

点在看

扫码关注

疆来攻防

获取更多精彩资讯


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:疆来攻防 《我学SQL踩过的那些坑(完全入门版)》

红石RedstarAIAgent 网络安全文章

红石RedstarAIAgent

文章总结: 本文介绍了红石RedstarAIAgent进展,通过CTF题演示其调用GhidraMCP自动化逆向的能力。文章预告1.0.0版本,含ESP引擎新增工
评论:0   参与:  0