第九章 - 多表查询(join,left join 等),合并查询(union union all),子查询

news2025/7/15 18:23:00

第九章 - 多表查询(join,left join 等),合并查询(union & union all),子查询

  • 交叉链接(笛卡尔积)
  • 内连接查询
  • 外连接查询
    • 左链接: left join
    • 右链接:right join
  • 组合查询 union & union all
  • 使用数据下载:

在日常工作中,需要查询的数据一般是存在多个不同的数据表中,比如用户的基本数据信息,商品的信息,用户的行为,订单信息等,都是不同的表,通过用户ID,订单ID等信息可以链接多个表进行多表查询。

多表链接的几种常见的方法:

交叉链接(笛卡尔积)

交叉链接会产生笛卡尔积,所以基本不会用此种链接查询。

select 字段名称 from 表a,表b

实例:

select
	*
from
	raw_sample,user_profile

可以看到显示的结果是没有对应关系的,这样的结果也是不能使用的。
在这里插入图片描述

内连接查询

内连接查询可以通过指定的条件来匹配两张或多张表中的数据,能按照条件匹配上就显示,匹配不上就不显示。

有两种写法:
1.完整写法

select 字段名称 from 表a inner join 表b on 对应条件

2.省略写法

select 字段名称 from 表a,表b where 对应条件

虽然两种写法查询的结果是一样的,但是还是建议使用完整的写法,更规范一些,而且在别人看的时候会更容易理解一些。尤其是在写一些比较复杂的查询代码的时候。

举个例子:查询所有男性的点击行为。

  • user_profile 为用户基本信息表,其中userid为用户id,final_gender_code为用户性别字段(男=1,女=2)。
  • behavior_log 为用户性别信息表,btag为用户点击行为(ipv = 浏览,cart = 加入购物车,fav = 喜欢,buy = 购买)

1.完整写法:

select
	a.userid, # 用户id
	a.final_gender_code, # 性别 1男,2女
	b.btag  # 行为(ipv = 浏览,cart = 加入购物车,fav = 喜欢,buy = 购买)
from
	# as 别名也可以对表用,此处就用a,b来替代原来的表名
	# on表示表时间的关联条件,此处为关联用户id
	user_profile as a inner join behavior_log as b on a.userid = b.user
where	
	# 性别为1男性
	a.final_gender_code = 1

输出结果:
在这里插入图片描述

2.省略写法

select
	a.userid, # 用户id
	a.final_gender_code,  #性别
	b.btag  # 行为(ipv = 浏览,cart = 加入购物车,fav = 喜欢,buy = 购买)
from
	user_profile as a , behavior_log as b
where
	# 链接条件为用户ID,筛选条件为1男性
	a.userid = b.user and a.final_gender_code = 1

输出结果:
在这里插入图片描述

外连接查询

左链接: left join

左外连接,也是最常用的一种链接方式,是以左边表为基本表,用右边表去匹配左边表中对应的数据,匹配上就显示,没有匹配上就用null来填充。

select 字段名称 from 表a left outer join 表b on 对应条件

outer 可以省略,一般直接写为 left join 

举个例子:

select
	a.userid,  # 用户ID
	b.user,  # 用户ID
	b.btag  # 行为(ipv = 浏览,cart = 加入购物车,fav = 喜欢,buy = 购买)
from
	# 以左边表user_profile为准,用behavior_log中的数据去匹配
	# on 链接条件为 用户ID
	user_profile as a left join  behavior_log as b on a.userid = b.user
order by
	# 以userid列正序排序
	a.userid 

输出结果:
在这里插入图片描述
以左表user_profileuserid为准,用右表去匹配左表,当右表没有对应数据的时候就用null来填充显示

右链接:right join

右外连接,和左外连接相反,是以右边表为基本表,用左边表去匹配右边表中对应的数据,匹配上就显示,没有匹配上就用null来填充。
不过一般情况下基本都是用左连接。

select 字段名称 from 表a right outer join 表b on 对应条件

outer 可以省略,一般直接写为 right join 

举个例子:

select
	a.userid,  # 用户ID
	b.user,  # 用户ID
	b.btag  #行为(ipv = 浏览,cart = 加入购物车,fav = 喜欢,buy = 购买)
from
	# 以右边表behavior_log为准,用左边表user_profile中的数据去匹配。
	# 筛选条件 on 为用户ID
	user_profile as a right outer join  behavior_log as b on a.userid = b.user 
order by
	# 按user列正序排序
	b.user

输出结果:
在这里插入图片描述
从结果可以看到,左边userid没有匹配到user上面数据的,也是用null来填充。

组合查询 union & union all

组合查询是可以执行多个select查询,并且可以将结果作为单个查询结果返回。
使用要点:

  1. 选择的字段数量需要一致
  2. 相对应字段的数据类型需要一致
  3. 列名在显示的时候会使用第一条select的列名
  4. union 的结果会进行去重操作
  5. union all 不会进行去重,所以计算速度会快一些。
  6. 可以用于合并链接数据,或者合并多个查询结果。

语法格式:

select 字段名称 from 表 (where 条件)

union (或者union allselect 字段名称 from 表 (where 条件)

举个例子1:基本拼接数据
例子使用用union,如果不需要去重可以替换为union all

select
	userid,
	final_gender_code
from
	user_profile
# union会进行去重操作
# 如果允许有重复值出现,可以使用 union all
union

select
	adgroup_id,
	price
from
	ad_feature 

输出结果:
列名是以第一条select的列名来显示的
在这里插入图片描述
举个例子2:用来链接聚合后的数据

  • 一般使用select进行多个数据汇总的时候,数据结果是在一行数据上显示的,如果想要把数据结果用竖列显示,可以尝试适合用此方法。
select
	# 添加新的行内容和列名
	"人数" as "分类",
	# 设置新的列名
	count(distinct userid) as "结果"
from
	user_profile

union

select
	# 添加新行的内容
	"价格",
	sum(price)
from
	ad_feature 

输出结果:
在这里插入图片描述

使用数据下载:

SQL演示数据集 - ad-feature(广告基本信息表)
SQL演示数据集 - user-profile(用户基本信息)
SQL演示数据集 - behavior-log(行为数据表)
SQL演示数据集 - raw-sample(样本骨架数据)

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

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

相关文章

python3遍历目录的三种方法浅谈

日期:2023年2月22日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方&#xf…

JavaScript中怎么实现链表?

JavaScript中怎么实现链表? 学习数据结构的的链表和树时,会遇到节点(node)这个词,节点是处理数据结构的链表和树的基础。节点是一种数据元素,包括两个部分:一个是实际需要用到的数据&#xff1b…

MATLAB | 如何用MATLAB绘制这样有气泡感的网络图

今天给大家带来一款用来绘制有气泡感的网络图的工具函数,绘制效果如下: 花里胡哨的,气泡大小代表流入流出数据量综合,不同颜色的气泡代表属于不同类,两个气泡之间有连线代表有数据流动,连线透明度代表流动数…

木鱼cms 审计小结

MuYuCMS基于Thinkphp开发的一套轻量级开源内容管理系统,专注为公司企业、个人站长提供快速建站提供解决方案。‍环境搭建我们利用 phpstudy 来搭建环境,选择 Apache2.4.39 MySQL5.7.26 php5.6.9 ,同时利用 PhpStorm 来实现对项目的调试‍漏洞复现分析‍…

经过深思熟虑后的接口测试自动化的总结与思考

序近期看到阿里云性能测试 PTS 接口测试开启免费公测,本着以和大家交流如何实现高效的接口测试为出发点,本文包含了我在接口测试领域的一些方法和心得,希望大家一起讨论和分享,内容包括但不仅限于:服务端接口测试介绍接…

中央一号文件首提“即时零售”,县域掀起消费业态新风潮

经过几年的探索,即时零售已经逐步走向成熟,并开始向三四线城市以及乡镇城市渗透。 过去一年,京东、美团、阿里争先布局即时零售市场,完善即时配送网络、培养用户消费习惯,即时零售订单迎来了骤增。2022年下半年&#…

【字节面试】Fail-fast知识点相关知识点

字节面试,问到的一个小知识点,这里做一下总结,其实小编之前有一篇文章,已经对此有过涉及,不过这里知识专项针对于问题,把这个知识点拎出来说一下。 1.问题 什么是Fail-fast机制? Hashmap是否拥…

斯坦福大学团队提出AI生成文本检测器DetectGPT,通过文本对数概率的曲率进行可解释判断

原文链接:https://www.techbeat.net/article-info?id4583 作者:seven_ 随着以ChatGPT等大型语言模型(large language models,LLMs)的爆火,学界和工业界目前已经开始重视这些模型的安全性,由于C…

DSP28系列 CCS 开发问题总结及解决办法

文章目录 问题汇总 1. CCS编译器的Project菜单栏工程导入选项丢失,怎么解决! 1.1启动CCS后发现导入工程菜单栏丢失,无法导入工程文件。 1.2方法一 工程选项的导入工程文件丢失,如果要重新获得相应的选项,就需要删除当前…

Java必备小知识点2——输入输出与变量

变量变量的实质假如将内存比喻成一座房子,存入内存就相当于住进房子。但是如果一个房间给了应人,他却不住,那么房间实际上是空着的,又属于个人,别人无法住进来,就会造成浪费。那么将内存比喻成酒店&#xf…

Cocoa-autoLayout

什么是autoLayout autoLayout的重新布局是通过 constraints 各个view实现自动布局,autoLayout重新调整布局view是在runtime中 autolayout without constraints 也就是通过stack view实现不引入复杂的constraints的情况下 还能使用autoLayout 什么是stack view …

SPDK NVMe-oF Target

SPDK NVMe-oF TargetNVMe协议制定了本机高速访问PCIe SSD的规范,相对于SATA、SAS、AHCI等协议,NVMe协议在带宽、延迟、IOps等方面占据了极大的优势,但是在价格上目前相对来讲还是比较贵的。不过不可否认的是,配置PCIe SSD的服务器…

软件供应链受威胁下的应对方法——供应链安全管理平台的五大工具能力

背景如今,软件供应链安全问题已经成为一个全球性的难题。根据数据统计,2017年全球遭受网络攻击的公司比例已经达到了93%,其中很大一部分是由于软件供应链安全问题导致的。而在中国,据统计,2019年全国共发生…

FlinkSQL行级权限解决方案及源码

FlinkSQL的行级权限解决方案及源码,支持面向用户级别的行级数据访问控制,即特定用户只能访问授权过的行,隐藏未授权的行数据。此方案是实时领域Flink的解决方案,类似离线数仓Hive中Ranger Row-level Filter方案。 源码地址: https…

不可变集合、Stream、异常、日志框架

创建不可变集合 什么是不可变集合?不可变集合,就是不可被修改的集合。集合的数据项在创建的时候提供,并且在整个生命周期中都不可改变。否则报错。为什么要创建不可变集合?如果某个数据不能被修改,把它防御性地拷贝到…

交叉编译 SQLite

交叉编译 SQLite 概述 SQLite 是一个 C 语言库,它实现了一个小型、快速、自包含、高可靠性、功能齐全的 SQL 数据库引擎。SQLite 是世界上使用最多的数据库引擎。SQLite 内置于所有手机和大多数计算机中,并捆绑在人们每天使用的无数其他应用程序中。 S…

java迷宫回溯找最短路径问题(多策略)

1、首先我们先明确迷宫,并创建如上图,1为墙,中间的1为挡板墙,由图我们可以看出这是一个二维数组/*** 创建地图* return*/public static int [][] createMap(){int [][] mapNew new int[8][7];//1表示墙,不能走for (in…

Kaggle系列之识别狗的品种类别(深度残差网络模型ResNet-34)

我们来到这个比赛页面:https://www.kaggle.com/competitions/dog-breed-identification这个数据集的目标是Determine the breed of a dog in an image(确定图像中狗的品种)我们先下载数据集解压之后来看下(当然不手动解压,也可以使用),这里我…

超全 Vue3新特性总结

Vue3 应用-技术分享与交流 新特性篇 Vue3 组合式 API VS Vue2 选项式 API 选项式 API 面临的问题: 我们在处理业务逻辑时,需要在 data computed method watch 中分别进行代码编写,碎片化使得理解和维护复杂组件变得困难。选项的分离掩盖了潜在的逻辑问…

百度工程师浅谈分布式日志

作者 | 文库基础架构 导读 我们做软件开发时,或多或少的会记录日志。由于日志不是系统的核心功能,常常被忽视,定位问题的时候才想起它。本文由浅入深的探讨不起眼的日志是否重要,以及分布式架构下的日志运维工具应该具备哪些能力&…