RaymondHuang
RaymondHuang
发布于 2023-10-06 / 88 阅读
0
0

Chapter 3 —— SQL语言(1)

数据库标准语言的基本功能

· 要实现一个能够灵活操作的数据库语言,需要满足以下要求

  1. 数据定义

  2. 数据操纵

  3. 数据库事务管理与运行管理

· 对应数据库的管理语言为

  1. DDL(Data Definition Language)

  2. DML(Data Manipulation Language)

  3. 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 破解版

· 破解教程参考此博客

· 记得全程断网操作!


评论