chapter_4

概述

SQL发展

image-20210117214210476

注:关键词是哪些功能,尤其第一个create alter drop是定义功能

1.SQL功能强大,实现了数据定义、数据操纵、数据控制等功能

2.SQL语言简洁,只用少量的动词就实现了核心功能

3.SQL支持关系数据库的三级模式结构

4.SQL语言能嵌入到其他高级语言所写的程序中

注:语句格式

image-20210117214252905 image-20210117214304490

补充:模式 create/drop schema <模式名> authorization <用户名> 定义模式=定义命名空间,可以进一步定义数据库对象等

补充:索引:create/drop [ unique/cluster ] index <索引名> on <表名>(....列)

基本表定义创建

基本表修改

查询结果显示select

基础不再赘述

1.在SQL查询语句中,若结果中需要显示一个关系表的所有属性用*号

2.去除结果中重复的元组 select distinct ****【默认不去除】

3.查询结果计算 【返回的结果】

  • 聚集函数:count/sum/avg/max/min [all|distinct] <列>

  • 对于属性的空值,除count()外都不考虑,count()只计算个数需要考虑

  • 数学函数/字符串函数/日期函数

举例:select

查询结果排序order by

5.SQL的查询语句中,重命名目标列的方式:

  • 在重命名对象后用AS表示出新的名称 ,age as age1,

  • 在重命名对象后空格加新的名称 ,age age1,

  • 【不可以】在重命名后以括号形式表示新的名称

查询满足条件 like in

元组条件表达式:

1.运算符:+- / % = > < and or not* 比如:5/3=1

**2.谓词:[not] between ..and .. 范围 [not] LIKE .... **匹配

[not] IN (列名....) 指定集合 IS [not] NULL

image-20210117225758131

  1. 其中LIKE 用于部分匹配查询[单引号]

其中字符串表达式通配符

_ 表示任意单个字符[可以是0个字符]

% 表示长度可为0的任意长字符串

比如查找DB_Design 则 LIKE 'DB I_ Design' ESCAPE 'I'

​ 前面用添加转义字符,后面补充 ESCAPE 'I'

  1. 其中IN 用于判断一个值是否属于集合里面

分组聚集group by、having

1.根据属性名1,属性名2值依次进行分组;2.having子句对分组后的结果进行筛选

连接查询join

多表连接查询

注意连接时,需要补充where中的内容 等价关系

外连接查询

from <左关系 > left |right|full [outer] join <右关系 > on <连接条件>

【常规/内连接】from <左关系 > [inner] join <右关系 > on <连接条件>

自身连接查询

举例练习:设有关系R(A,B,C)和S(C,D)。与SQL语句select A,B,D from R,S where R.C=S.C等价的关系代数表达式是( )。πA,B,D(σR.C= S.C(R×S))

嵌套查询方式where中in

根据子查询中处理的数据是否与父查询的当前元组有关,

可以把嵌套查询分为独立子查询和相关子查询

  1. 谓词IN【一个值是否属于一个集合】

    image-20210117232440270

  2. 比较操作符

    image-20210117232523444

  3. 量词ANY ALL【部分支持】

ANY 的语义为查询结果中的某个值,当子查询结果中有某一 个值满足比较运算符,比较运算结果则为真。

ALL的语义为查询结果中的所有值,当子查询结果中每一个值 都满足比较运算符,比较运算结果才为真。

image-20210117232718447 image-20210117232743279

等价关系【因为部分支持any和all量词,所以可以替换】

  1. 谓词 exisits【相关子查询】

    因为子查询的查询条件(sc.sno)需要用父查询的属性(s.sno)

集合运算

select语句返回的是集合,多个select语句可以返回多个集合

两个参与集合查询的select语句中,查询结果不仅要具备相同的属性名,而且属性名的排列顺序也要一致。

并union

交intersect

差except

数据更新

  1. 插入元组

**insert into <表名> (属性名,.....) value (值....) **可插入多个元组

  • 常量值与相应的属性名值域相同、个数相同。

  • 元组的某属性没在INTO后出现,则这些属性上的值取空值NULL。

  • INTO中没有指明任何属性,则VALUES子句中新插入的元组在每个属 性上必须有值,且常量值的顺序要与表定义中属性的顺序一致。

  • INSERT语句可以往视图中插入数据

举例:INSERT INTO SC(SNO,CNO) VALUES ('S31','C01');

​ INSERT INTO S VALUES (‘S31’,‘王浩’,‘计算机’,‘1999-10-15’,‘男’) ;

或者插入的元祖是某个子查询的结果

举例:插入“计算机”系学生选修“数据库”课程的选课记录。

INSERT INTO SC(SNO,CNO)

​ SELECT SNO,CNO FROM S,C WHERE SD='计算机' AND CN='数据库';

  1. 修改属性值

update <表名> set <属性>=<值> ,......... where <条件> 可修改多个属性值

  1. 删除元组

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

举例:删除成绩低于所有课程平均成绩的选课元组

DELETE FROM SC WHERE GRADE<(SELECT AVG(GRADE) FROM SC);

  1. 更新操作的完整性检查

更新操作不能满足参照完整性时,采用的处理策略

拒绝执行(NO ACTION) •产生级联操作(CASCADE) •设置为空值(SET NULL)

  1. 更新操作不对关系表的模式结构进行改变

  2. 更新往往是在查询的基础上操作,更新也可能会嵌套子查询

  3. 更新需要考虑数据库定义的各类完整性约束

视图

视图(View)并不在数据库中实际存在,而是一种虚拟表,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。

即视图就是执行查询语句后所返回的结果集,所以在创建视图的时候,主要就是创建这条SQL查询语句。

对于普通的数据表来说,视图具有以下的一些特点:

1、简单:因为视图是查询语句执行后返回的已经过滤好的复合条件的结果集,所以使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件。

2、安全:使用视图的用户只能访问他们被允许查询的结果集,对于表的权限管理并不能限制到某个行或者某个列,但是通过视图就可以简单的实现。

3、数据独立:一旦视图的结构被确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

二、视图的语法

Last updated