本文目录导读:
图片来源于网络,如有侵权联系删除
《关系数据库标准语言SQL第三章整理手册》
SQL数据定义功能
1、模式的定义与删除
- 在关系数据库中,模式(Schema)是数据库对象的集合,包括表、视图、索引等,定义模式可以使用CREATE SCHEMA
语句。CREATE SCHEMA my_schema;
就创建了一个名为my_schema
的模式,这个模式可以用来组织相关的数据库对象,使得数据库结构更加清晰,当需要删除一个模式时,可以使用DROP SCHEMA
语句,但是要注意,如果模式中包含对象,需要先删除这些对象或者使用CASCADE
关键字来级联删除模式及其包含的所有对象,如DROP SCHEMA my_schema CASCADE;
。
2、基本表的定义、修改和删除
定义基本表
- 使用CREATE TABLE
语句来创建基本表,创建一个包含学生信息的表:
```sql
CREATE TABLE student (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
major VARCHAR(100)
);
```
- 这里定义了一个名为student
的表,其中id
列被定义为主键(PRIMARY KEY
),它能唯一标识表中的每一行记录。name
列是可变长度的字符串类型,最多能存储50个字符,age
为整数类型,major
为可变长度最多100个字符的字符串类型。
修改基本表
- 随着业务需求的变化,可能需要修改基本表的结构,可以使用ALTER TABLE
语句,如果要给student
表添加一个新的列gender
,可以使用ALTER TABLE student ADD COLUMN gender VARCHAR(10);
,如果要修改列的数据类型,比如将age
列的数据类型从INT
改为SMALLINT
,可以使用ALTER TABLE student ALTER COLUMN age SMALLINT;
,如果要删除列,如删除major
列,可以使用ALTER TABLE student DROP COLUMN major;
。
删除基本表
- 当某个表不再需要时,可以使用DROP TABLE
语句删除它,例如DROP TABLE student;
,需要注意的是,一旦删除表,表中的所有数据和结构信息都将丢失,所以在执行删除操作前要谨慎确认。
3、索引的建立与删除
建立索引
- 索引(Index)是一种提高数据库查询效率的数据结构,可以使用CREATE INDEX
语句创建索引,为student
表的name
列创建索引:CREATE INDEX idx_name ON student (name);
,索引可以加快对表中数据的查询速度,特别是在查询条件涉及到索引列时,当执行SELECT * FROM student WHERE name = 'John';
这样的查询时,如果name
列上有索引,查询速度会大大提高。
图片来源于网络,如有侵权联系删除
删除索引
- 当索引不再需要或者需要重新创建以优化性能时,可以使用DROP INDEX
语句删除索引,例如DROP INDEX idx_name;
,需要注意的是,虽然索引可以提高查询速度,但过多的索引也会增加数据库的维护成本,因为在对表进行插入、更新和删除操作时,索引也需要相应地更新。
数据完整性
1、实体完整性
- 实体完整性要求表中的每一行都有一个唯一的标识符,这通常通过主键(Primary Key)来实现,如前面在定义student
表时,id
列被指定为主键,这就保证了表中不会存在id
值相同的两行记录,主键的值不能为空(NULL),这是实体完整性的重要规则,如果试图插入一个id
值为NULL
的记录到student
表中,数据库系统将拒绝该操作并返回错误信息。
2、参照完整性
- 参照完整性是指在关系数据库中,外键(Foreign Key)的取值必须参照主表中主键的值,假设有一个course
表,其中包含course_id
(主键)和course_name
列,还有一个student_course
表,其中包含student_id
和course_id
列,这里student_course
表中的course_id
是外键,它参照course
表中的course_id
主键,这就意味着在student_course
表中插入记录时,course_id
的值必须是course
表中已经存在的course_id
值,否则数据库将拒绝插入操作,可以在创建表时定义外键约束来保证参照完整性,如:
```sql
CREATE TABLE student_course (
student_id INT,
course_id INT,
FOREIGN KEY (course_id) REFERENCES course(course_id)
);
```
3、用户定义完整性
- 用户定义完整性允许用户根据具体的业务规则定义一些特殊的约束条件,在student
表中,可以定义age
列的取值范围为18到50之间,这可以通过在创建表时使用CHECK
约束来实现,如:
```sql
CREATE TABLE student (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT CHECK (age >= 18 AND age <= 50),
major VARCHAR(100)
);
图片来源于网络,如有侵权联系删除
```
- 这样,当插入或更新student
表中的记录时,如果age
列的值不在18到50之间,数据库将拒绝该操作,用户定义完整性还可以包括一些更复杂的业务规则,例如根据其他列的值计算某一列的值,或者限制某一列的取值必须在一个预定义的集合中等。
视图
1、视图的定义与删除
定义视图
- 视图(View)是从一个或多个基本表(或视图)导出的虚拟表,可以使用CREATE VIEW
语句来定义视图,从student
表中创建一个只包含name
和major
列的视图:
```sql
CREATE VIEW student_info AS
SELECT name, major FROM student;
```
- 视图并不实际存储数据,它的数据是在查询视图时从基本表中动态获取的,视图可以简化复杂的查询,隐藏基本表的结构细节,提供一定的安全性(例如只让用户访问视图而不是直接访问基本表)。
删除视图
- 当视图不再需要时,可以使用DROP VIEW
语句删除它,例如DROP VIEW student_info;
,需要注意的是,如果其他视图或存储过程依赖于要删除的视图,可能需要先调整这些依赖关系,否则删除操作可能会导致错误。
2、视图的更新
- 视图的更新操作相对复杂,因为视图是虚拟表,并非所有的视图都可以更新,如果视图是基于单个基本表的简单查询,并且没有包含聚合函数、GROUP BY
、HAVING
等复杂操作,那么该视图可能是可更新的,对于前面定义的student_info
视图,如果要更新其中的name
列的值,可以尝试使用UPDATE student_info SET name = 'New Name' WHERE...;
,但是如果视图是基于多个表的连接查询或者包含了复杂的计算,那么直接更新视图可能会失败或者产生不可预期的结果,在这种情况下,可能需要通过更新基本表来间接影响视图的数据。
数据控制
1、授权
- 数据库中的授权(Grant)功能用于控制用户对数据库对象的访问权限,可以使用GRANT
语句授予用户对表的查询、插入、更新、删除等权限,假设存在用户user1
,要授予他对student
表的查询权限,可以使用GRANT SELECT ON student TO user1;
,如果要授予多个权限,可以在一个GRANT
语句中列出,如GRANT SELECT, INSERT ON student TO user1;
,还可以授予用户对视图的权限,操作方式与授予对表的权限类似,可以使用WITH GRANT OPTION
关键字来允许被授权用户将权限再授予其他用户,例如GRANT SELECT ON student TO user1 WITH GRANT OPTION;
。
2、收回权限
- 与授权相对应的是收回权限(Revoke)操作,当需要收回用户的某些权限时,可以使用REVOKE
语句,要收回user1
对student
表的查询权限,可以使用REVOKE SELECT ON student FROM user1;
,如果用户user1
曾经使用WITH GRANT OPTION
将查询权限授予了其他用户,当收回user1
的查询权限时,那些被user1
授予查询权限的用户的查询权限也会被级联收回。
关系数据库标准语言SQL第三章涵盖了数据库的核心定义和操作功能,从数据结构的定义到数据完整性的保证,再到视图的运用以及数据控制等方面,这些内容对于构建和管理关系数据库具有至关重要的意义,无论是数据库管理员还是开发人员,都需要深入理解这些概念并熟练掌握相关的SQL语句操作,以便高效地开发和维护数据库应用系统。
评论列表