数据库系统概论 ---- 第三章 -- 关系数据库标准语言SQL(3.5-3.7)(二)

简介: 数据库系统概论 ---- 第三章 -- 关系数据库标准语言SQL(3.5-3.7)(二)

3.带子查询的删除语句

子查询同样也可以嵌套在DELETE语句中,用以构造执行删除操作的条件。

恢复数据:

insert into SC
values ('201215121', 1, 92),
       ('201215121', 2, 85),
       ('201215121', 3, 88),
       ('201215122', 2, 90),
       ('201215122', 3, 80);
SELECT * FROM SC;

[例3.78] 删除计算机科学系所有学生的选课记录。

DELETE FROM SC
WHERE Sno IN (
    SELECT Sno
    FROM Student
    WHERE Sdept = 'CS'
    );
SELECT s.Sno, Sdept, Cno
FROM Student s LEFT JOIN SC ON s.Sno = SC.Sno;

3.6 空值处理

所谓空值就是“不知道”或“不存在”或“无意义”的值。

SQL 语言中允许某些元组的某些属性在一定情况下取空值。

一般有以下几种情况:

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

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

1.空值的产生

[例3.79] 向SC表中插入一个元组,学生号是“201215126”,课程号是“1”,成绩为空。

INSERT INTO SC(Sno, Cno)
VALUES ('201215126', '1');
SELECT * FROM SC;

[例3.80] 将Student表中学生号为“201215200”的学生所属的系改为空值。

# 先插入数据
INSERT INTO Student
VALUES ('201215200', 'lili', '女', 21, 'IS');
UPDATE Student
SET Sdept = NULL
WHERE Sno = '201215200';
SELECT * FROM Student;

另外,外连接也会产生空值

空值的关系运算也会产生空值

2.空值的判断

判断一个属性的值是否为空值用IS NULL 或IS NOT NULL来表示

将一个属性的值赋值为空值使用 =NULL

[例3.81]从Student表中找出漏填了数据的学生信息。

SELECT *
FROM Student
WHERE Sname IS NULL OR
      Ssex IS NULL OR
      Sage IS NULL OR
      Sdept IS NULL ;

3. 空值的约束条件

  • 属性定义(或者域定义)中有NOT NULL约束条件的不能取空值
  • 加了UNIQUE限制的属性不能取空值
  • 属性不能取空值

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

  • 空值与另一个值(包括另一个空值)的算术运算的结果为空值
  • 空值与另一个值(包括另一个空值)的比较运算的结果为UNKNOWN
SELECT 1+NULL,
       NULL+NULL,
       5*NULL,
       NULL>1,
       NULL = NULL;

有了UNKNOWN后,传统的逻辑运算中二值以(TRUE, FALSE) 逻辑就扩展成了三值逻辑。

AND、OR、NOT的真值表如表所示:

其中

  • T表示TRUE,
  • F表示FALSE,
  • U表示UNKNOWN。

在查询语句中,只有使WHERE和HAVING子句中的选择条件为TRUE的元组才被选出作为输出结果

[例3.83]选出选修 1号课程的不及格的学生以及缺考的学生。

插入数据:

INSERT INTO SC
VALUES ('201215122', 1, 58),
       ('201215121', 1, 88),
       ('201215123', 1, 48);
SELECT * FROM SC;

查询:

SELECT *
FROM SC
WHERE Cno = '1' AND
      Grade < 60
UNION
SELECT *
FROM SC
WHERE Grade IS NULL;

3.7 视图

视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表

数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中

一旦基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。

视图一经定义,就可以和基本表一样被查询、被删除。也可以在一个视图之上再定义新的视图,但对视图的更新(增、删、改)操作则有一定的限制。

3.7.1 定义视图

1. 建立视图

SQL语言用CREATE VIEW命令建立视图,其一般格式为:

CREATE VIEW 视图名 [(列名 [,列名] ...)]
AS 子查询
[ WITH CHECK OPTION ];
  • 其中,子查询可以是任意的SELECT语句,
  • 是否可以含有ORDER BY子句和DISTINCT
    短语,则取决于具体系统的实现。
  • WITH CHECK OPTION表示对视图进行UPDATE、INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)。
  • 组成视图的属性列名或者全部省略或者全部指定,没有第三种选择。
  • 如果省略了视图的各个属性列名,则隐含该视图由子查询中SELECT子句目标列中的诸字段组成
  • 但在下列三种情况下必须明确指定组成视图的所有列名:
  • (1)某个目标列不是单纯的属性名,而是聚集函数或列表达式;
  • (2)多表连接时选出了几个同名列作为视图的字段;
  • (3)需要在视图中为某个列启用新的更合适的名字

[例3.84] 建立信息系学生的视图。

CREATE VIEW V_IS_Stu
AS
    SELECT Sno, Sname, Sage
    FROM student
    WHERE Sdept = 'CS';
SELECT * FROM v_is_stu;


相关文章
|
2天前
|
存储 SQL 数据库
数据库sql语句-----游标和存储过程
数据库sql语句-----游标和存储过程
14 1
|
1天前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之当 SQL Server 源数据库中的数据更新后,CDC 吐出的操作(op)是怎样的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
11 0
|
2天前
|
SQL 关系型数据库 数据管理
Microsoft SQL Server 是微软公司开发的一款关系型数据库管理系统
【5月更文挑战第14天】Microsoft SQL Server 是微软公司开发的一款关系型数据库管理系统
13 2
|
2天前
|
SQL 数据库
数据库SQL语言实战(六)
本次实战的重点就在于对表格本身的一些处理,包括复制表格、修改表格结构、修改表格数据
|
2天前
|
SQL Oracle 关系型数据库
数据库SQL语言实战(五)(数据库系统概念第三章练习题)
本文的SQL语言适用的是Oracle数据库与mySQL可能存在略微不同
|
2天前
|
SQL Oracle 关系型数据库
数据库SQL语言实战(四)(数据库系统概念第三章练习题)
本文的SQL语言适用的是Oracle数据库与mySQL可能存在略微不同
数据库SQL语言实战(四)(数据库系统概念第三章练习题)
|
2天前
|
关系型数据库 MySQL 数据库
docker MySQL删除数据库时的错误(errno: 39)
docker MySQL删除数据库时的错误(errno: 39)
22 0
|
2天前
|
前端开发 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口
【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口
24 0
|
2天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口(下)
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口
10 0
|
2天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口(上)
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口
15 0