sql中的on的用法

ON子句是SQL连接表的灵魂,直接用,别绕弯。

表连接用ON,列值相等就连接。

订单产品查详情,ON子句来匹配。

INNERJOIN只选匹配,LEFTJOIN选左表所有。

等值连接最常见,非等值也常用。

多列连接更精确,多个条件一起用。

聚合前先过滤,ON和WHERE别混淆。

性能优化靠索引,NULL值LEFTJOIN见。

复杂条件别嵌套,经验之谈,你自己掂量。

sql中join on怎么用

这就是JOIN ON的核心。

INNER JOIN:匹配记录,条件Customers.id=Orders.customer_id。

LEFT JOIN:左表全返回,右表无匹配时Orders列空。

多表链式JOIN:Orders JOIN Customers ON Orders.customer_id=Customers.id。

实际:
查询:SELECT Customers.name, Orders.product_id FROM Customers LEFT JOIN Orders ON Customers.id=Orders.customer_id;
注意:ON字段类型需匹配,如INT=INT。

索引ON字段,提升速度。
别这么干:ON条件无效导致全表扫描。

提醒:先建索引再写JOIN。

SQL中ON与WHERE的区别

哎哟,咱们聊聊SQL里的ON和WHERE子句吧,这俩玩意儿在JOIN操作里可是挺有讲究的。

先说ON子句,这东西在临时表生成的时候就用上了,主要是定义表之间的关联条件。
比如说,你用LEFT JOIN,不管ON条件是不是成立,左表的所有记录都会被保留下来,没匹配的部分就填NULL。
如果是INNER JOIN,ON条件就直接决定了哪些记录能进临时表,跟WHERE的效果是一样的。

再说说WHERE子句,这玩意儿是在临时表生成之后再用的,主要是对结果集进行过滤。
如果你在WHERE里加了个过滤条件,那条件不成立的记录就直接被剔除了。
不过,你要是想在LEFT JOIN里保留左表的所有记录,就不能在WHERE里过滤右表的字段,否则可能会意外地过滤掉左表的数据。

咱们举个例子:
场景一,LEFT JOIN加过滤条件,比如这样: sql SELECT e., d.dept_name FROM employees e LEFT JOIN departments d ON e.dept_id = d.id AND d.location = 'NY';
这里ON条件是关联dept_id匹配且部门在纽约的记录,但所有员工都会被返回。
你要是改用WHERE,就只会返回匹配纽约部门的员工,包括无部门的员工,这样就破坏了LEFT JOIN的语义。

场景二,INNER JOIN的等价性,比如这样: sql SELECT e., d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id = d.id AND d.location = 'NY';
和这样: sql SELECT e., d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id = d.id WHERE d.location = 'NY';
这两种写法结果是一样的,因为未匹配的记录已经被排除了。

再举个例子,为什么s.to_date='9 9 9 9 -01 -01 '必须放在WHERE?
sql SELECT e., s.salary FROM employees e LEFT JOIN salaries s ON e.id = s.emp_id WHERE s.to_date = '9 9 9 9 -01 -01 ';
这个WHERE条件是正确的,因为它确保了最终结果只包含当前有效的薪资记录,同时保留了无薪资的员工(其薪资字段为NULL)。
你要是把它放在ON里,就会保留所有员工,但只关联满足条件的薪资记录,没匹配的薪资就为NULL,可能会导致逻辑错误。

总的来说,ON是用来定义关联逻辑的,WHERE是用来过滤结果集的。
在LEFT JOIN中,如果你想保留左表的所有记录,就别在WHERE里过滤右表的字段。

on在sql中什么意思

说白了,ON在SQL中就是表连接的“黏合剂”,其实很简单,它就像是在两个表之间架起一座桥梁,让它们通过列值匹配来组合行。
先说最重要的,ON主要用于JOIN操作,比如INNER JOIN、LEFT JOIN、RIGHT JOIN,它决定了哪些行会被合并到结果集中。

我一开始也以为ON和WHERE的作用是一样的,后来发现不对,其实ON是在连接过程中过滤行,决定哪些行参与组合,即使不满足ON条件,LEFT JOIN仍会保留左表行。
而WHERE是在连接完成后过滤结果集,直接排除不满足条件的行。

还有个细节挺关键的,ON是可选的。
如果你省略了ON,某些数据库(如MySQL)会默认执行笛卡尔积,这说实话挺坑的。
显式使用ON能提高代码的可读性和逻辑清晰度。

另外一点,如果你连接的列名相同,可以使用USING来简化语法,这能让你写出更简洁的代码。
比如JOIN Order USING(customer_id)。

常见错误之一是混淆ON和WHERE,比如以下查询会返回不同结果:
-
使用ON:保留左表所有行,即使右表无匹配 SELECT FROM Customer LEFT JOIN Order ON Customer.id = Order.customer_id;
-
使用WHERE:过滤掉右表无匹配的行(相当于转为INNER JOIN) SELECT FROM Customer LEFT JOIN Order ON Customer.id = Order.customer_id WHERE Order.id IS NOT NULL;
总结一下,ON的核心作用是定义表连接时的匹配规则。
通过合理使用ON,可以精确控制多表查询的数据组合逻辑。
等等,还有个事,我觉得在使用ON的时候,要特别注意区分它与WHERE的区别,避免写出错误的查询语句。