数据库系统概论总结(二)

外连接

左连接:LEFT JOIN .... ON
以左边的为主,右边不存在的置为NULL
SELECT 
DISTINCT cou.country,cou.country_id,c.city,c.city_id
FROM country cou LEFT JOIN city c 
ON cou.country_id = c.country_id

数据库系统概论总结(二)_第1张图片

右连接:RIGHT JOIN.....ON
以右边的为主,左边不存在的置为NULL
SELECT 
cou.country,cou.country_id,c.city,c.city_id
FROM country cou RIGHT JOIN city c 
ON cou.country_id = c.country_id

数据库系统概论总结(二)_第2张图片

内连接:INNER JOIN.....ON
两个表之间的交集

数据库系统概论总结(二)_第3张图片

**嵌套查询**
嵌套查询指的是语句嵌套着另外一个语句,一般有IN、带比较符、any/all、exist这些,
这里需要强调的是:
上层的查询块称为外层查询或父查询
下层查询块称为内层查询或子查询
SQL语言允许多层嵌套查询
子查询的限制:不能使用ORDER BY子句

**注意:
不相关子查询:
子查询的查询条件不依赖于父查询,由里向外 逐层处理。即每个子查询在上一级查询处		  理,之前求解,子查询的结果用于建立其父查询的查找条件。
相关子查询:子查询的查询条件依赖于父查询
首先取外层查询中表的第一个元组,根据它与内层查相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表
然后再取外层表的下一个元组
重复这一过程,直至外层表全部检查完为止**

下面是一些例子,就不贴图了
(1) SELECT Sno, Sname, Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname= 'XX'); [不相关子查询]
(2)SELECT Sno, Cno
FROM SC x
WHERE Grade >=(SELECT AVG(Grade)FROM SC y
WHERE y.Sno=x.Sno);[相关子查询]
(3)SELECT Sname,Sage
FROM Student
WHERE Sage < ANY (SELECT Sage
FROM Student
WHERE Sdept= ' CS ');[任意的一个值]
(4)SELECT Sname,Sage
FROM Student
WHERE Sage <
(SELECT MIN(Sage)
FROM Student
WHERE Sdept= ' CS ') [聚集函数的嵌套]
(5)EXISTS谓词
带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”
或逻辑假值“false”。
若内层查询结果非空,则外层的WHERE子句返回真值
若内层查询结果为空,则外层的WHERE子句返回假值
 由EXISTS引出的子查询,其目标列表达式通常都用 * ,因为带
EXISTS的子查询只返回真值或假值,给出列名无实际意义。
请比较下面的两种情况
SELECT Sname
FROM Student
WHERE EXISTS
(SELECT *
FROM SC
WHERE Sno=Student.Sno AND Cno= ' 1 '); [相关子查询,如果存在就输出,然后继续循环下去]

SELECT Sname
FROM Student
WHERE EXISTS
(SELECT *
FROM SC
WHERE Sname='XX');[非相关子查询,如果表中存在叫‘XX’的学生,那么将输出SELECT Sname FROM Student的查询结果,否则为空]
**注意:EXIST有很多高级的用法,以后可能会涉及更多exist的逻辑转换**

**集合查询**
集合操作的种类
(1)并操作UNION
SELECT *
FROM Student
WHERE Sdept= 'CS'
UNION
SELECT *
FROM Student
WHERE Sage<=19;
UNION:将多个查询结果合并起来时,系统自动去掉重复元组
UNION ALL:将多个查询结果合并起来时,保留重复元组

(2)交操作INTERSECT,相当于AND
   SELECT *
   FROM Student
  WHERE Sdept='CS'
  INTERSECT
  SELECT *
  FROM Student
  WHERE Sage<=19;
	(3) 差操作 EXCEPT
  SELECT *
  FROM Student
  WHERE Sdept='CS'
  EXCEPT
  SELECT *
  FROM Student
  WHERE Sage <=19;
  第一句语句的结果为A,第二句语句的结果为B,则为A-B

2.3 带子查询的更新语句操作

1、插入子查询结果,一般需要检查数据表的完整性约束等条件
如下面的例子:
第一步:建表
 CREATE TABLE Dept_age
 ( Sdept CHAR(15) /*系名*/
 Avg_age SMALLINT); /*学生平均年龄*/
第二步:插入数据
 INSERT INTO Dept_age(Sdept,Avg_age)
 SELECT Sdept,AVG(Sage)
 FROM Student
 GROUP BY Sdept;
2、UPDATE 子查询结果
UPDATE SC
 SET Grade=0
 WHERE Sno IN
 (SELETE Sno
 FROM Student
 WHERE Sdept= 'CS' );[修改表SC中所有学生成绩为0]
3、DELETE 子查询结果
DELETE
FROM SC
WHERE Sno IN
(SELETE Sno
 FROM Student
 WHERE Sdept= 'CS') ;[删除部门为CS的所有学生记录]

参考:数据库系统概论 王删

你可能感兴趣的:(数据库,数据库)