子查询跟join on差别
时间: 2023-07-25 08:23:24 浏览: 85
子查询和 JOIN ON 都是 SQL 中用于连接两个或多个表的方法,但是它们之间还是有一些差别的。
子查询是将一个查询语句嵌套到另一个查询语句中,最终作为一张虚拟表参与主查询。子查询的执行顺序是先执行子查询语句,然后将子查询的结果作为条件参与到主查询中。子查询通常使用在 WHERE 或 HAVING 子句中,用于限制主查询的结果集。
例如,以下 SQL 语句使用子查询来查询员工表中薪水最高的员工信息:
```
SELECT * FROM employee WHERE salary = (SELECT MAX(salary) FROM employee);
```
JOIN ON 是通过将两个或多个表中的数据进行连接,从而返回更为完整的结果集。它是将两个表中的数据按照指定条件进行匹配,并将匹配的行连接起来。JOIN ON 通常使用在 FROM 子句中。
例如,以下 SQL 语句使用 JOIN ON 来查询员工表和部门表的信息:
```
SELECT employee.*, department.name
FROM employee
JOIN department ON employee.department_id = department.id;
```
总的来说,子查询和 JOIN ON 都是用来连接表的方法,但是它们的应用场景不同。子查询通常用于在主查询中限制结果集,而 JOIN ON 则用于连接多个表中的数据,返回更为完整的结果集。
相关问题
多表连接查询 内连接:inner join on 交叉连接:笛卡尔积 等值连接: 自然连接:natural join 自连接: 外连接:outer join on 左外连接 右外连接 全连接 子查询: 单行子查询 多行子查询 TopN查询: 分页
查询:limit和offset
内连接:inner join on
内连接是指只返回两个表中都有数据匹配的行,也就是说只返回匹配的结果集。在 MySQL 中,内连接可以使用“inner join on”来实现。例如:
```
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;
```
这个查询语句将返回 table1 和 table2 表中都有匹配数据的行。
交叉连接:笛卡尔积
交叉连接是指返回两个表中的所有可能组合,也就是说返回的结果集是两个表的笛卡尔积。在 MySQL 中,可以使用“cross join”关键字来实现交叉连接。例如:
```
SELECT * FROM table1 CROSS JOIN table2;
```
这个查询语句将返回 table1 和 table2 中的所有可能组合。
等值连接:
等值连接是指返回两个表中某个列值相等的行。在 MySQL 中,可以使用“inner join on”来实现等值连接。例如:
```
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;
```
这个查询语句将返回 table1 和 table2 中 id 列值相等的行。
自然连接:
自然连接是指返回两个表中所有列名相同且列值相等的行,不需要指定任何连接条件。在 MySQL 中,可以使用“natural join”关键字来实现自然连接。例如:
```
SELECT * FROM table1 NATURAL JOIN table2;
```
这个查询语句将返回 table1 和 table2 中所有列名相同且列值相等的行。
自连接:
自连接是指在同一个表中进行连接查询。在 MySQL 中,可以使用“inner join on”关键字来实现自连接。例如:
```
SELECT a.id, a.name, b.name FROM table1 a INNER JOIN table1 b ON a.parent_id = b.id;
```
这个查询语句将返回 table1 表中每个行的 id、name 以及它的父级 name。
外连接:
外连接是指返回两个表中匹配和不匹配的行,一般分为左外连接、右外连接和全连接。
左外连接:
左外连接是指返回左表中所有行以及右表中匹配的行。在 MySQL 中,可以使用“left join on”关键字来实现左外连接。例如:
```
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id;
```
这个查询语句将返回 table1 中所有行以及 table2 中匹配的行。
右外连接:
右外连接是指返回右表中所有行以及左表中匹配的行。在 MySQL 中,可以使用“right join on”关键字来实现右外连接。例如:
```
SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id;
```
这个查询语句将返回 table2 中所有行以及 table1 中匹配的行。
全连接:
全连接是指返回左表和右表中所有行。在 MySQL 中,可以使用“full outer join on”关键字来实现全连接。例如:
```
SELECT * FROM table1 FULL OUTER JOIN table2 ON table1.id = table2.id;
```
这个查询语句将返回 table1 和 table2 中所有行。
子查询:
子查询是指在一个查询语句中嵌套另一个查询语句,用于获取需要的数据。通常分为单行子查询和多行子查询。
单行子查询:
单行子查询是指返回一行数据的子查询。例如:
```
SELECT name FROM table1 WHERE id = (SELECT id FROM table2 WHERE name = 'John');
```
这个查询语句将返回 table1 中 id 和 table2 中 name 匹配的行的 name 字段。
多行子查询:
多行子查询是指返回多行数据的子查询。例如:
```
SELECT name FROM table1 WHERE id IN (SELECT id FROM table2 WHERE age > 18);
```
这个查询语句将返回 table1 中 id 和 table2 中 age 大于 18 的行的 name 字段。
TopN查询:
TopN查询是指获取查询结果集中前 N 行数据。在 MySQL 中,可以使用“limit”关键字来实现分页查询,例如:
```
SELECT * FROM table1 LIMIT 10;
```
这个查询语句将返回 table1 中的前 10 行数据。
同时,可以使用“limit offset, count”来实现分页查询,例如:
```
SELECT * FROM table1 LIMIT 10, 20;
```
这个查询语句将返回 table1 中从第 11 行开始的 20 行数据。
left join 跟子查询
### SQL `LEFT JOIN` 与子查询的区别及用法
#### 左连接 (`LEFT JOIN`)
左连接用于获取左侧表中的所有记录以及右侧表中满足条件的匹配记录。如果右侧表中不存在对应的记录,则结果集中这些字段显示为 NULL。
语法结构如下:
```sql
SELECT column_names
FROM table1 AS t1
LEFT JOIN table2 AS t2 ON join_condition;
```
例如,在员工和部门表格之间执行左连接可以得到所有员工的信息及其所属部门名称;对于那些未分配到任何部门的员工,其部门名将为空值[^1]。
#### 子查询 (Subquery)
子查询是指嵌套在一个更大查询内部的小型查询表达式。它可以作为另一个查询的一部分来提供过滤条件或计算某些特定值的结果集。
当需要基于某个集合内的成员身份来进行筛选时经常使用子查询。比如要找出参加过“800米”项目的运动员编号可以用下面的方式实现:
```sql
WHERE sno IN (SELECT sno FROM p_test WHERE category = '800米');
```
这里 `(SELECT sno FROM p_test WHERE category = '800米')` 就是一个典型的子查询例子。
#### 使用场景对比
- **性能方面**: 对于大规模数据处理而言, 如果能够通过索引来优化访问路径的话, `JOIN`操作通常会比相应的子查询更高效.
- **可读性和维护性**: 当涉及到复杂的多层关联逻辑时, 明确写出各个表之间的关系往往使得代码更容易理解和调试. 而过度依赖深层嵌套式的子查询可能会降低程序的清晰度.
- **功能特性**: 在某些情况下只有采用某种方式才能达到预期效果. 比如当我们想要保留左边表的所有行即使右边没有任何对应项的时候就必须选用`LEFT JOIN`; 反之如果我们只是单纯地希望根据某几个指定ID去检索相关信息则更适合利用子查询完成任务.
综上所述, 应该根据不同业务需求灵活选择合适的方法以构建高效的数据库查询语句[^3].
阅读全文
相关推荐
















