`
jackleechina
  • 浏览: 585201 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

join......on 后面的and 和where

    博客分类:
  • sql
 
阅读更多
运行平台:Mysql
目的:比较join......on 后面的and 和where的区别

1)建表
创建A表
SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `a`
-- ----------------------------
DROP TABLE IF EXISTS `a`;
CREATE TABLE `a` (
  `id` decimal(10,0) NOT NULL DEFAULT '0',
  `link` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `a_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- ----------------------------
-- Records of a
-- ----------------------------
INSERT INTO `a` VALUES ('1', '1', 'jack');
INSERT INTO `a` VALUES ('2', '1', 'jack');
INSERT INTO `a` VALUES ('3', '1', 'leo');


创建B表
SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `b`
-- ----------------------------
DROP TABLE IF EXISTS `b`;
CREATE TABLE `b` (
  `id` decimal(10,0) NOT NULL DEFAULT '0',
  `link` varchar(11) COLLATE utf8_unicode_ci DEFAULT NULL,
  `b_name` varchar(11) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- ----------------------------
-- Records of b
-- ----------------------------
INSERT INTO `b` VALUES ('1', '1', 'frowna');
INSERT INTO `b` VALUES ('2', '1', 'frowna');
INSERT INTO `b` VALUES ('3', '1', 'kiki');


2)比较下面的运行结果

select * from A left join B on A.link =B.link where A.a_name='jack'
和
select * from A left join B on A.link =B.link and A.a_name='jack'


select * from A inner join B on A.link =B.link where A.a_name='jack'
和
select * from A inner join B on A.link =B.link and A.a_name='jack'


select * from A right join B on A.link =B.link where A.a_name='jack'
和
select * from A right join B on A.link =B.link and A.a_name='jack'


select * from A right join B on A.link =B.link where A.a_name is null
和
select * from A right join B on A.link =B.link and A.a_name is null 


3)结论
3.1) where 是在两个表join完成后,再附上where条件。

select * from (select A.a_name,B.b_name from A left join B on A.link =B.link)t where t.a_name='jack';
等价为
select A.a_name,B.b_name from A left join B on A.link =B.link  where A.a_name='jack'


3.2)
而 and 则是在表连接前过滤A表或B表里面哪些记录符合连接条件,同时会兼顾是left join还是right join。即
假如是左连接的话,如果左边表的某条记录不符合连接条件,那么它不进行连接,但是仍然留在结果集中(此时右边部分的连接结果为NULL)。

on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。参考http://blog.csdn.net/muxiaoshan/article/details/7617533

3.3)建议尽量用where来过滤条件,以避免复杂的逻辑考虑。(除非在某些情况下(后接其他sql语句),用and会报错,才用and,但要考虑是否影响正确结果。)

分享到:
评论

相关推荐

    left join 过滤条件写在on后面和写在where 后面的区别

    ### left join 过滤条件写在on后面和写在where 后面的区别 在SQL查询语句中,连接(JOIN)是一种非常重要的操作,用于从两个或多个表中获取数据。其中,`LEFT JOIN`是一种常用的连接类型,它返回左表的所有记录以及...

    MySQL left join操作中on和where放置条件的区别介绍

    总结一下,`ON` 和 `WHERE` 在 `LEFT JOIN` 中的主要区别在于: 1. `ON` 用于在生成临时表时定义连接条件,无论条件是否满足,都会返回左表的所有行。 2. `WHERE` 在临时表生成后进行过滤,如果它包含了连接条件,...

    数据库各种join连接

    数据库各种join连接 数据库中的join连接是指将两个或多个表连接起来,以便检索数据...在写连接查询时,推荐在on后面只跟连接条件,而对中间表限制的条件都写到where子句中。这可以避免查询结果的歧义性和难以理解性。

    c#操作数据库,史上最牛逼的方法,你见过这种方法吗?

    InnerJoin(b).On(a.UserId == b.CategoryId) .Where(a.UserId == 1 && (a.UserName + "123").LikeLeft(u1.UserName)) ); //下面是子查询方式的多表查询In 的使用方法 var ListUser8= Sql.ExecuteList((a, b, c) =>...

    MySQL查询条件中放置on和where的区别分析

    在SQL查询中,`ON` 和 `WHERE` 子句都是用于设置筛选条件,但它们在`JOIN`操作中有着不同的作用和位置。理解这两者的区别对于编写高效的SQL语句至关重要,尤其是在处理复杂的多表查询时。 首先,我们来看一下MySQL...

    sql各种连接

    需要注意的是,在写连接查询的时候,ON 后面只跟连接条件,而对中间表限制的条件都写到 WHERE 子句中。例如,语句 7 和语句 8 的结果是不相同的: 语句 7:WHERE 条件独立 SELECT o.id, o.order_number, o.customer...

    数据库有用的笔记

    - **Inner Join**:根据 ON 条件生成临时表,ON 后面的条件可以用 WHERE 实现。 - **示例**: - 假设有一个查询: ```sql SELECT A.卡号, B.手机号码 FROM A LEFT JOIN B ON A.客户号 = B.客户号 AND B.联系...

    MySQL三种关联查询的方式_ ON vs USING vs 传统风格

    可以看到,这样的写法让查询的结构更为清晰,关联条件被明确地放在了`ON`后面,而其他的过滤条件则放在了`WHERE`后面。这种改进对于大型查询来说尤为重要。 **注意**:`ON`语句中的括号并不是必需的,但在实践中...

    SQL连接查询中On筛选与Where筛选的区别

    如果将筛选条件放在On后面,它会影响连接本身,而放在Where后面,它则会影响最终的结果集。 理解On和Where筛选器的区别对于编写正确的SQL查询至关重要,尤其是在处理Outer Join时。误用可能导致数据筛选不准确,...

    C#语法及存储过程.docx

    select * from table where NAME = @NAME and AGE = @AGE end exec user @NAME = '男',@AGE = 15 select 单号 ,收入 = case when 收入>0 then 收入 else 0 end ,支出 = case when 收入>0 then 0 else ...

    sql连接查询语句中on、where筛选的区别总结

    在`INNER JOIN`和`CROSS JOIN`中,`ON`后面的筛选条件与`WHERE`子句的效果相同,都是在最后生成结果集时应用。如果在这些类型的JOIN中只使用`ON`,不使用`WHERE`,查询仍然有效,结果不会改变。 然而,当涉及到`...

    And,Where使用提示以及用+进行左关联的提示及注意事项

    在SQL查询中,正确使用`AND`和`WHERE`子句以及理解左连接(LEFT JOIN)的机制至关重要,因为它们直接影响到查询结果的准确性和效率。以下是对这些知识点的详细解释: 1. `AND`与`WHERE`的区别: - `AND`是一个逻辑...

    mysql修改语句修改单表中的记录

    这里的`表名`是你想要更新的表,`列=新值`定义了你要修改的列及对应的新值,`WHERE`后面的筛选条件用于指定哪些记录需要被更新。例如,如果你有一个名为`beauty`的表,想把所有姓周的女神的电话改为119,可以使用...

    2016七年级英语下册Unit6I’mwatchingTV第1课时练习新版人教新目标版.doc

    14. Linda and her mother are talking __C.__ on the phone. 15. —What is your sister doing? —__D.__ She is washing the dishes. 四、根据汉语意思完成句子,每空一词: 16. Is Jane __reading__ __the__ __...

    sql 语句实现数据库数据的更新查询.docx

    在这个查询中,`JOIN`子句用于连接多个表,`ON`后面是连接条件,`ORDER BY`用于对结果集进行排序。 实验结果显示,查询所有"天津"的供应商明细时,最初因为使用了等号`=`而不是`LIKE`进行模糊查询,导致没有找到...

    Oracle练习笔试大全

    Oracle练习笔试大全 1、select ename, sal * 12 from emp; //计算年薪 2、select 2*3 from dual; //计算一个比较纯的数据...68、select ename,grade from emp e join salgrade s on(e.sal between s.losal and s.hisal...

    数据库数据查询应用实践资料大全(ppt-66页).ppt

    例如,`SELECT DISTINCT 姓名 FROM TReader JOIN HLend ON TReader.借书证号=HLend.借书证号 WHERE (HLend.还书时间-HLend.借书时间)>5`,这个查询返回那些还书超过5天的读者的唯一姓名,通过`JOIN`连接了读者表...

    sql面试题大全(非常经典)

    LEFT OUTER JOIN SC ON Student.S# = SC.S# GROUP BY Student.S#, Student.Sname; ``` ### 4. 查询所有老师的数量。 **知识点:** - **DISTINCT**:去除重复值。 **解析:** ```sql SELECT COUNT(DISTINCT Tname)...

    新目标九年级英语Unit 1单元测试题精选.doc

    这篇文档是针对新目标九年级英语Unit 1 "How do you study for a test" 的单元测试题,旨在帮助学生巩固和检验在这个单元所学的英语知识。以下是根据文档内容提炼的相关知识点: 一、词汇填空 1. aloud - 在这个...

Global site tag (gtag.js) - Google Analytics