数据库标准语言的基本功能
· 要实现一个能够灵活操作的数据库语言,需要满足以下要求
数据定义
数据操纵
数据库事务管理与运行管理
· 对应数据库的管理语言为
DDL(Data Definition Language)
DML(Data Manipulation Language)
DCL(Data Control Language)
SQL语言概述
· 为了实现上述三个目标,我们设计了一套SQL语言(Structured Query Language,结构化查询语言),它被设计的很简单易学且能满足上面的三个要求。
· 接下来介绍SQL的一些特点。
综合统一
· SQL集DDL、DML、DCL于一身。
· 可以独立完成数据库生命周期中的所有活动,如创建、修改、查询、重做、恢复等。
· 即使数据库已经面向用户使用,也能随时修改模式,不影响使用。
高度非过程化
· SQL只需要提出"做什么",DBMS即可帮你完成操作。
· 不需要关心存储路径、存储方式等东西,这些都已经帮你完成好了。
面向集合的操作方式
· SQL操作的对象都是一条一条的记录,即我们之前说的元组。
多种使用方式、同一语法
· SQL是独立语言,可以直接在命令行与数据库进行交互。
· SQL又是嵌入式语言,它可以在所有主流编程语言中使用,如Python、Java。
语言简单,易学易用
· SQL的功能很强大,但实现核心功能只用到了9个动词。
支持三级结构
· SQL在设计上就支持了数据库的三级结构
创建(CREATE)
· 接下来我们以比较常用的MySQL数据库作为例子。
· 使用CREATE语句可以轻易创建数据库、表、视图和索引。
· 创建语句一般是DBA在用,我们通常使用如下语句进行创建数据库
CREATE DATABASE [IF NOT EXISTS] `数据库名`
· 其中括号内的IF NOT EXISTS就是如果数据库不存在的时候才创建。
· 因为数据库的命名允许使用横杠(-)和空格( ),因此需要用`把名字扩起来。
· 创建完数据库后就是创建表了,我们通常会使用如下语句创建表
CREATE TABLE `表名` (
`列名` 数据类型 约束条件,
`列名` 数据类型 约束条件,
......
);
· 注意,创建表要在某一个数据库下创建,因此要先进入某个数据库环境,使用如下指令可进入对应数据库
USE `数据库名`
· 当然,也可以用指定的方法来创建表,如下面的例子就代表在school数据库内创建students表。
CREATE TABLE `school`.`students` (
......
);
·来看一个实际例子,我们要在school数据库下创建一个students表
CREATE TABLE `school`.`students` (
`id` char(10) UNIQUE NOT NULL,
`name` varchar(20) NOT NULL,
`gender` int,
`house` int,
`major` int,
PRIMARY KEY(`id`)
);
·上述表的意思是建立一个学生表,属性id为长度必须为10的字符,非空,唯一;name为最大长度为20的字符串,非空;gender、house和major都是int;最后以id作为主键。
外键(FOREIGN KEY)
· 我们会使用FOREIGN KEY关键字来创建外键,一般会与REFERENCE连用,如
CONSTRAINT `限制名`
FOREIGN KEY(`外键名`)
REFERENCES `参考表名`(`外键在参考表中的位置`)
· 我们来看一个实际例子,这里要创建一个学生选课表
CREATE TABLE `SC`(
`Sno` char(9),
`Cno` char(4),
`Grade` smallint,
/* 主码由两个属性构成 */
PRIMARY KEY(`Sno`, `Cno`),
/* Sno是一个外码,参照的是Students表中的Sno属性 */
FOREIGN KEY(`Sno`) REFERENCES `Students`(`Sno`),
/* Cno是一个外码,参照的是Courses表中的Cno属性 */
FOREIGN KEY(`Cno`) REFERENCES `Courses`(`Cno`)
);
· 你还可以定义当外键被删除或被修改时,被参考的表会做出什么反应。
CONSTRAINT `限制名`
FOREIGN KEY(`外键名`)
REFERENCES `参考表名`(`外键在参考表中的位置`)
ON DELETE 模式,
ON UPDATE 模式;
其中模式有如下选择
· CASCATE模式是级联,即主表被删除或更新,参考它的所有表都会跟着改变,看一个例子
主表中的B01被删除后,参考它的房间表所有所属楼为BO1的记录都会被删除。
· NO ACTION和RESTRICT的作用都是在主表更新后,参考它的表不进行任何操作。
· SET NULL的作用顾名思义就是在主表更新后,参考它的表对应值会被设为空值。
索引(INDEX)
· 索引(Index)是一种数据结构,建立在原有的属性上,建立索引的目的是加快查询速度。
· 关系数据库中索引的实现方法通常是平衡树索引(B-TREE)和散列索引(HASH),前者是动态平衡,对索引的存储有优化,后者是查找速度更快。
· 索引的特点是需要占用额外的存储空间,并且在进行插入、更新、删除等操作的时候需要对索引进行维护。
· 过多或不合理的索引可能会导致性能下降。
· 对于一张已存在的表,我们使用CREATE INDEX语句来创建索引:
CREATE INDEX `索引名` ON `表名`(`想要创建索引的列名` [ASC|DESC])
· 其中ASC代表升序排列,DESC代表降序排列,默认使用ASC。
· 默认的索引方法为B-TREE。
· 我们也可以在创建表的时候,随表创建索引,如:
CREATE TABLE `student`(
`Sno` char(9) NOT NULL,
`Sname` varchar(20) NOT NULL,
`Ssex` char(2),
`Sage` smallint,
`Sdept` varchar(20),
PRIMARY KEY(`Sno`),
/* 给Sno创建一个名为Sno_idx的索引 */
KEY `Sno_idx`(`Sno`),
/* 给Sanme创建一个名为Sname_idx的索引 */
INDEX `Sname_idx`(`Sname`)
);
删除(DROP)
· 删除数据库
DROP DATABASE `数据库名`;
· 删除表
DROP TABLE `表名`; /* 要先USE进入某个数据库再删除其中的表 */
DROP TABLE `数据库名`.`表名` /* 也可以这么做 */
· 删除索引
DROP INDEX `索引名` ON `表名`;
修改(ALTER)
· 新增列
ALTER TABLE `表名` ADD `新建列名` 数据类型 约束条件;
· 修改列定义(不改名)
ALTER TABLE `表名` MODIFY `想修改的列名` 新数据类型 新约束条件;
· 修改列定义(改名)
ALTER TABLE `表名` CHANGE `想修改的列名` `新列名` 新数据类型;
· 修改列的默认值(有默认值可以改,没有就用MODIFY加)
ALTER TABLE `表名` ALTER `想修改的列名` SET DEFAULT 新默认值;
· 删除列
ALTER TABLE `表名` DROP `想删除的列名`;
· 修改表名(不建议进行该操作,会影响外键约束,需要全部手动更改!)
ALTER TABLE `旧表名` RENAME TO `新表名`;
· 添加主键
ALTER TABLE `表名` ADD PRIMARY KEY (`想作为主键的列名`);
· 添加外键
ALTER TABLE `表名` ADD CONSTRAINT `限制名` FOREIGN KEY (`外键名`) REFERENCES `参考表名`(`参考列名`);
· 删除主键
ALTER TABLE `表名` DROP PRIMARY KEY;
· 删除外键
ALTER TABLE `表名` DROP FOREIGN KEY `限制名`;
资源:Navicat Premium 16.1 破解版
· 破解教程参考此博客。
· 记得全程断网操作!