SQL 核心概念与实践总结
1. SQL 语言分类
SQL 语言主要分为以下几类:
- DQL(数据查询语言):用于数据查询,主要是 SELECT 语句
- DCL(数据控制语言):用于权限控制,如 GRANT、REVOKE
- TCL(事务控制语言):用于事务管理,如 COMMIT、ROLLBACK
- DDL(数据定义语言):用于定义数据库对象,如 CREATE、ALTER、DROP
- DML(数据操作语言):用于数据操作,如 INSERT、DELETE、UPDATE
2. 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();
```
3. 事务控制语言 (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; -- 回滚事务
```
4. 视图 (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;
```
5. 索引 (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;
```
6. 总结
SQL 是数据库操作的核心语言,掌握其不同分类和特性对于高效数据库开发至关重要。DQL 用于数据查询,TCL 用于事务管理,视图和索引则是优化数据库性能和安全性的重要工具。合理使用这些技术可以显著提高数据库应用的效率和可靠性。
在实际开发中,应根据具体需求选择合适的技术:
- 复杂查询可考虑使用视图简化
- 高频查询字段可考虑添加索引
- 重要数据操作应使用事务保证数据一致性
- 注意避免索引失效的情况以提高查询性能