数据库原理(十 八)- 关系数据库标准化语言SQL

数据库原理(十 八)- 关系数据库标准化语言SQL

      • 前言
      • SQL概述
        • SQL的发展过程
        • SQL的特点
      • 数据定义
        • 模式的定义与删除
        • 基本表的定义、删除和修改
        • 索引的建立和删除
      • 数据查询
        • 单表查询
        • 连接查询
        • 嵌套查询
        • 集合查询
      • 数据更新
        • 插入数据
        • 修改数据
        • 删除数据
      • 空值的处理
        • 空值的产生
        • 空值的判断
        • 空值的约束条件
        • 空值的算术运算、比较运算和逻辑运算
      • 视图
        • 定义视图
        • 删除视图
        • 查询视图
        • 更新视图
        • 视图的作用
      • 借鉴

前言

结构化查询语言SQL是关系数据库的标准语言,也是一个通用的、功能极强的关系数据库语言。其功能不仅仅是查询,而是包括数据库模式创建、数据库数据的插入与修改、数据库安全性定义与控制等一系列功能

SQL概述

SQL的发展过程

  • 1974年由Boyce和Chamberlin提出,最初叫Sequel,并在IBM公司研制的关系数据库管理系统原型System R上实现
  • 1986年10月,美国国家标准局(ANSI)数据库委员会X3H批准了SQL作为关系数据库语言的美国标准,同年公布了SQL标准文本(SQL-86)
  • 1987年,国际标准化组织(ISO)也通过了这一标准

  • 数据库原理(十 八)- 关系数据库标准化语言SQL_第1张图片

SQL的特点

  • 综合统一
  • 高度非过程化
  • 面向集合的操作方式
  • 以同一语法结构提供多种使用方式
  • 语言简洁,易学易用

数据定义

关系数据库系统支持三级模式结构,其模式、外模式和内模式的基本对象由模式、表、视图和索引等。因此SQL的数据定义功能包括模式定义、表定义、视图和索引的定义。
数据库原理(十 八)- 关系数据库标准化语言SQL_第2张图片
操作对象之间的关系

一个关系数据库管理系统的实例中可以建立多个数据库,一个数据库中可以建立多个模式,一个模式下通常包括多个表、视图、索引等数据对象

模式的定义与删除

模式的定义

CREATE SCHEMA <模式名> AUTHORIZATION <用户名>

还可以进一步创建基本表、视图,定义授权

CREATE SCHEMA <模式名> AUTHORIZATION <用户名> [<表定义子句>|<视图定义子句>|<授权定义子句>]

删除模式

DROP SCHEMA <模式名> [CASCADE|RESTRICT] //级联删除|限制删除

基本表的定义、删除和修改

基本表的定义

CREATE TABLE <表名>(
<列名><数据类型>[列级完整性约束条件]
[,<列名><数据类型>[列级完整性约束条件]]
...
[,<表级完整性约束条件>]
)

数据类型

数据库原理(十 八)- 关系数据库标准化语言SQL_第3张图片
修改基本表

ALTER TABLE <表名>
[ADD [COLUMN] <新列名> <数据类型> [完整性约束]] //添加新的列
[ADD <表级完整性约束>] //添加新的约束
[DROP CONSTRAINT <完整性约束名> [RESTRICT|CASCADE]] //删除完整性约束      
[ALTER COLUMN <列名><数据类型>] //修改列名和数据类型                         

删除基本表

DROP TABLE <表名> [RESTRICT|CASCADE]

索引的建立和删除

建立索引

CREATE [UNIQUE|CLUSTER] index //唯一索引/聚簇索引
ON <表名>(<列名>[DESC|ASC][,<列名>DESC|ASC]]...) //降序|升序

修改索引

ALTER INDEX <旧索引名> RENAME TO <新索引名>

删除索引

DROP INDEX <索引名>

数据查询

数据查询是数据库的核心操作。SQL提供了SELECT语句进行数据查询,该语句具有灵活的使用方式和丰富的功能。其一般格式为:

SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>]
FROM <表名或视图名> [,<表名或视图名>...]|(<SELECT语句>)[AS]<别名>
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名> [ASC|DESC]]

单表查询

选择表中的若干列

  • 查询指定列
SELECT <列名>[,<列名>]... FROM <表名>
  • 查询全部列
SELECT * FROM <表名>
  • 查询经过计算的值
SELECT <算术表达式|字符串变量|函数> FROM <表名>
  • 取别名
SELECT <列名> <别名>[,<列名> <别名>]... FROM <表名> //列名和别名之间注意有空格

选择表中的若干元组

  • 消除取值重复的行
SELECT DISTINCT <列名> [,<列名>]... FROM <表名>
  • 查询满足条件的元组
SELECT <目标列表达式> [,<目标列表达式>] FROM <表名> WHERE<条件表达式>

常用的查询条件

数据库原理(十 八)- 关系数据库标准化语言SQL_第4张图片
查询年龄不满20岁的学生学号和姓名

SELECT Sno,Sname FROM student WHERE Sage<20

查询年龄在18~20岁之间的学生学号和姓名

SELECT Sno,Sname FROM student WHERE BETWEEN 18 AND 20

查询属于CS、MA和IS系的学生学号和姓名

SELECT Sno,Sname FROM student WHERE Sdept IN ('CS','MA','IS')

查询所有姓刘的学生姓名、学号和性别

SELECT Sno,Sname,Ssex FROM student where LIKE '刘%'

查询姓“欧阳”且全名为三个汉字的学生姓名和学号

SELECT Sno,Sname FROM student where LIKE '欧阳_'

查询DB_Design课程号和学分

SELECT Cno,Ccredit FROM Course WHERE LIKE 'DB/_Design' ESCAPE '/' 

//使用转义字符"/"添加在"_"之前转为普通"_"字符

查询没有成绩的学生学号和对应的课程号

SELECT Sno,Cno FROM SC WHERE Grade IS NULL

查询属于计算机系且年龄大于20的学生学号和姓名

 SELECT Sno,Cno FROM student WHERE Sdept = 'IS' AND Sage>20

聚集函数

查询学生总数

SELECT COUNT(*) FROM student

查询选修了课程的总人数

SELECT COUNT(DISTINCT Sno) FROM SC

查询1号选修课的平均成绩

SELECT AVG(Grade) FROM SC WHERE Cno='1'

查询1号选修课的最高成绩

SELECT MAX(Grade) FROM SC WHERE Cno='1'

查询1号选修课的最低成绩

SELECT MIN(Grade) FROM SC WHERE Cno='1'

查询学生20181210的选修课程的总学分

SELECT SUM(Ccredit) FROM SC WHERE Sno='20181210' group by cno

ORDER BY子句

查询年龄不满20岁的学生学号和姓名,按年龄进行升序排序

SELECT Sno,Sname FROM student WHERE Sage<20 ORDER BY Sage ASC

GROUP BY子句

GROUP BY子句用来对数据进行分组查询

SELECT sno FROM SC  group by sno having avg(Grade)>60

如果在查询条件中使用聚合函数,那么就在group by子句后使用having代替where使用

平均成绩大于60的学生学号

SELECT sno FROM SC  group by sno having avg(Grade)>60

连接查询

连接查询分为自然连接、外连接,而外连接又分为左外连接和右外连接,在之前的关系代数中我们知道了这几个的含义,这里不在进行说明

自然连接,这里使用student表和sc表相同的sno字段进行等号连接

select sno  grade from  student sc where student.sno=sc.sno and sno='20181210'

外连接

select sno  grade from  student join sc on (student.sno=sc.sno)

左外连接

select sno  grade from  student left join sc on (student.sno=sc.sno)

右外连接

select sno  grade from  student right  join sc on (student.sno=sc.sno)

嵌套查询

嵌套查询就是在一个查询语句中嵌套一个或多个子查询语句

select sno  sname from  student  where sno in (select sno from sc where grade > 90)

集合查询

select语句的查询结果是元组的集合,所以多个select语句的结果可进行集合操作,主要包括并操作、交操作和差操作

SELECT <列名>[,<列名>]... FROM <表名> [union|intersect|except] SELECT <列名>[,<列名>]... FROM <表名>

数据更新

数据更新操作分别是插入操作、修改操作和删除操作,向表中添加若干行数据、修改表中的数据和删除表中若干行数据

插入数据

insert into <表名><列名>[,<列名>]...values(<<对应列要添加的数据>[,<对应列要添加的数据>]... >),

(<<对应列要添加的数据>[,<对应列要添加的数据>]... >)... //这里可以用于插入多行数据

修改数据

update <表名> set <列名>=<表达式>[,<列名>=<表达式>]...[where <条件>]

删除数据

delete from <表名> [where <条件>]

空值的处理

所谓空值就是“不知道”或“不存在”或“无意义”的值,SQL语言中允许某些元组的某些属性在一定情况下取空值。一般有一下情况:

  • 该属性应该有一个值,但目前不知道它的具体值
  • 该属性不应该有值
  • 由于某种原因不便于填写

因此,空值是一个很特殊的值,含有不确定性,对关系运算带来特殊的问题,需要做特殊的处理

空值的产生

举个例子,在学生表插入数据时,因为目前还不知道张三的年龄,在这里暂时设置为空值

insert into student value"1","张三",null

空值的判断

空值的主要使用 is null 和 is not null进行判断

select sno sname from student where age is not null

空值的约束条件

  • 在属性定义时使用 not null 进行约束
  • 在属性定义时使用 unique 限制的属性不能取空值,码属性不能取空值

空值的算术运算、比较运算和逻辑运算

空值与另一个值(包括另一个空值) 的算术运算的结果为空值,空值与另一个值(包括另一个空值)的比较结果为 unknown。有了unknown 后,传统的逻辑运算中二值(true,false)逻辑成了三值逻辑

视图

视图是从一个或几个基本表(或视图)导出的表,它的特点有:

  • 视图一个虚表
  • 数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中
  • 所以基本表的数据一旦改变,从视图中查询出的数据也随之改变

定义视图

create view <视图名> [(<列名> [,<列名>]...)]
as <子查询>
[with check option]

删除视图

drop view <视图名> [cascade]

查询视图

select  <列名>[,<列名>]... from <视图名> [where 条件表达式 ]

更新视图

视图的更新实际上是对基本表的更新,而单独的对基本表进行更新是无法转换成对基本表的更新,每个数据库管理系统对视图是否可以进行更新的规定各不相同

insert into <视图名>(<列名>[,<列名>...]) values (<<对应列要添加的数据>[,<对应列要添加的数据>]... >)

update <视图名> set <列名>=<表达式>[,<列名>=<表达式>]...[where <条件>]

delete  from <视图名> [where <条件>]

视图的作用

  • 视图能够简化用户的操作
  • 视图使用户能以多种角度看待同一数据
  • 视图对重构数据库提供了一定程序的逻辑独立性
  • 视图能够对机密数据提供安全保护
  • 适当利用视图可以更清晰地表达查询

借鉴

王珊,萨师煊.数据库系统概论(第五版)[M].北京:高等教育出版社,2014:75-132.

你可能感兴趣的:(#,数据库系统概论)