数据库基础概论_SQL复杂查询

(1)非相关子查询:内层查询独立进行,没有涉及任何外层查询相关的子查询

--eg :查询SALES部门的员工信息
SELECT e.* ,FROM emp e  WHERE e.deptno  =(SELECT deptno from dept where dname ='SALES');

(2)相关子查询:所谓的相关子查询,内层查询需要依靠外层查询的某些变量作为限定条件才能进行的子查询(外层向内层传递的参数需要使用外层的表名或者表别名来限定<   相关子查询 将主查询的结果给子查询使用>)

--eg:求学过001课程的同学的姓名
SELECT s.sname FROM student s  WHERE sno in(SELECT sc.sno from sc where sc.sno =s.sno and sc.cno = “cno” ); 

 (3)theta some 与theta all

--找出员工最低的员工的姓名
SELECT sname from salaries  WHERE salary<=all(SELECT salary from salaries );
--找员工的工资比所有人都少的员工。
--找出001号课程成绩不是最高的所有的学生的学号
SELECT sno FROM student    WHERE cno =“001” and score<some(SELECT Sscore
FROM student WHERE cno=“001”);
--只要存在一个学生成绩比当前学生成绩高就打印当前学生学号
--查找所有成绩都及格的学生的姓名
SELECT sname FROM student s WHERE 60>=(SELECT score FROM Student s1  WHERE s.sno=s1.sno);
--这是一个相关子查询的例子,就是从主查询返回一个学号,然后查出这个学生的所有成绩 并判断是不是都不小---于60 如若是的话 就打印出来

 

(4)NOT EXISTS :查询所有的 全部的(*****)

--例如:检索学过001号教师主讲的所有课程的所有同学的姓名
SELECT sname FROM student WHERE NOT EXISTS--不存在
(SELECT *FROM course c WHERE c.tno="001" --有一门001号老师主讲的课
and NOT EXISTS(SELECT
*FROM sc WHERE sc.sno =s.sno and sc.cno = c.cno ) )--该同学没有学过


--换个思路,就是不存在001号教师主讲的课某个同学没学过
--先看子查询 某门课 某个同学没学过,则会返回真 真的否定就为假 就不打印这个学生的姓名
--示例 列出学过98030101号同学学过所有课程的同学的学号。


   SELECT DISTINCT sno FROM student WHERE NOT EXISTS --不存在
(SELECT *FROM sc WHERE sc.sno ="98030101"  --980同学学过的课
and NOT EXISTS(SELECT *FROM sc sc1 WHERE  --该同学没有学过
sc1.sno =s.sno and sc.cno = sc1.cno
) );


--换个想法就是不存在98030101号同学学过的课程某个同学没学
--示例:已知SPJ(Sno, Pno, Jno, Qty), 其中Sno供应商号,Pno零件号,Jno工程号,Qty数量,列出至少用---了供应商S1供应的全部零件的工程号.



SELECT DISTINCT Jno FROM SPJ spj1 
WHERE NOT EXISTS//不存在
(SELECT *FROM SPJ spj2 WHERE spj2.Sno ="s1" and NOT EXISTS--s1工程用过的零件
(SELECT *FROM SPJ spj3 WHERE spj3.Jno = spj1.Jno and spj2.Pno= spj1.Pno)--该工程没有使用

--不存在供应商s1用过的工程该工程没有使用。

(5)并-交-差的处理

--SQL语言 并-交-差的特殊处理
---并运算
UNION 
---交运算 
INTERSECT
---差运算
EXECEPT 
--基本语法形式
子查询1 UNION [ALL]| INTERSECT[ALL]|EXPECT[ALL] 子查询2
--没有ALL的情况下自动删除重复元组,不带ALL,若要保留重复分组,则要带ALL
--eg"
--假设子查询1的一个元组出现m次、子查询2的一个元组出现n次
--则该元组在
子查询1 UNION ALL 子查询2-- 出现m+n;
子查询1 INTERSECT ALL 子查询2 --出现 min(m,n);
子查询1 EXCEPT ALL 子查询2-- 出现 max(0,m-n);

(6)空值的处理

--现行DBMS的空值处理
        -- 除 IS[NOT] NULL 之外,空值不满足任何查找条件
        --如果NULL参与算法运算,则该算术表达式的值是NULL
        --如果NULL参与比较运算,则可视为FALSE. 
        --如果NULL参与聚集运算,除count(*)之外聚集函数都忽略NULL

(7)聚集函数的使用条件

--聚集函数是不允许出现在WHERE子句中的:WHERE子句是对每一个元祖进行条件过滤,而不是对集合进行条件过滤
--分组过滤:若要对集合(即分组)进行条件过滤,即满足条件的集合/分组留
--下,不满足条件的集合/分组剔除。 having存在前提是Group By的存在

(8)视图

对应概念模式的数据在SQL中被称为基本表,而对应于外模式的数据被称为视图,视图不仅仅包含外模式,而且还包括E-C(外模式到概念模式的映像)。

注:通常所说的子模式就是指的是外模式 模式指的是概念模式

SQL数据库结构

基本表是实际存储于存储文件中的表,基本表的数据是需要存储的,视图在SQL中值存储其由基本表导出视图所需要的映像信息,其数据并不存储,而是在运行过程中动态产生和维护的。对视图的数据更改最终要反应在对基本表的更改之上的。

--例如:
--定义一个视图:
CREATE view CompStud AS(SELECT *FROM Student WHERE Dno in(SELECT dno  FROM Dept WHERE dname=”计算机”)); 

注:SQL视图的更新:对视图的更新,最终是要反应在基本表上的,而视图定义的映射有时不是可逆的。

如含有聚集函数构成的视图,因为聚集函数查询的结果不能反映到基本表上。

如插入数据到视图中,但是不包含主键,这样是不能更新,因为数据到视图不能反应在基本表上。(不知道对应哪一行)。

总结如下:

如果视图中的SELECT目标列含有聚集函数,则不能更新。

如果视图中的SELECT子句使用了Unique或者Distinct 则不能更新。

如果视图中使用了group By子句,则不能更新。

如果视图中包含经过算术表达式计算出来的列,则不能更新

如果视图是由单个表的列构成,但是并没有包含主键,则不能更新。

注:对于有单一表的子集构成的视图,即如果视图是从单个基本表使用选择或者投影操作导出的,并包含了基本表的主键,则可以更新。

视图的撤销和表的撤销和数据库的撤销操作一致。

(9)外链接

两个关系RS进行连接时,如果关系R(S)中的元组在S(R)中找不到相匹配的元组,则为了避免该元组信息丢失,从而将该元组与S(R)中假定存在的全为空值的元组形成连接,放置在结果关系中,这种连接称之为外连接(Outer Join)

SELECT 	e.ename,s.ename FROM emp e LEFT JOIN  emp s ON s.empno = e.mgr;  
--//最大的老板没有项目经理 所以这一行失配 结果是用失配元组+空元组 左侧的s失配
--+右侧的空元组 因而使用的是左外连接

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值