睿诚科技协会

SQL语言与数据库操作技术大全,如何快速掌握核心技能?

SQL语言与数据库操作技术大全

目录

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

数据库基础理论

在深入SQL之前,理解一些基本概念至关重要。

SQL语言与数据库操作技术大全,如何快速掌握核心技能?-图1
(图片来源网络,侵删)
  • 数据库: 有组织的数据集合,通常长期存储在计算机内、有共享性、统一管理。
  • 数据库管理系统: 管理数据库的软件,如 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。

SQL语言与数据库操作技术大全,如何快速掌握核心技能?-图2
(图片来源网络,侵删)
命令 描述 示例
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 聚合函数与分组

对一组值执行计算,并返回单个值。

SQL语言与数据库操作技术大全,如何快速掌握核心技能?-图3
(图片来源网络,侵删)
函数 描述
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)和精确匹配。
    • 哈希索引: 仅适用于等值查询(),速度极快,但不支持范围查询。
    • 全文索引: 用于在文本内容中执行关键词搜索。
    • 唯一索引: 确保索引列中的所有值都是唯一的。
  • 原则: 为WHERE子句、JOIN条件、ORDER BY子句中频繁使用的列创建索引,但索引会占用存储空间,并降低INSERT, UPDATE, DELETE速度,因此需谨慎使用。

2 视图

  • 定义: 一个虚拟的表,其结果集由存储的查询定义。
  • 优点:
    • 简化复杂查询: 将复杂的JOINWHERE逻辑封装起来。
    • 安全性: 可以限制用户只能访问视图中的特定列或行,而不是底层表。
    • 数据独立性: 应用程序基于视图,当底层表结构改变时,只需修改视图定义。

3 存储过程与函数

  • 存储过程: 在数据库中预编译并存储的一组SQL语句,可以接受参数,并返回状态值或结果集,用于封装业务逻辑。
  • 函数: 类似于存储过程,但必须返回一个值,通常用于计算,并可以在SQL语句的任何地方调用(如SELECT列表、WHERE子句)。

4 触发器

一种特殊的存储过程,在特定事件(如INSERT, UPDATE, DELETE)发生时自动执行,常用于实现数据完整性约束、审计日志等。

5 事务

将多个SQL操作捆绑成一个单一的执行单元,这个单元要么全部成功,要么全部失败,以确保数据的一致性,ACID特性是其核心:

  • 原子性: 事务不可分割。
  • 一致性: 事务使数据库从一个有效状态转移到另一个有效状态。
  • 隔离性: 并发执行的事务是相互隔离的。
  • 持久性: 一旦事务提交,其结果就是永久性的。

6 锁机制

用于实现事务的隔离性,防止并发操作导致的数据不一致。

  • 行级锁: 只锁定被访问的行,并发性最好。
  • 表级锁: 锁定整个表,并发性最差,但开销小。
  • 乐观锁: 假设冲突不常发生,只在更新时检查数据是否被修改。
  • 悲观锁: 假设冲突经常发生,在读取数据时就加锁。

7 SQL性能优化

  • *避免 `SELECT `**: 只查询需要的列。
  • WHEREJOIN条件添加索引
  • 避免在WHERE子句中对字段进行函数操作或表达式计算,这会导致索引失效。
  • 合理使用EXPLAIN: 分析查询执行计划,找出性能瓶颈。
  • 避免OR条件: 可以改用UNION ALL
  • 分页查询: 使用LIMITOFFSET,但大偏移量时性能差,可基于键的分页("seek method")优化。
  • 批量操作: 使用批量INSERTUPDATE代替单条操作。

不同数据库系统的特性

虽然SQL是标准,但各数据库系统都有自己的方言和扩展。

特性 MySQL PostgreSQL SQL Server Oracle SQLite
类型 开源/商业 开源 商业 商业 开源
分页 LIMIT offset, countLIMIT count OFFSET offset LIMIT count OFFSET offset SELECT TOP N ...OFFSET-FETCH ROWNUMFETCH FIRST N ROWS ONLY LIMIT offset, count
字符串连接 CONCAT(str1, str2)str1 || str2 str1 || str2CONCAT(str1, str2) CONCAT(str1, str2) CONCAT(str1, str2) CONCAT(str1, str2)
自增主键 AUTO_INCREMENT SERIALIDENTITY IDENTITY(1,1) SEQUENCEGENERATED 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或查询语言。


学习资源与总结

学习资源推荐

  • 在线教程:
  • 书籍:
    • 《SQL必知必会》: 经典入门书籍。
    • 《高性能MySQL》: MySQL领域的权威之作。
    • 《SQL学习指南》: 内容全面,适合进阶。
  • 练习平台:
  • 官方文档: 学习特定数据库的最佳资源。

SQL是数据科学、后端开发、数据分析等领域不可或缺的核心技能,掌握它需要:

  1. 扎实的基础: 理解数据库范式、主键外键、事务等概念。
  2. 熟练的查询能力: 精通SELECTJOINGROUP BY、子查询等。
  3. 高级应用能力: 学会使用窗口函数、CTE等现代SQL特性。
  4. 性能优化意识: 知道如何创建索引、分析执行计划、写出高效的SQL。
  5. 持续学习: 了解不同数据库的特性和NoSQL的发展趋势。

这份大全为你提供了一个全面的框架,希望它能成为你学习和工作中可靠的参考手册,祝你在数据库的世界里探索愉快!

分享:
扫描分享到社交APP
上一篇
下一篇