精华内容
下载资源
问答
  • 一点提醒ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行,即使on中包含有A表中限制条件,也不会过滤A任何数据(A数据只会通过where过滤)。如果 B 表中没有任何一行数据...

    展开全部

    关于 “A LEFT JOIN B ON 条件636f707962616964757a686964616f31333363373666表达式” 的一点提醒

    ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行,即使on中包含有A表中的列的限制条件,也不会过滤A的任何数据(A的数据只会通过where过滤)。

    如果 B 表中没有任何一行数据匹配 ON 的条件,将会额外生成一行所有列为 NULL 的数据

    在匹配阶段 WHERE 子句的条件都不会被使用。仅在匹配阶段完成以后,WHERE 子句条件才会被使用。它将从匹配阶段产生的数据中检索过滤。

    让我们看一个 LFET JOIN 示例:

    01

    mysql> CREATE TABLE `product`

    (

    02

    `id` int(10)

    unsigned NOT NULL auto_increment,

    03

    `amount` int(10)

    unsigned default NULL,

    04

    PRIMARY KEY (`id`)

    05

    )

    ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1

    06

    07

    mysql> CREATE TABLE `product_details`

    (

    08

    `id` int(10)

    unsigned NOT NULL,

    09

    `weight` int(10)

    unsigned default NULL,

    10

    `exist` int(10)

    unsigned default NULL,

    11

    PRIMARY KEY (`id`)

    12

    )

    ENGINE=MyISAM DEFAULT CHARSET=latin1

    13

    14

    mysql> INSERT INTO product

    (id,amount)

    15

    VALUES (1,100),(2,200),(3,300),(4,400);

    16

    Query

    OK, 4 rows affected

    (0.00 sec)

    17

    Records:

    4 Duplicates: 0 Warnings: 0

    18

    19

    mysql> INSERT INTO product_details

    (id,weight,exist)

    20

    VALUES (2,22,0),(4,44,1),(5,55,0),(6,66,1);

    21

    Query

    OK, 4 rows affected

    (0.00 sec)

    22

    Records:

    4 Duplicates: 0 Warnings: 0

    23

    24

    mysql> SELECT * FROM product;

    25

    +----+--------+

    26

    |

    id | amount |

    27

    +----+--------+

    28

    |

    1 | 100 |

    29

    |

    2 | 200 |

    30

    |

    3 | 300 |

    31

    |

    4 | 400 |

    32

    +----+--------+

    33

    4 rows in set (0.00

    sec)

    34

    35

    mysql> SELECT * FROM product_details;

    36

    +----+--------+-------+

    37

    |

    id | weight | exist |

    38

    +----+--------+-------+

    39

    |

    2 | 22 | 0 |

    40

    |

    4 | 44 | 1 |

    41

    |

    5 | 55 | 0 |

    42

    |

    6 | 66 | 1 |

    43

    +----+--------+-------+

    44

    4 rows in set (0.00

    sec)

    45

    46

    mysql> SELECT * FROM product LEFT JOIN product_details

    47

    ON (product.id

    = product_details.id);

    48

    +----+--------+------+--------+-------+

    49

    |

    id | amount | id | weight | exist |

    50

    +----+--------+------+--------+-------+

    51

    |

    1 | 100 | NULL | NULL | NULL |

    52

    |

    2 | 200 | 2 | 22 | 0 |

    53

    |

    3 | 300 | NULL | NULL | NULL |

    54

    |

    4 | 400 | 4 | 44 | 1 |

    55

    +----+--------+------+--------+-------+

    56

    4 rows in set (0.00

    sec)

    ON 子句和 WHERE 子句有什么不同?

    一个问题:下面两个查询的结果集有什么不同么?

    1

    1. SELECT * FROM product LEFT JOIN product_details

    2

    ON (product.id

    = product_details.id)

    3

    AND product_details.id=2;

    4

    2. SELECT * FROM product LEFT JOIN product_details

    5

    ON (product.id

    = product_details.id)

    6

    WHERE product_details.id=2;

    用例子来理解最好不过了:

    01

    mysql> SELECT * FROM product LEFT JOIN product_details

    02

    ON (product.id

    = product_details.id)

    03

    AND product_details.id=2;

    04

    +----+--------+------+--------+-------+

    05

    |

    id | amount | id | weight | exist |

    06

    +----+--------+------+--------+-------+

    07

    |

    1 | 100 | NULL | NULL | NULL |

    08

    |

    2 | 200 | 2 | 22 | 0 |

    09

    |

    3 | 300 | NULL | NULL | NULL |

    10

    |

    4 | 400 | NULL | NULL | NULL |

    11

    +----+--------+------+--------+-------+

    12

    4 rows in set (0.00

    sec)

    13

    14

    mysql> SELECT * FROM product LEFT JOIN product_details

    15

    ON (product.id

    = product_details.id)

    16

    WHERE product_details.id=2;

    17

    +----+--------+----+--------+-------+

    18

    |

    id | amount | id | weight | exist |

    本回答由提问者推荐

    2Q==

    已赞过

    已踩过<

    你对这个回答的评价是?

    评论

    收起

    展开全文
  • Oracle中Left joinon和where的效率差别,在linq中使用into rightRow from rw in rightRow.DefaultIfEmpty()可以保证查询类型le假设有两个表a、b使用onSelect * from a left join b on b.col = a.col and b.col2 = ...

    Oracle中Left join的on和where的效率差别,在linq中使用into rightRow from rw in rightRow.DefaultIfEmpty()可以保证查询类型le

    假设有两个表a、b

    使用on

    Select * from a left join b on b.col = a.col and b.col2 = ‘aa’

    使用 where

    Select * from a left join b on b.col = a.col where b.col2 = ‘aa’ and b.col2 is null

    // b.col2 is null作用是防止因b表中没有匹配数据,照成a表原有记录无法返回的问题

    分析

    1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

    2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

    语句测试

    set serveroutput on ; -- 必须运行,否则打印结果无法显示

    declare

    I Number;

    Starttime Timestamp;

    Endtime Timestamp;

    Begin

    select current_timestamp(5) into starttime from Dual;

    I := 1;

    While I<=10000 Loop

    dbms_output.put_line(i);

    Execute Immediate ' '; --此处放入sql语句

    i := i+1;

    End Loop;

    Select Current_Timestamp(5) Into Endtime From Dual;

    dbms_output.put_line('10000条语句运行时间为(毫秒):' || (endtime - starttime)); --打印一个Interval类型数据,显示时间差

    end;

    测试结果

    On语句, 10000条语句运行时间为(毫秒):+000000000 00:00:01.032850000

    Where 语句 10000条语句运行时间为(毫秒):+000000000 00:00:01.013420000

    结论

    Where语句的性能优于on语句

    其实sql语句的运行效率也可以通过查询Oracle的系统视图来查看,,但时间关系今后再研究了。

    在C#中使用linq进行查询

    // 写得比较仓促,见谅了

    var reList = from DataRow a in dtA.Rows

    join DataRow b in dtB.Rows on

    new {t = a["col"], l=’aa’}

    equals

    new {t = b["col"], l = b["col2"] }

    into rightRow from rw in rightRow.DefaultIfEmpty()

    select new

    {

    Col1 = a["col"],

    Col2 = rw["col2"]

    };

    在linq中使用into rightRow from rw in rightRow.DefaultIfEmpty()可以保证查询类型left outer join的效果,如果left join中有多个查询条件,使用new两个对象进行比较即可。

    logo.gif

    f68f2add0b68e4f9810432fce46917b7.png

    本文原创发布php中文网,转载请注明出处,感谢您的尊重!

    展开全文
  • 假设有两个表a、b 使用on Select * from a left join b on b.col = a.col and b.col2 = ‘aa...Select * from a left join b on b.col = a.col where b.col2 = ‘aa’ and b.col2 is null // b.col2 is null作用...

    假设有两个表a、b

    使用on

    Select * from a left join b on b.col = a.col and b.col2 = ‘aa’

    使用 where

    Select * from a left join b on b.col = a.col where b.col2 = ‘aa’ and b.col2 is null

    // b.col2 is null作用是防止因b表中没有匹配数据,照成a表原有记录无法返回的问题

     

    分析

    1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

    2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

     

    语句测试

    set serveroutput on ; -- 必须运行,否则打印结果无法显示

    declare

    I Number;

    Starttime Timestamp;

    Endtime Timestamp;

    Begin

    select current_timestamp(5) into starttime from Dual;

    I := 1;

    While I<=10000 Loop 

          dbms_output.put_line(i);

          Execute Immediate ' '; --此处放入sql语句

          i := i+1;

    End Loop;

    Select Current_Timestamp(5) Into Endtime From Dual;

    dbms_output.put_line('10000条语句运行时间为(毫秒):' || (endtime - starttime)); --打印一个Interval类型数据,显示时间差

    end;

     

    测试结果

    On语句, 10000条语句运行时间为(毫秒):+000000000 00:00:01.032850000

    Where 语句 10000条语句运行时间为(毫秒):+000000000 00:00:01.013420000

     

    结论

    Where语句的性能优于on语句

    其实sql语句的运行效率也可以通过查询oracle的系统视图来查看,但时间关系今后再研究了。

     

    在C#中使用linq进行查询

    // 写得比较仓促,见谅了

    var reList = from DataRow a in dtA.Rows

                join DataRow b in dtB.Rows on

                    new {t = a["col"], l=’aa’}

                    equals

                    new {t = b["col"], l = b["col2"] }

                    into rightRow from rw in rightRow.DefaultIfEmpty()

                    select new

                    {

                         Col1 = a["col"],

                         Col2 = rw["col2"]

                     };

    在linq中使用into rightRow from rw in rightRow.DefaultIfEmpty()可以保证查询类型left outer join的效果,如果left join中有多个查询条件,使用new两个对象进行比较即可。

    转载于:https://www.cnblogs.com/smallidea/p/3609382.html

    展开全文
  • inner join on条件和where条件的效率

    千次阅读 2016-11-14 17:35:08
  • 看到很多网友在说join的时候,where一定要在on的条件之前,这样可以起到优化左右,比如有同学这样说(如下截图),其实不然,对此我做了实验 为验证此结论我选择了一个大表进行数据验证,进行了sparksql查询 sql...
  • 亲测SQL left join on where 效率

    千次阅读 2015-02-06 13:38:26
    亲测SQL left join on where 效率 纪念一下自己测试结果: where 用了1点多秒 下面是left join ,只有0点几秒,十倍差距啊。数据量只有几万条,估计数据量几千万时,差别就更大了。
  • 写sql的时候很多小伙伴会写 left join where,然后发现 主表有的,附表...on的优先级比where高,因此,理论on-and写法效率比on-where高,速度更快 inner-join的时候,不管对左表还是右表进行筛选,on-join和on-where
  • 1. 摘要关于这两种写法重要知识点摘要如下:left-join 时,即使有相同查询条件,二者查询结果集也不同,原因是优先级导致on 优先级比 whereon-and 是进行韦恩运算连接生成临时表时使用条件where 是...
  • 如:select xxjj.*,bjsj.bj from wx_xx_xxjj xxjj INNER JOIN wx_xx_bjsj bjsj on xxjj.campusid=bjsj.campusid and bjsj.orgcode=10008 ... 加在where后面的效率区别。 INNER JOINON 条件 WHERE 条件
  • 一.Join语法概述join 用于多表中字段之间联系,语法如下:... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON ...下面是ecshop 商品表品牌表查询,请问它们查询效率有什么区别呢?还有一个问题是 left j...
  • (好像这是某一年阿里面试题)这个问题提出来以后,多数小伙伴回答是:查询结果应该是一样吧,只是查询效率不一样。我当时回答是,在Inner Join时这两种情况返回结果是一样,在Left、Right等情况时结果不...
  • 合理使用Join语句优化SQL有利于:增加数据库处理效率,减少响应时间;减少数据库服务器负载,增加服务器稳定性;减少服务器通讯网络流量;1. Join的分类:内连接 Inner Join全外连接 FULL Outer Join左外连接 ...
  • 一、创建视图时使用WHERE...AND 1、视图DDL CREATE ALGORITHM = UNDEFINED DEFINER = `root` @`%` SQL SECURITY DEFINER VIEW `readorderToAcceptView` AS SELECT `cl`.`id` AS `order_id`, `cl`.`status` AS `...
  • 多表join时条件写在where和on的区别(总结篇)?

    千次阅读 多人点赞 2019-08-25 00:13:25
    多表关联join时,到底限制条件是写在where后面效率高还是写在on后面,又或者是先对表过滤使表数据量减少,到底这三种效率哪种更高,看了一堆网上说,都没有说到具体点上,现在对这三种情况专门做以下详细说明...
  • (好像这是某一年阿里面试题)这个问题提出来以后,多数小伙伴回答是:查询结果应该是一样吧,只是查询效率不一样。我当时回答是,在Inner Join时这两种情况返回结果是一样,在Left、Right等情况时结果不...
  • 今天写了个SQL语句,但是速度总是很慢,后来做些改动速度提升...如:(1) select * from Aleft join Bon A.b = B.b left join C on A.c = C.c where 1=1and A.d = 'XXXXX' and A.e = 'SSSSS' (2)select * from...
  • sql执行效率——on where

    千次阅读 2015-04-21 11:44:21
    今天在分析一个sql语句时候 发现 left joinwhere a=b(+) 产生执行计划不一样 而且效率也是不一样 到底怎么回事 我在网上找了篇文章分享 (1.)select语句执行顺序 Processing Order of the SELECT sta
  • SQL语句中join连表时on和where后都可以跟条件,那么对查询结果集,执行顺序,效率是如何呢?通过查询资料发现:区别:on是对中间结果进行筛选,where是对最终结果筛选。执行顺序:先进行on的过滤, 而后才进行join。...
  • SQL语句中join连表时on和where后都可以跟条件,那么对查询结果集,执行顺序,效率是如何呢? 通过查询资料发现: 区别: on是对中间结果进行筛选,where是对最终结果筛选。 执行顺序: 先进行on的过滤, 而后才...
  • 这一种写大致上是说先将BC进行了条件的筛选后再进行关联,这样关联上的数据明显就少了很多,貌似第二种的效率更高,特别是当B,C表后面用了联合索引时似乎会提升很多,但也会有些情况比如当B,C表后面的几个字段没有联合...
  • 还有一个问题是 left join 和join的效率哪个高一点呢。 谢谢 !! SELECT a.`goods_id` , a.`goods_name` , b.brand_name FROM `ecs_goods` AS a LEFT JOIN ecs_brand AS b ON a.`brand_id` = b.`brand_id` ...
  • 从sql server执行计划中分析: 1.where 之后的条件都会用来先过滤各自表的数据(表扫描),输出select 所...3.当left join 时,表扫描得到的列需要包含on中条件列,on的条件是用来过滤最后显示数据时之用; 如果...
  • mysql表连接时on和where区别 数据库在连接两张表时都会生成一张中间表,将这张中间表返回给用户。...对于inner joinon和where返回结果是一样,但是效率不同。on效率快,where效率慢!!! ...
  • Oracle left join where 条件应用时的效率研究今天写了个SQL语句,但是速度总是很慢,后来做些改动速度提升了几倍,记录下来心得,一起分享讨论!如:(1) select * from A left join B on A.b = B.b left join C ...

空空如也

空空如也

1 2 3 4 5 6
收藏数 104
精华内容 41
关键字:

on的效率where和join