选读SQL经典实例笔记02_多表查询

news2024/11/17 23:30:54

1. 除非有必要,否则不要用UNION代替UNION ALL

2. 查找两个表中相同的行

2.1. 当执行连接查询时,为了得到正确的结果,必须慎重考虑要把哪些列作为连接项

2.2. 当参与连接的行集里的某些列可能有共同值,而其他列有不同值的时候,这一点尤为重要

2.3. 集合运算INTERSECT会返回两个行集的相同部分

2.3.1. 必须保证两个表里参与比较的项目数目是相同的,并且数据类型也是相同的

2.3.2. 默认不会返回重复项

2.4. 示例

2.4.1. sql

create view V
as
select ename,job,sal
  from emp
 where job = 'CLERK'
select * from V

ENAME      JOB              SAL

---------- --------- ----------

SMITH      CLERK            800
ADAMS      CLERK           1100
JAMES      CLERK            950
MILLER     CLERK           1300

2.4.2.   sql

select e.empno,e.ename,e.job,e.sal,e.deptno
    from emp e join V
      on (    e.ename = v.ename
          and e.job   = v.job
          and e.sal   = v.sal )

2.4.3.   sql

select empno,ename,job,sal,deptno
    from emp
   where (ename,job,sal) in (
    select ename,job,sal from emp
    intersect
    select ename,job,sal from V
   )

3. 查找只存在于一个表中的数据

3.1. MySQL

3.1.1.  sql

select deptno
   from dept
  where deptno not in (select deptno from emp)

3.1.2. sql

select distinct deptno
  from dept
where deptno not in (select deptno from emp)

3.1.2.1. 排除重复项

3.1.3. 在使用NOT IN时,要注意Null值

3.2. PostgreSQL

3.2.1.  sql

select deptno from dept
 except
select deptno from emp

3.3. Oracle

3.3.1.  sql

select deptno from dept
 minus
select deptno from emp

3.4. 要点

3.4.1. 参与运算的两个SELECT列表要有相同的数据类型和值个数

3.4.2. 不返回重复项

3.4.3. Null值不会产生问题

3.5. sql

select deptno
  from dept
 where deptno not in ( 10,50,null )
( no rows )
select deptno
  from dept
 where not (deptno=10 or deptno=50 or deptno=null)
( no rows )

3.5.1. 三值逻辑

3.6. 免受Null值影响的替代方案

3.6.1. sql

select d.deptno
  from dept d
 where not exists ( select null
                      from emp e
                     where d.deptno = e.deptno )

4. 从一个表检索与另一个表不相关的行

4.1. 使用外连接并过滤掉Null值

4.2.  sql

select d.*
   from dept d left outer join emp e
     on (d.deptno = e.deptno)
  where e.deptno is null

4.2.1. 反连接(anti-join)

5. 新增连接查询而不影响其他连接查询

5.1. 外连接既能够获得额外信息,又不会丢失原有的信息

5.1.1.  sql

select e.ename, d.loc, eb.received
   from emp e join dept d
     on (e.deptno=d.deptno)
   left join emp_bonus eb
     on (e.empno=eb.empno)
  order by 2

5.2. 使用标量子查询

5.2.1. 把子查询放置在SELECT列表里

5.2.2. 在不破坏当前结果集的情况下,标量子查询是为现有查询语句添加额外数据的好办法

5.2.3.  sql

select e.ename, d.loc,
        (select eb.received from emp_bonus eb
          where eb.empno=e.empno) as received
   from emp e, dept d
  where e.deptno=d.deptno
  order by 2

6. 识别并消除笛卡儿积

6.1. n-1法则

6.1.1. n代表FROM子句里表的个数

6.1.2. n-1则代表消除笛卡儿积所必需的连接查询的最少次数

6.2. 笛卡儿积常用于变换或展开(以及合并)结果集,生成一系列的值,以及模拟loop循环

7. 组合使用连接查询与聚合函数

7.1. 如果连接查询产生了重复行,两种办法来使用聚合函数可以避免得出错误的计算结果

7.1.1. 调用聚合函数时直接使用关键字DISTINCT,这样每个值都会先去掉重复项再参与计算

7.1.2. 在进行连接查询之前先执行聚合运算(以内嵌视图的方式),这样可以避免错误的结果,因为聚合运算发生在连接查询之前

8. 从多个表中返回缺失值

8.1. 使用全外连接(full outer join),基于一个共同值从两个表中返回缺失值

8.1.1.  sql

select d.deptno,d.dname,e.ename
   from dept d full outer join emp e
     on (d.deptno=e.deptno)B

8.2. 合并两个外连接的查询结果

8.2.1.  sql

select d.deptno,d.dname,e.ename
   from dept d right outer join emp e
     on (d.deptno=e.deptno)
  union
 select d.deptno,d.dname,e.ename
   from dept d left outer join emp e
     on (d.deptno=e.deptno)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/730148.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.4.cuda驱动API-使用驱动API进行内存分配

目录 前言1. 内存分配总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记 本次课程学习精简 CUDA 教程-Driver API 内存分配 课程大纲可见下面…

基于Java生活缴费系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

【工具】录屏工具Bandicam参数测试(参数设置建议)

一款小而精美的软件,上手特别容易,学习版参见b站up视频:【免费】好用录屏软件推荐,无水印1080P你值得拥有。 我有个需求,要求录屏但视频文件尽可能小但保持基本清晰。 我分别用看视频环境(b站学习教程类&…

探索全桥电机驱动模块:实现精确控制与高效驱动

全桥电机驱动模块是一种在现代工程应用中广泛使用的电机驱动方式。对于需要精确控制和高效驱动的场景,如机器人、无人机、电动车等,全桥电机驱动模块提供了理想的解决方案。本文将介绍全桥电机驱动模块的原理和实际应用场景,并对几种常见的全…

【高并发网络通信架构】引入IO多路复用(select,poll,epoll)实现高并发tcp服务端

目录 一,往期文章 二,基本概念 IO多路复用 select 模型 poll 模型 epoll 模型 三,函数清单 1.select 方法 2.poll 方法 3.epoll_create 方法 4.epoll_ctl 方法 5.epoll_wait 方法 6.struct epoll_event 结构体 四,代…

uniapp踩坑之项目:uniapp修改弹窗组件样式

在components文件夹里创建zz-prompt文件夹&#xff0c;再在下面创建index.vue <!--通知弹窗index.vue--> <template><view class"prompt-box" v-if"visible" touchmove"true"><view class"prompt"><view c…

1.8 用户注册_和使用的工具类

步骤1&#xff1a;在common模块下,创建对应的工具类 /** 创建性别枚举(Sex)*/ /** md5加密类(MD5Utils)*/ /** 时间转换格式化类(DateUtil)*/ /** 生成全局唯一主机id (Sid)*/步骤2&#xff1a;在pojo模块下&#xff0c;创建表单封装bo对象 /** 注册表单bo对象 UserBO*/步骤3…

怎么将桌面笔记软件中记录的内容折叠起来或展开显示?

记笔记是一种良好的习惯&#xff0c;不仅可以帮助我们整理思绪&#xff0c;还能有效地记录重要的信息。在现代科技的支持下&#xff0c;一款优秀的笔记软件已经成为我们记录和管理事项的主要工具。特别是一款能够折叠的桌面笔记软件&#xff0c;将会给用户带来更多的便利和效率…

2023.07.07 homework

孩子们有些基础不好&#xff0c;鼓励为主&#xff0c;教他们慢慢搬公式推算&#xff0c;提高准确率就好啦。每一次比上一次好一点点&#xff0c;慢慢找回自信心。 图形结合&#xff0c;话说话&#xff0c;其实数学这玩意&#xff0c;画得好也比较直观 第八题找规律的题目&#…

【如何成功加载 HuggingFace 数据集】不使用Colab,以ChnSentiCorp数据集为例

【如何成功加载 HuggingFace 数据集】不使用Colab&#xff0c;以ChnSentiCorp数据集为例 前置加载数据集尝试一&#xff1a;标准加载数据库代码尝试二&#xff1a;科学上网尝试三&#xff1a;把 Huggingface 的数据库下载到本地尝试3.5 创建 state.json彩蛋 前置 Huggingface …

DAY45——动态规划part7

爬楼梯问题 爬楼梯阶数为1...m class Solution {public int climbStairs(int n) {int[] dp new int[n 1];int m 2;dp[0] 1;for (int i 1; i < n; i) { // 遍历背包for (int j 1; j < m; j) { //遍历物品if (i > j) dp[i] dp[i - j];}}return dp[n];} } class…

基于matlab处理来自立体相机图像数据构建室外环境地图并估计相机的轨迹(附源码)

一、前言 视觉同步定位和映射 &#xff08;vSLAM&#xff09; 是指计算摄像机相对于周围环境的位置和方向&#xff0c;同时映射环境的过程。该过程仅使用来自相机的视觉输入。vSLAM 的应用包括增强现实、机器人和自动驾驶。vSLAM 只需使用单眼摄像头即可执行。但是&#xff0c…

Spring系列3 -- 更简单的读取和存储对象

前言 上一篇章总结了,Spring的创建与使用,通过创建Maven项目配置Spring的环境依赖,创建Spring框架的项目,然后通过在Resource目录下创建Spring-config.xml配置文件,添加<bean></bean>标签将我们需要的bean对象注入到容器中,然后通过ApplicationContext获取Spring上…

Mybatis-puls——条件查询的三种格式+条件查询null判定+查询投影

前言 在mybatis_plus的封装中的Wrapper<T>接口参数就是用于封装查询条件 在测试类中启动如上一个简单的查询&#xff0c;然后控制台运行会输出一大堆无关日志&#xff0c;这里先把这些日志关闭 去除无关日志文件 先新建一个XML配置文件 然后变成如下&#xff0c;这里…

[神经网络]YoloV7

Yolo系列是一类很经典的目标检测网络&#xff0c;属于anchor-base型网络&#xff0c;即需要先产生先验框然后筛选先验框得到预测框。同时它也是One-Stage网络&#xff0c;即不需要额外的网络结构来筛选先验框。这两种特点使得它具备了运算速度快和计算精度相对较高的特点。 比较…

Win10怎么用U盘重装系统?Win10用U盘重装系统步骤图解教程

Win10怎么用U盘重装系统&#xff1f;使用U盘重装系统是一种快速而有效的方法&#xff0c;可以帮助我们在电脑中进行Win10系统的重新安装。首先用户需要准备一个容量适当的U盘&#xff0c;并确保其中没有重要数据&#xff0c;然后按照小编分享的Win10用U盘重装系统步骤图解教程操…

Redis 简单入门

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 安装 Redisredis 的数据类型和使用字符串类型字典类型列表类型集合类型有序集合类型 SpringBoot 集成 Redis添加 redis 依赖配…

el-checkbox / el-checkbox-group中绑定对象无法回显的问题处理

在使用el-checkbox / el-checkbox-group时&#xff0c;发现若label绑定的是对象&#xff0c;则是无法回显的&#xff0c;参考了很多方法&#xff0c;但大多都无法解决&#xff0c;最终参考下面的方法解决&#xff0c;记录一下。 <el-checkbox :label"JSON.stringify(i…

每天一点Python——day51

#第五十一天列表和字典为可变序列&#xff0c;元组是不可变序列 为什么要将元组设计成不可变序列呢&#xff1f; 一旦创建了不可变类型的对象&#xff0c;对象内部的所有数据将不能被修改 这样就避免了由于修改数据而导致的错误 对于不可变对象&#xff0c;在多任务环境下&…

最小覆盖串双指针解题思路及Java实现

最小覆盖串双指针解题思路及Java实现 题目双指针思路Java实现 题目 题目来自牛客NC28 最小覆盖子串 给出两个字符串 s 和 t&#xff0c;要求在 s 中找出最短的包含 t 中所有字符的连续子串。 例如&#xff1a; 输入&#xff1a;“XDOYEZODEYXNZ”,“XYZ” 返回值&#xff1a;“…