教材:王珊 萨师煊 编著 数据库系统概论(第5版) 高等教育出版社
注:文档高清截图在后

我个人也是 SQL 的初学者,教程难免出错。如果发现 SQL 语句相关的教程有错,请大家千万千万要指出来。

第3章 关系数据库标准语言SQL

3.1 SQL概述

1、结构化查询语言(Structured Query Language,SQL)是关系数据库的标准语言,也是一个通用的、功能极强的关系数据库语言。

2、SQL的特点:
【1】综合统一。
SQL集数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)于一体,可以独立完成数据库的生命周期中的全部活动,包括:
(1)定义、修改、删除关系模式,定义、删除视图,插入数据,建立数据库。
(2)对数据库中的数据进行查询与更新。
(3)数据库的重构和维护。
(4)数据库的安全性与完整性的控制,以及事务控制。
(5)嵌入式SQL和动态SQL定义。
与非关系模型的数据库不同,通过SQL构建的数据库在投入运行后可以随时逐步修改模式,不影响数据库的运行。而非关系模型数据库在运行后,如果需要修改模式,必须停止运行、转储数据,修改模式并便于后重装数据库,不但操作麻烦,而且带来了巨量的维护成本。
【2】高度非过程化。
非关系数据模型的DML是面向过程的语言,完成某项请求时必须指定存取路径。用SQL进行操作时,只用指定“做什么”,而无需指明“怎么做”,这部分内容会由系统自动完成。这大大减轻了用户负担,且有利于提高数据独立性。
【3】面向集合的操作方式。
非关系数据模型采用面向记录的操作方式,操作对象是单条记录。如果需要对大量记录进行操作,必须一条一条把所有需要操作的记录枚举出来,而且需要说明具体的处理过程,如按照哪条路径、如何循环等。SQL可以对元组的集合一并进行某项操作,极大减少了工作量。
【4】以同一语法结构提供多种使用方式。
SQL可以作为独立的语言,能独立地应用于联机交互的使用方式,可以直接输入SQL命令对数据库操作。而且SQL还可以作为嵌入式语言嵌入到高级语言(C++、Java等)中,程序员在设计相应程序时可以直接操作数据库。两种不同的使用方式下,SQL的语法结构基本一致。这个特点提供了极大的灵活性与方便性。
【5】语言简洁、易学易用。SQL的核心功能只有9个词:
select, create, drop, alter, insert, update, delete, grant, revoke
SQL接近英语口语,易于学习和使用。

3、没有一个数据库系统能支持SQL标准的全部概念和特性。许多厂商的SQL的基本命令集作了不同程度的扩充或修改,可以支持标准以外的一些功能特性。目前SQL的标准的最新版本是SQL 2016。各厂商的数据库产品(Oracle / MySQL / SQL Server等)对SQL的支持也有所不同,具体需要查找相应的资料。

3.3 数据定义

1、SQL的数据定义语句可以对模式、表、视图、索引进行操作。在SQL标准中,模式和视图的定义不能被修改。如果需要修改,只能删除后重建。表和索引则是可以被修改的。一个关系数据库管理系统的实例(instance)或者项目(project)中可以建立多个数据库,一个数据库可以建立多个模式,一个模式可以包括多个表、视图、索引等对象。

2、所有的SQL命令可以在命令行中完成,也可以在数据库产品提供的GUI(图形界面)中完成。例如MySQL中就有对应的命令行来执行SQL语句,也可以采用PHP语言。而MySQL Workbench则是设计数据库的一个GUI。至于Microsoft的SQL Server,则需要在安装SQL Server之后,额外安装SQL Server Management Studio(SSMS)来进行。SSMS在新版的SQL Server中已经不再一起提供,需要单独下载安装。新建Query(请求)文件后,就可以输入SQL语句并执行。

3、定义一个模式或数据库可以通过如下的语句:
MySQL:

create schema s;
create database d;

执行以后,可以在模式选项卡中看到新增的模式。如果没有,则需要右键并刷新。

MySQL不支持书本上的authorization命令。
SQL Server中,输入:

create schema s authorization andy;

来建立模式s(此种输入方式不允许名称含有特殊符号,如果需要输入如-之类的字符,应该把名称加上引号),并指定用户名andy(SQL Server对大小写不敏感)。但是,指定的用户名必须存在于数据库的Users中,否则会报错。如果没有,需要先创建对应的用户。默认情况下是对内置的master数据库进行操作的。在Users文件夹上右键,选择“新用户”,然后输入用户名和登录名。这要求登录名也必须存在,否则依然会报错。

在启动SQL Server的时候会有选择服务器的界面。如果是第一次启动,一般只有本机可选,且身份验证只有“Windows验证”一种方式。此时选择连接即可。界面加载完毕后,在服务器的“安全”文件夹中可以看到“登录名”文件夹,右键并选择新建。输入登录名和密码后,在“服务器角色”一栏把全部的权限都打勾。然后在“状态”一栏,确保“连接到数据库引擎”和“登录”都被授权,然后确定。再开始建立需要的用户名。输入用户名和密码后,在“拥有的模式”和“成员关系”两个选项卡中,把除了“Guest”以外的框都选中,然后确定,就可以正确执行上面的语句了。


要将一个模式彻底删除,在MySQL中输入如下语句:

drop schema s;

MySQL的drop命令默认是级联(cascade)的,也就是说被删除对象包括的内容会全部一起删除。而SQL Server不允许这种操作,如果被删除的对象与其它内容相关联,则会直接报错。在使用两个数据库产品编写SQL语句时,都不能像书本的示例那样在drop命令的最后直接添加cascade或restrict修饰。
MySQL和SQL Server中,彻底删除一个模式的写法是一样的:

drop schema s;

用SQL Server编写SQL语句时,一个Query文件不允许和同时出现,否则报错。如果在创建完毕后需要删除,则不能将创建和删除的语句写在同一个Query文件中。(一个解决办法见下文)
SQL Server中,可以在不创建新模式的情况下直接建立一个新的表。但是MySQL则不可以。MySQL中,如果要求不创建新模式而直接建立一个新表,需要在Workbench的模式选项卡中选中对应的模式。现在我们来创建一个模式s和包含的表t:

create schema s
create table t(作者 varchar(64),书名 varchar(64),范围 varchar(64),日期 date);

MySQL中,第一行的结尾要加分号,并将表格名写成s.t,否则报错。SQL Server中则不要在第一行加分号,否则报错。
运行结果:

每一个属性可以指定如下的数据类型:

不同的数据库产品中,这些类型还有别名:

接下来给出指定主码、外码,修改基本表内容的示例。
SQL Server:

create schema s
create table 已阅读作品(id int,作者 varchar(64),书名 varchar(64),范围 varchar(64),日期 date,primary key(id))
create table student(no int,name varchar(32),major varchar(32),constraint pk primary key(no,name,major))
create table participant(no int,name varchar(32),major varchar(32),eventname varchar(32),foreign key(no,name,major) references student(no,name,major));

其中constraint pk可以去掉。no和name因为和内置命令重名,在GUI中显示成蓝色。如果不希望如此显示,可以打引号,创建表格后的名称不会包含引号。
MySQL:

create schema s;
create table s.已阅读作品(id int,作者 varchar(64),书名 varchar(64),范围 varchar(64),日期 date,primary key(id));
create table s.student(no int,name varchar(32),major varchar(32),constraint pk primary key(no,name,major));
create table s.participant(no int,name varchar(32),major varchar(32),eventname varchar(32),foreign key(no,name,major) references s.student(no,name,major));

运行结果:

接下来,演示增加列(属性)、修改数据类型与约束条件的示例:
如果采用SQL Server,接下来,删去刚才的代码中第二行的

,primary key(id)

并在刚才的Query文件中补充以下语句:

go
alter table s.student add GPA numeric(3,2)
alter table s.participant add unique(no)
alter table s.已阅读作品 alter column id bigint
exec sp_rename 's.已阅读作品.id','ID'
alter table s.已阅读作品 add unique(ID)

在左侧的“对象浏览器”上找到刚才建立的模式和表,删除,然后重新执行整个Query,自行观察并体会增加列、增加约束条件、改变数据类型、重命名列的语句的用法。通过数据库产品的图形界面和SQL语句都可以修改数据库内容。
go是batch的分隔符,可以在【工具→选项→查询执行】中修改为其它标志。添加go以后,可以避免错误提示“…… must be the only statement in the batch.”。

如果采用MySQL,则在“导航”栏中的“模式”选项卡中删除刚才建立的模式s后,删去刚才的代码中第二行的

,primary key(id)

并在Query中补充下列SQL语句:

alter table s.student add GPA numeric(3,2);
alter table s.participant add unique(no);
alter table s.已阅读作品 modify column id bigint;
alter table s.已阅读作品 change id ID bigint;
alter table s.已阅读作品 add unique(ID);

通过数据库产品的图形界面和SQL语句都可以修改数据库内容。
运行结果分别是:

在MySQL中,删除或注释刚才全部的SQL语句,然后输入:

drop schema s;

直接删除整个模式s。
在SQL Server中,删除或注释刚才全部的SQL语句,然后输入:

drop table s.participant
drop table s.student
drop table s.已阅读作品
drop schema s

来删除全部表格,然后删除整个模式。如果将上述语句的第一行和第二行调换则会报错,因为s.student被s.participant参照,不允许被直接删除。
最基础的SQL语句教程就到这里。可以发现,不同数据库产品对SQL语句的语法要求是不同的,不能全部按照课本上的内容来学习。课本本章后续的SQL语句语法相关的内容不会被写入接下来的归纳梳理中,大家应该根据自己使用的数据库产品自行搜索其它资料来学习SQL语句的更多使用。



























更多推荐

【梳理】数据库系统概论 第3章 关系数据库标准语言SQL 3.1 SQL概述 3.3 数据定义(瞬间吐血弃坑警告:不要照搬书上的SQL语句 · 附:图文MySQ