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

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

我们再写 SQL 的时候,最常碰到一个问题就是,把查询条件放到 JOIN 子句和放到 WHERE 子句有什么不同呢?...'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...子句,则它将被过滤掉,因为 NULL 不等于 1。

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

    ClickHouse中,WHERE、PREWHERE子句和SELECT子句的使用

    图片WHERE、PREWHERE子句在ClickHouse中,WHERE和PREWHERE子句都用于筛选数据,但它们在查询中的使用有一些区别和注意事项。1....WHERE子句:WHERE子句在查询中是最后执行的,它作用于从表中读取的所有数据。WHERE子句可以包含任意条件,并且可以使用各种函数和操作符进行数据筛选。...PREWHERE子句通常用于过滤数据源中不必要的行,以减少读取和处理的数据量,提升性能。PREWHERE子句只能包含简单的条件,不能使用聚合函数、多个列的条件判断等复杂操作。...WHERE和PREWHERE子句在ClickHouse的查询中都用于筛选数据,但WHERE子句是最后执行的,可包含复杂条件,能使用索引进行优化;而PREWHERE子句是在WHERE之前执行的,用于数据源的过滤...支持使用条件语句(CASE WHEN THEN ELSE END)进行条件选择。系统函数:支持使用系统函数,如date、toDateTime、toString等。

    1.8K61

    SQL中EXISTS的使用

    相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询,带EXISTS 的子查询就是相关子查询 EXISTS表示存在量词:带有EXISTS的子查询不返回任何记录的数据,只返回逻辑值“True...普通SQL查询: SELECT 姓名 FROM 学生表 WHERE 学号 IN (SELECT 学号 FROM 选课表 WHERE 课程号 = 'C1'); 带EXISTS的SQL查询: SELECT...); 相关子查询执行过程:先在外层查询中取“学生表”的第一行记录,用该记录的相关的属性值(在内层WHERE子句中给定的)处理内层查询,若外层的WHERE子句返回“TRUE”值,则这条记录放入结果表中。...4.查询没有选C1课程的学生的学号、姓名 SELECT 姓名 FROM 学生表 WHERE NOT EXISTS ( SELECT * FROM 选课表 WHERE 学生表.学号...= 选课表.学号 AND 课程号 = 'C1' ); 5.查询选修了所有课程的学生的姓名(续) SELECT 姓名 FROM 学生表 WHERE NOT EXISTS ( SELECT *

    1.2K10

    为什么SQL语句Where 1=1 and在SQL Server中不影响性能

    对出现在where子句中的字段加索引 避免在索引列上使用函数或计算,在where子句中,如果索引是函数的一部分,优化器将不再使用索引而使用全表扫描 在insert和update维表时都加上一个条件来过滤维表中已经存在的记录...如果使用了IN或者OR等时发现查询没有走索引,使用显式申明指定索引 EXISTS要远比IN的效率高。       ...比如说访问一行数据,如果是编程语言实现,就需要指定连接数据的方式,打开数据,按某个方式取出数据,最后还要关闭连接,而在SQL Server中,T-SQL仅仅是定义如何去获取所需的数据,而无需考虑实现细节...在SQL Server中,T-SQL需要编译为执行计划才能去执行,在编译过程中,Query Optimizer需要考虑很多元数据,比如说表上的索引、数据分布、估计行数、一些参数配置、硬件环境等,在这其中...比如语句select * from table where a=1 and b=2 这个语句,SQL Server估计的行数会是:     a列的选择率*b列的选择率*表中采样的总行数     因此,当

    2K30

    SQL中的CASE WHEN使用

    SQL中的CASE WHEN使用 Case具有两种格式。简单Case函数和Case搜索函数。...简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。 还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。...如果使用Case函数,SQL代码如下: SELECT SUM(population), CASE country WHEN ‘中国’     THEN ‘亚洲’ WHEN ‘印度’     THEN ‘...,完成对二维表的输出形式,充分显示了Case函数的强大。...可能有很多人根本就不用Check,那么我建议你在看过下面的例子之后也尝试一下在SQL中使用Check。 下面我们来举个例子 公司A,这个公司有个规定,女职员的工资必须高于1000块。

    2.3K10

    SQL 中的in与not in、exists与not exists的区别以及性能分析

    end if  end loop  对于in 和 exists的性能区别 ---- 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大...对于not in 和 not exists的性能区别: not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大,子查询中的表小但是记录多...如果主查询表中记录少,子查询表中记录多,并有索引,可以使用not exists,另外not in最好也可以用/*+ HASH_AJ */或者外连接+is null NOT IN 在基于成本的应用中较好...from title T, rollup R  where R.source_id = T.Title_id(+)  and T.Title_id is null;  或者 sql> select /*... t2 ) t2  where t1.x = t2.y;  ——如果你有一定的SQL优化经验,从这句很自然的可以想到t2绝对不能是个大表,因为需要对t2进行全表的“唯一排序”,如果t2很大这个排序的性能是

    2.1K00

    SQL中的in与not in、exists与not exists的区别以及性能分析

    end if end loop 对于in 和 exists的性能区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用...所以要具体需求来决定 对于not in 和 not exists的性能区别: not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大...如果主查询表中记录少,子查询表中记录多,并有索引,可以使用not exists,另外not in最好也可以用/*+ HASH_AJ */或者外连接+is null NOT IN 在基于成本的应用中较好...from title T, rollup R where R.source_id = T.Title_id(+) and T.Title_id is null; 或者(佳) sql> select...t2 ) t2 where t1.x = t2.y; ——如果你有一定的SQL优化经验,从这句很自然的可以想到t2绝对不能是个大表,因为需要对t2进行全表的“唯一排序”,如果t2很大这个排序的性能是

    2.5K20

    SQL中的in与not in、exists与not exists的区别以及性能分析

    end if end loop 对于in 和 exists的性能区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用...所以要具体需求来决定 对于not in 和 not exists的性能区别: not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大...如果主查询表中记录少,子查询表中记录多,并有索引,可以使用not exists,另外not in最好也可以用/*+ HASH_AJ */或者外连接+is null NOT IN 在基于成本的应用中较好...from title T, rollup R where R.source_id = T.Title_id(+) and T.Title_id is null; 或者(佳) sql> select...t2 ) t2 where t1.x = t2.y; ——如果你有一定的SQL优化经验,从这句很自然的可以想到t2绝对不能是个大表,因为需要对t2进行全表的“唯一排序”,如果t2很大这个排序的性能是

    4.2K20

    SQL中的in与not in、exists与not exists的区别以及性能分析

    end if end loop 对于in 和 exists的性能区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用...所以要具体需求来决定 对于not in 和 not exists的性能区别: not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大...如果主查询表中记录少,子查询表中记录多,并有索引,可以使用not exists,另外not in最好也可以用/*+ HASH_AJ */或者外连接+is null NOT IN 在基于成本的应用中较好...from title T, rollup R where R.source_id = T.Title_id(+) and T.Title_id is null; 或者(佳) sql> select...t2 ) t2 where t1.x = t2.y; ——如果你有一定的SQL优化经验,从这句很自然的可以想到t2绝对不能是个大表,因为需要对t2进行全表的“唯一排序”,如果t2很大这个排序的性能是

    61630

    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查询文档中阅读有关SELECT DISTINCT及其技术限制的更多信息。...SQL查询| WHERE子句中的JSON对象 除了SELECT DISTINCT之外,您现在还可以通过两种方式在SQL WHERE子句中使用JSON对象: WHERE JSONor WHERE identifier

    3.5K20

    图解sql中的where和on的区别

    经常会有读者有疑问,sql中关联条件是放where后面好,还是on后面好?今天就通过图形的方式给大家来解决这个问题。 之前两章我们通过图解SQL的执行顺序和JOIN的原理知道了这两步的执行过程。...我们还是以上一章的例题来讲解: 因为在sql的内连接阶段,左表(a)和右表(b)通过笛卡尔积生成的虚表VT-A1, VT-A1 在经过内连接后会将虚表VT-A1中符合条件 (a.CustomerID=b.CustomerID...这是因为在执行sql左连接的时候,是先执行的ON后面的所有条件。...表)未关联上的其它所有数据都要添加到虚表VT-B1-1中的,所以在执行完LEFT动作之后,它的结果变成了虚表VT-B2。...结论 1、对于内连接(inner join),sql过滤条件放在where或者on后面没有区别 2、对于左右连接(left/right join),sql过滤条件放在where或者on后面有很大的区别。

    16210

    T-SQL基础(一)之简单查询

    SQL是一种声明式编程语言,即只需表明需要什么而无需关注实现细节(C#中的LINQ也是如此)。 SQL方言:在SQL标准的基础上延伸的其它语言,如SQL Server中所使用的T-SQL。...两值逻辑 与T-SQL中的大多数谓词不同,EXISTS使用两值逻辑(True/False),而不是三值逻辑; 在EXISTS( SELECT * FROM T_A WHERE Id=12)中,EXISTS...SQL Server引擎在优化查询时会忽略SELECT子句。所以,SELECT子句中的星号(*)对于性能没有任何负面影响。...FROM子句用于指定需要查询的数据源,WHERE语句对数据源中的数据做基于行的筛选。通常WHERE子句可以决定查询是否使用索引,及使用哪些索引,对于查询优化有着重要意义。...如,WHERE子句中的多个表达式的计算并没有确定的顺序。 CASE...WHEN... CASE表达式是标量表达式,返回一个符合条件的值。注意,CASE是表达式,不是语句,与COUNT类似。

    4.2K20

    SQL中CASE表达式的妙用

    case 表达式作为标准SQL的用法,真的是很强大。 case 表达式分为搜索表达式和简单表达式,由于搜索表达式包含了简单表达式的所有用法,此处仅介绍搜索表达式的用法。...取代小表关联 之前工作中遇到一个需求,需要将表中的某列进行转换,以得到新的列,当时采用的创建小表,然后再进行内连接的方法。...最近学习 case 表达式的用法,发现正好可以用来完成此工作。...-- 2.使用 case 表达式的方法 SELECT `中端1月`.NODE_NAME, case when `中端1月`.NODE_NAME = '目标制定报告上传' then...第二种写法看似代码更加复杂,但是较写法一少了建表、插入数据的步骤。 行转列 假设有下表 ? 想转换成下面的样子,该如何写 sql 呢? ?

    1K30

    SQL Server中的GUID

    GUID 主要用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有唯一性的标识符。...1、在 SQL Server 中使用 GUID 如果在 SQL Server 的表定义中将列类型指定为 uniqueidentifier,则列的值就为 GUID 类型。...SQL Server 中的 NewID() 函数可以产生 GUID 唯一值,使用此函数的几种方式如下: 1) 作为列默认值 将 uniqueidentifier 的列的默认值设为 NewID(),这样当新行插入表中时...2)使用 T-SQL 在 T-SQL 中使用 NewID()函数,如“INSERT INTO Table(ID,… ) VALUES(NewID(),…)”来生成此列的 GUID 值。...而 Guid 计算全部 16 个字节,这种差异可能会给 SQL Server 中 uniqueidentifier 列的排序带来一定影响,当然这种排序意义也不大。

    5.2K20

    数据库 SQL中IN和EXISTS用法的区别

    他要执行的次数是外表的长度*内表结果的长度 exists: exists是对外表做loop循环,每次loop循环再对内表(子查询)进行查询,那么因为对内表的查询使用的索引,他只需要执行的次数是外表的长度...where c_num ='C2' ) 使用exists实现 select s_num as 学号 from selectCourse A where A.c_num = 'C1' and not...id in(select id from B) 以上查询使用了in语句,in()只执行一次,它查出B表中的所有id字段并缓存起来.之后,检查A表的id是否与B表中的id相等,如果相等则将A表的记录加入结果集中...结论:in()适合B表比A表数据小的情况 ---- select a.* from A a where exists(select 1 from B b where a.id=b.id) 以上查询使用了...如:A表有10000条记录,B表有1000000条记录,那么exists()会执行10000次去判断A表中的id是否与B表中的id相等.

    1.2K30

    sql中的 where 、group by 和 having 用法解析

    --sql中的 where 、group by 和 having 用法解析 --如果要用到group by 一般用到的就是“每这个字” 例如说明现在有一个这样的表:每个部门有多少人 就要用到分组的技术...having avg(grade) > (select avg(grade) from sc where sno=3); –sql中的 where 、group by 和 having 用法解析 –如果要用到...即having子句的适用场景是可以使用聚合函数 having 子句限制的是组,而不是行 having 子句中的每一个元素也必须出现在select列表中。...) > (select avg(grade) from sc where sno=3); --sql中的 where 、group by 和 having 用法解析 --如果要用到group...having avg(grade) > (select avg(grade) from sc where sno=3); –sql中的 where 、group by 和 having 用法解析 –如果要用到

    12.9K30

    《SQL Cookbook》 - 第三章 多表查询

    内连接中的相等连接, select a.ename, d.loc   from emp a, dept d where a.deptno = d.deptno; 可显式使用JOIN子句,INNER则是可选项...如果习惯在FROM子句中,而不是WHERE子句中,写连接逻辑,则可以使用JOIN子句。 如果从可阅读性角度来说,表关联的时候,关联条件写在ON子句中,过滤条件写在WHERE子句中,会更让人理解。...SQL> select * from t01       where not exists (select null from t02 where t01.id = t02.id); ...EXISTS/NOT EXISTS和关联子查询一起使用时,SELECT中的列,不重要,之所以使用了NULL,是为了让注意力集中在子查询的连接操作上,而不是SELECT的列上。 5. ...*)   from dept; 因为UNION子句会过滤重复项,如果两个表的行数相同,则只会返回一行数据,如果返回两行,说明这两个表中没有完全相同的数据。

    2.4K50

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

    最近遇到相关业务,想揪一下sql的中的left join 或者right join 或者inner join 中的 on和where的区别,想了解这个首先我们要了解两个基础的知识。...1.join的三种连接方式的区别: left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录...笛卡尔积:两个[集合]*X*和*Y*的笛卡尓积(Cartesian product),又称[直积],表示为*X* × *Y*,第一个对象是*X*的成员而第二个对象是*Y*的所有可能[有序对]的其中一个成员...| 6 | 8 | 111 | | 7 | 11 | 222 | | 8 | 13 | 12 | +----+------+--------+ 下面我们来执行sql...和 where 是没有区别的 下面我们来执行sql语句看看 left join select a.

    3.8K10

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券