精华内容
下载资源
问答
  • ![图片说明](https://img-ask.csdn.net/upload/201805/16/1526442951_444485.png) 请问这两条SQL在查询表达的意思上有什么区别?
  • 前言 在SQL的查询中,我们经常会使用到left join左连接进行多表连接查询,...下面分别将筛选条件放在on后面和放在where后面进行试验。 1、条件放在on的后面 写一条SQL语句进行查询,这里的筛选条件为左表的id值为1,S

    前言

    在SQL的查询中,我们经常会使用到left join左连接进行多表连接查询,使用的时候,根据条件的筛选,我们有的时候是将筛选条件放在on后面用and连起来,有时候是将筛选条件写在where的过滤中,那么这两种方式的写法有什么区别吗?查询后的结果是怎样的?下面让我们一起来看一下。
    我们事先准备好两张数据表样,第一张表中的数据如下:

    在这里插入图片描述
    第二张表的数据如下:

    在这里插入图片描述
    下面分别将筛选条件放在on后面和放在where后面进行试验。

    1、条件放在on的后面

    写一条SQL语句进行查询,这里的筛选条件为左表的id值为1,SQL语句如下:

    select * from d9
    left join d10
    on d9.id = d10.id
    and d9.id = 1;
    

    可以看到筛选条件是接在on后面的,用and连接起来,and d9.id = 1,查询结果如下:

    在这里插入图片描述
    为什么是这样的结果呢?我们先将筛选条件去掉,只进行left join左连接查询,不做筛选,SQL如下:

    select * from d9
    left join d10
    on d9.id = d10.id;
    

    查询结果如下:

    在这里插入图片描述
    对比两种查询结果,可以发现,前面的查询是先进行筛选的,也就是先筛选出d9.id = 1的记录,是有3条,然后再进行连接,连接的时候只有这筛选出的3条记录右边是不为null的,其余的记录右边为null。得出的结论是:筛选条件放在on的后面,是先进行筛选,后进行连接查询。

    2、条件放在where的后面

    同样的筛选条件,我们将其改放在where的后面进行筛选,SQL如下:

    select * from d9
    left join d10
    on d9.id = d10.id
    where d9.id = 1;
    

    查询结果如下:

    在这里插入图片描述
    对比只进行连接查询的结果,可以发现,实际上这种是对连接查询后的结果进行一次筛选,连接查询的结果有6条记录,然后对着6条记录进行筛选,筛选出d9.id = 1的记录,是有3条,所以最后的结果是有3条记录。得出的结论是:筛选条件放在where的后面,是先进行连接查询,后进行筛选。

    3、小结

    对于左连接left join而言:
    筛选条件放在on的后面是先进行筛选,后进行连接查询。
    筛选条件放在where的后面是先进行连接查询,后进行筛选。

    一起学习,一起进步,每天只要进步一点点,时间久了,就是质的飞跃。

    展开全文
  • 首先,这个语法只能在Oracle数据库中使用...select A.* ,B.* from A,B where A.id = b.id(+); select A.*,B.* from A left join B on A.id = B.id; 上面两个语句是等效的。带(+)的表在没有数据时也展示出来null。 ...
    首先,这个语法只能在Oracle数据库中使用。

    相当于左连接或者右连接

    select A.* ,B.* from A,B where A.id = b.id(+);
    select A.*,B.* from A left join B on A.id = B.id;
    

    上面两个语句是等效的。带(+)的表在没有数据时也展示出来null。

    展开全文
  • oracle where 后面的条件中|| 是连接符号,Oracle中另一个concat函数能够连接两个字符串 concat(a,b) Oracle中nvl函数的使用方法和作用是什么? 假设你某个字段为空,可是你想让这个字段显示0 nvl(字段名,0),...
    oracle where 后面的条件中|| 是连接符号,Oracle中另一个concat函数能够连接两个字符串
    concat(a,b)
    Oracle中nvl函数的使用方法和作用是什么?
    假设你某个字段为空,可是你想让这个字段显示0
    nvl(字段名,0),就是当你选出来的时候,这个字段尽管为空。可是显示的是0,当然这个0也能够换成其它东西,如:1,2,3……
    展开全文
  • 用 inner join , LEFTJOIN时,条件直接放ON后面,是先筛选后连接,条件放WHERE后面,是先连接后筛选 inner join A inner join B on a.id = b.a_id and a.is_delete = 0 and b.is_delete = 0 等同于 A inner join B...

    1.inner join 和 left join 限制条件放在 where 和 on 后面 有什么区别?

    先说结论:

    用 inner join , LEFTJOIN时,条件直接放ON后面,是先筛选后连接,条件放WHERE后面,是先连接后筛选

    inner join A inner join B on a.id = b.a_id and a.is_delete = 0 and b.is_delete = 0

    等同于

    A inner join B on a.id = b.a_id where a.is_delete = 0 and b.is_delete = 0

    left join

    A left join B on a.id = b.a_id and a.is_delete = 0 and b.is_delete = 0

    不等同于

    A left join B on a.id = b.a_id where a.is_delete = 0 and b.is_delete = 0

    说明:

    on 后面 直接加条件,只会对右表数据产生过滤筛选,是关联之前对右表的操作,不会对左边的表产生影响,不管如何都会返回左边表中的记录

    where 加限制条件 才会对左边的表产生影响

    where条件是关联查询之后的条件

    # 用 inner join , LEFTJOIN时,条件直接放ON后面,是先筛选后连接,条件放WHERE后面,是先连接后筛选
    # inner join
    # A  inner join B on a.id = b.a_id and a.is_delete = 0 and b.is_delete = 0
    # 等同于 A  inner join B on a.id = b.a_id where a.is_delete = 0 and b.is_delete = 0
    
    # left join
    # A  left join B on a.id = b.a_id and a.is_delete = 0 and b.is_delete = 0
    # 不等同于  A  left join B on a.id = b.a_id where a.is_delete = 0 and b.is_delete = 0
    # 说明:
    # on 后面 直接加条件的话,不会对左边的表产生影响,只会对右表数据产生过滤筛选,on条件是在左关联时候的条件,不管如何都会返回左边表中的记录
    #   是关联之前对右表的操作
    # where 加条件 才会对左边的表 生效。where条件是关联查询之后的条件
    
    
    select * from teacher;
    # +---+-----+-------+
    # |Tid|Tname|t_group|
    # +---+-----+-------+
    # |01 |张三   |1      |
    # |02 |李四   |1      |
    # |03 |王五   |2      |
    # |04 |赵六   |2      |
    # +---+-----+-------+
    
    select * from course;
    # +---+-----+---+----------+
    # |Cid|Cname|Tid|is_deleted|
    # +---+-----+---+----------+
    # |01 |语文   |02 |0         |
    # |02 |数学   |01 |0         |
    # |03 |英语   |03 |0         |
    # |04 |化学   |01 |0         |
    # |05 |地理   |01 |0         |
    # |06 |体育   |01 |1         |
    # |07 |音乐   |01 |1         |
    # +---+-----+---+----------+
    
    
    # inner join
    
    # 查看有代课程的老师情况(没带课程的老师信息不显示)
    # 找到 teacher的 任课科目 (A inner join B 也可能结果集是 大于A 表数据,所以说 A inner join B on  的结果集不能 同时大于 A ,B的 数量 )
    select t.Tid, t.Tname, c.Cname ,c.is_deleted from teacher t inner join course c on t.Tid = c.Tid order by Tid;
    # +---+-----+-----+----------+
    # |Tid|Tname|Cname|is_deleted|
    # +---+-----+-----+----------+
    # |01 |张三   |数学   |0         |
    # |01 |张三   |化学   |0         |
    # |01 |张三   |地理   |0         |
    # |01 |张三   |体育   |1         |
    # |01 |张三   |音乐   |1         |
    # |02 |李四   |语文   |0         |
    # |03 |王五   |英语   |0         |
    # +---+-----+-----+----------+
    
    #  过滤条件 放到 on 后面 和放到  where 后面的区别
    #  选出 张三 老师 的有效课程
    # ① where 后面
    select t.Tid, t.Tname, c.Cname, c.is_deleted
    from teacher t
             inner join course c on t.Tid = c.Tid
    where t.Tname  = '张三' and is_deleted = 0 ;
    # +---+-----+-----+----------+
    # |Tid|Tname|Cname|is_deleted|
    # +---+-----+-----+----------+
    # |01 |张三   |数学   |0         |
    # |01 |张三   |化学   |0         |
    # |01 |张三   |地理   |0         |
    # +---+-----+-----+----------+
    # ② on 后面 : A inner join B 的时候 ,分别筛选出 A满足条件的集合,B满足条件的集合
    select t.Tid, t.Tname, c.Cname, c.is_deleted
    from teacher t
             inner join
        course c on t.Tid = c.Tid and t.Tname = '张三' and is_deleted = 0 ;
    
    # +---+-----+-----+----------+
    # |Tid|Tname|Cname|is_deleted|
    # +---+-----+-----+----------+
    # |01 |张三   |数学   |0         |
    # |01 |张三   |化学   |0         |
    # |01 |张三   |地理   |0         |
    # +---+-----+-----+----------+
    
    # 查看所有老师的代课情况(没带课程的老师信息也需要显示)
    # left join
    
    select t.Tid, t.Tname, c.Cname, c.is_deleted
    from teacher t
             left join course c on t.Tid = c.Tid
    order by Tid;
    # +---+-----+-----+----------+
    # |Tid|Tname|Cname|is_deleted|
    # +---+-----+-----+----------+
    # |01 |张三   |数学   |0         |
    # |01 |张三   |化学   |0         |
    # |01 |张三   |地理   |0         |
    # |01 |张三   |体育   |1         |
    # |01 |张三   |音乐   |1         |
    # |02 |李四   |语文   |0         |
    # |03 |王五   |英语   |0         |
    # |04 |赵六   |NULL |NULL      |
    # +---+-----+-----+----------+
    
    # 查看张三的有效代课情况(张三有可能不带课程)
    
    # ① 条件放到 where后面 (结果说明这种情况是正确的)
    select t.Tid, t.Tname, c.Cname, c.is_deleted
    from teacher t
             left join
         course c on t.Tid = c.Tid
    where t.Tname = '张三'
      and is_deleted = 0;
    # +---+-----+-----+----------+
    # |Tid|Tname|Cname|is_deleted|
    # +---+-----+-----+----------+
    # |01 |张三   |数学   |0         |
    # |01 |张三   |化学   |0         |
    # |01 |张三   |地理   |0         |
    # +---+-----+-----+----------+
    
    # ② 条件放到 on 后面
    # on 后面 直接加条件的话,不会对左边的表产生影响,只会对右表数据产生过滤筛选,on条件是在左关联时候的条件,不管如何都会返回左边表中的记录
    #   是关联之前对右表的操作
    # where 加条件 才会对左边的表 生效。where条件是关联查询之后的条件
    select t.Tid, t.Tname, c.Cname, c.is_deleted
    from teacher t
             left join
        course c on t.Tid = c.Tid and t.Tname = '张三' and is_deleted = 0 ;
    
    # +---+-----+-----+----------+
    # |Tid|Tname|Cname|is_deleted|
    # +---+-----+-----+----------+
    # |01 |张三   |数学   |0         |
    # |01 |张三   |化学   |0         |
    # |01 |张三   |地理   |0         |
    # |02 |李四   |NULL |NULL      |
    # |03 |王五   |NULL |NULL      |
    # |04 |赵六   |NULL |NULL      |
    # +---+-----+-----+----------+
    
    # 说明:on t.Tid = c.Tid and t.Tname = '张三' and is_deleted = 0 是对  右表 进行 操作 ------>
    #      从右表筛选出 张三,有效的数据,结果集B1为:
    # +---+-----+-----+----------+
    # |01 |张三   |数学   |0         |
    # |01 |张三   |化学   |0         |
    # |01 |张三   |地理   |0         |
    # +---+-----+-----+----------+
    # 然后 A left join B1
    
    # on 后面的条件只针对 右表数据集进行过滤,如果要过滤 坐标数据,需要 在where 后面加过滤条件,如下
    
    select t.Tid, t.Tname, c.Cname, c.is_deleted
    from teacher t
             left join
        course c on t.Tid = c.Tid and t.Tname = '张三' and is_deleted = 0
    where  t.Tname = '张三' ;
    # +---+-----+-----+----------+
    # |Tid|Tname|Cname|is_deleted|
    # +---+-----+-----+----------+
    # |01 |张三   |数学   |0         |
    # |01 |张三   |化学   |0         |
    # |01 |张三   |地理   |0         |
    # +---+-----+-----+----------+
    
    # 等同于如下:
    select t.Tid, t.Tname, c.Cname, c.is_deleted
    from teacher t
             left join
        course c on t.Tid = c.Tid  and is_deleted = 0
    where  t.Tname = '张三' ;
    # +---+-----+-----+----------+
    # |Tid|Tname|Cname|is_deleted|
    # +---+-----+-----+----------+
    # |01 |张三   |数学   |0         |
    # |01 |张三   |化学   |0         |
    # |01 |张三   |地理   |0         |
    # +---+-----+-----+----------+
    
    
    
    
    
    

     

    展开全文
  • 最近在项目开发中总是看到在left join的on语句后面使用and或者是where的SQL,也看到一些用得的不对的地方,那么在on后面使用and或者where到底有什么区别呢?让我们来一探究竟...... 1、首先来谈谈什么是left join ...
  • 1. 用途一:动态SQL拼接 动态sql拼凑,如下,可以每个查询调价可以直接写 and ;... String sql="select * from table_name where 1=1"; if( conditon 1) { sql=sql+" and var2=value2"; } if(condit...
  • 在编程过程当中,忽然看到有一段SQL语句中where的字段后面跟着(+),以前没写过这样的sql语句,于是起了好奇之心,想探究一下这个语句的作用是什么。 举一个例子,如SQL: select a.*,b.* FROM tmp_0813001 a,...
  • 在左连接中,不管on后面跟什么条件,左表的数据全部查出来,因此要想过滤需把条件放到where后面 在内连接中,满足on后面的条件表的数据才能查出,可以起到过滤作用。也可以把条件放到where后面。 where...
  •  在连接查询语法中,另人迷惑首当其冲的要属on筛选和where筛选的区别了, 在我们编写查询的时候, 筛选条件的放置不管是在on后面还是where后面, 查出来的结果总是一样的, 既然如此,那为什么还要多此一举的让...
  • cross join,inner join,和outer join , 在 cross join和inner join中,筛选条件放在on后面还是where后面是没区别的,极端一点,在编写这两种连接查询的时候,只用on不使用where也没有什么问题。因此,on筛选和...
  • 表连接查询 条件在On与Where后区别

    千次阅读 2019-05-05 23:42:31
    左右关联的条件放在where后面什么区别吗? 答案是有区别的,所有的连接条件都必需要放在ON后面,不然前面的所有LEFT,和RIGHT关联将作为摆设,而不起任何作用。 下面用两张表people和scores,people表的Id关联...
  • cross join,inner join,和outer join , 在 cross join和inner join中,筛选条件放在on后面还是where后面是没区别的,极端一点,在编写这两种连接查询的时候,只用on不使用where也没有什么问题。因此,on筛选和...
  • 有一些新手可能会有这样的疑问,总是在一些查询语句的题目中发现,有些是用on后面加连接条件,有些又是在where上加连接条件,到底这两种写法有什么区别,分别对应什么场景呢?(只适合新手哦,大神勿喷) 其实这是...
  •  在连接查询语法中,另人迷惑首当其冲的就要属on筛选和where筛选的区别了,如果在我们编写查询的时候, 筛选条件的放置不管是在on后面还是where后面, 查出来的结果总是一样的, 既然如此,那为什么还要多此一举的...
  • 这段代码应该是由程序(例如Java)中生成的,where条件中 1=1 之后的条件是通过 if 块动态变化的。...where后面总要有语句,加上了1=1后就可以保证语法不会出错! select * from table where 1=1 因为table中根本就没
  • 联表时的联表条件可以写在on后面,也可以写在where后面,有什么区别? 第一种:等值连接时的联表条件 写在 on 后面: select * from A a join B b on a.xx = b.yy 写在where后面: select * from A a join B b where...
  • 对于left join,不管on后面跟什么条件,左表的数据全部查出来,因此要想过滤需把条件放到where后面 对于inner join,满足on后面的条件表的数据才能查出,可以起到过滤作用。也可以把条件放到where后面。 ...
  • cross join,inner join,和outer join , 在 cross join和inner join中,筛选条件放在on后面还是where后面是没区别的,极端一点,在编写这两种连接查询的时候,只用on不使用where也没有什么问题。因此,on筛选和...
  • 注意:where 后面要跟的是数据表里的字段,如果我把ag换成avg(goods_price)也是错误的!...而having只是根据前面查询出来的是什么就可以后面接什么。 http://blog.csdn.net/yexudengzhidao/article/details/...
  • 在编写sql语句的时候,他们的作用都是一样的,后面接判断条件。where和having到底怎么区别? group by 语句怎么用?他有什么作用? where后面可以使用聚合函数吗? 聚合函数可以在哪使用? 这里先给出答案(结论...
  • 对于left join,不管on后面跟什么条件,左表的数据全部查出来,因此要想过滤需把条件放到where后面 对于inner join或者是,号隔开的表,满足on后面的条件表的数据才能查出,可以起到过滤作用。也可以把条件放到...
  • 映射文件中编写的 SQL 后面都加入了“where 1=1”的条件,那么到底为什么要这么写呢?如果将 where 后“1=1”的条件去掉,那么 MyBatis 所拼接出来的SQL将会如下所示。 select * from t_customer where and ...
  • 条件筛选Where 1.where关键字可在哪里使用? delete from 表 where… update 表 set 列= 值 where… select 列 from 表 where… ...4.where后面具体怎么使用 连接什么东西 比较运算符 > >= ...
  • 首先呢,经常会在后台的service中拼接sql中会发现有时候会有where 1=1 不啰嗦了 写这个条件的原因是:仅仅是为了让where ...但是需要在后面跟上group by order by limit 等等条件,没有where条件又不可以 所以目的仅
  • 顺序问题:where子句必须放在group子句之前;而having子句必须在group子句之后  1.Where子句    2.having子句 ...字段问题:where子句只可以处理数据表中的...having根据前面查询出来的是什么就可以在后面接...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 136
精华内容 54
关键字:

where后面接什么