又好久没写文章了~今天来写写数据库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的用法和场景(包含非等值于非等值)相关推荐

  1. MySQL数据库基础到进阶笔记整理包含事务、SQL优化、锁等内容

    写在前面 本文是在学习MySQL数据库时整理的笔记,可供初学者学习 是在https://dhc.pythonanywhere.com/entry/share/?key=12e4a7324f68371d ...

  2. TiDB 数据库的 4 大应用场景分析

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 如今硬件的性价比越来越高,网络传输速度越来越快,数据库分 ...

  3. Oracle数据库数据查询语句示例(包含大部分常用语句)

    Oracle数据库数据查询语句示例(包含大部分常用语句) 目标 本文用到的关系模式 语句示例 1.在创建的s,p,j和spj表中完成以下查询 (1)查询零件重量在10-20之间(包括10和20)的零件 ...

  4. 【混合云小知识】混合云应用场景包含哪些?

    混合云应用场景包含哪些? 1.云上业务.弹性伸缩:业务呈峰谷交替,需要利用云上资源进行弹性伸缩. 2.云上云下.多地互通:多分支机构就近接入阿里云.华为云等等,网络打通互访,共享云上资源. 3.数据上 ...

  5. 数据库join使用方法

    这里写目录标题 数据库join使用方法 inner join的用法 left join 的用法 Right join 的用法 数据库join使用方法 inner join(等值连接):只返回两个表中联 ...

  6. mysql全外连接和笛卡尔积_数据库(join) 内连接、外连接、笛卡尔积

    今天,重刷了刷leetcode数据库的题目,对数据库连接查询做一个记录. 数据库(join) 内连接.外连接.笛卡尔积 内连接(自身连接) 内连接有隐式内连接和显示内连接两种: 隐式(无join),f ...

  7. 内连接(等值、非等值连接)、外连接(左外连接、右外连接、全连接)、自然连接、自连接

    目录 一.交叉连接(笛卡尔积) 二.内连接(等值.非等值连接) 三.外连接(左外连接.右外连接.全连接) 四.自然连接 五.自连接 一.交叉连接(笛卡尔积) 交叉联接返回左表中的所有行,左表中的每一行 ...

  8. 判断回文串时忽略既非字母又非数字的字符

    问题及解决办法 1.question:通过删除既非字母有非数字的字符过滤这个字符串.answer:创建一个新的空字符串构建器,将字符串中每一个字母或数字字符添加到字符串构建器中,然后从这个构建器返回所 ...

  9. mysql 非英文_非英文网站如何使用MySQL的字符集

    使用 MySQL 字符 集 对于非英文网站,当他们使用非英语语言从数据库中写入或读取数据时,常常必须解决字符集的问题.字符集指导数据库哪种字符编码方案用于数据的写入读取,这样 可以简单地理解 为 字符 ...

最新文章

  1. echarts 在.net 中和数据库交互
  2. C#操作 MongoDB【原创】
  3. BlazeDS入门教程-很详细-赞原创作者一个
  4. 阿里公开自研AI集群细节:64个GPU,百万分类训练速度提升4倍
  5. ubuntu 设置静态路由_Linux系统添加永久静态路由的方法
  6. jsp页面的相关复习
  7. 什么是ISO9000质量管理体系认证以及认证流程
  8. 论文发表费用大概需要多少
  9. CSP201403-1 相反数 (Python)
  10. python使用moviepy包下的VideoFileClip时报错:OSError: [WinError 6] 句柄无效解决方法
  11. 君莫笑系列视频学习(4)
  12. DM05-奇异点处理总结
  13. 片上总线Wishbone 学习(九)总线周期之单次读操作
  14. IEEE会议投稿资料汇总http://cadcg2015.nwpu.edu.cn/index.htm
  15. imgui中在指定位置(非固定window方式)绘制text
  16. Linux rar unrar的安装
  17. 配置文档的访问权限 配置LDAP家目录漫游
  18. BIM模型一键输出 3D Tiles (for Cesium) 和 glTF/blg
  19. PHP.ini配置文件(转载)
  20. 能够实时显示CPU温度的软件

热门文章

  1. IDEA checkStyle
  2. FPGA 解析PS2游戏手柄
  3. CMAPSS的个人理解和CMAPSS、PHM08、09、12下载地址
  4. MYSQL统计每年、每月、每日的数据
  5. 月入破万,程序员副业接私活的平台推荐
  6. 《C++ Primer》读书笔记(2,3.1,3.2)
  7. Construct2 水波特效
  8. bat文件获取当前目录
  9. 大数据分析-第六章 分类
  10. import cv2 import random import numpy as np from matplotlib import pyplot as plt img_gray = cv2.imre