首页 > 数据库 >SQL:表关联与子查询

SQL:表关联与子查询

时间:2022-10-12 21:22:20浏览次数:60  
标签:JOIN join 查询 拼接 SQL 与子 table id SELECT

1、(INNER) JOIN :

  内链接,也就是交集。

  这种拼接得到最少的数据量,效率较高,但在数据分析中使用频率非常低,原因是这种拼接不分主次表,在完成表拼接的同时也做了条件筛选。

  而表拼接是比较初始的数据整理,过早排除一些数据是不明智的,往往不到最后的数据聚合无法确认哪些数据是否是必须的,

  此时再返回更改拼接逻辑,往往会导致后续的整个整合过程中出现聚合或筛选逻辑误差,从而花费大量的精力排错。 

2、LEFT JOIN  :

  左(外)连接,即左为主表,是最常用的拼接,逻辑是把右侧表中能与左侧表关联上的记录拼接在左侧表后面(默认排列,也可以根据需要重新排列字段顺序),

  如果右侧表有m条记录可以与左侧n条记录相关联,则左侧主表将生成n*m条记录,可以根据on 关联条件或where筛选条件排除不需要的数据。

3、RIGHT JOIN  :右(外)连接与LEFT JOIN 其实等价,一般习惯为左边主表,所以right join 不常用。

4、FULL (OUTER) JOIN :

  全拼接 ,即保留左右未匹配上的数据,一般用于主键或联合主键等价的多数据源的整合拼接,如 表_A 包含用户的a、b类信息,表_B 包含用户的c、d类信息,

  但两个表包含的用户量并不一定相同,即可能是两个表包含的用户量簿相同,也可能是 部分表_A 的用户没有c、d信息,或部分部分 表_B 用户没有a、b信息。

  而我们又需要得到一张横向展开a、b、c、d字段的宽表以便于进一步的聚会统计分析,这种情形,无论是left join 还是right join 都无法得到完整的数据,此时就需要用到全拼接。

  hive_SQL 语法:

  SELECT NVL(a.a,'')  a,NVL(a.b,'') b,NVL(b.c,'') c,NVL(b.d,'') d 

    FROM table_A a full join table_B b

    ON a.user_id = b.user_id 

  MySQL好像没有全拼接吧,需要用union 方式转换一下,貌似。。。

5、ON 拼接条件,MySQL 允许非等值(>,<...)拼接,hive 只支持等值链接 即 (=)

6、CROSS JOIN  或 ",":

  SELECT  * FROM tb_A,tb_B ,

  SELECT * FROM table_A,table_B

  这种拼接方法为笛卡儿积,得到所有可能的连接结果,此拼接不需要on 拼接条件,

  在一些特殊的情况下,尤其是时间纵向的数据分析有奇效,这种拼接导致数据量指数膨胀,易造成数据倾斜,运算阻塞奔溃,要慎用。。。

  WHERE 筛选条件

7、union all :上下拼接(并集),不去重

  union :上下拼接,去重,且按默认方式排序

8、子查询:

  即把其中一个select的结果作为另一个select 的where 筛选条件

  SELECT* FROM table_A  a 

    WHERE a.id IN (SELECT id FROM table_B WHERE id>n)

  实际应用过程中,子查询情况并不多,运行效率不高,且容易导致脚本复杂,可读性太差,尤其时在复杂的SQL脚本中,实用性不高,可以通过常规拼接代替。

标签:JOIN,join,查询,拼接,SQL,与子,table,id,SELECT
From: https://www.cnblogs.com/bigcat-sniffs-the-rose/p/16777943.html

相关文章

  • Azure SQL Managed Instance (3) 把本地Excel文件通过OPENROWSET导入到Azure SQL Mana
    《WindowsAzurePlatform系列文章目录》 本文介绍如何使用AzureBlobStorage,把本地Excel文件导入到AzureSQLMI在使用SQLMI的时候,通常会把本地Excel......
  • Native SQL 整理
    目录1一、静态调用连接数据库创建数据库更新数据库数据查询-到字段查询-到结构:(结构跟搜索字段完全对应)查询-到内表删除数据库数据...9删除数据库...9二、动......
  • MySQL 8.0.31 发布
    MySQL8.0.31在昨天(2022-10-11)正式发布,这一篇文章来一起看看有哪些更改。审计插件:审计插件的日志轮换函数audit_log_rotate(),简化了日志轮换的工作,用户无需手动更改日志名......
  • mysql存储json
    mysql存储json  1.json_merge合并Json并返回 ?1update`user`setinviteeMap=json_merge(inviteeMap,'{"xx1":100}')    where`account`='100089'......
  • Mybatis---动态查询(choose,when,otherwise)
    choose(when,otherwise)标签有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。而使用if标签时,只要test中的表达式为true,就会执行if标签中的条件。MyBat......
  • 关于 sql 中的 over() 函数
    关于sql中的row_number()、over()、rank()、dense_rank()函数,还是挺常见的,而且看起来高级。萌新理解另一种聚合函数,不需要绑定groupby就能把聚合和非聚合的函数展示......
  • mysql数据库新增用户只有读写权限
    CREATEUSER'pcms'@'%'IDENTIFIEDBY'123456';  --创建用户pcms,密码为123456GRANTSELECT,INSERT,UPDATE,DELETEONdatabase1.*TO'pcms';--赋予pcms账号,datab......
  • mysql if判断字符串比较
    一、ifnull判断selectifnull(param,1);#如果param为null则输出1,如果不为null,则输出param当使用concat拼接时,如果有列值为null,结果从null到最后都是一个null填充,不会再显示......
  • sql server 解密存储过程的过程
    UsemasterGoifobject_ID('[sp_DecryptObject]')isnotnullDropProcedure[sp_DecryptObject]Gocreateproceduresp_DecryptObject(@Objectsysname,......
  • mysql模糊查时间
     今天需要用到模糊查时间,直接模糊查时间一直报错,后来查阅网上一些资料知道date_format()可以根据指定格式来格式化日期值,并返回格式化的日期字符串,下面的内容都是从大佬......