数据库原理-数据查询 集合查询 空值处理

149 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

数据库原理-数据查询 集合查询

集合查询

集合操作的种类

  • 并操作UNION
  • 交操作INTERSECT
  • 差操作EXCEPT

参加集合操作的个查询结果的列数必须相同;对应项的数据类型也必须相同

查询计算机科学系的学生及年龄不大于19岁的学生

     SELECT *
     FROM Student
     WHERE Sdept='CS'
     UNION
     SELECT *
     FROM Student
     WHERE Sage<=19;

UNION:将多个查询结果合并起来时,系统自动去掉重复元组

UNION ALL:将多个查询结果合并起来时,保留重复元组

查询选修了课程1或者选修了课程2的学生

     SELECT Sno
     FROM SC
     WHERE Cno='1'
     UNION
     SELECT Sno
     FROM SC
     WHERE Cno='2'

查询计算机科学系的学生与年龄不大于19岁的学生的交集

     SELECT *
     FROM Student
     WHERE Sdept='CS'
     INTERSECT
     SELECT *
     FROM Student
     WHERE Sage<=19

实际上就是查询计算机科学系中年龄不大于19岁的学生

     SELECT *
     FROM Student
     WHERE Sdept = 'CS' AND Sage <= 19;

查询既选修了课程1又选修了课程2的学生

     SELECT Sno
     FROM SC
     WHERE Cno='1'
     INTERSECT
     SELECT Sno
     FROM SC 
     WHERE Cno='2'

也可以表示为:

     SELECT Sno
     FROM SC
     WHERE Cno='1' AND Sno IN
                       (SELECT Sno
                        FROM SC
                        WHERE Con='2')

查询计算机科学系的学生与年龄不大于19岁的学生的差集

     SELECT *
     FROM Student
     WHERE Sdept='CS'
     EXCEPT
     SELECT *
     FROM Student
     WHERE Sage<=19;

实际上是查询计算机科学系中年龄大于19岁的学生

     SELECT *
     FROM Student
     WHERE Sdept = 'CS' AND Sage>19

\

数据库原理-数据查询 空值处理

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

一般有以下几种情况:

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

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

空值的产生有其实际需求

学生这选课后,产生选课表,但是还没有成绩。这时候成绩部分就为空值,它和0不一样

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

找出漏填了性别或者年龄信息的记录

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

属性定义(或者域定义)中

  • 有NOT NULL约束条件的不能取空值
  • 加了UNIQUE限制的属性不能去空值
  • 码属性不能取空值

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

  • 空值与另一个值(包括另一个空值)的算术运算的结果为空值
  • 空值与另一个值(包括另一个空值)的比较运算的结果为UNKNOWN
  • 有UNKNOWN后,传统二值(TRUE,FALSE)逻辑就扩展成了三值逻辑

找出选修1号课程的不及格的学生

     SELECT Sno
     FROM SC
     WHERE Grade < 60 AND Cno='1';

查询结果不包括缺考的学生,因为他们的Grade值为null

选出选修1号课程的不及格的学生以及缺考的学生

     SELECT Sno
     FROM SC
     WHERE Cno='1' AND (Grade<60 OR Grade IS NULL);

\