- SQL 语言分类
SQL 语言主要分为以下几类:
-
DQL(数据查询语言):用于数据查询,主要是 SELECT 语句
-
DCL(数据控制语言):用于权限控制,如 GRANT、REVOKE
-
TCL(事务控制语言):用于事务管理,如 COMMIT、ROLLBACK
-
DDL(数据定义语言):用于定义数据库对象,如 CREATE、ALTER、DROP
-
DML(数据操作语言):用于数据操作,如 INSERT、DELETE、UPDATE
- 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();
```
- 事务控制语言 (TCL)
3.1 事务概念
事务是将一系列 DML 操作视为一个整体,保证它们要么都执行成功,要么都执行失败。
3.2 事务特性 (ACID)
-
原子性:事务中的所有操作要么全部完成,要么全部不完成
-
一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态
-
隔离性:多个事务并发执行时,彼此互不干扰
-
持久性:事务一旦提交,对数据库的改变是永久性的
3.3 事务并发问题
-
脏读:读到其他事务未提交的数据
-
幻读:读到其他事务添加或删除后提交的数据
-
不可重复读:读到其他事务修改后提交的数据
-
丢失修改:前后两次修改,丢失第一次修改的结果
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; -- 回滚事务
```
- 视图 (View)
4.1 视图概念
视图是一张虚拟表,不存储实际数据,而是基于一个或多个实际表的查询结果。
4.2 视图优点
-
保护隐私数据
-
简化复杂查询
-
提供逻辑数据独立性
4.3 视图使用注意事项
-
视图中不要有同名字段
-
不建议对视图进行 DML 操作
-
对视图主要进行查询操作
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;
```
- 索引 (Index)
5.1 索引概念
索引是一种数据结构(通常是 B+ 树),用于加快数据检索速度,采用"以空间换时间"的理念。
5.2 索引分类
-
全文索引
-
普通索引
-
主键索引
-
唯一索引
5.3 索引使用场景
-
适合创建索引:经常查询的列、连接条件列、范围查询列
-
不适合创建索引:
-
经常增删改的列
-
有大量重复数据的列
-
表记录太少
5.4 破坏索引的情况
-
对索引列进行模糊查询(如 LIKE '%value%')
-
对索引列使用函数
-
对索引列进行表达式计算
-
使用 OR 条件或取反操作
5.5 索引示例
```sql
-- 创建索引
CREATE INDEX index_emp_ename ON emp(ename);
-- 查看查询执行计划
EXPLAIN SELECT empno, ename, hiredate, job FROM emp WHERE empno = 7369;
```
- 总结
SQL 是数据库操作的核心语言,掌握其不同分类和特性对于高效数据库开发至关重要。DQL 用于数据查询,TCL 用于事务管理,视图和索引则是优化数据库性能和安全性的重要工具。合理使用这些技术可以显著提高数据库应用的效率和可靠性。
在实际开发中,应根据具体需求选择合适的技术:
-
复杂查询可考虑使用视图简化
-
高频查询字段可考虑添加索引
-
重要数据操作应使用事务保证数据一致性
-
注意避免索引失效的情况以提高查询性能