上岸后分享:SELECT查询解题思路(尤其是不同多表查询对比) 力荐力荐力荐

阅读前请看一下:我是一个热衷于记录的人,每次写博客会反复研读,尽量不断提升博客质量。文章设置为仅粉丝可见,是因为写博客确实花了不少精力。希望互相进步谢谢!!


前言

提示:本文着重讲解多表查询的思路,及不同多表查询的对比:

背景:刚上岸某985计科,之前准备研究生复试中关于数据库的一些学习心得,本篇重点记录关于SQL中查询(SELECT)语句的心得。我使用的是王、萨二人的数据库系统概论教材,例子的来源来自于教材、如何分析也是按照教材的框架去总结提炼得到。(代码未上机进行验证,这篇文章目的只是去给思路(尤其是多表查询),以及不同查询语句的对比,有错望指正,勿喷勿喷勿喷!)
教材图


提示:以下是本篇文章正文内容,直接SELECT开门见山

一、SELECT语句都有哪些?

1、其实教材讲得很清楚,无非就是单表查询 (选择列+选择行)+ 多表查询(连接查询、嵌套查询、集合查询、基于派生表查询)
在这里插入图片描述

2、重点应该是单表查询中的选择满足条件的元组(WHERE)、排序(ORDER BY)、分组查询 [过滤](GROUP BY [HAVING])多表查询(最常用就是连接查询,其次是嵌套查询)


二、解题方法

提示:本文着重讲解多表查询的思路,及不同多表查询的对比:
1、拿到一道查询语句的题,解体步骤:
先判断是单表还是多表查询(两个相同的表也叫多表,此时注意要取别名),若是单表,无非就是选列还是选行。难点在于选行考题自然要考WHERE关键字,若升级难度,无非就是在此基础上加上聚集函数和排序(ORDER BY)关键字,再升级,那就是分组查询[过滤](GROUP BY [HAVING])。单表查询按照此思路解,一定就不会混乱了。若是多表查询,则跳到第二步;
②若多表(这里给图更直观,常考的下划线标注,解题时按图中顺序进行思考即可):
在这里插入图片描述


三、例题

第五版P112例3.67

1、学生-课程模式S-T如下(第五版P79)
在这里插入图片描述在这里插入图片描述
2、第五版教材P112例3.67在这里插入图片描述
3、这里代码就是按照上面“方法”步骤进行的(这里未上机运行,若有问题,麻烦指出)。
这里判断出来是需要两个SC表进行查询,故:
(1)连接查询(这里需要注意取别名

SELECT Sno
FROM SC SC1, SC SC2
WHERE S1.Sno = S2.Sno //连接条件,与IN子查询区分,IN无连接条件
      AND S1.Cno = '1'
      AND S2.Cno = '2';

(2)嵌套子查询(这里写了最常用的IN子查询与EXISTS子查询)

①IN子查询(一定注意IN是不需要连接条件的,因此两个SC表无需别名

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

②EXISTS子查询(与IN区分,最大不同就是需要连接条件,故两个SC表一定要取别名

SELECT Sno
FROM SC S1
WHERE S1.Cno = '1' AND EXISTS
					(SELECT *   /*与IN不同,这里通常都是*,
	因为返回结果是true or false,所以给出实际列名无意义*/
					 FROM SC S2
					 WHERE S2.Cno = '2' AND
					       S1.Sno = S2.Sno);/*一定注意这里
   需要连接条件,故两个SC表需要别名*/

(3)集合查询

错误写法:(思考为何会错?)

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

正确写法:

SELECT Sno
FROM SC 
WHERE Cno = '1'
INTERSECT             //交
SELECT Sno
FROM SC 
WHERE Cno = '2';

(4)派生表查询

SELECT Sno
FROM SC S1, (SELECT Sno, Cno FROM SC) AS S2  //派生表表名S2
WHERE S1.Sno = S2.Sno  //连接条件,与IN子查询区分,IN无连接条件
      AND S1.Cno = '1'
      AND S2.Cno = '2';


四、总结(有干货)

1、多表查询解题思路一定掌握;

2、对于查询中提炼了几个需要注意的地方(重要性由高到低排序)

(1) 单表查询:

聚集函数不能出现在WHERE中,只能出现在SELECT或HAVING中

WHERE作用于整个表选择满足条件的元组,而HAVING作用于整个组,需要和GROUP BY搭配使用从而实现“分组过滤”;

(2) 多表查询:

IN无需写连接条件,故若多个相同表进行查询的时候也无需别名。其余所有均需要写连接条件,故若多个相同表就需要取别名这一点非常重要,上面例题中可以验证这一点);

遇到全称量词要转化为双重否定,即两个NOT EXISTS处理;

③子查询中不能有ORDER BY,它只能对最终结果排序;

④连接查询和嵌套子查询可以混用;

⑤有些嵌套子查询可以和连接替换,有些不能,但是尽量用连接,查询效率更高(这就是为何书上先讲连接查询,再讲嵌套子查询的原因了);

⑥嵌套子查询中,IN、比较符、ANY/ALL均能转化成EXISTS;

⑦聚集函数要比ANY/ALL效率要高。


码字不易,谢谢点赞!!!
码字不易,谢谢点赞!!!
码字不易,谢谢点赞!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值