# 第三章

### 1．试述 SQL 语言的特点。

（1）综合统一。 SQL 语言集数据定义语言 DDL 、数据操纵语言 DML 和数据控制语言 DCL 的功能于一体。&#x20;

（2）高度非过程化。用 SQL 语言进行数据操作，只要提出“做什么”，而无需指明“怎么做”，因此无需了解存取路径，存取路径的选择以及 sQL 语句的操作过程由系统自动完成。&#x20;

（3）面向集合的操作方式。SQL 语言采用集合操作方式，不仅操作对象、查找结果可以是元组的集合，而且一次插入、删除、更新操作的对象也可以是元组的集合。&#x20;

（4）以同一种语法结构提供两种使用方式。SQL 语言既是自含式语言，又是嵌入式语言。作为自含式语言，它能够独立地用于联机交互的使用方式；作为嵌入式语言，它能够嵌入到高级语言程序中，供程序员设计程序时使用。&#x20;

（5）语言简捷且易学易用。

### 2. 说明在DROP TABLE时RESTRICT和CASCADE的区别。

RESTRICT表示表的删除是有限制条件的。要删除的基本表不能被其他表的约束所引州，不能有视图，不能有触发器，不能有存储过程或函数等。如果存在这些依赖该表的对象，则表不能被删除。  &#x20;

CASCADE表示表的删除没有限制条件，在删除基本表的同时，相关的依赖对象(如视图)都将被删除。

### 3．有两个关系S(A,B,C,D)和T(C,D,E,F)，写出与下列查询等价的SQL表达式：

```sql
(1) select * from S where A=‘10’;
(2) select distinct A,B from S;
(3) select A,B,S.C,S.D,E,F from S ,T where S.C=T.C and S.D=T.D;
(4) select * from S ,T where S.C=T.C;
(5) select * from S ,T where S.A<T.E;
(6) select S.C,S.D,T.* from S ,T ;
```

### 4．用 SQL 语句建立第二章习题2第6题SPJ数据库的4个表(S,P,J,SPJ),并针对建立 的4个表用SQL语句完成该练习题中的查询

> ### 建表

建 S 表： S ( SNO , SNAME , STATUS , CITY ) ;

```sql
CREATE TABLE S ( SNO char(2), SNAME char(8),STATUS char(2),CITY char(6));
```

建 P 表： P ( PNO , PNAME , COLOR , WEIGHT );

```sql
CREATE TABLE P ( PNO char(2), PNAME char(8),COLOR char(2),WEIGHT int);
```

建 J 表： J ( JNO , JNAME , CITY） ;

```sql
CREATE TABLE J(JNO char(2), JNAME char(8), CITY char(6));
```

建SPJ 表： SPJ(SNO,PNO,JNO,QTY)

```sql
CREATE TABLE SPJ(SNO char(2) , PNO char(2), JNO char(2),QTY int);
```

> ### 查询

（1）求供应工程 Jl 零件的供应商号码 SNO ;

<pre class="language-sql"><code class="lang-sql"><strong>SELECT DIST SNO 
</strong><strong>FROM SPJ 
</strong><strong>WHERE JNO=’J1’;
</strong></code></pre>

（2）求供应工程 Jl 零件 Pl 的供应商号码 SNO ;

```sql
SELECT DIST SNO 
FROM SPJ 
WHERE JNO=‘J1’ AND PNO=‘P1’;
```

（3）求供应工程 Jl 零件为红色的供应商号码 SNO ;

```sql
SELECT SNO 
FROM SPJ,P 
WHERE JNO=‘J1’ AND SPJ.PNO=P.PNO AND COLOR=‘红’;
```

（4）求没有使用天津供应商生产的红色零件的工程号 JNO ;

```sql
SELECT JNO
FROM J
WHERE NOT EXISTS
(SELECT*
FROM SPJ
WHERE SPJ.JNO=J.JNO
AND SNO IN
(SELECT SNO                                /* 天津供应商的SNO * /
FROM S
WHERE CITY='天津')
AND PNO IN
(SELECT PNO                                /* 红色零件的PNO * /
FROM P
WHERE COLOR ='红)) ;
```

（5）求至少用了供应商 Sl 所供应的全部零件的工程号 JNO ;

### 5．针对第4题中的4个表S、P、J及SPJ,试用SQL完成以下各项操作：

(1)找出所有供应商的姓名和所在城市。

```sql
SELECT SNAME,CITY FROM S
```

(2)找出所有零件的名称、颜色、重量

```sql
SELECT PNAME,COLOR,WEIGHT FROM P
```

(3)找出使用供应商S1所供应零件的工程号码。

```sql
SELECT DIST JNO FROM SPJ WHERE SNO=‘S1’
```

(4)找出工程项目J2使用的各种零件的名称及其数量。

```sql
SELECT PNAME,QTY FROM SPJ,P
WHERE P.PNO=SPJ.PNO AND SPJ.JNO=‘J2’;
```

(5)找出上海厂商供应的所有零件号码。

```sql
SELECT PNO FROM SPJ,S WHERE S.SNO=SPJ.SNO AND CITY=‘上海’
```

(6)出使用上海产的零件的工程名称。

```sql
SELECT JNAME FROM SPJ,S,J
WHERE S.SNO=SPJ.SNO AND S.CITY=‘上海’ AND J.JNO=SPJ.JNO
```

(7)找出没有使用天津产的零件的工程号码。

```sql
 SELECT DISP JNO 
 FROM SPJ 
 WHERE JNO NOT IN 
 (SELECT DIST JNO FROM SPJ,S 
 WHERE S.SNO=SPJ.SNO AND S.CITY=‘天津’) 
```

(8)把全部红色零件的颜色改成蓝色。

```sql
UPDATE P SET COLOR=‘蓝’ WHERE COLOR=‘红’
```

(9)由S5供给J4的零件P6改为由S3供应。

<pre class="language-sql"><code class="lang-sql"><strong>UPDATE SPJ SET SNO=‘S3’ WHERE SNO=‘S5’ AND JNO=‘J4’ AND PNO=‘P6’
</strong></code></pre>

(10)从供应商关系中删除供应商号是S2的记录，并从供应情况关系中删除相应的记录。

```sql
DELETE FROM S WHERE SNO=’S2’
DELETE FROM SPJ WHERE SNO=‘S2’
```

(11)请将(S2，J6，P4，200)插入供应情况关系。

```sql
INSERT INTO SPJ VALUES（‘S2’，‘J6’，‘P4’，200）
```

### 6．什么是基本表？什么是视图？两者之间的区别和联系是什么？

&#x20;     基本表是本身独立存在的表，在 SQL 中一个关系就对应一个表。

   视图是从一个或几个基本表导出的表。视图本身不独立存储在数据库中，是一个虚表。即数据库中只存放视图的定义而不存放视图对应的数据，这些数据仍存放在导出视图的基本表中。视图在概念上与基本表等同，用户可以如同基本表那样使用视图，可以在视图上再定义视图。

### 7．试述视图的优点。

（1）视图能够简化用户的操作；

（2）视图使用户能以多种角度看待同一数据；

（3）视图对重构数据库提供了一定程度的逻辑独立性；

（4）视图能够对机密数据提供安全保护。

### 8．哪类视图是可以更新的？哪类视图是不可更新的？各举一例说明。

基本表的行列子集视图一般是可更新的。

&#x20;若视图的属性来自集合函数、表达式，则该视图肯定是不可以更新的。

视图是不实际存储数据的虚表，因此对视图的更新，最终要转换为对基本表的更新。因为有些视图的更新不能惟一有意义地转换成对相应基本表的更新，所以，并不是所有的视图都是可更新的。

#### 9 ．针对第4题中的4个表,为三建工程项目建立一个供应情况的视图，包括供应商代码(SNO)、零件代码(PNO)、供应数量(QTY)。针对该视图完成以下查询:

创建视图：

```sql
CREATE VIEW VSP AS SELECT SNO,SPJ.PNO,QTY FROM SPJ,J
WHERE SPJ.JNO=J.JNO AND J.JNAME=‘三建’
```

针对该视图VSP完成下列查询：

(1)找出三建工程项目使用的各种零件代码及其数量。

```sql
SELECT DIST PNO,QTY FROM VSP;
```

(2)找出供应商S1的供应情况。

```sql
SELECT DIST * FROM VSP WHERE SNO=‘S1’;
```

#### 10 ．什么是空值?举例说明。SQL中如何表示空值?空值如何参加运算

1. 空值（Empty Value）：\
   空值是指字段或属性的值为空，但仍保留了字段的数据类型。空值表示数据在该字段上的缺失或未知状态，它不是一个具体的值或数据类型。空值通常表示数据未填写或不适用的情况。
2. NULL：\
   NULL是一个特殊的值，表示缺失或未知的数据。它用于表示字段的值是未知、不存在或不适用的情况。NULL表示一个缺失的值或缺失的数据，不属于任何特定的数据类型。

但是课本中的空值好像直接将NULL与空值化等号,所以以下回答就按照课本上的来回答

所谓空值就是"不知道" "不存在" 或" 无意义" 的值,比如说某同学成绩为空,因为它没有参加考试。SQL中使用NULL表示空值

* 空值与另一个值的算术运算的结果为空值,与另一个值的比较结果为UNKNOWN
* 有了UNKNOWN后,二元逻辑运算拓展成为三值运算

```
----------------------------------------------
     x       y     | x AND y | x OR y | NOT x
----------------------------------------------
     T       T     |    T    |    T   |   F
     T       U     |    U    |    T   |   F
     T       F     |    U    |    T   |   F
     U       T     |    U    |    T   |   U
     U       U     |    F    |    U   |   U
     U       F     |    F    |    U   |   U
     F       T     |    U    |    T   |   T
     F       U     |    F    |    U   |   T
     F       F     |    F    |    F   |   T
----------------------------------------------
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://hiki-nazimis-organization.gitbook.io/database6th/di-san-zhang.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
