SQL 数据定义
这么多年的学业生涯,完全不接触它,看人工作都得要会,离谱,那就看看吧。
目录
1 基本数据类型
1.1 数值型
| 类型 | 参数 | |
|---|---|---|
| 整型 | INTEGER/INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT | |
| 定点型 | DECIMAL(p, s)/NUMERIC(p, s) | 有效数字共位 |
| 浮点型 | FLOAT, DOUBLE | |
| 二进制数型 | FLOAT, DOUBLE | 位二进制数 |
1.2 日期时间型
| 类型 | 显示和输入格式 | |
|---|---|---|
| 年类型 | YEAR | ‘YYYY’ |
| 日期型 | DATE | ‘YYYY-MM-DD’ |
| 时间型 | TIME | ‘HH:MM:SS’ / ‘HHH:MM:SS’ |
| 日期时间型 | DATETIME | ‘YYYY-MM-DD HH:MM:SS’ |
| 时间戳型 | TIMESTAMP | ‘YYYY-MM-DD HH:MM:SS’ |
1.3 字符串型
| 类型 | 参数 | |
|---|---|---|
| 定长字符串型 | CHAR(n) | 最多储存个字符 |
| 变长字符串型 | VARCHAR(n) | 最多储存个字符 |
| 文本型 | TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT |
1.4 二进制串
| 类型 | 参数 | |
|---|---|---|
| 定长二进制串型 | BINARY(n) | 最多储存个字符 |
| 变长二进制串型 | VARBINARY(n) | 最多储存个字符 |
| 二进制对象型 | TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB |
1.5 枚举型
ENUM(值列表)
枚举型的值只能取自值列表
例
: ENUM('Mercury', 'Venus', 'Earth', 'Mars')
1.6 集合型
SET(值列表)
集合型的值只能是值集合的子集'Mercury, Earth'
例
: SET('Mercury', 'Venus', 'Earth', 'Mars')
2 创建关系模式
2.1 创建关系模式
CREATE TABLE
定义关系模式
例
: 创建
Student 关系, 其模式如下:
属性名 属性类型 属性含义 SnoCHAR(6)学号 SnameVARCHAR(10)姓名 SsexENUM('M', 'F')性别 SageINT年龄 SdeptVARCHAR(20)所在系
SQL 语句: CREATE TABLE Student ( Sno CHAR(6), Sname VARCHAR(10), Ssex ENUM('M', 'F'), Sage INT, Sdept VARCHAR(20) );
2.2 声明主键
PRIMARY KEY
声明关系的主键
例
: 将
Sno属性声明位Student关系的主键.
方法
1: CREATE TABLE Student ( Sno CHAR(6) PRIMARY KEY, Sname VARCHAR(10), Ssex ENUM('M', 'F'), Sage INT, Sdept VARCHAR(20) );方法
2: CREATE TABLE Student ( Sno CHAR(6), Sname VARCHAR(10), Ssex ENUM('M', 'F'), Sage INT, Sdept VARCHAR(20) PRIMARY KEY (Sno) );声明多个属性构成的主键时只能用方法
2.
2.3 声明外键
FOREIGN KEY
声明关系的外键
例
: 创建
SC 关系, 其模式如下:
属性名 属性类型 属性含义 SnoCHAR(6)学号 CnoCHAR(4)课号 GradeINT成绩 { Sno, Cno} 是SC的主键, Sno是SC的外键, 参照Student关系的主键Sno. CREATE TABLE SC ( Sno CHAR(6), Cno CHAR(4), Grade INT, PRIMARY KEY (Sno, Cno), FOREIGN KEY (Sno) REFERENCES Student (Sno) );
2.4 声明用户定义完整性约束
- 规定属性值非空
: NOT NULL; - 规定属性值不重复
: UNIQUE; - 规定数值型属性值自动递增
: AUTO_INCREMENT; - 定义属性的缺省值
: DEFAULT 缺省值; - 规定属性值必须满足表达式给出的条件
: CHECK (表达式)1.
例
: CREATE TABLE Student ( Sno CHAR(6), Sname VARCHAR(10) NOT NULL, Ssex ENUM('M', 'F') NOT NULL CHECK (Ssex IN ('M', 'F')), Sage INT DEFAULT 0 CHECK (Sage >= 0), Sdept VARCHAR(20), PRIMARY KEY (Sno) );
3 删除关系模式
DROP TABLE 关系名1, 关系名2, ..., 关系名n;
删除关系时会连同关系中的数据一起删除
4 修改关系模式
ALTER TABLE
- 增加
, 修改, 删除属性; - 增加
, 删除约束.
例
:
增加属性
在
Student 关系中增加属性Mno, 记录学生的班长的学号. ALTER TABLE Student ADD Mno CHAR(6);增加约束
将属性
Mno 声明为Student 关系的外键, 参照Student 的主键Sno. ALTER TABLE Student ADD CONSTRAINT fk_mno FOREIGN KEY (Mno) REFERENCES Student(Sno);删除属性
删除
Student 关系的Mno 属性. ALTER TABLE Student DROP Mno;删除约束
删除
Student 关系中Mno 属性上的外键约束fk_mno. ALTER TABLE Student DROP CONSTRAINT fk_mno;修改属性定义
将
Student 关系中Sname 属性的类型修改为VARCHAR(20) 且不重名. ALTER TABLE Student ALTER Sname VARCHAR(20) UNIQUE;
MySQL 使用ALTER TABLE Student MODIFY Sname VARCHAR(20) UNIQUE;
5 定义视图
5.1 创建视图
CREATE VIEW 视图名 [(属性名列表)] AS 子查询;
例
: 为选修了
3006 号课的计算机系(CS) 的学生建立视图, 列出学号, 姓名和成绩. CREATE VIEW CS_Student_on_DB AS SELECT Sno, Sname, Grade FROM Student NATURAL JOIN SC WHERE Sdept = 'CS' AND Cno = '3006';
CREATE VIEW中的子查询有很多限制条件
5.2 修改视图定义
ALTER VIEW 视图名 [(属性名列表)] AS 子查询;
例
: 修改视图
CS_Student_on_DB, 增加性别属性. ALTER VIEW CS_Student_on_DB AS SELECT Sno, Sname, Ssex, Grade FROM Student NATURAL JOIN SC WHERE Sdept = 'CS' AND Cno = '3006';
5.3 删除视图
DROP VIEW 视图名;
5.4 视图查询
与
例
: 查询计算机系
(CS) 没有通过”Database Systems”课考试的学生. SELECT Sno, Sname FROM CS_Student_on_DB WHERE Grade < 60;
Footnotes
-
MySQL 只解析CHECK, 但储存引擎并不处理. ↩