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

文章目录

  • 阅读前请看一下:我是一个热衷于记录的人,每次写博客会反复研读,尽量不断提升博客质量。文章设置为仅粉丝可见,是因为写博客确实花了不少精力。希望互相进步谢谢!!
  • 前言
  • 一、SELECT语句都有哪些?
  • 二、解题方法
  • 三、例题
    • 第五版P112例3.67
  • 四、总结(有干货)

前言

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

背景:刚上岸某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 SnoFROM SCWHERE Cno = '2');

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

SELECT Sno
FROM SC S1
WHERE S1.Cno = '1' AND EXISTS(SELECT *   /*与IN不同,这里通常都是*,因为返回结果是true or false,所以给出实际列名无意义*/FROM SC S2WHERE S2.Cno = '2' ANDS1.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效率要高。


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

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

  1. access查询mysql_2017计算机二级Access数据库生成表查询教程

    2017计算机二级Access数据库生成表查询教程 引导语;你知道运用Access数据库如何查询生成表吗,以下是百分网小编分享给大家的2017计算机二级Access数据库生成表查询教程,欢迎阅读! 生 ...

  2. (探讨)MyBatis中的N+1问题,多表关联查询效率高点还是多次单表查询效率高

    MySQL多表关联查询效率高点还是多次单表查询效率高,为什么? https://blog.csdn.net/weixin_33869377/article/details/86265527 MyBat ...

  3. mysql 连接查询两个条件_MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习...

    一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建一个数据库,那数据库里面是不是存了好多张表啊,不可能把所有的数据都放到一张表里面,肯定要分表来存数据,这样节 ...

  4. 怎么提高mysql多表查询效率_MySQL创建index提高多表查询效率

    本文的目的在于探讨use index for join语句的基本原理.我们知道,在MySQL使用JION语句关联多表查询时,为表创建Index能够大幅度提高查询效率.下面以一个简单的例子来了解其中的原 ...

  5. mysql连接查询分为几种方式_SQL多表查询的几种连接方式

    一.基础 1.1 SQL查询的基本原理 第一.单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的):然后根据SELECT的选择列选择相应的列进行返回最终结果. 第二.两 ...

  6. MySQL数据库的查询:常用查询语句、MySQL函数、多表查询、视图表

    文章目录 一.构造数据 二.常用的查询语句 1.SELECT:字段表达式 2.FROM 子句 3.WHERE 子句:按指定条件过滤 4.GROUP BY:分组查询 5.HAVING 6.ORDER B ...

  7. mysql数据库查询关键字级别_MySQL数据库之单表查询中关键字的执行顺序

    MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 select distinct from where group by having order by limit 2 执行顺序 from ...

  8. vue实现查询多条记录_sql:多表查询

    1进阶9:联合查询 关键词union联合.合并:将多条查询语句的结果合并成一个结果 语法:查询语句1 union 查询语句2 union ... 应用场景:当我们要查询的结果来自于多个表,且多个表之间 ...

  9. mysql实验三单表和多表查询_数据库实验三(单表查询)

    实验三: select sno,sname from student;//(1)查询全体学生的学号和姓名 select * from student;//(2)查询全体学生的详细记录 select s ...

最新文章

  1. 3.1 A Historical Perspective 历史观点
  2. Sequelize 4.43.0 发布,基于 Nodejs 的异步 ORM 框架
  3. 初探linux内核编程,参数传递以及模块间函数调用
  4. 不得自行对涉密计算机进行格式化,保密资格认证-涉密人员考试试题
  5. split命令用法(shell)
  6. C# Winform实现捕获窗体最小化、最大化、关闭按钮事件的方法,可通过重写WndProc来实现
  7. 注释里的诅咒:哪种语言遭受最多的咒骂?
  8. Linux监控工具介绍系列——smem
  9. JAVA中创建的redis对象_详解Java在redis中进行对象的缓存
  10. Cisco职业认证再认证体系及程序问答
  11. UIImageView contentModel
  12. 常见机器学习算法原理
  13. js常用插件(八)之移动端滑动插件swiper,BScroll
  14. 高德地图API(使用浏览器ip实现精确定位)
  15. 5G无线技术基础自学系列 | 大规模天线阵列
  16. poi批量导入导出Excel(一、需要建数据库表)
  17. 教你把多个视频合并成一个视频的方法
  18. 手把手教你申请计算机软件著作权(2)—— 生成代码文件身份证明
  19. 一个菜鸡的HTML标签备忘录【点进来可能瞎眼】
  20. 文件夹只读属性不能更改如何去除

热门文章

  1. ubuntu解决无法上网问题
  2. 让你爱不释手的Mac软件
  3. electron 文件路径选择框
  4. 鸿蒙系统发布心情,确认了!鸿蒙非手机操作系统,花粉:心情真像坐过山车
  5. Coding?是不是Coder思维模式
  6. Jmeter函数助手(escapeHtml)
  7. meson 安装了找不到
  8. Jsp与Servlet之间传值方式
  9. python转utf-8编码_python3中utf-8编码如何转换?
  10. mplfiance绘制股票图