`

Sql join关键字 全面分析!

阅读更多
SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。

Join 和 Key

有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。

数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。

请看 Persons 表:



请注意,"Id_P" 列是 Persons 表中的的主键。这意味着没有两行能够拥有相同的 Id_P。即使两个人的姓名完全相同,Id_P 也可以区分他们。

接下来请看 "Orders" 表:



请注意,"Id_O" 列是 Orders 表中的的主键,同时,"Orders" 表中的 "Id_P" 列用于引用 "Persons" 表中的人,而无需使用他们的确切姓名。

请留意,"Id_P" 列把上面的两个表联系了起来。

不同的 SQL JOIN


下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。

    * JOIN: 如果表中有至少一个匹配,则返回行
    * LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
    * RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
    * FULL JOIN: 只要其中一个表中存在匹配,就返回行

SQL INNER JOIN 关键字

在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
INNER JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

注释:INNER JOIN 与 JOIN 是相同的。

现在,我们希望列出所有人的定购。

您可以使用下面的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName


结果集:



INNER JOIN 关键字在表中存在至少一个匹配时返回行。如果 "Persons" 中的行在 "Orders" 中没有匹配,就不会列出这些行。

SQL LEFT JOIN 关键字

LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
LEFT JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN。

现在,我们希望列出所有的人,以及他们的定购 - 如果有的话。

您可以使用下面的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName


结果集:



LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行。

SQL RIGHT JOIN 关键字

RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。
RIGHT JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

注释:在某些数据库中, RIGHT JOIN 称为 RIGHT OUTER JOIN。

现在,我们希望列出所有的定单,以及定购它们的人 - 如果有的话。

您可以使用下面的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
RIGHT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName


结果集:



RIGHT JOIN 关键字会从右表 (Orders) 那里返回所有的行,即使在左表 (Persons) 中没有匹配的行。

SQL FULL JOIN 关键字

只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。
FULL JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
FULL JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

注释:在某些数据库中, FULL JOIN 称为 FULL OUTER JOIN。

现在,我们希望列出所有的人,以及他们的定单,以及所有的定单,以及定购它们的人。

您可以使用下面的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName


结果集:



FULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果 "Persons" 中的行在表 "Orders" 中没有匹配,或者如果 "Orders" 中的行在表 "Persons" 中没有匹配,这些行同样会列出。

(转自http://www.w3school.com.cn)
  • 大小: 19.1 KB
  • 大小: 16.6 KB
  • 大小: 18 KB
  • 大小: 20.5 KB
  • 大小: 20 KB
  • 大小: 22.6 KB
分享到:
评论
19 楼 mercyblitz 2010-12-10  
loverswordsman 写道
join的表多了,效率就不高,这方面的优化如何做?



数据冗余来优化!
18 楼 杀客o凹胖 2010-12-10  
jwx0925 写道
SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。

Join 和 Key

有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。

数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。

请看 Persons 表:



请注意,"Id_P" 列是 Persons 表中的的主键。这意味着没有两行能够拥有相同的 Id_P。即使两个人的姓名完全相同,Id_P 也可以区分他们。

接下来请看 "Orders" 表:



请注意,"Id_O" 列是 Orders 表中的的主键,同时,"Orders" 表中的 "Id_P" 列用于引用 "Persons" 表中的人,而无需使用他们的确切姓名。

请留意,"Id_P" 列把上面的两个表联系了起来。

不同的 SQL JOIN


下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。

    * JOIN: 如果表中有至少一个匹配,则返回行
    * LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
    * RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
    * FULL JOIN: 只要其中一个表中存在匹配,就返回行

SQL INNER JOIN 关键字

在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
INNER JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

注释:INNER JOIN 与 JOIN 是相同的。

现在,我们希望列出所有人的定购。

您可以使用下面的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName


结果集:



INNER JOIN 关键字在表中存在至少一个匹配时返回行。如果 "Persons" 中的行在 "Orders" 中没有匹配,就不会列出这些行。

SQL LEFT JOIN 关键字

LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
LEFT JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN。

现在,我们希望列出所有的人,以及他们的定购 - 如果有的话。

您可以使用下面的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName


结果集:



LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行。

SQL RIGHT JOIN 关键字

RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。
RIGHT JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

注释:在某些数据库中, RIGHT JOIN 称为 RIGHT OUTER JOIN。

现在,我们希望列出所有的定单,以及定购它们的人 - 如果有的话。

您可以使用下面的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
RIGHT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName


结果集:



RIGHT JOIN 关键字会从右表 (Orders) 那里返回所有的行,即使在左表 (Persons) 中没有匹配的行。

SQL FULL JOIN 关键字

只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。
FULL JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
FULL JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

注释:在某些数据库中, FULL JOIN 称为 FULL OUTER JOIN。

现在,我们希望列出所有的人,以及他们的定单,以及所有的定单,以及定购它们的人。

您可以使用下面的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName


结果集:



FULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果 "Persons" 中的行在表 "Orders" 中没有匹配,或者如果 "Orders" 中的行在表 "Persons" 中没有匹配,这些行同样会列出。

(转自http://www.w3school.com.cn)

17 楼 xiaoyuwei 2010-10-20  
不错,学习了
16 楼 xylzk2007 2010-09-19  
a left  join b
b left join  a
结果一样,可能效率有不同
15 楼 gtandsn 2010-06-25  
好文章,可是在实践中有什么用呀
14 楼 段箭*残箫 2010-06-18  
使用表连接之后,假如原来的表名单词比较长,最好给表取个别名,这样使用的时候不用重复写原来的表名了。
13 楼 ORHCLE 2010-05-24  
full join 没怎么用到过。
12 楼 loverswordsman 2010-05-24  
join的表多了,效率就不高,这方面的优化如何做?
11 楼 winstonczc 2010-05-02  
如果join的字段不是主键外键的话,要考虑建立适当的索引
10 楼 flynofry 2010-04-27  
请问在SQL优化方面用到join是要注意哪些方面,谁写详细讲解下?
9 楼 liwenjie 2010-04-23  
还有cross join即笛卡尔积,其实全面分析join,应该分析下join的内在执行计划,比如nested loops、merge join、hashjoin,这在oracle和DB2都有实现的
8 楼 jinkingmanager 2010-04-23  
A left join B 与 B right join A:
如果指定了查询数据的顺序,那么结果应该是一样的
如果是使用* 查询所有,那么查询出的数据 列的顺序 不同
但是数据是一样的
7 楼 jwx0925 2010-04-22  
liufanjavaeye 写道
很清晰易懂。
有个问题一直想搞清楚,A left join B 和 B right join A 是一样的吗

貌似是一样的~实验出真理,一会儿做实验看看结果~
6 楼 moses3017 2010-04-22  
liufanjavaeye 写道
很清晰易懂。
有个问题一直想搞清楚,A left join B 和 B right join A 是一样的吗

5 楼 liufanjavaeye 2010-04-22  
很清晰易懂。
有个问题一直想搞清楚,A left join B 和 B right join A 是一样的吗
4 楼 lionhome 2010-04-22  
sql知识,看了就明白,谢谢
3 楼 玲cc 2010-04-20  
好文章啊,之前一直弄不懂这个,学习了
2 楼 moses3017 2010-04-19  
cross join
1 楼 sw1982 2010-04-19  
好文章,呵呵。其实JOIN就是我们平时用的and。

另外能再分析下join的效率就更好了。

相关推荐

    SQL Server帮助文档(全)

    例如,JOIN关键字用于合并多个表的数据,WHERE用于筛选记录,GROUP BY用于分组,HAVING用于条件分组,ORDER BY用于排序,等等。 3. **SQL Server帮助文档**: 完整的帮助文档是开发者和DBA的重要参考资料。它包含...

    SQL server 2000查询分析器安装

    SQL Server 2000查询分析器是微软数据库管理系统SQL Server的...通过以上的介绍,你应该对SQL Server 2000查询分析器的安装和使用有了更全面的了解。记住,熟练掌握这个工具将极大地提高你在数据库管理及开发中的效率。

    sqlserver学习资料(转载!)

    SQL Server是一款由微软开发的关系型数据库管理系统,广泛应用于企业级数据存储、管理和分析。这篇学习资料集合了大师级人物的智慧结晶,对于想要深入理解和掌握SQL Server的人来说是一份宝贵的资源。 1. SQL ...

    sql server 2005 技术内幕t-sql查询源码

    本书分为九个章节,全面覆盖了T-SQL查询的各种核心概念和技术。以下是对每个章节可能涉及的知识点的详细说明: 1. **基础查询语句**:这部分内容可能涵盖了SELECT语句的基本用法,包括选择列、表连接、聚合函数(如...

    比较全面的SQL补习

    SQL,全称Structured Query Language,即结构化查询语言,是用于管理和处理关系数据库的...通过"比较全面的SQL补习"的学习,你将能够掌握SQL的基础到进阶知识,并能在实际项目中灵活运用,提升数据管理与分析的能力。

    Microsoft SQL Server 2005技术内幕:T-SQL查询

    这本书是技术内幕系列的一部分,旨在为读者提供深入、全面的T-SQL查询知识,帮助他们提升在SQL Server 2005环境中的数据管理和分析能力。 T-SQL是SQL Server的扩展,它是用于管理关系数据库、执行数据查询和更新的...

    精通sql,很好的sql教程

    SQL,全称Structured Query Language,即结构化查询语言,是...总结,本教程全面涵盖了SQL的基础和高级用法,通过学习,读者不仅可以熟练掌握SQL语句的编写,还能深入了解SQL在实际工作中的应用,提升数据处理能力。

    24小时SQL教程

    在24个精心编排的章节中,读者将逐步掌握如何使用SQL进行数据管理和分析。下面将详细阐述这个教程中涉及的主要知识点。 1. **SQL基础**:SQL(Structured Query Language)是用于管理和处理关系数据库的标准编程...

    SQL语句中不同的连接JOIN及join的用法

    左外连接会返回左表(在JOIN关键字前的表)的所有行,即使在右表中没有匹配的行。对于那些在右表中没有匹配的左表行,结果中的对应列将填充NULL值。例如: ```sql SELECT s.name, g.sn, g.score FROM student ...

    SQL数据库学习大全

    3. 连接查询:通过JOIN关键字将两个或更多表的数据连接在一起。 4. 子查询:在SELECT、FROM或WHERE子句中嵌套一个查询,以获取满足特定条件的子集。 5. 分组与聚合函数:GROUP BY用于分组数据,聚合函数如COUNT、SUM...

    全面接触SQL语法,熟悉SQL语法

    全面了解SQL语法对于任何数据库相关的工作都是至关重要的。 1. **建立数据库和表格** 使用SQL,你可以创建新的数据库以及在数据库中建立表格。这通常通过`CREATE DATABASE`和`CREATE TABLE`语句实现,可以定义表格...

    sql实训例子

    SQL Server 2000是微软推出的一款关系数据库管理系统,它为开发者提供了强大而全面的数据管理和分析工具。这个实训例子可能涵盖了从基本的SQL查询到更复杂的数据库操作,下面将对一些关键知识点进行详细讲解。 1. *...

    SQL语言参考资料

    SQL2000的联机丛书中通常包含了对SQL语言的全面解释和示例,以帮助用户理解并有效地使用这一语言。本参考资料将围绕SQL的SELECT语句、数据库操作以及基本语法展开讨论。 首先,我们关注SQL中的SELECT语句,它是查询...

    SQL语言教程及项目案例

    6. **联接操作**:SQL允许通过`JOIN`关键字将两个或多个表的数据结合在一起。主要有内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL OUTER JOIN)。 7. **子查询**:子查询是在一...

    SQL Pretty Printer

    - 对比文本编辑器插件:一些文本编辑器(如VS Code、Sublime Text)有内置的SQL格式化插件,但SQL Pretty Printer可能提供更专业和全面的服务。 5. **如何使用SQL Pretty Printer** - 安装:根据平台选择相应的...

    Sql高手速成

    在IT领域,SQL...通过"Sql高手速成"的学习资料,你将能够逐步建立起对SQL的全面认识,从基础到高级,从理论到实践,为你的IT职业生涯打下坚实的基础。在实践中不断探索和应用,你也将成长为一名真正的SQL高手。

    全面深入学习SQL语句教程

    本教程旨在提供全面深入的SQL语句学习指导,适合初学者和有一定经验的数据库从业者进行复习。 SQL的核心在于其基本语句,包括但不限于: 1. **SELECT语句**:这是SQL中最常见的语句,用于从数据库中检索数据。基础...

    SQL 语句大全 SQL 语句大全

    本资源“SQL 语句大全”旨在提供全面的SQL语法和操作指南,帮助用户掌握SQL的核心概念与实践技巧。 1. **SQL基础** - **数据定义语言 (DDL)**:包括CREATE、ALTER和DROP等语句,用于创建、修改和删除数据库结构,...

    SQL Assistant 7.1

    1. **SQL语句智能提示**:SQL Assistant 7.1内置了全面的SQL语法库,当用户在编写SQL语句时,能够提供实时的语句完成建议,包括表名、字段名、函数和关键字等。这种智能提示不仅减少了输入错误,还能帮助开发者快速...

    SQL Course Materials.zip

    本课程资料集包含了全面的SQL学习资源,旨在帮助初学者和进阶者深入理解并掌握SQL的基本概念、语法以及实际应用。 一、SQL基础 SQL的基础包括数据操作语言(DML)、数据定义语言(DDL)和数据控制语言(DCL)。DML...

Global site tag (gtag.js) - Google Analytics