【数据库】join的用法和场景(包含非等值于非等值)
又好久没写文章了~今天来写写数据库join的事情
其实最近在看《长安十二时辰》,讲实话蛮好看的,为此我还用支付宝的积分换了一个月的优酷会员呢!
写了挺长时间的sql,join这个功能应该说是非常常见,而且非常好用的了,他的实现是将两部分数据笛卡尔积,然后通过on字段来筛选符合条件的结果。
一、等值join
等值的join一般是实现两种功能:
1、过滤掉不需要的数据
场景:
表A有100W人的行为
表B有10W人的uid
表A Join 表B,就可以得到表B中10W人的行为
2、获得更多信息
表A有10W人的uid和基础属性
表B有10W人的下订单的数据
表C有具体商品的详细信息
三表关联就可以得到10W人的基础信息和他们所购买的所有商品的详细信息
题外话:场景一在大数据场景下,各种框架都会有优化,优化的策略基本都是内存加载表B,然后读取表A每一条数据的时候,直接判断该条数据的uid是否存在于表B,以此来决定表A中哪些数据该保留,哪些不该保留。hive中这个功能叫map join,spark通过广播变量实现。
二、那么来说说不等值的join
不等值join一般也有如下场景
1、某个数据段的匹配
举两个例子说明:
例子一:购买折扣商品:
一次性买1~10个,打8折
一次性买11~20个,打6折
一次性买21~30个,打5折
小明买了25个,应该打几折呢?
表A:
开始个数 | 结束个数 | 折扣 |
1 | 10 | 0.8 |
11 | 20 | 0.6 |
21 | 30 | 0.5 |
表B:
uid | 购买个数 |
小明 | 25 |
小红 | 13 |
--sql实现:select uid,购买个数,折扣 from 表B inner join 表A on 表B.购买个数 >=表A.开始个数 and 表B.购买个数 <=表A.结束个数
例子二:跟上一个例子一样,只是用的是时间维度
我就直接引用别人的文章了
spark sql 不等值 join:https://blog.51cto.com/10120275/2171066(作者:巧克力黑)
2、模糊匹配
简而言之就是:判断表A中某个字段是否like表B中的另一个字段
随便举个例子:
表A是uid的基础属性,表B是一些标签(就是一些中文),我想要筛选出uid的name中包含表B中任一标签的uid都有谁
--greenplum的写法
SELECT *
FROM 表A
INNER JOIN
(SELECT tag from 表B where 某些筛选条件) bON username LIKE '%'|| tag||'%'--mysql的写法
SELECT *
FROM 表A
INNER JOIN
(SELECT tag from 表B where 某些筛选条件) b
ON username LIKE CONCAT('%' , tag , '%')
大部分的数据库都是支持以上的sql的,但是比如大数据常用的框架Hive其实是不支持非等值的join的,所以思想是一样,只是实现不一样!
hive可以通过locate函数实现
【Hive】join中的模糊匹配(locate):https://blog.csdn.net/qq_34105362/article/details/80540164(作者:喜东东cc)
所以,其实sql是很好用的工具,虽然数据库多种多样,但是他的实现思想很共通,而且网上能搜索到的资料还是比较全的,在做数据开发的时候,还需多加思考该功能用sql如何实现,毕竟大多数场景下,能从sql中直接得到结果的开发时间是较短的,效率也是较高的,而且移植起来也是相对比较容易的!!
本人菜鸡一只,不过还是很努力在写博客,力争写出不误导他人的博文!所以如果有哪里写得有误,还请大家批评指正,我一定立马修改~
写下这篇文章,还得感谢下我的王基友,产品经理随便说了一个试试看的需求,我本意是想用代码实现,但又觉得麻烦,在和王基友的讨论下,决定还是用非等值join来实现,当然确实是又快又好的实现了这个需求(虽然这个需求只是试试),果然要多和有经验的厉害的人讨论问题开阔视野啊,时常觉得自己是井底之蛙~呱呱!
【数据库】join的用法和场景(包含非等值于非等值)相关推荐
- MySQL数据库基础到进阶笔记整理包含事务、SQL优化、锁等内容
写在前面 本文是在学习MySQL数据库时整理的笔记,可供初学者学习 是在https://dhc.pythonanywhere.com/entry/share/?key=12e4a7324f68371d ...
- TiDB 数据库的 4 大应用场景分析
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 如今硬件的性价比越来越高,网络传输速度越来越快,数据库分 ...
- Oracle数据库数据查询语句示例(包含大部分常用语句)
Oracle数据库数据查询语句示例(包含大部分常用语句) 目标 本文用到的关系模式 语句示例 1.在创建的s,p,j和spj表中完成以下查询 (1)查询零件重量在10-20之间(包括10和20)的零件 ...
- 【混合云小知识】混合云应用场景包含哪些?
混合云应用场景包含哪些? 1.云上业务.弹性伸缩:业务呈峰谷交替,需要利用云上资源进行弹性伸缩. 2.云上云下.多地互通:多分支机构就近接入阿里云.华为云等等,网络打通互访,共享云上资源. 3.数据上 ...
- 数据库join使用方法
这里写目录标题 数据库join使用方法 inner join的用法 left join 的用法 Right join 的用法 数据库join使用方法 inner join(等值连接):只返回两个表中联 ...
- mysql全外连接和笛卡尔积_数据库(join) 内连接、外连接、笛卡尔积
今天,重刷了刷leetcode数据库的题目,对数据库连接查询做一个记录. 数据库(join) 内连接.外连接.笛卡尔积 内连接(自身连接) 内连接有隐式内连接和显示内连接两种: 隐式(无join),f ...
- 内连接(等值、非等值连接)、外连接(左外连接、右外连接、全连接)、自然连接、自连接
目录 一.交叉连接(笛卡尔积) 二.内连接(等值.非等值连接) 三.外连接(左外连接.右外连接.全连接) 四.自然连接 五.自连接 一.交叉连接(笛卡尔积) 交叉联接返回左表中的所有行,左表中的每一行 ...
- 判断回文串时忽略既非字母又非数字的字符
问题及解决办法 1.question:通过删除既非字母有非数字的字符过滤这个字符串.answer:创建一个新的空字符串构建器,将字符串中每一个字母或数字字符添加到字符串构建器中,然后从这个构建器返回所 ...
- mysql 非英文_非英文网站如何使用MySQL的字符集
使用 MySQL 字符 集 对于非英文网站,当他们使用非英语语言从数据库中写入或读取数据时,常常必须解决字符集的问题.字符集指导数据库哪种字符编码方案用于数据的写入读取,这样 可以简单地理解 为 字符 ...
最新文章
- echarts 在.net 中和数据库交互
- C#操作 MongoDB【原创】
- BlazeDS入门教程-很详细-赞原创作者一个
- 阿里公开自研AI集群细节:64个GPU,百万分类训练速度提升4倍
- ubuntu 设置静态路由_Linux系统添加永久静态路由的方法
- jsp页面的相关复习
- 什么是ISO9000质量管理体系认证以及认证流程
- 论文发表费用大概需要多少
- CSP201403-1 相反数 (Python)
- python使用moviepy包下的VideoFileClip时报错:OSError: [WinError 6] 句柄无效解决方法
- 君莫笑系列视频学习(4)
- DM05-奇异点处理总结
- 片上总线Wishbone 学习(九)总线周期之单次读操作
- IEEE会议投稿资料汇总http://cadcg2015.nwpu.edu.cn/index.htm
- imgui中在指定位置(非固定window方式)绘制text
- Linux rar unrar的安装
- 配置文档的访问权限 配置LDAP家目录漫游
- BIM模型一键输出 3D Tiles (for Cesium) 和 glTF/blg
- PHP.ini配置文件(转载)
- 能够实时显示CPU温度的软件
热门文章
- IDEA checkStyle
- FPGA 解析PS2游戏手柄
- CMAPSS的个人理解和CMAPSS、PHM08、09、12下载地址
- MYSQL统计每年、每月、每日的数据
- 月入破万,程序员副业接私活的平台推荐
- 《C++ Primer》读书笔记(2,3.1,3.2)
- Construct2 水波特效
- bat文件获取当前目录
- 大数据分析-第六章 分类
- import cv2 import random import numpy as np from matplotlib import pyplot as plt img_gray = cv2.imre