首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SQL 查询条件放到 JOIN 子句与 WHERE 子句的差别

我们再写 SQL 的时候,最常碰到一个问题就是,把查询条件放到 JOIN 子句和放到 WHERE 子句有什么不同呢?...比如: 查询条件放到 JOIN 语句: SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts JOIN wp_skus sku ON sku.post_id...'publish' ORDER BY sku.price DESC, wp_posts.post_date DESC LIMIT 0, 10 查询条件放到 WHERE 语句: SELECT SQL_CALC_FOUND_ROWS...但是语义上:JOIN - 描述两个表之间的关系,WHERE - 从结果集中删除行。这两种方法直接存在显著的语义上的差别,尽管两种方法对结果和性能都无影响,但是选择正确的语法将有助于代码更易于被阅读。...OUTER JOIN:如果使用的是 OUTER JOIN,可能会不同,比如上面的 SQL 改成 LEFT JOIN,并且连接条件失败,则查询条件放到 JOIN 子句仍将获得一行,但是如果放到 WHERE

2.4K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL数据库,SQL的where条件提取

    = 'a'; ⼀条⽐较简单的SQL,⼀⽬了然就可以发现where条件使⽤到了[b,c,d,e]四个字段,⽽t1表的idxt1bcd索引,恰好使⽤了[b,c,d]这三个字段,那么⾛idxt1bcd索引进⾏...根据SQL,固定了索引的查询范围[(2,2,2),(8,8,8))之后,此索引范围中并不是每条记录都是满⾜where查询条件的。例如:(3,1,1)不满⾜c > 1的约束;(6,4,4)不满⾜d !...在理解以上的问题解答的基础上,做⼀个抽象,可总结出⼀套放置于所有SQL语句⽽皆准的where查询条件的提取规则: 所有SQL的where条件,均可归纳为3⼤类 • Index Key (First Key...;若where条件为 >=、>、的⼏种,则跳过索引第⼀列,将其余where条件中索引相关列全部加⼊到Index Filter之中;若索引第⼀列的where条件包含 =、>=、>、<、<=...Index Key/Index Filter/Table Filter⼩结 SQL语句中的where条件,使⽤以上的提取规则,最终都会被提取到Index Key (First Key & Last Key

    2.3K10

    【SQL Server】变量的使用

    变量的分类 局部变量:(仅在过程中使用) 局部变量必须标记@作为前缀,如@age。 局部变量的使用也是先声明(使用declare),再赋值。...StudentId,StudentName,Gender,StudentIdNo from Students where StudentName = @stuname --查询李铭的学号 select...@stuid =StudentId from Students where StudentName = @stuname --查询与李铭学号相邻的学员 select StudentId,StudentName...含义 @@ERROR 最后一个T-SQL错误的错误号 @@IDEENTITY 最后一次插入的标识值 @@LANGUAGE 当前使用的语言的名称 @@MAX_CONNECTIONS 可以创建的同时连接的最大数目...@@ROWCOUNT 受上一个SQL语句影响的行数 @@SERVERNAME 本地服务器的名称 @@TRANSCOUNT 当前连接打开的事务数 @@VERSION SQLServer的版本信息

    18410

    神奇的 SQL 之 WHERE 条件的提取与应用

    但是,大家先别紧张,上面说的那些了,今天一个也不讲,气不气 ?   今天和大家一起来看一下 SQL 生命周期中比较有意思的一个环节 给定一条 SQL,如何提取其中的 where 条件 ?...where 条件中的每个子条件,在 SQL 执行的过程中有分别起着什么样的作用 ? 前提准备   正式开讲之前了,我们先来回顾一些内容   SQL 执行流程 ?     ...= 'a' 条件   有些小伙伴可能觉得上述 WHERE 条件的抽取具有特殊性,不具普遍性,那么我们抽象出一套放置于所有 SQL 语句皆准的 WHERE 查询条件的提取规则:Index Key (First...WHERE 条件的应用   SQL 语句中的 where 条件,最终都会被提取到 Index Key (First Key & Last Key),Index Filter 与 Table Filter...大家可以先去了解下,我们下篇详细讲解 参考 SQL中的where条件,在数据库中提取与应用浅析 MySQL的索引 MySQL的server层和存储引擎层是如何交互的

    1.9K10

    sql中的过滤条件放在on和where的区别

    最近遇到相关业务,想揪一下sql的中的left join 或者right join 或者inner join 中的 on和where的区别,想了解这个首先我们要了解两个基础的知识。...1.join的三种连接方式的区别: left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录...是没有区别的 下面我们来执行sql语句看看 left join select a....12 | +----+--------+------+------+--------+ 5 rows in set (0.00 sec) 结论:left join时进行笛卡尔积之后on后面的条件只对右表有效...类似:如果是right join的话 right join时进行笛卡尔积之后on后面的条件只对左表有效 ,并且如果左表用了where还是两个表都会取交集,进行过滤。 有对结论有疑问者,欢迎讨论~~~

    3.8K10

    SQL中JOIN时条件放在Where和On的区别

    背景 SQL中JOIN子句是用于把来自两个或多个表的数据连接起来,在这个过程中可能会添加一些过滤条件。昨天有小伙伴问,如下图的这两种SQL写法查询结果是否会一样?(好像这是某一年阿里的面试题) ?...结果验证 将上面的两个表Inner Join和Left Join,过滤条件分别放在on和where中。...结论:Inner Join时过滤条件放在on和where中返回结果一致。...在On的情况下,是在生成临时表时起作用,但由于Left Join的性质,就是他不管On里面的过滤条件是否为真,都会返回左表里的记录。对于不满足条件的记录,右表字段全部是NULL。...在Where的情况下,是在临时表生成好以后起作用,在对临时表进行过滤。此时,只要条件不为真的行,全部都过滤掉了。 — 完 —

    3.5K10

    SQL - where条件里的!=会过滤值为null的数据

    =会过滤值为null的数据 在测试数据时忽然发现,使用如下的SQL是无法查询到对应column为null的数据的: 1 select * from test where name !...= 'Lewis'; 本意是想把表里name的值不为Lewis的所有数据都搜索出来,结果发现这样写无法把name的值为null的数据也包括进来。 上面的!...=换成也是一样的结果,这可能是因为在数据库里null是一个特殊值,有自己的判断标准,如果想要把null的数据也一起搜索出来,需要额外加上条件,如下: 1 select * from test where...null值的比较 这里另外说下SQL里null值的比较,任何与null值的比较结果,最后都会变成null,以PostgreSQL为例,如下: 1 2 3 4 select null !...参考链接 Sql 中 不等于'‘与 NULL 警告 本文最后更新于 November 12, 2019,文中内容可能已过时,请谨慎使用。

    2.1K40

    谈谈基于SQL Server 的Exception Handlingp

    中使用RAISERROR将一个可预知的Error抛出;如何在Stored procedure中使用TRY/CATCH进行异常的捕捉;在Application如果处理从SQL Server抛出的Exception...实际上,SQL Server database Engine抛出、被我们的.NET最终捕获的SqlException,我们通过SqlException的属性可以得到Error的相关信息。...int Number { get; } public string Procedure { get; } public string Server { get; } public override...\t: {0}", ex.Server);                 Console.WriteLine("ex.Source\t: {0}", ex.Source);                 ...要做到这点很简单,只需要用到SqlConnection的InfoMessage事件,当通过DbCommand执行上面一段Sql的时候,Print语句的执行将出发该事件。

    33310

    谈谈基于SQL Server 的Exception Handling

    [注:这里的Database主要指SQL Server]。...谈谈基于SQL Server 的Exception Handling - PART I 在这一节中,我们将对@@ERROR进行详细讨论,详细大家会对@@ERROR有一个深刻的认识;随后,我将介绍在T-SQL...谈谈基于SQL Server 的Exception Handling - PART II 大家已经习惯了在.NET编程语言中使用Try/Catch,不知道大家对T-SQL有没有深入的认识。...在本节中,将着重介绍在T-SQL中如何使用Try/Catch进行异常处理;当我们人为地进行异常处理的时候,我们制定异常相关的Message信息, 这些Message通过SQL Server特性的数据表进行维护...谈谈基于SQL Server 的Exception Handling - PART III 对于基于SQL Server的ADO.NET应用来说,SqlException将是我们最常见的异常,本节中将会对

    52010

    SQL Server 2008基于策略的管理

    执行模式:SQL Server 2008的基于策略的管理支持4种执行模式,这4种模式决定了策略对目标的影响程度。...l 更新时阻止(On Change - Prevent):这是最严格的一种,SQL Server 2008通过DDL Trigger的方式在订阅该策略的目标上发生操作时实施检查操作对策略的符合性,如果违反策略则回滚该操作...l 更新时记录(On Change - Log Only):SQL Server 2008通过Event Notification的机制在在订阅该策略的目标上发生操作时实施检查操作对策略的符合性,如果违反策略则发送消息...虽然PBM有以上四种执行模式,但是归总起来其实是两大种,一种是基于SQL Agent作业方式的On Schedule模式,而另外一种是基于Event机制的On Change模式。...参考 SQL Server 2008安全性 教程:使用基于策略的管理来管理服务器

    80890

    Studio 3T中的新功能:支持SQL SELECT DISTINCT,WHERE子句中的JSON对象及更多

    Studio 3T的2019年第一个版本侧重于对SQL Query的改进,这是您最常用的功能之一,此外还有其他用户请求的UX优化: 添加了SELECT DISTINCT支持 使用JSON对象的WHERE...子句中的扩展SQL语法 能够在更改字段类型时保留值 更好的入门功能建立在功能和新的交互之上 SQL查询|支持SQL SELECT DISTINCT 我们已将SQL SELECT DISTINCT添加到支持的...SQL语法的(长)列表中。...SQL查询| WHERE子句中的JSON对象 除了SELECT DISTINCT之外,您现在还可以通过两种方式在SQL WHERE子句中使用JSON对象: WHERE JSONor WHERE identifier...[SQL operator] JSON 一个快速说明:此功能可以更改当前支持的SQL语法。

    3.5K20

    基于JavaScript 声明全局变量的三种方式详解

    JS中声明全局变量主要分为显式声明或者隐式声明下面分别介绍。...声明方式一: 使用var(关键字)+变量名(标识符)的方式在function外部声明,即为全局变量,否则在function声明的是局部变量。...: 没有使用var,直接给标识符test赋值,这样会隐式的声明了全局变量test。...全局变量的缺点: (1)全局变量保存在静态存贮区,程序开始运行时为其分配内存,程序结束释放该内存。与局部变量的动态分配、动态释放相比,生存期比较长,因此过多的全局变量会占用较多的内存单元。...(3)全局变量使函数的代码可读性降低。由于多个函数都可能使用全局变量,函数执行时全局变量的值可能随时发生变化,对于程序的查错和调试都非常不利。 因此,如果不是万不得已,最好不要使用全局变量。

    2K80

    《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(下)

    为了灵活而有效地处理分组集,SQL Server 2008引入了几个重要的新功能(他们都是GROUP BY的从属子句,需要依赖于GROUP BY子句):   (1)GROUPING SETS从属子句   ...DELETE FROM dbo.Orders WHERE orderdate < '20070101';   ② TRUNCATE语句:不是标准的SQL语句,永于删除表中的所有行,不需要过滤条件。...SQL Server 2005引入了OUTPUT子句,通过在修改语句中添加OUTPUT子句,就可以实现从修改语句中返回数据的功能。   ...》 八、可编程对象 8.1 变量与批处理   (1)变量:DECLARE+SET/SELECT   DECLARE语句可以声明一个或多个变量,然后使用SET/SELECT语句可以把一个变量设置成指定的值...① SET语句每次只能针对一个变量进行操作 --set方式 declare @i as int set @i=10; --SQL Server 2008可以在同一语句同时声明和初始化变量 declare

    9K20

    SQL命令 FETCH

    INTO子句可以指定为DECLARE语句的子句,也可以指定为FETCH语句的子句,或者两者都指定。 INTO子句允许将fetch列中的数据放到本地主机变量中。...注意:只有当SQLCODE=0时,INTO子句宿主变量返回的值才是可靠的。 如果SQLCODE=100(没有更多数据),则不应该使用主机变量值。 游标名称不是特定于名称空间的。...如果没有匹配查询选择条件的行,FETCH不会更改之前的%ROWID值。...带有DISTINCT关键字或GROUP BY子句的基于游标的SELECT不会设置%ROWID。 %ROWID值与之前的值(如果有的话)保持不变。...基于游标的SELECT只执行聚合操作,不设置%ROWID。 %ROWID值与之前的值(如果有的话)保持不变。 没有声明游标的嵌入式SQL SELECT不会设置%ROWID。

    3.2K51
    领券