SQL从基础到实战完全指南 - 非程序员也能轻松学习的数据库
SQL Complete Guide from Basics to Practice - Database Learning for Non-Programmers
引言:为什么要学习SQL?
2026年的今天,我们生活在一个每天大约产生2.5艾字节(EB)数据的时代。企业的决策已经从凭感觉转向了数据驱动,营销人员分析客户行为数据,产品经理通过数字解读服务使用模式。在所有这些数据应用的核心,就是SQL(Structured Query Language,结构化查询语言)。SQL是与数据库进行对话的标准语言,自1970年代在IBM首次开发以来,已经作为数据管理的核心工具存在了半个多世纪。
很多人会问:"我不是开发人员,真的需要SQL吗?"答案是"是的,绝对需要"。数字营销人员需要直接查询广告效果数据,服务策划人员(PM)必须分析用户行为日志来改进功能。不仅是数据分析师,连人力资源人员也在使用SQL高效管理员工数据的时代已经到来。根据LinkedIn的2025年最受欢迎的职业技能报告,SQL被列为编程语言中求职公告要求最多的技术。
具体来看,能够使用SQL的职位范围比想象中要广泛得多。营销人员使用SQL进行客户细分分析、活动效果评估和流失率计算。服务策划人员用SQL进行用户漏斗分析、功能使用率追踪和A/B测试结果分析。财务团队用于收入趋势分析和预算执行情况跟踪,人力资源团队用于员工现状分析和招聘数据管理。由此可见,SQL不是某个特定岗位的专属技能,而是正在成为所有与数据打交道的现代职场人士的基本素养。
好消息是,SQL的入门门槛非常低。由于其直觉性的语法结构与英语句子类似,即使完全没有编程经验的人也可以在几个小时内学会基本语法。例如,"从员工表中按薪资排序查询市场部的员工姓名"这一请求用SQL表达就是SELECT name FROM employees WHERE department = 'Marketing' ORDER BY salary DESC;。它具有如同阅读英语句子般自然的结构。在本文中,我们将从数据库的基础概念开始,到能够立即在实际工作中应用的中级技巧,按照非技术人员的水平进行系统性的讲解。
1. 数据库基础概念
1.1 什么是数据库?
数据库(Database)是系统地结构化存储的数据集合。与简单的文件存储不同,数据库是一个被设计为能够高效地存储、检索、修改和删除数据的系统。在我们每天使用的网上购物、银行服务、社交媒体等几乎所有数字服务的背后,都有数据库在运行。
数据库大致分为两种类型:
- 关系型数据库(RDBMS):以表格形式存储数据,并通过表之间的关系连接数据。使用SQL来操作数据。代表性的有MySQL、PostgreSQL、Oracle、SQL Server、SQLite等。适合处理结构化数据的大多数业务场景。
- 非关系型数据库(NoSQL):不受表格结构的限制,以灵活的形式存储数据。包括MongoDB(文档型)、Redis(键值型)、Cassandra(列型)、Neo4j(图型)等,主要用于处理大量非结构化数据或需要快速读写的场景。
本文重点介绍使用最广泛、在就业市场上需求最高的关系型数据库和SQL。特别是MySQL和PostgreSQL是开源免费的,学习资源也非常丰富,强烈推荐给初学者。作为参考,简单比较各RDBMS的特点:MySQL在Web服务中使用最广泛,安装和运维简便。PostgreSQL最忠实地支持标准SQL,高级功能丰富。Oracle主要用于大企业和金融行业,稳定性出色,但商业许可费用较高。SQL Server与微软生态系统兼容性好。SQLite无需单独服务器,以单个文件运行,适合移动应用或小型项目。
1.2 理解表、行和列
关系型数据库的核心结构是表(Table)。如果你使用过Excel,就可以轻松理解表。Excel的工作表就相当于一个表,每行(Row)代表一条数据记录,每列(Column)代表数据的一个属性(字段)。
例如,用于管理员工信息的employees表具有以下结构:
| emp_id(员工编号) | name(姓名) | department(部门) | salary(薪资) | hire_date(入职日期) |
|---|---|---|---|---|
| 1 | Kim Younghee | Marketing | 4500000 | 2023-03-15 |
| 2 | Lee Cheolsu | Development | 5200000 | 2022-07-01 |
| 3 | Park Minsu | HR | 4000000 | 2024-01-10 |
在数据库中,有两种在表之间建立关系方面起关键作用的键(Key):
- 主键(Primary Key,PK):唯一标识每行的列。在上面的表中,
emp_id就是主键。主键不允许重复,也不能有NULL值。就像身份证号一样,唯一区分每条记录。 - 外键(Foreign Key,FK):引用另一个表的主键的列。例如,如果
orders(订单)表中有一个customer_id列,这就是引用customers(客户)表主键的外键。通过外键形成表之间的关系。
1.3 数据类型
数据库中每列都有规定可以存储的数据类型。主要数据类型如下:
| 分类 | 数据类型 | 说明 | 示例 |
|---|---|---|---|
| 整数 | INT, BIGINT | 存储整数值 | 1, 42, -100 |
| 小数 | DECIMAL, FLOAT | 带小数点的数字 | 3.14, 99.99 |
| 字符串 | VARCHAR(n), TEXT | 可变长度字符串 | 'Zhang San', 'hello' |
| 日期 | DATE, DATETIME | 日期和时间 | '2026-02-20' |
| 布尔 | BOOLEAN | 真/假 | TRUE, FALSE |
VARCHAR(n)可以指定最大长度,适合姓名、邮箱等长度可预测的数据。TEXT用于存储没有长度限制的长字符串。通常,对结构化的短数据使用VARCHAR,对博客正文等长文本使用TEXT。
2. 全面掌握SQL基本语法
2.1 SELECT - 数据查询
SELECT是SQL中使用最多的命令,用于从数据库中查询(读取)所需的数据。SELECT语句的基本结构如下:
-- SELECT基本语法
SELECT column1, column2
FROM table_name
WHERE condition
ORDER BY sort_criteria
LIMIT count;
让我们通过实战示例逐步学习:
-- 1. 查询所有员工信息
SELECT * FROM employees;
-- 2. 只查询特定列
SELECT name, department, salary
FROM employees;
-- 3. 条件过滤(WHERE)
-- 只查询薪资 >= 450万的员工
SELECT name, department, salary
FROM employees
WHERE salary >= 4500000;
-- 4. 组合多个条件(AND, OR)
-- 市场部且薪资 >= 400万的员工
SELECT name, salary
FROM employees
WHERE department = 'Marketing' AND salary >= 4000000;
-- 5. 排序(ORDER BY)
-- 按薪资从高到低排序
SELECT name, salary
FROM employees
ORDER BY salary DESC;
-- 6. 限制结果数量(LIMIT)
-- 只查询薪资前5名
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 5;
-- 7. 字符串搜索(LIKE)
-- 姓名以'Kim'开头的员工
SELECT * FROM employees
WHERE name LIKE 'Kim%';
-- 8. 范围搜索(BETWEEN)
-- 2023年入职的员工
SELECT name, hire_date
FROM employees
WHERE hire_date BETWEEN '2023-01-01' AND '2023-12-31';
SQL的执行顺序与书写顺序不同。实际执行顺序为:FROM(从哪个表?)-> WHERE(什么条件?)-> SELECT(哪些列?)-> ORDER BY(什么顺序?)-> LIMIT(多少条?)。理解这个顺序可以帮助减少编写复杂查询时的错误。
2.2 INSERT、UPDATE、DELETE - 数据操作
数据库的基本操作称为CRUD。这是Create(创建)、Read(读取)、Update(更新)、Delete(删除)的缩写,在SQL中分别对应INSERT、SELECT、UPDATE、DELETE命令。
-- CREATE: 添加新数据(INSERT)
INSERT INTO employees (name, department, salary, hire_date)
VALUES ('Jung Suyeon', 'Design', 4200000, '2026-02-20');
-- 一次插入多行
INSERT INTO employees (name, department, salary, hire_date)
VALUES
('Han Jimin', 'Marketing', 4300000, '2026-01-15'),
('Oh Sehun', 'Development', 5500000, '2025-11-01'),
('Choi Yuri', 'HR', 3800000, '2026-02-01');
-- UPDATE: 修改现有数据
-- 将Kim Younghee的薪资改为480万
UPDATE employees
SET salary = 4800000
WHERE name = 'Kim Younghee';
-- 同时修改多列
UPDATE employees
SET department = 'Planning', salary = 4600000
WHERE emp_id = 3;
-- DELETE: 删除数据
-- 删除特定员工
DELETE FROM employees
WHERE emp_id = 5;
执行
UPDATE employees SET salary = 0;会将所有员工的薪资改为0。DELETE FROM employees;会删除表中所有数据。在实际工作中,务必确认WHERE条件后再执行,在执行重要操作前请使用事务(BEGIN/COMMIT/ROLLBACK)。
2.3 聚合函数和GROUP BY
聚合函数是将多行数据汇总为一个结果的函数。它是数据分析中最常用的核心功能。
-- 基本聚合函数
SELECT
COUNT(*) AS total_employees, -- 行数
SUM(salary) AS total_salary, -- 总和
AVG(salary) AS avg_salary, -- 平均值
MAX(salary) AS max_salary, -- 最大值
MIN(salary) AS min_salary -- 最小值
FROM employees;
-- GROUP BY: 按组聚合
-- 查询各部门的平均薪资和人数
SELECT
department AS dept,
COUNT(*) AS headcount,
ROUND(AVG(salary), 0) AS avg_salary,
MAX(salary) AS max_salary,
MIN(salary) AS min_salary
FROM employees
GROUP BY department
ORDER BY avg_salary DESC;
-- HAVING: 过滤分组
-- 只查询平均薪资 >= 450万的部门
SELECT
department AS dept,
COUNT(*) AS headcount,
ROUND(AVG(salary), 0) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) >= 4500000
ORDER BY avg_salary DESC;
WHERE和HAVING的区别是SQL初学者最容易混淆的部分之一。让我们明确理解核心区别。WHERE用于在分组(GROUP BY)之前过滤单独的行。也就是说,它先从表的原始数据中筛选出符合条件的行。而HAVING是在GROUP BY分组之后按组进行过滤。因此,在HAVING子句中可以使用聚合函数(COUNT、SUM、AVG等)作为条件,但在WHERE子句中不能直接使用聚合函数。例如,要查找"只考虑薪资在300万以上的员工,部门平均薪资在450万以上的部门",需要同时使用WHERE和HAVING:
SELECT department, ROUND(AVG(salary), 0) AS avg_salary
FROM employees
WHERE salary >= 3000000 -- 单行过滤(分组前)
GROUP BY department
HAVING AVG(salary) >= 4500000 -- 分组过滤(分组后)
ORDER BY avg_salary DESC;
3. 中级SQL - 实际工作中常用的技巧
3.1 JOIN - 表连接的核心
在实际工作中,数据分布在多个表中。正如我们之前在规范化中学到的,良好的数据库设计会根据目的将数据分散到多个表中。但在分析或生成报告时,需要重新组合分散的数据以提取有意义的信息。JOIN是连接两个或多个表以一起查询相关数据的功能,是SQL中最重要的中级概念。如果你能自如地使用JOIN,就可以说你的SQL技能已经从初级跃升到了中级。大量实际查询都是基于JOIN编写的,面试中也经常出现评估JOIN理解程度的题目。
假设我们有以下两个表:
-- employees(员工)表
-- emp_id | name | dept_id
-- 1 | Kim Younghee | 10
-- 2 | Lee Cheolsu | 20
-- 3 | Park Minsu | 10
-- 4 | Choi Jieun | NULL
-- departments(部门)表
-- dept_id | dept_name
-- 10 | Marketing
-- 20 | Development
-- 30 | HR
让我们用维恩图的概念来理解JOIN的类型:
INNER JOIN LEFT JOIN RIGHT JOIN FULL OUTER JOIN
A B A B A B A B
/ \ / \ / \ / \ / \ / \ / \ / \
| .|X|. | | |X| | | |X| | | |X| |
\ / \ / \ / \ / \ / \ / \ / \ /
仅两侧都 左侧全部 右侧全部 两侧全部
匹配的数据 + 右侧匹配 + 左侧匹配 全部包含
-- INNER JOIN: 仅查询两个表中都匹配的数据
-- 结果: Kim Younghee(Marketing), Lee Cheolsu(Development), Park Minsu(Marketing)
-- Choi Jieun(dept_id=NULL)和HR部门(无匹配员工)被排除
SELECT e.name, d.dept_name
FROM employees e
INNER JOIN departments d ON e.dept_id = d.dept_id;
-- LEFT JOIN: 左表所有行 + 右表匹配
-- 结果: 显示所有员工,Choi Jieun的部门显示为NULL
SELECT e.name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.dept_id;
-- RIGHT JOIN: 右表所有行 + 左表匹配
-- 结果: 显示所有部门,HR部门的员工显示为NULL
SELECT e.name, d.dept_name
FROM employees e
RIGHT JOIN departments d ON e.dept_id = d.dept_id;
-- FULL OUTER JOIN: 包含两个表的所有行
-- (在MySQL中使用UNION实现)
SELECT e.name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.dept_id
UNION
SELECT e.name, d.dept_name
FROM employees e
RIGHT JOIN departments d ON e.dept_id = d.dept_id;
让我们看看实际工作中最常用的JOIN实战示例:
-- 实战: 查询每个客户的订单记录和总订单金额
SELECT
c.customer_name AS customer,
COUNT(o.order_id) AS order_count,
SUM(o.amount) AS total_amount
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_id, c.customer_name
ORDER BY total_amount DESC;
-- 实战: 3表JOIN - 订单明细
SELECT
c.customer_name AS customer,
o.order_date AS order_date,
p.product_name AS product,
od.quantity AS qty,
od.unit_price AS unit_price,
(od.quantity * od.unit_price) AS subtotal
FROM customers c
INNER JOIN orders o ON c.customer_id = o.customer_id
INNER JOIN order_details od ON o.order_id = od.order_id
INNER JOIN products p ON od.product_id = p.product_id
WHERE o.order_date >= '2026-01-01'
ORDER BY o.order_date DESC;
3.2 子查询和CTE
子查询(Subquery)是包含在SQL语句中的另一个SQL语句。在需要复杂条件或计算时非常有用。
-- 子查询基础: 查询薪资高于平均值的员工
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
-- IN子查询: 仅查询有订单记录的客户
SELECT customer_name
FROM customers
WHERE customer_id IN (
SELECT DISTINCT customer_id FROM orders
);
-- EXISTS子查询: 检查是否存在满足特定条件的行
SELECT d.dept_name
FROM departments d
WHERE EXISTS (
SELECT 1 FROM employees e
WHERE e.dept_id = d.dept_id AND e.salary > 5000000
);
CTE(Common Table Expression,公用表表达式)使用WITH子句为临时结果集命名。它使复杂的子查询变得可读且可重用。
-- CTE基本语法
WITH temp_table_name AS (
SELECT statement
)
SELECT * FROM temp_table_name;
-- 实战: 查找销售额高于平均值的客户
WITH customer_sales AS (
SELECT
c.customer_id,
c.customer_name,
SUM(o.amount) AS total_sales
FROM customers c
INNER JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_id, c.customer_name
),
avg_sales AS (
SELECT AVG(total_sales) AS avg_total
FROM customer_sales
)
SELECT
cs.customer_name AS customer,
cs.total_sales AS total_sales,
a.avg_total AS overall_avg,
ROUND(cs.total_sales / a.avg_total * 100, 1) AS pct_of_avg
FROM customer_sales cs
CROSS JOIN avg_sales a
WHERE cs.total_sales > a.avg_total
ORDER BY cs.total_sales DESC;
对于简单条件,子查询更简洁。但当需要多次引用同一结果,或者查询变长影响可读性时,请使用CTE。CTE使查询像分段的文章一样易于阅读。在实际工作中,越来越推荐使用CTE。
3.3 窗口函数
窗口函数(Window Function)是一种强大的功能,它在对行组执行计算的同时保留各个行。与GROUP BY不同,它不合并行,而是在每行旁边额外显示计算结果。窗口函数在数据分析中使用非常频繁,是能够优雅地回答"部门内的薪资排名是?"、"与上月相比的销售额增减是?"、"累计总额是?"等问题的工具。利用窗口函数,以前需要用子查询或自连接复杂编写的查询可以更加简洁易读地表达。如果在面试中能自然地使用窗口函数,就会被认为具有SQL中级以上的实力。
-- ROW_NUMBER(): 分配序号
-- 按部门内薪资从高到低分配序号
SELECT
name,
department,
salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank
FROM employees;
-- RANK(): 分配排名(允许并列,跳过下一名次)
-- DENSE_RANK(): 分配排名(允许并列,不跳过下一名次)
SELECT
name,
salary,
RANK() OVER (ORDER BY salary DESC) AS rank_num,
DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank_num
FROM employees;
-- 实战: 月度销售额和排名
SELECT
DATE_FORMAT(order_date, '%Y-%m') AS month,
SUM(amount) AS monthly_revenue,
RANK() OVER (ORDER BY SUM(amount) DESC) AS revenue_rank
FROM orders
WHERE order_date >= '2025-01-01'
GROUP BY DATE_FORMAT(order_date, '%Y-%m')
ORDER BY month;
-- LAG() / LEAD(): 引用前一行/后一行
-- 实战: 计算环比销售额增长率
WITH monthly_sales AS (
SELECT
DATE_FORMAT(order_date, '%Y-%m') AS month,
SUM(amount) AS sales
FROM orders
WHERE order_date >= '2025-01-01'
GROUP BY DATE_FORMAT(order_date, '%Y-%m')
)
SELECT
month,
sales AS current_month_sales,
LAG(sales, 1) OVER (ORDER BY month) AS prev_month_sales,
ROUND(
(sales - LAG(sales, 1) OVER (ORDER BY month))
/ LAG(sales, 1) OVER (ORDER BY month) * 100, 1
) AS growth_rate_pct
FROM monthly_sales
ORDER BY month;
窗口函数的核心语法是function() OVER (PARTITION BY group_column ORDER BY sort_column)。PARTITION BY类似于GROUP BY指定分组,但不合并行,而是在每行上显示结果。ORDER BY决定窗口内的排序顺序。
4. 数据库设计基础
良好的数据库设计保证数据的一致性、效率和可扩展性。即使SQL语法掌握得再好,如果数据库结构设计不当,查询性能就会下降,数据不一致问题也会出现。这就像建筑的地基工程一样,如果一开始没有正确设计,以后修改的成本会呈指数级增长。实际工作中常见的问题是"万能表"设计,即把所有信息塞进一个表中。这种结构初看起来很方便,但随着数据积累,冗余变得严重,修改时需要同时在多处进行更改。
让我们简单地理解设计的核心原则——规范化(Normalization)。
什么是规范化?这是一个通过系统地分离表来减少数据冗余和提高数据完整性的过程。让我们通过一个简单的例子来看看为什么需要规范化。如果在订单表中同时存储客户姓名和客户地址,那么同一客户每下一次订单,姓名和地址就会被重复存储。如果该客户更改了地址,就必须找到并修改所有订单记录。漏掉任何一条就会导致数据不一致。规范化从结构上防止这类问题。
- 第一范式(1NF):每个单元格只存储一个值。不在一个单元格中放置多个值如"北京, 上海"。所有列的值必须是原子的。
- 第二范式(2NF):满足1NF的同时,所有非键列必须完全依赖于整个主键。仅依赖于主键部分的列应分离到单独的表中。例如,在订单表中,商品名称依赖于商品编号而非订单编号,因此应该分离。
- 第三范式(3NF):满足2NF的同时,非键列不能依赖于其他非键列。例如,如果员工表中同时包含部门名称和部门地址,部门地址依赖于部门名称,因此应移至部门表中。
ERD(实体关系图)是直观展示表之间关系的图表。以下是读懂ERD的基本方法:
- 矩形:实体(表)
- 线:关系(1:1、1:N、N:M)
- PK:主键标识
- FK:外键标识(引用其他表)
-- ERD文本表示示例
+---------------+ +------------------+ +----------------+
| customers | | orders | | products |
+---------------+ +------------------+ +----------------+
| PK customer_id|---+ | PK order_id | +---| PK product_id |
| name | +-->| FK customer_id | | | name |
| email | | order_date | | | price |
| phone | | total_amount | | | category |
+---------------+ +------------------+ | +----------------+
| order_details | |
+------------------+ |
| PK detail_id | |
| FK order_id | |
| FK product_id |---+
| quantity |
| unit_price |
+------------------+
1. 一个表只处理一个主题(单一职责原则)
2. 必须设置主键(推荐自增整数或UUID)
3. 列名遵循一致的命名规范(推荐snake_case)
4. 谨慎决定是否允许NULL值
5. 适当使用索引优化搜索性能
5. 练习环境搭建指南
学习SQL最有效的方式是亲自执行查询。只读理论是无法正确掌握SQL的。编程学习中最重要的原则是"与其看不如亲手打",SQL也是如此。在自己编写查询、查看结果、修改条件进行实验的过程中才能产生真正的理解。下面介绍从无需安装即可开始的在线环境到适合深入学习的本地环境。
在线免费练习环境(无需安装)
- SQLite Online (sqliteonline.com):可在网页浏览器中直接执行SQL。支持SQLite、PostgreSQL、MySQL语法,无需注册即可立即使用。最推荐给初学者的环境。
- DB Fiddle (db-fiddle.com):支持MySQL、PostgreSQL、SQLite,编写的查询可通过URL分享,便于协作或提问。
- W3Schools SQL Tryit Editor:预先准备了示例数据,可以立即练习各种SQL语法。与教程一起提供,可以同时进行学习和练习。
- LeetCode / HackerRank SQL题目:通过解决实战问题来提升SQL技能的编程平台。按难度分类良好,适合循序渐进的学习。
本地安装环境(深入学习用)
- MySQL + MySQL Workbench:使用最广泛的开源RDBMS。MySQL Workbench是官方GUI工具,可以可视化地管理数据库和编写查询。学习Web开发时特别推荐。
- PostgreSQL + pgAdmin:高级功能丰富的开源RDBMS。最忠实地支持标准SQL,广泛用于数据分析和后端开发。pgAdmin是基于Web的管理工具。
- DBeaver(通用DB客户端):能连接MySQL、PostgreSQL、Oracle、SQL Server等几乎所有数据库的免费通用工具。想用一个工具处理多种DBMS时推荐使用。
练习用示例数据集
要有效学习SQL,使用接近真实结构的数据进行练习非常重要。以下是广泛使用的免费示例数据集。每个数据集模拟不同的业务领域,可以练习各种场景下的查询编写:
- Northwind Database:由贸易公司的订单、客户、产品、供应商数据组成的经典学习数据集。可以练习客户订单分析、产品类别销售汇总、供应商绩效比较等实际工作中常见的查询类型。最适合练习JOIN、聚合和子查询。
- Sakila Database:模拟DVD租赁店的MySQL官方示例数据库。电影、演员、客户、租赁记录等多种表之间的关系构建良好,适合练习多表连接和复杂查询。
- Chinook Database:模拟数字音乐商店的数据集,也提供SQLite版本,可以轻松上手。由艺术家、专辑、曲目、发票等表组成,可以体验类似于音乐流媒体服务的数据分析。
6. SQL学习路线图和认证
SQL学习中最常见的错误是一开始就试图同时学太多东西。在基本语法还没完全掌握的情况下就学习窗口函数或优化技巧,只会增加混乱。最有效的学习方法是循序渐进,在每个阶段充分练习后再进入下一个阶段。以下是系统学习的4周路线图。基于每天投入1-2小时制定。
| 周次 | 学习目标 | 主要内容 | 练习任务 |
|---|---|---|---|
| 第1周 | 掌握基础语法 | SELECT, WHERE, ORDER BY, LIMIT, INSERT, UPDATE, DELETE | 完成W3Schools全部基础题目 |
| 第2周 | 聚合和分组 | 聚合函数、GROUP BY、HAVING、DISTINCT、日期函数 | 使用Northwind DB编写销售分析报告 |
| 第3周 | JOIN和子查询 | INNER/LEFT/RIGHT JOIN、子查询、CTE、UNION | LeetCode Easy~Medium SQL题目20道 |
| 第4周 | 实战应用 | 窗口函数、建表、索引、视图、事务 | 实际业务数据分析迷你项目 |
SQLD(SQL开发者)认证
SQLD(SQL Developer)是由韩国数据产业振兴院组织的国家认证资格,可以正式认证SQL应用能力。对于非程序员证明数据能力非常有效,在IT企业求职或部门调动时有利。特别是对于以数据分析师、数据工程师、后端开发者等职位为目标的人来说,仅在简历上列出SQLD认证就能证明具备基本的数据库能力。还有更高级的SQLP(SQL专家)认证,获得SQLD后想要深入学习的人可以尝试挑战。
- 考试结构:数据建模理解(10题)、SQL基础与应用(40题),共50题选择题
- 合格标准:总分60分以上,各科目40%以上
- 考试时间:每年4次(3月、6月、9月、12月),在韩国数据产业振兴院官网报名
- 准备时间:非程序员约4-8周,有SQL基础知识约2-4周
推荐学习资源
- 免费:W3Schools SQL Tutorial、Mode Analytics SQL Tutorial、Khan Academy SQL课程、SQLZoo Interactive Tutorial
- 付费:Inflearn/FastCampus SQL课程(韩语)、Udemy "The Complete SQL Bootcamp"、DataCamp SQL Track
- 书籍:《SQL必知必会》(Ben Forta)、《SQL基础教程》(MICK)、《SQL编程技巧》(John Viescas)
总结:SQL是性价比最高的技术投资
SQL是一项经过半个多世纪验证的技术,同时也是数据时代的核心竞争力。与Python或JavaScript等编程语言相比,它的语法更简单,学习时间与实际应用价值的比例非常高。营销人员、产品经理、数据分析师、后端开发者等所有与数据相关的岗位都将SQL作为通用语言使用。事实上,许多企业在非开发岗位的招聘中也将SQL能力从优选条件改为了必要条件。特别是在创业公司和重视数据驱动决策的组织中,更青睐能够不依赖开发团队、自行提取所需数据的人才。
以下是本文涵盖内容的总结:
- 基础概念:理解数据库、表、行、列、主键、外键之间的关系。
- 基本语法:用SELECT查询数据,用INSERT/UPDATE/DELETE操作数据。
- 聚合和分组:用COUNT、SUM、AVG等聚合函数和GROUP BY汇总数据。
- JOIN:连接多个表以一起查询相关数据。
- 子查询和CTE:实现复杂条件和多阶段分析。
- 窗口函数:执行排名、前后行比较等高级分析。
- 数据库设计:通过规范化创建高效一致的数据结构。
Step 1:访问SQLite Online(sqliteonline.com),执行
SELECT 'Hello, SQL!' AS greeting;。恭喜你,你已经执行了第一个查询!Step 2:跟着W3Schools SQL Tutorial的SELECT、WHERE、ORDER BY章节,用示例数据亲手编写查询。30分钟就能做基本查询。
Step 3:试着用SQL表达与你工作相关的问题。"本月销售额最高的商品TOP10是?""与上季度相比新客户数量变化如何?"将这些问题转化为SQL的练习是提高技能的关键。
SQL核心语法速查表
| 分类 | 语法 | 说明 |
|---|---|---|
| 查询 | SELECT columns FROM table |
数据查询 |
| 条件 | WHERE condition |
行过滤 |
| 排序 | ORDER BY column ASC/DESC |
升序/降序排序 |
| 限制 | LIMIT n |
限制结果数量 |
| 插入 | INSERT INTO table VALUES (...) |
添加新数据 |
| 更新 | UPDATE table SET col=val WHERE condition |
修改现有数据 |
| 删除 | DELETE FROM table WHERE condition |
删除数据 |
| 聚合 | COUNT, SUM, AVG, MAX, MIN |
分组函数 |
| 分组 | GROUP BY column HAVING condition |
按组聚合和过滤 |
| 连接 | JOIN table ON condition |
表的合并 |
| 临时 | WITH cte AS (SELECT ...) |
CTE(公用表表达式) |
| 排名 | ROW_NUMBER() OVER (...) |
窗口函数 |
SQL是一次学习就能终身受用的、性价比最高的技术投资。在数据即竞争力的时代,通过SQL获得与数据直接对话的能力,将成为任何岗位中的强大武器。此外,在学习SQL的过程中,你会自然地发展对数据结构的理解、逻辑思维能力和问题解决能力。这不仅超越了SQL本身,还成为学习其他技术的基础,并打开了Excel无法处理的大规模数据分析的大门。SQL是不受技术潮流影响的、超越时代的基本功。从今天开始执行你的第一个查询吧。这个小小的第一步将为你的职业生涯带来惊人的变化。