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 用于事务管理,视图和索引则是优化数据库性能和安全性的重要工具。合理使用这些技术可以显著提高数据库应用的效率和可靠性。

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

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

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

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

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

相关推荐
西阳未落1 小时前
C语言柔性数组详解与应用
c语言·开发语言·柔性数组
wuyunhang1234561 小时前
Redis---集群模式
数据库·redis·缓存
咋吃都不胖lyh2 小时前
SQL-字符串函数、数值函数、日期函数
sql
sensenlin912 小时前
Mybatis中SQL全大写或全小写影响执行性能吗
数据库·sql·mybatis
咕噜咕噜啦啦2 小时前
Qt之快捷键、事件处理、自定义按键——完成记事本项目
开发语言·qt
Source.Liu2 小时前
【Pywinauto库】12.1 pywinauto.backend 后端内部实施模块
开发语言·windows·python·自动化
晚云与城2 小时前
今日分享:C++ deque与priority_queue
开发语言·c++
半梦半醒*2 小时前
正则表达式
linux·运维·开发语言·正则表达式·centos·运维开发
不吃洋葱.2 小时前
Bean.
java·开发语言