相信很多朋友在写sql的时候会用到 left join on,right join on, inner join on 这种连接方式,但是如果想在我们连接的表中去过滤某个条件该怎么做呢,是直接在 on 后面加 and 还是直接在where中加条件呢?之前自己遇到这种情况总是先去做尝试,对于这其中的原理不明白。通过网上搜索以及自己实践,把自己的见解以及网上搜到的一些结果写下来,以便以后回顾使用。
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
left join on :
1. on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。 on 后面跟and条件,先会在右边表中对and条件进行过滤,然后再跟左边主表进行关联。
2. where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
示例:
表table1
id no
1 101
2 102
3 103
4 104
5 105
表table2
no name
101 a
103 b
104 c
SELECT * FROM table1 t1 LEFT JOIN table2 t2 ON (t1.no = t2.no AND t2.no='103')
查询结果如下:
t1.id t1.no t2.no t2.name
1 101 (null) (null)
2 102 (null) (null)
3 103 103 b
4 104 (null) (null)
5 105 (null) (null)
SELECT * FROM table1 t1 LEFT JOIN table2 t2 ON t1.no = t2.no WHERE t2.no='103'
查询结果如下:
t1.id t1.no t2.no t2.name
3 103 103 b
其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。
而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。
相关推荐
条件可以是列的值、比较运算符和逻辑运算符的组合,如 `WHERE 列1 = '值' AND 列2 > 10`。 3. GROUP BY和HAVING子句:用于对数据进行分组并筛选组。`GROUP BY`后跟一列或多列名,`HAVING`则在分组后设置条件。例如...
left join (SELECT PP_VALUE, PP_NAME FROM SYSTEM_PARAMETERS where PP_TABLE = 'F_Company_EU_Info' and PP_FIELD = 'Identification') f on a.Identification = f.PP_VALUE ``` - **左连接(left join)**: 左连接...
- **SQL语句**:`SELECT t1.Tname, t1.Prof FROM teacher t1 JOIN teacher t2 ON t1.Prof <> t2.Prof WHERE t1.Depart = '计算机系' AND t2.Depart = '电子工程系';` - **知识点**:使用表连接进行条件筛选。 ###...
- 复杂的联查操作,如`SELECT * FROM a LEFT INNER JOIN b ON a.a = b.b RIGHT INNER JOIN c ON a.a = c.c INNER JOIN d ON a.a = d.d WHERE 条件;` 12. **日程提醒**: - 提前五分钟提醒:`SELECT * FROM 日程...
SQL2支持多种JOIN操作,包括INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN,用于合并多个表的数据。例如,通过员工ID连接员工表和部门表: ```sql SELECT * FROM 员工 e INNER JOIN 部门 d ON e.部门ID = d.部门ID;...
在使用外连接时,注意`ON`关键字后跟连接条件,而不是`WHERE`。在某些旧的SQL方言中(如Oracle),可以使用`(+)`操作符来表示外连接,但这在标准SQL中已经不再推荐。 在实际应用中,`SELECT`语句的灵活性非常高,...
在进行开发和实际应用中,用户不应该只用root用户进行连接数据库,虽然使用root用户进行测试时很方便,但会给系统带来重大安全隐患,也不利于管理技术的提高。我们给一个应用中使用的用户赋予最恰当的数据库权限。如...
- **外部连接**:LEFT JOIN、RIGHT JOIN和FULL OUTER JOIN。 - **示例**:合并两个表中的记录,去除重复项: ```sql SELECT * FROM Table1 UNION SELECT * FROM Table2; ``` #### 24. 嵌入SQL - **概念**:将...
- `LEFT JOIN sys.extended_properties g on a.id = g.major_id AND a.colid = g.minor_id`: 左连接`sys.extended_properties`表,获取列的扩展属性。 #### 3. WHERE子句: - `WHERE b.name is not null`: 排除...
此外,还有`LEFT JOIN`、`RIGHT JOIN`和`FULL OUTER JOIN`等不同类型的联接。 聚合函数如`COUNT`、`SUM`、`AVG`、`MAX`和`MIN`用于对一组值进行计算。`GROUP BY`和`HAVING`则用于对结果进行分组和过滤。例如,按...
2. **WHERE子句与AND操作符**:在查询10号部门员工的`job`和20号部门的`location_id`时,可以使用`WHERE`子句结合`AND`操作符来指定条件。 3. **SELECT语句与条件判断**:选择所有有奖金的员工,需要检查`emp`表中...
例如,连接`Stores`和`Sales`表基于`store_id`列,可以使用`SELECT * FROM Stores INNER JOIN Sales ON Stores.store_id = Sales.store_id`。 #### 外部连接(Outer Join) 外部连接包括`LEFT OUTER JOIN`、`RIGHT...
FROM emp e LEFT JOIN emp m ON e.mgr = m.empno; ``` **知识点:** - `LEFT JOIN`:左外连接,保留左表的所有行,并在右表中找到匹配项。如果没有找到匹配项,则用NULL填充右表中的列。 - 本题展示了如何使用外连接...
6. **多表连接查询**:`JOIN`操作允许从多个表中联合查询数据,`INNER JOIN`、`LEFT JOIN`、`RIGHT JOIN`和`FULL JOIN`等提供了不同类型的连接方式。自我连接是连接同一张表的特殊情况,用于比较表中的行或解决特定...
- **使用JOIN连接表**:通过INNER JOIN、LEFT JOIN、RIGHT JOIN或FULL JOIN等,可以结合多个表的数据。例如,`SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;` - **使用外连接查看不满足连接...
主要有INNER JOIN(内连接)、LEFT JOIN(左连接)、RIGHT JOIN(右连接)和FULL JOIN(全连接)。 - UNION操作:合并两个或多个SELECT查询的结果集,去除重复行。 - SUBQUERY(子查询):在另一个SQL语句中嵌套一...
多表连接查询允许从多个表中获取数据,如`INNER JOIN`、`LEFT JOIN`、`RIGHT JOIN`等。子查询则可以在一个查询语句内部嵌套另一个查询,以满足更复杂的查询需求。 在实际应用中,SQL的这些功能使得开发者和数据库...
有几种类型的JOIN,包括INNER JOIN(内连接)、LEFT JOIN(左连接)、RIGHT JOIN(右连接)和FULL OUTER JOIN(全外连接)。 7. **子查询与集合函数**:子查询是在一个查询中嵌套另一个查询,用于实现更复杂的筛选...
5. **联接操作**:如INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL OUTER JOIN,用于合并来自两个或更多表的数据。 6. **事务处理**:BEGIN、COMMIT、ROLLBACK用于控制数据的原子性和一致性,确保数据的完整性。 7. **...