¶SQL
¶SQL概述
¶特点
- 语言统一
- 将数据定义语言DDL,数据操纵语言DML,数据控制语言DCL于一体
- 可以独立完成数据库生命周期的全部活动
- 高度非过程化
- 和非关系模型不同,无需了解数据存储过程
- 面向集合的操作方式
- 同一语法采用多种使用方式
- 语法简介

¶其他
- 三级模式结构

- 基本表

- 存储文件
可以理解为内模式中具体数据库实现时的真正数据存储 - 视图

¶数据定义
¶概念
¶SQL对象
模式定义 表定义 视图定义 索引定义


举个mysql的例子来说,数据库表示mysql本身,mysql的模式SCHEMA等价于database
1 | CREATE DATABASE XX; |
SCHEMA就是表的集合
¶数据字典

¶定义
- 模式
- 定义

CREATE SCHEMA <模式名> AUTHORIZATION <用户名>[<表定义 子句>|<视图定义子句>|<授权定义子句>]
- 删除
DROP SCHEMA <模式名> <CASCADE|RESTRICT
- CASCADE级联:直接删除模式中数据对象
- RESTRICT限制:当模式中存在数据对象(表,视图等)拒绝删除
这两个操作中,MYSQL只能使用部分功能
- 表
- 定义
CREATE TABLE <表名> (<列名> <数据类型> [<列级完整性约束>],...[<表级完整性约束>])
- <列级完整性约束>仅仅涉及到单一列
- <表级完整性约束>涉及到多个属性列
- 例子
-
建立“学生”表Student。学号是主码,姓名取值唯一。
CREATE TABLE Student (id INT PRIMARY KEY,name VARCHAR(20) UNIQUE,sex CHAR(20),age TINYINT,dept VARCHAR(20));
-
建立课程表
CREATE TABLE Course(id INT PRIMARY KEY ,name VARCHAR(20) UNIQUE ,pId INT, credit SMALLINT ,FOREIGN KEY (pId) REFERENCES Course(id));
-
建立选课表
CREATE TABLE SC (sId INT,cId INT, grade SMALLINT, PRIMARY KEY(sId,cId),FOREIGN KEY (cId) REFERENCES Student(id),FOREIGN KEY (cId) references Coures(id));
-
- 数据类型
MYSQL参考 - 修改表
ALTER TABLE <表名> [ADD[COLUMN] <新列名> <数据类型> [ 完整性约束 ] ] [ADD <表级完整性约束>] [DROP [ COLUMN ] <列名> [CASCADE| RESTRICT] ] [DROP CONSTRAINT<完整性约束名>[ RESTRICT | CASCADE ] ] [ALTER COLUMN <列名><数据类型> ] ;

MYSQL中使用MODIFY COLUMN <列名><数据类型>
和CHANGE COLUMN <列名><数据类型>
来修改
- 例子
-
向Student添加"入学时间"
ALTER TABLE Student ADD COLUMN entrance DATE;
-
mysql中将年龄修改为INT类型
ALERT TABLE Student MODIFY COLUMN age INT;
-
mysql对于主键的添加 删除
ALTER TABLE 表名 ADD CONSTRAINT PRIMARY KEY(列名)
ALTER TABLE 表名 DROP PRIMARY KEY
若要删除的主键被作为外键引用,则不能删除 | 若主键存在auto_increment则要修改该列,覆盖掉该属性,然后才能删除主键 -
外键约束
ALERT TABLE 表名 ADD CONSTRAINT FOREIGN KEY (列名) REFERENCES 表名(列名)
ALERT TABLE 表名 DROP FOREIGN KEY 外键名
通过show create table 表名可以查看外键名 -
唯一约束
ALTER TABLE 表名 ADD CONSTRAINT UNIQUE KEY (列名)
ALTER TABLE 表名 DROP (KEY|INDEX) 唯一索引名
唯一约束在mysql中通过索引删除 -
默认
ALTER TABLE 表名 ALTER 列名 {SET DEFAULT 值|DROP DEFAULT}
-
- 索引定义
- 创建和删除
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ALTER TABLE 表名 DROP INDEX 索引名

- coures表 name为unique key、自动创建了唯一索引,pid引用了id并且创建了一个非唯一索引
- sc表中,我不明白为何没有创建sid的非唯一索引,总而言之mysql创建外键时会创建一个非唯一索引
此处总结一部分实践操作: - mysql会给主键|外键创建索引,通过show indexes可查看
- 主键为唯一索引,在数据查询|插入|修改时都会对B+进行一次查询,也就是说sql语句中使用索引当作条件效率会高
- mysql会给外键创建一个非唯一索引,也就是说对于外键当查询条件效率也不会低
- 可以猜测的是当对外键进行操作时,会根据外键约束去查询引用的键,确定是否违反了引用完整性