mysql中inner join和left join使用详解

目录
  • 区别
  • inner join 场景
  • inner join 场景

区别

返回不同
1、inner join只返回两个表中联结字段相等的行
2、left join的数量小于等于左表和右表中的记录数量。

数量不同
1、inner join返回包括左表中的所有记录和右表中联结字段相等的记录。
2、left join的数量以左表中的记录数量相同

记录属性不同
1、inner join不足的记录属性会被直接舍弃
2、left join不足的记录属性用NULL填充

inner join 场景

设计两张表:

  • channel 频道表:有频道id、频道name等
  • module 模块表:模块id、模块name、channe_id。

页面展示频道时,可能会有新增了一个频道但是没有模块,此时不能用inner join 不然新增的模块查询不出来,所以用left join

 select channel.* from  channel left join modules on channel.id = modules.channel_id
 where page_id=1
 group by channel.id order by channel.new_sort asc , channel.id desc

1、page_id是指在哪个页面类型下,在频道channel表中定义,用来区分哪个页面类型
2、一个频道id可能有多个模块去关联,所以需要按照频道id进行分组
3、new_sort可以设置频道的排序显示,另外排序相同应该让频道最先创建的显示在前面。

以下这种情况新创建的频道就不会显示,并且没有模块的频道也不会显示。

select channel.*  from channel inner join modules on channel.id=modules.channel_id
where page_id=1 group by channel.id order by channel.new_sort asc , channel.id desc

最后:有点疑问,频道只做显示频道相关信息,并没有用到关联的模块信息,所以感觉这样也能满足需求了。后续发现问题再更吧~

 select channel.* from  channel
 where page_id=1 order by channel.new_sort asc , channel.id desc

额~补充问题,上面遗留的问题是页面上需要查询module的id所以才关联了。

之前还遇到了个inner join 的场景,后续再补~

inner join 场景

新加一个策略表policy_lib 、然后再创建一个中间表channel_policy记录 channel频道和policy_lib策略表关联。
那么显然sql这样写

select policy_lib.id,channel_policy.policy_id,channel_policy.channel_id,channel.id  from policy_lib inner join channel_policy on channel_policy.policy_id=policy_lib.id
inner join channel on channel.id=channel_policy.channel_id

使用inner join 显然结果查询出来不会有空的情况,如果用left join 万一表中有脏数据,左边有数据右边时空的,在处理的时候还需要考虑是否有空的情况显然不合理。

到此这篇关于mysql中inner join和left join使用详解的文章就介绍到这了,更多相关mysql中inner join和left join内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mysql left join快速转inner join的过程

    在日常优化过程中,发现一个怪事情,同一个SQL出现两个完全不一样执行计划,left join 连驱动表都可以变成不一样. 对于left join,如果where条件里有被关联表过滤,left join有可能被转成inner join ,本案例中shopInfo有ShopCategory = 'LOC'过滤条件: 保证shopInfo的记录非NULL,因此left join在优化过程中可以转为inner join. 那么O和S的JOIN顺序就是可以交换的. 验证结论: 创建表: --班级表 CRE

  • 超详细mysql left join,right join,inner join用法分析

    下面是例子分析表A记录如下: aID        aNum 1           a20050111 2           a20050112 3           a20050113 4           a20050114 5           a20050115 表B记录如下: bID        bName 1            2006032401 2           2006032402 3           2006032403 4           20

  • MySQL中使用去重distinct方法的示例详解

    一 distinct 含义:distinct用来查询不重复记录的条数,即distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而无法返回其他字段 用法注意: 1.distinct[查询字段],必须放在要查询字段的开头,即放在第一个参数: 2.只能在SELECT 语句中使用,不能在 INSERT, DELETE, UPDATE 中使用: 3.DISTINCT 表示对后面的所有参数的拼接取 不重复的记录,即查出的参数拼接每行记录

  • MySQL中CHAR和VARCHAR类型演变和详解

    一.演变: MySQL数据库的varchar类型在5.0.3以下的版本中的最大长度限制为255,其数据范围可以是0~255. 在MySQL5.0.3及以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去了3个字节,也就是说,在5.0.3以下版本中需要使用固定的TEXT或BLOB格式存放的数据可以在高版本中使用可变长的varchar来存放,这样就能有效的减少数据库文件的大小. 如果在varchar中写入大于设定的长度,默认情况下会

  • MySQL中sleep函数的特殊现象示例详解

    前言 MySQL中的系统函数sleep,实际应用的场景不多,一般用来做实验测试,昨天在测试的时候,意外发现sleep函数的一个特殊现象.如果在查询语句中使用sleep函数,那么休眠的时间跟返回的记录有关. 如下测试所示: mysql> create table test(id int); Query OK, 0 rows affected (0.03 sec) mysql> select *, sleep(6) from test; Empty set (0.00 sec) mysql>

  • MySQL中SQL Mode的查看与设置详解

    MySQL中SQL Mode的查看与设置 MySQL可以运行在不同的模式下,而且可以在不同的场景下运行不同的模式,这主要取决于系统变量 sql_mode 的值.本文主要介绍一下这个值的查看与设置,主要在Mac系统下. 对于每个模式的意义和作用,网上很容易找到,本文不做介绍. 按作用区域和时间可分为3个级别,分别是会话级别,全局级别,配置(永久生效)级别. 会话级别: 查看- select @@session.sql_mode; 修改- set @@session.sql_mode='xx_mod

  • MySQL中你可能忽略的COLLATION实例详解

    前言 MySQL 数据库的字符串类型有 CHAR.VARCHAR.BINARY.BLOB.TEXT.ENUM.SET.不同的类型在业务设计.数据库性能方面的表现完全不同,其中最常使用的是 CHAR.VARCHAR.今天我就带你深入了解字符串类型 CHAR.VARCHAR 的应用. CHAR 和 VARCHAR 的定义 CHAR(N) 用来保存固定长度的字符,N 的范围是 0 ~ 255,请牢记,N 表示的是字符,而不是字节.VARCHAR(N) 用来保存变长字符,N 的范围为 0 ~ 65536

  • MySQL中常见的六个约束类型详解

    目录 前言 1. not null 2. unique 3. default 4. primary key 自增主键auto_increment 5. foreign key 6. check 总结 前言 在向数据表中插入数据时,有的时候对于插入的数据是有特殊要求的,比如学生成绩不能为空,学生学号不能重复等等,这个时候约束就派上用场了. 约束类型是通过对表的行或列的数据做出限制,来确保表的数据的完整性.唯一性.这一章我们主要介绍六个常见的MySQL约束类型. 1. not null 保证指定不能

  • MySQL中查询json格式的字段实例详解

    工作开发过程遇到一个需求:需要动态存储客户的姓名.手机号码.身份证.证件类型,意思是可能前端会传一个人或二个人或者三个人的信息是动态的不固定人数的四个字段(姓名.手机号码.身份证.证件类型). 前端页面如下: 我是使用List来接收前端传过来 json,mysql 用 varchar 来保存这个 json 数组 [{ "cardId": "110101199003072316", "cstName": "张双儿1", &quo

  • MySQL中几种常见的嵌套查询详解

    目录 几种常见的嵌套查询——以学员成绩为例 含ANY或ALL关键词的嵌套查询 含IN关键词的嵌套查询 含EXISTS关键词的嵌套查询 [补充]关于IN和EXISTS两个关键词还有两个延伸关键词NOT IN和NOT EXISTS 附:其他使用方法和注意 总结 几种常见的嵌套查询——以学员成绩为例 嵌套查询,也称为子查询,是实际工作中经常用到的一种查询方式.子查询其实就是在已有的查询语句中的where后面再嵌套一层查询语句,也就是把内层查询结果当做外层查询参照的数据表来使用. 在工作中,经常会遇见4

  • Mysql中where与having的区别实例详解

    以一道题来做引子 牛客,SQL30 计算总和 OrderItems表代表订单信息,包括字段:订单号order_num和item_price商品售出价格.quantity商品数量. order_num item_price quantity a1 10 105 a2 1 1100 a3 1 200 a4 2 1121 a5 5 10 a6 1 19 a7 7 5 [问题]编写 SQL 语句,根据订单号聚合,返回订单总价不小于1000 的所有订单号,最后的结果按订单号进行升序排序. 提示:总价 =

  • mysql中count(), group by, order by使用详解

    最近做IM的时候遇到一个问题,同时用到了这三个关键字.就是查询一个人的离线消息详情,我们服务端返回给客户端显示的这个详情包括了三个内容,第一个要求列出离线这段时间哪些人或者群给你发了消息,第二个这其中的某个人或者群发了多少条离线消息,第三个拿出最新的一条显示出来.很明显,group by分组哪些人或者群给你发了离线消息,count()得到离线消息数量,order by时间来排序拿出最新的消息. select count(1) as cnt, msg_data from t_im_chat_off

随机推荐