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

使用JOIN时WHERE Clause vs ON

在 SQL 中,JOINWHERE 子句都是用于筛选数据,但它们在实现方式、功能和用途上有所不同。以下是关于这两者的比较:

WHERE Clause

  1. 实现方式:WHERE 子句通过指定条件对结果集进行筛选。
  2. 功能:WHERE 子句用于过滤结果集中的数据,只返回符合特定条件的数据。
  3. 用途:WHERE 子句常用于查询操作,例如在 SELECT、INSERT、UPDATE 或 DELETE 语句中使用,来过滤要返回或操作的数据。
  4. 优势:使用 WHERE 子句可以更灵活地筛选数据,可以针对多个条件进行筛选。
  5. 劣势:WHERE 子句可能会降低查询性能,尤其是在大型数据集上,因为筛选数据需要在处理前进行。

ON Clause

  1. 实现方式:ON 子句允许您在 JOIN 操作中指定匹配条件。
  2. 功能:ON 子句用于在 JOIN 操作中指定匹配条件,只有当表与条件匹配时,才会返回结果。
  3. 用途:ON 子句主要用于 JOIN 操作,特别是在多个表通过特定键进行连接时。
  4. 优势:与 WHERE 子句相比,使用 ON 子句进行连接可以更快地筛选出匹配的数据。
  5. 劣势:ON 子句只适用于 JOIN 操作,不能用于其他类型的查询。

示例

假设您有一个名为 employees 的表,包含以下字段:employee_idfirst_namelast_namesalary

使用 WHERE 子句

代码语言:sql
复制
SELECT first_name, last_name, salary
FROM employees
WHERE salary > 50000;

使用 ON 子句

代码语言:sql
复制
SELECT e1.first_name, e1.last_name, e2.salary
FROM employees e1
JOIN employees e2 ON e1.salary > 50000 AND e2.salary > 50000;

在上述示例中,ON 子句在 JOIN 操作中指定了两个表(e1e2)的 salary 字段,只有当 e1e2 表中的 salary 字段都大于 50000 时,才会返回结果。与 WHERE 子句相比,使用 ON 子句的连接更加高效。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • HQL的左连接_左连接与右连接的区别

    在Hibernate的映射文件中配置好关联关系之后,查询的时候可以直接使用比如 select new map(student.studentID as studentID, student.studentAccount...,但是默认使用的内连接,就是说外键必须匹配的记录才能查出来,实现不了要求。 当我决定用左连接查询之后,做了很多尝试,但是因为对HQL不够熟悉,都没有达到要求。...错误,报错:with-clause expressions did not reference from-clause element to which the with-clause 原因因给是是在with...虽然有了skill,但是,报错:with-clause referenced two different from-clause elements 幸好没有崩溃,想起来看一下书。...其实怪就怪在没想起来用到joinwherewhere对字段的限制并没有那么严格,但是因为在Student关联的是Skill实体,又不能直接用where而放弃join,所以,正确的语句: select

    1.3K30

    关于sql和MySQL的语句执行顺序(必看)「建议收藏」

    目前还在查看,但是在查阅资料发现了一些有益的知识,给大家分享一下,就是关于sql以及MySQL语句执行顺序: sql和mysql执行顺序,发现内部机制是一样的。最大区别是在别名的引用上。...一、sql执行顺序 from on join where group by(开始使用select中的别名,后面的语句中都可以使用) avg,sum…....SELECT语句的定义如下: SQL代码 [] [] [] [] [] [] SELECT子句是必选的,其它子句如WHERE子句、GROUP BY子句等是可选的。...执行 GROUP BY 子句, 把 tb_Grade 表按 “学生姓名” 列进行分组(注:这一步开始才可以使用select中的别名,他返回的是一个游标,而不是一个表,所以在where中不可以使用select

    1.3K10

    mysql多表查询 浅谈mysql中等值连接与非等值连接、自连接与非自连接、内连接与外连接问题(一)

    笛卡尔积也称为 交叉连接 ,英文是 CROSS JOIN。在 SQL99 中也是使用 CROSS JOIN表示交 叉连接。它的作用就是可以把任意表进行连接,即使这两张表不相关。...中使用表明的话,则必须使用表的别名,而不能再使用表的原名 #如下的操作是错误的 SELECT emp.employee_id,dept.department_name,emp.department_id...= departments.department_id; [Err] 1054 - Unknown column 'departments.department_id' in 'where clause...e.department_id = d.department_id; 需要注意的是,如果我们使用了表的别名,在查询字段中、过滤条件中就只能使用别名进行代替, 不能使用原有的表名,否则就会报错。...说明 :对多表进行查询记录、更新记录、删除记录,如果对操作列没有限定表的别名(或表 名),并且操作列在多个表中存在,就会抛异常。

    3K20

    Gorm实战,轻松掌握数据库增删改查技巧!

    有upsert 既可以更新数据,又可以插入数据,来解决这个问题,如果主键存在就更新 import "gorm.io/gorm/clause" // 在冲突,什么都不做 db.Clauses(clause.OnConflict...{DoNothing: true}).Create(&user) // 在`id`冲突,将列更新为默认值 db.Clauses(clause.OnConflict{ Columns: []clause.Column...,可以通过将相关字段名称或 dbname 传递给 'Where()' 来指定要在查询条件中使用的结构中的哪些特定值,例如: //在使用struct进行搜索,可以通过将相关字段名或数据库名传递给`Where...如果您想确保指定字段被更新,你应该使用 Select 更新选定字段,或使用 map 来完成更新操作 4.4 更新选定字段 如果您想要在更新选定、忽略某些字段,您可以使用 Select、Omit /...c.id = u.company_id) WHERE name = 'jinzhu' 5.3 不使用 Hook 和时间追踪 如果您想在更新跳过 Hook 方法且不追踪更新时间,可以使用 UpdateColumn

    3K20

    Apache-Flink深度解析-JOIN-LATERAL

    用 Correlated subquery解决 Correlated subquery 是在subquery中使用关联表的字段,subquery可以在FROM Clause中也可以在WHERE Clause...WHERE ClauseWHERE Clause实现上面的查询需求,SQL如下: SELECT c.customerid, c.city FROM Customers c WHERE c.customerid...) 执行情况: 上面的问题是用在WHERE Clause里面subquery的查询列必须和需要比较的列对应,否则我们无法对o.orderid进行投影, 上面查询我为什么要加一个o.orderid呢,...e.DEPTNO=d.DEPTNO ) as d; 查询结果: 我使用的是Calcite官方自带测试数据。...Flink中对JOIN LATERAL的支持,后续篇章会介绍Apache Flink中另一种使用LATERAL的场景,就是Temporal JION,Temporal JION也是一种新的JOIN类型

    1.2K50
    领券