• MySQL左右连接查询中的NULL的数据筛选问题


    这里使用左连接为例子,对于左连接是将左边表的数据显示,右边表中如果没有对应的数据则使用null填充。

    game表:

    game_type表:

    SELECT g.name,g.type_id,t.type_id,t.type_name FROM game g LEFT JOIN game_type t ON t.type_id=g.type_id

    这里的语句得到的内容:

     

    这里我们如果想将没有游戏类型的游戏信息去掉:

    SELECT g.name,g.type_id,t.type_id,t.type_name FROM game g LEFT JOIN game_type t ON t.type_id=g.type_id where t.type_name!=''

    也可以这样:

    SELECT g.name,g.type_id,t.type_id,t.type_name FROM game g LEFT JOIN game_type t ON t.type_id=g.type_id where not ISNULL(t.type_name)

     

    上面两条语句得到的结果是一样的,事实上准确点来说是应该使用第二条,因为如果在game表中的游戏5记录对应的type_id是一个没有type_name的类型,如下图:

    game表:

    game_type表:

     

    使用语句:SELECT g.name,g.type_id,t.type_id,t.type_name FROM game g LEFT JOIN game_type t ON t.type_id=g.type_id where t.type_name!=''得到的结果:

    但是游戏5是有游戏类型的,只是游戏类型为空。所以这时候使用下面语句得到的结果才是正确的:

    SELECT g.name,g.type_id,t.type_id,t.type_name FROM game g LEFT JOIN game_type t ON t.type_id=g.type_id where not ISNULL(t.type_name)

    这里我们将game表中的游戏5记录对应的type_id记录设置为0,那么使用:

    SELECT g.name,g.type_id,t.type_id,t.type_name FROM game g LEFT JOIN game_type t ON t.type_id=g.type_id

    得到的内容:

    假如这里我们想将游戏5的记录筛选出来,就是筛选游戏表中没有对应的游戏类型记录:

    因为刚刚我们使用语句:SELECT g.name,g.type_id,t.type_id,t.type_name FROM game g LEFT JOIN game_type t ON t.type_id=g.type_id where t.type_name!=''

    可以将游戏5筛选掉,那么这里如果我们设置成下面这样:

    SELECT g.name,g.type_id,t.type_id,t.type_name FROM game g LEFT JOIN game_type t ON t.type_id=g.type_id where t.type_name=''

     

    结果不能游戏5给筛选出来,这时候需要的是:

    SELECT g.name,g.type_id,t.type_id,t.type_name FROM game g LEFT JOIN game_type t ON t.type_id=g.type_id where ISNULL(t.type_name)

     

  • 相关阅读:
    djangoadmin实现文件上传下载
    Apscheduler详解(转)
    django集成Apscheduler3
    springboot实现token鉴权
    xss攻击入门
    回顾2012——运维工作周年祭
    9个常用iptables配置实例
    ardunio 实验:超声波测距、声光报警模拟倒车雷达
    一款我用了好多年的多线程FTP软件
    线程Thread基础学习(2)
  • 原文地址:https://www.cnblogs.com/alonely/p/10452448.html
Copyright © 2020-2023  润新知