SQL语言与数据库操作技术大全
目录
- 数据库基础理论
- SQL语言核心
- 1 DDL (数据定义语言)
- 2 DML (数据操纵语言)
- 3 DQL (数据查询语言)
- 4 DCL (数据控制语言)
- 5 TCL (事务控制语言)
- 高级SQL技术
- 1 聚合函数与分组
- 2 多表连接查询
- 3 子查询
- 4 窗口函数
- 5 公用表表达式
- 6 集合操作
- 7 NULL值处理
- 数据库操作与优化
- 1 索引
- 2 视图
- 3 存储过程与函数
- 4 触发器
- 5 事务
- 6 锁机制
- 7 SQL性能优化
- 不同数据库系统的特性
- 1 MySQL
- 2 PostgreSQL
- 3 SQL Server
- 4 Oracle
- 5 SQLite
- NoSQL简介
- 学习资源与总结
数据库基础理论
在深入SQL之前,理解一些基本概念至关重要。

- 数据库: 有组织的数据集合,通常长期存储在计算机内、有共享性、统一管理。
- 数据库管理系统: 管理数据库的软件,如 MySQL, PostgreSQL, Oracle, SQL Server,用户通过DBMS创建、查询、更新和管理数据库。
- SQL (Structured Query Language): 用于与DBMS通信的标准语言,几乎所有关系型数据库都支持SQL。
- 关系型数据库: 基于关系模型(二维表结构)的数据库,数据存储在相互关联的表中。
- 表: 数据库中存储数据的结构,由行和列组成。
- 行/记录: 表中的一条数据,代表一个实体。
- 列/字段: 表中的一个属性,定义了数据的类型。
- 主键: 表中唯一标识每一行记录的列或列组合,不能为NULL,且值必须唯一。
- 外键: 一个表中的列,其值是另一个表的主键,用于建立两个表之间的关联关系。
- 索引: 一种用于快速查询和检索数据的数据库数据结构,可以类比为一本书的目录。
SQL语言核心
SQL主要分为以下几类语言。
1 DDL (Data Definition Language) - 数据定义语言
用于定义和管理数据库的结构(表、索引、视图等)。
| 命令 | 描述 | 示例 |
|---|---|---|
CREATE |
创建数据库或对象 | CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(100)); |
ALTER |
修改现有数据库对象的结构 | ALTER TABLE users ADD COLUMN email VARCHAR(255); |
DROP |
删除数据库或对象 | DROP TABLE users; |
TRUNCATE |
删除表中的所有数据,保留表结构 | TRUNCATE TABLE users; |
2 DML (Data Manipulation Language) - 数据操纵语言
用于操作数据库中的数据。
| 命令 | 描述 | 示例 |
|---|---|---|
INSERT |
向表中插入新数据 | INSERT INTO users (id, name) VALUES (1, 'Alice'); |
UPDATE |
更新表中的现有数据 | UPDATE users SET name = 'Bob' WHERE id = 1; |
DELETE |
从表中删除数据 | DELETE FROM users WHERE id = 1; |
3 DQL (Data Query Language) - 数据查询语言
用于从数据库中检索数据,虽然SELECT常被单独分类,但它广义上属于DML。

| 命令 | 描述 | 示例 |
|---|---|---|
SELECT |
从表中检索数据 | SELECT * FROM users; |
FROM |
指定要查询的表 | SELECT name FROM users; |
WHERE |
指定查询条件 | SELECT * FROM users WHERE age > 30; |
ORDER BY |
对结果集进行排序 | SELECT * FROM users ORDER BY name DESC; |
LIMIT / TOP / FETCH |
限制返回的行数 | SELECT * FROM users LIMIT 10; (MySQL) SELECT TOP 10 * FROM users; (SQL Server) SELECT * FROM users FETCH FIRST 10 ROWS ONLY; (SQL标准) |
4 DCL (Data Control Language) - 数据控制语言
用于控制数据库的访问权限和安全级别。
| 命令 | 描述 | 示例 |
|---|---|---|
GRANT |
授予用户或角色权限 | GRANT SELECT ON users TO 'read_user'@'localhost'; |
REVOKE |
撤销用户或角色权限 | REVOKE SELECT ON users FROM 'read_user'@'localhost'; |
5 TCL (Transaction Control Language) - 事务控制语言
用于管理数据库事务,确保数据的一致性。
| 命令 | 描述 | 示例 |
|---|---|---|
COMMIT |
提交事务,将更改永久保存到数据库 | COMMIT; |
ROLLBACK |
回滚事务,撤销未提交的更改 | ROLLBACK; |
SAVEPOINT |
在事务中设置保存点,可以部分回滚 | SAVEPOINT my_savepoint; ROLLBACK TO my_savepoint; |
高级SQL技术
这些技术能让你写出更强大、更高效的SQL查询。
1 聚合函数与分组
对一组值执行计算,并返回单个值。

| 函数 | 描述 |
|---|---|
COUNT() |
计算行数 |
SUM() |
计算数值列的总和 |
AVG() |
计算数值列的平均值 |
MIN() |
返回列的最小值 |
MAX() |
返回列的最大值 |
GROUP BY 子句: 将结果集按一个或多个列进行分组。
HAVING 子句: 对分组后的结果进行筛选(类似于WHERE,但WHERE在分组前,HAVING在分组后)。
-- 统计每个部门的员工人数,并只显示人数大于5的部门 SELECT department_id, COUNT(*) AS employee_count FROM employees GROUP BY department_id HAVING COUNT(*) > 5;
2 多表连接查询
当数据分布在多个相关表中时,使用连接来合并它们。
INNER JOIN(内连接): 只返回两个表中连接字段相匹配的行。SELECT orders.order_id, customers.customer_name FROM orders INNER JOIN customers ON orders.customer_id = customers.id;
LEFT JOIN(左连接): 返回左表中的所有行,以及右表中匹配的行,如果右表没有匹配,则结果中右表的列为NULL。SELECT customers.customer_name, COUNT(orders.order_id) AS order_count FROM customers LEFT JOIN orders ON customers.id = orders.customer_id GROUP BY customers.id;
RIGHT JOIN(右连接): 与LEFT JOIN相反,返回右表中的所有行。FULL OUTER JOIN(全外连接): 返回两个表中的所有行,无论它们是否匹配,不匹配的列显示为NULL。CROSS JOIN(交叉连接): 返回两个表的笛卡尔积,即第一个表的每一行与第二个表的每一行的组合。
3 子查询
嵌套在另一个查询(SELECT, INSERT, UPDATE, DELETE)内部的查询。
- 相关子查询: 子查询依赖于外部查询的值。
-- 找出每个部门中薪水最高的员工 SELECT e1.name, e1.salary, e1.department_id FROM employees e1 WHERE e1.salary = ( SELECT MAX(e2.salary) FROM employees e2 WHERE e2.department_id = e1.department_id ); - 非相关子查询: 子查询独立于外部查询执行。
4 窗口函数
现代SQL的强大功能,它可以在不合并行的情况下对一组行(窗口)进行计算,它避免了复杂的自连接和子查询。
ROW_NUMBER(): 为窗口中的每一行分配一个唯一的序号。RANK(): 为窗口中的每一行分配一个排名,如果有相同的值,则排名相同,并跳过后续排名。DENSE_RANK(): 与RANK()类似,但不跳过后续排名。LAG() / LEAD(): 访问同一窗口中当前行之前或之后的行的值。
-- 为每个部门的员工按薪水排名
SELECT
name,
department_id,
salary,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) as salary_rank
FROM employees;
5 公用表表达式
一个临时的、命名的结果集,可以在一个SELECT, INSERT, UPDATE, DELETE语句中多次引用,使复杂查询更易读。
WITH RegionalSales AS (
SELECT
region,
SUM(sales) AS total_sales
FROM orders
GROUP BY region
)
SELECT
region,
total_sales,
total_sales / (SELECT SUM(total_sales) FROM RegionalSales) AS percentage_of_total
FROM RegionalSales
ORDER BY total_sales DESC;
6 集合操作
用于合并多个SELECT语句的结果集。
UNION: 合并两个结果集,并自动去除重复行。UNION ALL: 合并两个结果集,不去除重复行(性能更好)。INTERSECT: 返回两个结果集的交集(即都存在的行)。EXCEPT/MINUS: 返回在第一个结果集但不在第二个结果集中的行。
7 NULL值处理
IS NULL: 检查列是否为NULL。IS NOT NULL: 检查列是否不为NULL。COALESCE(): 返回列表中的第一个非NULL值。NULLIF(): 如果两个表达式相等,则返回NULL,否则返回第一个表达式的值。
数据库操作与优化
1 索引
- 作用: 大幅提高查询速度,特别是在大型表上。
- 类型:
- B-Tree索引: 最常见,适用于范围查询(
>,<,BETWEEN)和精确匹配。 - 哈希索引: 仅适用于等值查询(),速度极快,但不支持范围查询。
- 全文索引: 用于在文本内容中执行关键词搜索。
- 唯一索引: 确保索引列中的所有值都是唯一的。
- B-Tree索引: 最常见,适用于范围查询(
- 原则: 为
WHERE子句、JOIN条件、ORDER BY子句中频繁使用的列创建索引,但索引会占用存储空间,并降低INSERT,UPDATE,DELETE速度,因此需谨慎使用。
2 视图
- 定义: 一个虚拟的表,其结果集由存储的查询定义。
- 优点:
- 简化复杂查询: 将复杂的
JOIN和WHERE逻辑封装起来。 - 安全性: 可以限制用户只能访问视图中的特定列或行,而不是底层表。
- 数据独立性: 应用程序基于视图,当底层表结构改变时,只需修改视图定义。
- 简化复杂查询: 将复杂的
3 存储过程与函数
- 存储过程: 在数据库中预编译并存储的一组SQL语句,可以接受参数,并返回状态值或结果集,用于封装业务逻辑。
- 函数: 类似于存储过程,但必须返回一个值,通常用于计算,并可以在SQL语句的任何地方调用(如
SELECT列表、WHERE子句)。
4 触发器
一种特殊的存储过程,在特定事件(如INSERT, UPDATE, DELETE)发生时自动执行,常用于实现数据完整性约束、审计日志等。
5 事务
将多个SQL操作捆绑成一个单一的执行单元,这个单元要么全部成功,要么全部失败,以确保数据的一致性,ACID特性是其核心:
- 原子性: 事务不可分割。
- 一致性: 事务使数据库从一个有效状态转移到另一个有效状态。
- 隔离性: 并发执行的事务是相互隔离的。
- 持久性: 一旦事务提交,其结果就是永久性的。
6 锁机制
用于实现事务的隔离性,防止并发操作导致的数据不一致。
- 行级锁: 只锁定被访问的行,并发性最好。
- 表级锁: 锁定整个表,并发性最差,但开销小。
- 乐观锁: 假设冲突不常发生,只在更新时检查数据是否被修改。
- 悲观锁: 假设冲突经常发生,在读取数据时就加锁。
7 SQL性能优化
- *避免 `SELECT `**: 只查询需要的列。
- 为
WHERE和JOIN条件添加索引。 - 避免在
WHERE子句中对字段进行函数操作或表达式计算,这会导致索引失效。 - 合理使用
EXPLAIN: 分析查询执行计划,找出性能瓶颈。 - 避免
OR条件: 可以改用UNION ALL。 - 分页查询: 使用
LIMIT和OFFSET,但大偏移量时性能差,可基于键的分页("seek method")优化。 - 批量操作: 使用批量
INSERT、UPDATE代替单条操作。
不同数据库系统的特性
虽然SQL是标准,但各数据库系统都有自己的方言和扩展。
| 特性 | MySQL | PostgreSQL | SQL Server | Oracle | SQLite |
|---|---|---|---|---|---|
| 类型 | 开源/商业 | 开源 | 商业 | 商业 | 开源 |
| 分页 | LIMIT offset, count 或 LIMIT count OFFSET offset |
LIMIT count OFFSET offset |
SELECT TOP N ... 或 OFFSET-FETCH |
ROWNUM 或 FETCH FIRST N ROWS ONLY |
LIMIT offset, count |
| 字符串连接 | CONCAT(str1, str2) 或 str1 || str2 |
str1 || str2 或 CONCAT(str1, str2) |
或 CONCAT(str1, str2) |
或 CONCAT(str1, str2) |
或 CONCAT(str1, str2) |
| 自增主键 | AUTO_INCREMENT |
SERIAL 或 IDENTITY |
IDENTITY(1,1) |
SEQUENCE 或 GENERATED ALWAYS AS IDENTITY |
INTEGER PRIMARY KEY AUTOINCREMENT |
| 高级特性 | 窗口函数(8.0+), JSON支持 | 极其强大,高级类型(数组、JSON、GIS),窗口函数,CTE | 窗口函数,CTE,强大的T-SQL | 企业级,强大的PL/SQL,高级分析 | 轻量级,嵌入式,功能相对基础 |
NoSQL简介
对于非结构化、半结构化或需要极高扩展性的数据,NoSQL(Not Only SQL)数据库是很好的选择。
- 文档数据库: 存储JSON/BSON格式的文档,如 MongoDB, CouchDB。
- 键值存储: 通过键来快速访问值,如 Redis, Amazon DynamoDB。
- 列族数据库: 按列族存储数据,适合大规模数据分析,如 Cassandra, HBase。
- 图数据库: 用于存储和查询节点和边之间的关系,如 Neo4j。
NoSQL数据库通常不使用SQL,而是提供自己的API或查询语言。
学习资源与总结
学习资源推荐
- 在线教程:
- SQLZoo: 交互式SQL学习网站。
- W3Schools SQL Tutorial: 简单易懂的入门教程。
- Mode Analytics SQL Tutorial: 结合实际数据的教程。
- 书籍:
- 《SQL必知必会》: 经典入门书籍。
- 《高性能MySQL》: MySQL领域的权威之作。
- 《SQL学习指南》: 内容全面,适合进阶。
- 练习平台:
- LeetCode (数据库标签): 刷题提升实战能力。
- HackerRank: SQL专项练习。
- 官方文档: 学习特定数据库的最佳资源。
SQL是数据科学、后端开发、数据分析等领域不可或缺的核心技能,掌握它需要:
- 扎实的基础: 理解数据库范式、主键外键、事务等概念。
- 熟练的查询能力: 精通
SELECT、JOIN、GROUP BY、子查询等。 - 高级应用能力: 学会使用窗口函数、CTE等现代SQL特性。
- 性能优化意识: 知道如何创建索引、分析执行计划、写出高效的SQL。
- 持续学习: 了解不同数据库的特性和NoSQL的发展趋势。
这份大全为你提供了一个全面的框架,希望它能成为你学习和工作中可靠的参考手册,祝你在数据库的世界里探索愉快!
