东南大学数据库课程03-User Interfaces and SQL Language

User Interfaces and SQL Language 用户接口和SQL语言

User interface of DBMS

A DBMS must offer some interfaces to support user to access database, including:

  • Query Languages
  • Interface and maintaining tools (GUI)
  • APIs
  • Class Libarary

一是用于人机交互,二是用于程序调用

Query Language分类

  • Formal
  • Tabular
  • Graphic
  • Limited Natural Language

6fc470c5-be7c-4d05-bfb7-cc89c46f5a91

SQL Language概况

Relational Query Languages

6b79f011-3be2-48e3-880a-28aec1429855

Formal Relational Query Languages

b052e00f-f572-4a54-8897-91e81140313b

SQL Language

  • It can be divided into four parts acording to function:
    • Data Definition Language(DDL):used to define, delete, or alter data schema
    • Query Language(QL):used to retrieve data
    • Data Manipulation Language (DML):used to insert, delete, or update data.
    • Data Control Language (DCL):used to control user’s access authority to data.
  • QL and DML are introduced in detail in this chapter

Important terms and concepts

  • Basic Table : 存在数据库里的表【基表】
  • View :视图,虚表:根据基表计算出来的(三层抽象)
  • Data type supported
  • NULL
  • UNIQUE:说明某个表的属性是否允许重复【主键只能有一个,必然不允许重复,其他不允许重复的属性就可以用UNIQUE指定】
  • DEFAULT:没填的属性值,填默认值
  • PRIMARY KEY:主键
  • FOREIGN KEY:外键:检查引用完整性约束
  • CHECK (Integration Constraint)

Example Instance and Basic Grammar

Example

20cb5285-ce3b-4b94-a1bf-9a5a41341ec5

Basic Grammar

2693a364-3850-4261-bad5-526a19788b7e

注:正如Join时所讲的,系统一般不会主动删除重复元组,除非用户指定,指定词就是DISTINCT 如果对结果没有影响的话一般不加

Conceptual Evaluation Strategy

084e0aed-5740-482f-954a-0bd8d8f3aa8e

  1. 先做笛卡尔乘积,在剔除不符合条件的元组,得到一组符合条件的元组
  2. 将符合条件的元组在投影到对应的元素上,最后如果必要就去重得到结果。

低效,但可以先这么理解,后面会讲优化

3.1 简单的SQL查询语句

20cb5285-ce3b-4b94-a1bf-9a5a41341ec5

ebaf8327-a19f-43ef-b225-7b1c123bd4d0

R.sid, R.sid, R.bid中的S,R成为Range Variables(范围变量),要写全,更规范

Find sailors who’ve reserved at least one boat

98e8306b-018e-44a4-9648-505badd21b37

  • 在Select中加入DISTINCT有影响吗:没有
  • 如果把SELECT中的S.sid换成S.sname,此时加上DISTINCT有影响吗:有,可能会删除同名水手

b949c20d-099a-40fe-84c8-8132c25d2f36

3.2 基于集合

bff0e48c-f595-489b-b937-b4298e61278b

fbcde0ce-e520-41a3-9e5a-4c8c23aafd82

自连接Page3.png

集合运算表达:Union、Insert、EXCEPT、IN、NOT IN

量词表达:IN、NOT IN、EXISTS、NOT EXIST、UNIQUE、NOT UNIQUE、ANY、ALL

0d25061a-1b02-4152-aa92-bb37a967fe12

e25f3674-7c4a-4b46-8707-54caabe46e05

S.sid不能改为s.sname因为有重名的可能

注意空值NULL

NULL表示unknown或者Inapplicable

NULL的加入使得SQL变成三值语句:0/1/NULL,许多运算如AND\OR\NOT\Union需要考虑更多

常见做法是直接判断是否为空值再运算

1d35c898-f945-4d44-b690-e8ee7b3e87de

3.3 基于嵌套子查询

非关联

ca1f95c0-7aa7-4591-a59a-11a278dfae57

嵌套查询
得到一个Set,看S.sid是否在Set里
在就输出名字
O(N+N)

关联

b11e7159-96e9-4728-b4ef-f0d2f2d4ce6b

嵌套查询,逻辑是两层循环
把外层的S.sid带入内循环不断循环

O(N*N)

5815ee34-9458-49f0-b360-07d78b5e6e46

内循环:除了R1.sid水手以外的水手定过的船的集合

如果外层的bid不在上面的集合里,说明这条船只被R1.sid这个水手订过,即这条船只被订过一次

启发:不同的说法会产生不同的方法,用属性来转换,正反面转换

//非关联写法:
SELECT bid
FROM Reserves R
WHERE bid NOT IN(
	SELECT bid
	FROM Reserves R1, Reserves R2
	WHERE R1.sid != R2.sid AND R1.bid == R2.bid) [被订过不止一次的船的集合]

3.4 除法与聚集函数

Division除法

Find sailors who’ve reserved all boats

684eb657-fa30-48b4-9e41-57abf6ee44d9

内层嵌套查询:该水手没有订过的船

NOT EXISTS 没有订过的船,说明该水手订过所有船

0d759a4d-5d07-4318-824b-1b7173496500

Aggregate Operators 聚集函数

聚集函数返回的是一个值

  • Significant extension of relational algebra.
    • COUNT (*):Relation的tuple数
    • COUNT ( [DISTINCT] A):属性A有多少种[不同的]值
    • SUM ( [DISTINCT] A)
    • AVG ( [DISTINCT] A)
    • MAX (A)
    • MIN (A)
  • A is a single column

最后一个表示查找最高级水手的名字

最后一个表示查找最高级水手的名字

57026554-54b6-40df-930b-e118870569ec

第一段文字:SELECT中的聚集函数通常作用在GROUP BY的分组中

3.5 分组(GROUP BY)聚集函数

分组的动机

8004a89f-331e-49dd-853a-07b28ab47409

基本语法

3f7692b5-c8a5-4c3a-9859-c62c22f9879a

  1. 将relation-list中的表用qualification进行筛选,得到一组符合条件的tuple set
  2. 将tupel set 按group-list中的属性进行分组,满足group-qualification的分组会被保留
  3. 将得到的分组用target-list中的聚集函数进行运算,并投影到target-list中的属性

c89e7864-c073-463e-bd4c-6face03ee0f6

例子

480967d0-576d-4806-a7ba-32e5ef771880

551140c2-5966-44f6-b1a4-9634d35739c0

注意:SELECT中的聚集函数MIN是对每个分组group使用的,而不是整个relation

1b5cee9f-144d-4d39-960c-11cb0e9b4705

rating 3 的分组被HAVING过滤掉了,不参与聚集


bf6057ce-458b-4b26-a019-6fe90e18cad3

逻辑上可以,但是由于数据库系统在语义上规定HAVING中的Attribute必须是GOUPBY的子集,所以不行,数据库会报错

可以写为

SELECT B.bid, COUNT(*) AS scount
FROM Boats B, Reserves R
WHERE R.bid = B.bid
GROUP BY B.bid, B.color = 'red' 【要等号吗】
HAVING B.color = 'red'

也可以写为

SELECT B.bid, COUNT(*) AS scount
FROM Boats B, Reserves R
WHERE R.bid = B.bid
GROUP BY B.bid
HAVING B.bid IN (SELECT bid
				FROM Boats
				WHERE color = 'red')

这里的Sailors S2是指整个relation而不是指group

这里的Sailors S2是指整个relation而不是指group


ec6c6ea4-33b1-420c-ad10-5a8d233c16c2

聚集函数不能嵌套使用,而且第一段语句的查询逻辑是错误的

3.6 CAST与CASE表达式

CAST表达式:强制类型转换

311d72d6-bdaf-4fe7-b370-251edbd0d96c

5f5a336f-186b-4d2e-bfb6-0eedece49946

创建View的语法

CREATE VIEW prospects (name, school, service) AS 

CASE表达式:就是if语句

例子

65b9f3d7-80d4-4865-875d-c1f0f8bfc5d2

2a126127-b797-4785-ae34-2e6015da2987

800f0b6e-2f25-4d7b-9acd-d5beec1d6cd6

2086ebc1-cf12-4776-96a8-05d1a49423de

3.7 Sub Query

  • Embedded query & embedded query with correlation【相互关系】
  • The functoins of sub-queries have been enhanced in new SQL standard. Now they can be used in SELECT and FROM and WHERE clause
    • Scalar sub-query:标量子查询【查询结果是一个值(查最大年龄的水手的名字)】
    • Table expression:表表达式【得到的结果是一个表,一个集合,FROM中建立临时表
    • Common table expression:公共表表达式【同一个表表达式不止出现一次,课定义为公共表表达式,计算一次,多次使用】

Scalar sub query 标量子查询

emp:employee

emp:employee

FROM、WHERE得到了一组d.location=‘New York’ 的tuple set,将这组tuple set送入sub-query再次进行查询

table expression:表表达式

bf84552f-8b68-47e7-9d03-15de88c20294

common table expression 公共表表达式

a1390a57-547f-488d-9c1c-ee5973f79b50

2dc31167-2e8b-46a1-80fb-f1b0f1c55173

e9fd4e37-f449-45fb-9534-de596dd33ced

3.8 Outer Join

要求:建立一张表,表示Fall 96(96年秋季)的教师授课情况

(name, rank, subject, enrollment)

有老师上的课程四个属性全满

没老师上的课程前两列为NULL

空闲的老师后两列为NULL

d22b7034-a950-4fbe-aece-d8c560eb1d37

27ddfb50-9d3e-4d08-9ecc-d61aa90c905d

ef5fe1e6-8304-4ea4-b422-c099b6f2818a

3.9 Recursion 递归

这里的下属可以是下属的下属,所以需要递归

这里的下属可以是下属的下属,所以需要递归

由于结构是树,所以递归会自动结束


ff0fd1d2-af00-40b8-b6c7-12fb63a671a9

1e406fa5-2ac8-41d7-9be3-da9573130bb3

38594329-bd11-4f66-8ccf-a854ac64718f

有向无环图,递归会自动结束

44186ac6-81b6-4776-8688-0f91ce9d3c65


69881724-f787-4249-9358-08117d6c7ee0

a8947fcc-3ec9-4dda-9213-cb0e138b8a5c

||字符串拼接

递归终止条件

由于下属那题的结构是树,飞机零件那题的结构是有向无环图,最终递归都会终止

但本题是有向有环图,所以必须要保证递归终止

50e462a8-8d76-4d5c-a696-a0ed45842ebb

378fd8a0-d1dd-40aa-896c-7a6d6bc1ec03

Data Manipulation Language

3152a7e8-6c9f-4ee1-98ae-fdd9721ad8dc

View in SQL

temporary:View的定义也不保存

temporary:View的定义也不保存

3b571f78-3e18-4e95-9c64-d8678a0f6547

Embedded SQL

dc64c9c0-a9ba-4c64-a5d6-c65471d52310

ffb6d3df-3086-47ef-bef3-060f88db7399

4b8a80e3-86e8-4433-ac0f-7728ab5f0499

宿主变量

1b541ecb-0a19-4846-9076-c8d0c44d8584

c255a61f-095b-431c-a6f8-e7855764dece

GRADEI:GRADE Indicator表明是否为空

CURSUR

444c3431-e672-4fd8-b423-0979f4a2c217

3a9c22b4-443d-42ad-89f6-3bac3a9771b6

执行过程

bf505e6c-fadb-4cb2-a25f-3a850fa50733

Dynamic SQL

2420c901-f884-42c0-9ef8-705c7dfe1195

cd25f24d-88f1-497a-b191-14cfd6b7926d

place holder:占位符;   macro processin:宏处理;    :y:不是一个宿主变量,仅仅是一个place holder

place holder:占位符; macro processin:宏处理; :y:不是一个宿主变量,仅仅是一个place holder

:birth year:填充占位符的需要是一个宿主变量

:birth year:填充占位符的需要是一个宿主变量

USING :GIVENCNO:填充place holder

USING :GIVENCNO:填充place holder

d36c47a0-7821-4395-a7fe-903e5fa395b3

Store Procedure

7f18e150-9ace-4be7-bc1f-045501e005a6

7f4c98f9-ae25-4987-9b07-8390fff09783

posted @ 2025-09-15 15:13  Miaops  阅读(14)  评论(0)    收藏  举报