DBMS笔记 04 SQL语言
SQL 是一种非过程化、面向集合的数据库语言,涵盖数据定义、查询、操纵和控制四大功能,通过 SELECT、DDL 和 DML 等语句实现对数据的全面管理。 其核心在于查询机制(WHERE、GROUP BY、HAVING、JOIN 等)以及视图与约束的使用,用于高效获取数据并保证数据结构与安全性。
DBMS笔记 04 SQL语言
第四章 SQL
4.1 SQL 语言特点
- SQL 四大功能:
- 数据查询(DQL):SELECT
- 数据定义(DDL):CREATE, DROP, ALTER
- 数据操纵(DML):INSERT, DELETE, UPDATE
- 数据控制(DCL):GRANT, REVOKE, DENY
- SQL 特点:综合性、非过程化、面向集合、可嵌入其他语言。
4.2 数据定义 (DDL)
- 数据库模式
- CREATE SCHEMA / DROP SCHEMA
- 基本表
- CREATE TABLE 表名 (列名 类型 [完整性约束], … )
- ALTER TABLE 修改表结构(加列、删列、改属性、加约束等)
DROP TABLE 表名 [RESTRICT CASCADE]
- 视图(见 4.5)
- 索引
CREATE [UNIQUE CLUSTER] INDEX 索引名 ON 表(列) - DROP INDEX 索引名
- 常见约束:
- PRIMARY KEY 主键
- UNIQUE 唯一
- NOT NULL 非空
- CHECK 检查
- DEFAULT 默认值
- FOREIGN KEY 外键
4.3 数据查询 (DQL) — SELECT
基本格式:
SELECT [ALL|DISTINCT] 列名/表达式
FROM 表名
[WHERE 条件]
[GROUP BY 列名 [HAVING 条件]]
[ORDER BY 列名 ASC|DESC];
功能
- 投影查询:选列
- 选择查询:WHERE 条件
- 排序:ORDER BY
- 聚合函数:COUNT, SUM, AVG, MAX, MIN(只能用于 SELECT/HAVING,不可在 WHERE)
- 分组:GROUP BY … HAVING
- 连接查询:内连接、自然连接、外连接(LEFT/RIGHT OUTER JOIN)
- 嵌套查询:子查询,可分相关子查询与非相关子查询
- IN, EXISTS, ANY, ALL
4.4 数据更新 (DML)
- 插入:
INSERT INTO 表名 (列名1, …) VALUES (值1, …); - 修改:
UPDATE 表名 SET 列=值 … WHERE 条件; - 删除:
DELETE FROM 表名 WHERE 条件;
4.5 视图 (VIEW)
- 创建:
CREATE VIEW 视图名 AS SELECT … [WITH CHECK OPTION]; - 删除:
DROP VIEW 视图名; - 更新限制:
- 单表视图,且不含聚合、DISTINCT、GROUP BY、子查询时可更新。
- 否则视图不可更新。
- 作用:
- 简化查询
- 提高安全性(限制用户访问范围)
- 逻辑独立性(隐藏底层结构变化)
- 聚焦用户关心数据
对比分析
- WHERE vs HAVING
- WHERE:过滤行,在分组前执行。
- HAVING:过滤组,在 GROUP BY 后执行。
- DELETE vs DROP vs TRUNCATE
- DELETE:删除表中数据(结构仍在)。
- DROP:删除整个表结构(定义和数据都没了)。
- TRUNCATE(本书没细讲,扩展):删除表中所有行但保留结构。
- 主键 vs 唯一约束
- PRIMARY KEY:唯一且非空。
- UNIQUE:唯一但可空。
- 视图可更新条件:不能包含聚合函数、DISTINCT、GROUP BY、连接、多表,否则不可更新。
概念阐释
- WHERE 子句中不能用聚合函数 ✅
因为聚合是对组运算,只能在 SELECT 或 HAVING 出现。 - HAVING 和 WHERE 的区别 ✅
HAVING 是对分组结果筛选,WHERE 是对原始行筛选。 - DELETE FROM employee 与 DROP TABLE employee 区别 ✅
- DELETE:只删数据,不删表结构。
- DROP:删表定义+数据,彻底没了。
- Primary Key 与 Unique 区别 ✅
- Primary Key:唯一 + 非空。
- Unique:允许空值。
- SQL 的非过程化特征 ✅
SQL 描述要什么结果,而不关心如何实现。 - GROUP BY 子句不能单独和 HAVING 用 ✅
必须先 GROUP BY,再 HAVING;HAVING 不能脱离分组。 - 题里 “在视图上定义新表” 的操作是否可能? ❌
不可以,视图是虚拟表,不能在上面再定义基本表。
本文由作者按照 CC BY-NC 4.0. 进行授权
...

Comments
评论区