第三章 关系数据库标准语言SQL(3)

本文介绍了SQL中的集合操作(UNION,INTERSECT,EXCEPT)以及如何使用子查询创建派生表进行复杂查询。通过实例展示了如何结合这些概念来查找满足特定条件的学生信息和课程选择。同时讲解了INSERT语句的两种插入方式:元组和子查询结果。
摘要由CSDN通过智能技术生成

3.4.4 集合查询

集合操作的种类:并操作UNION(或)、交操作INTERSECT、差操作EXCEPT
参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同

[例 3.64] 查询计算机科学系的学生及年龄不大于19岁的学生。

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

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

[例 3.65] 查询选修了课程1或者选修了课程2的学生。

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

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

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

[例 3.67] 查询既选修了课程1又选修了课程2的学生。

 SELECT Sno
FROM SC
WHERE Cno=' 1 ' 
INTERSECT
SELECT Sno
FROM SC
WHERE Cno='2 ';
[3.67]也可以表示为:
        
	     SELECT Sno
          FROM    SC
          WHERE Cno=' 1 ' AND Sno IN
                                                (SELECT Sno
                                                 FROM SC
                                                 WHERE Cno=' 2 ');

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

SELECT *
FROM Student
WHERE Sdept='CS'
EXCEPT
SELECT  *
FROM Student
WHERE Sage <=19;
[3.68] 实际上是查询计算机科学系中年龄大于19岁的学生

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

3.4.5基于派生表的查询

子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这时子查询生成的临时派生表(Derived Table)成为主查询的查询对象

[例3.57] 找出每个学生超过他自己选修课程平均成绩的课程号

SELECT Sno, Cno
FROM SC, (SELECT Sno, Avg(Grade) FROM SCGROUP BY Sno)
                    AS   Avg_sc(avg_sno,avg_grade)
WHERE SC.Sno = Avg_sc.avg_sno
  and SC.Grade >=Avg_sc.avg_grade
  1. AS Avg_sc(avg_sno,avg_grade)给新生成的表和其中列取名
  2. 如果子查询中没有聚集函数,派生表可以不指定属性列,子查询SELECT子句后面的列名为其缺省属性。
  3. 生成派生表时,AS关键字可省略,但必须为派生表指定一个别名

[例3.60] 查询所有选修了1号课程的学生姓名,可以用如下查询完成:

SELECT Sname
FROM     Student,  
               (SELECT Sno FROM SC WHERE Cno=' 1 ') AS SC1
WHERE  Student.Sno=SC1.Sno;

3.4.6 SELECT语句的一般形式

 SELECT [ALL|DISTINCT]  
   <目标列表达式> [别名] [ ,<目标列表达式> [别名]] …
 FROM     <表名或视图名> [别名] 
                [ ,<表名或视图名> [别名]]|(<SELECT语句>)[AS]<别名>
 [WHERE <条件表达式>]
 [GROUP BY <列名1>[HAVING<条件表达式>]]
 [ORDER BY <列名2> [ASC|DESC]];

3.5 数据更新

3.5.1 插入数据

两种插入数据方式:① 插入元组; ②插入子查询结果(可以一次插入多个元组 )

  1. 插入元组
语句格式:
INSERT
INTO <表名> [(<属性列1>[,<属性列2 >)]
VALUES (<常量1> [,<常量2>]);

功能:将新元组插入指定表中

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值