SQL 核心概念与实践总结

  1. SQL 语言分类

SQL 语言主要分为以下几类:

  • DQL(数据查询语言):用于数据查询,主要是 SELECT 语句

  • DCL(数据控制语言):用于权限控制,如 GRANT、REVOKE

  • TCL(事务控制语言):用于事务管理,如 COMMIT、ROLLBACK

  • DDL(数据定义语言):用于定义数据库对象,如 CREATE、ALTER、DROP

  • DML(数据操作语言):用于数据操作,如 INSERT、DELETE、UPDATE

  1. DQL 数据查询语言详解

2.1 DQL 组成结构

```sql

SELECT 字段列表

FROM 表名

WHERE 条件

GROUP BY 分组字段

HAVING 分组后条件

ORDER BY 排序字段

LIMIT 分页限制

```

2.2 示例查询

```sql

-- 计算每个部门工资低于1000的员工数量

SELECT COUNT(empno), deptno

FROM emp

WHERE sal < 1000

GROUP BY DEPTNO;

-- 查询没有奖金的员工,按部门编号倒序排列

SELECT FROM emp

WHERE comm IS NULL

ORDER BY deptno DESC;

-- 查询入职超过10年的员工

SELECT FROM emp

WHERE DATE_ADD(HIREDATE, INTERVAL 10 YEAR) < NOW();

```

  1. 事务控制语言 (TCL)

3.1 事务概念

事务是将一系列 DML 操作视为一个整体,保证它们要么都执行成功,要么都执行失败。

3.2 事务特性 (ACID)

  • 原子性:事务中的所有操作要么全部完成,要么全部不完成

  • 一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态

  • 隔离性:多个事务并发执行时,彼此互不干扰

  • 持久性:事务一旦提交,对数据库的改变是永久性的

3.3 事务并发问题

  • 脏读:读到其他事务未提交的数据

  • 幻读:读到其他事务添加或删除后提交的数据

  • 不可重复读:读到其他事务修改后提交的数据

  • 丢失修改:前后两次修改,丢失第一次修改的结果

3.4 事务隔离级别

从低到高分为:

  1. 读未提交数据

  2. 读已提交数据

  3. 可重复读

  4. 串行化(可序列化)

3.5 事务示例

```sql

-- 创建账户表

CREATE TABLE account(

id INT PRIMARY KEY AUTO_INCREMENT,

uname VARCHAR(10) NOT NULL,

balance DOUBLE CHECK(balance >= 0)

);

INSERT INTO account VALUES(NULL, '张三', 500);

INSERT INTO account VALUES(NULL, '李四', 300);

-- 使用事务进行转账操作

START TRANSACTION;

UPDATE account SET balance = balance - 500 WHERE id = 1;

UPDATE account SET balance = balance + 500 WHERE id = 2;

COMMIT; -- 提交事务

-- ROLLBACK; -- 回滚事务

```

  1. 视图 (View)

4.1 视图概念

视图是一张虚拟表,不存储实际数据,而是基于一个或多个实际表的查询结果。

4.2 视图优点

  • 保护隐私数据

  • 简化复杂查询

  • 提供逻辑数据独立性

4.3 视图使用注意事项

  1. 视图中不要有同名字段

  2. 不建议对视图进行 DML 操作

  3. 对视图主要进行查询操作

4.4 视图示例

```sql

-- 创建视图

CREATE VIEW v_empDeptSalgrade AS

SELECT e., d.dname, d.loc, s.grade

FROM emp e

INNER JOIN dept d ON e.deptno = d.deptno

INNER JOIN salgrade s ON e.sal >= s.LOSAL AND e.sal <= s.HISAL;

-- 使用视图查询

SELECT FROM v_empDeptSalgrade WHERE grade = 3;

```

  1. 索引 (Index)

5.1 索引概念

索引是一种数据结构(通常是 B+ 树),用于加快数据检索速度,采用"以空间换时间"的理念。

5.2 索引分类

  • 全文索引

  • 普通索引

  • 主键索引

  • 唯一索引

5.3 索引使用场景

  • 适合创建索引:经常查询的列、连接条件列、范围查询列

  • 不适合创建索引:

  • 经常增删改的列

  • 有大量重复数据的列

  • 表记录太少

5.4 破坏索引的情况

  1. 对索引列进行模糊查询(如 LIKE '%value%')

  2. 对索引列使用函数

  3. 对索引列进行表达式计算

  4. 使用 OR 条件或取反操作

5.5 索引示例

```sql

-- 创建索引

CREATE INDEX index_emp_ename ON emp(ename);

-- 查看查询执行计划

EXPLAIN SELECT empno, ename, hiredate, job FROM emp WHERE empno = 7369;

```

  1. 总结

SQL 是数据库操作的核心语言,掌握其不同分类和特性对于高效数据库开发至关重要。DQL 用于数据查询,TCL 用于事务管理,视图和索引则是优化数据库性能和安全性的重要工具。合理使用这些技术可以显著提高数据库应用的效率和可靠性。

在实际开发中,应根据具体需求选择合适的技术:

  • 复杂查询可考虑使用视图简化

  • 高频查询字段可考虑添加索引

  • 重要数据操作应使用事务保证数据一致性

  • 注意避免索引失效的情况以提高查询性能

相关推荐
twcc_come5 分钟前
安全策略配置实验报告
开发语言·php
张人玉8 分钟前
基于 Vue 3 + ECharts + Express + SQLite 构建的新能源汽车销量数据分析与可视化平台——新能源汽车销量数据分析系统
数据库·vue.js·sqlite·echarts
2601_9638702219 分钟前
基于Python的晋江文学城热门作品数据分析与可视化
开发语言·python·数据分析
其实防守也摸鱼1 小时前
Kimi K3深度测评:长文本之外的真实力
运维·开发语言·网络·人工智能·python·学习·安全
冻柠檬飞冰走茶2 小时前
PTA基础编程题目集 7-7 12-24小时制(C语言实现)
c语言·开发语言·数据结构·算法
梦幻通灵2 小时前
Java中finally失效的几种情况【持续更新】
java·开发语言
月落归舟2 小时前
SpringMVC 多种响应返回方式
java·开发语言
长不胖的路人甲2 小时前
二叉排序树(BST)Java 完整实现 + 删除思路详解
java·开发语言·算法
geovindu2 小时前
python: Breadth First Search Algorithm and Depth First Search Algorithm
开发语言·后端·python·算法·搜索算法
笨笨饿2 小时前
#102_Codex无在VSCold无法打开
java·c语言·数据库·笔记