SQL高级应用(Join、Inner Join、Left Join、Right Join、Full Join)

SQL JOIN

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

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

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

  请看 "Persons" 表:

Id_P LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

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

  接下来请看 "Orders" 表:

Id_O OrderNo Id_P
1 77895 3
2 44678 3
3 22456 1
4 24562 1
5 34764 65

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

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

引用两个表

  可以通过引用两个表的方式,从两个表中获取数据:谁订购了产品,并且他们订购了什么产品?

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P=Orders.Id_P

  结果集:

LastName FirstName OrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678

SQL Join - 使用 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

  结果集:

LastName FirstName OrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678

不同的 SQL JOIN

  除了上面例子中使用的 INNER JOIN(内连接),还可以使用其他几种连接

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

SQL 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是相同的

  还以上面的 Persons和 Orders 表为例,现在,列出所有人的订购

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

  结果集:

LastName FirstName OrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678

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

SQL LEFT JOIN关键字

  LEFT JOIN 关键字会从左表(table_name1)那里返回所有的行,及时在右表(table_name2)中没有匹配的行,它的语法是

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

  还是以上面的 Persons和Orders 表为例,使用 LEFT JOIN,列出所有的人,以及他们的订购(如果有的话)

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

  结果集:

LastName FirstName OrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678
Bush George  

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

SQL RIGHT JOIN 关键字

  RIGHT JOIN 关键字会从右表(table_name2)那里返回所有的行,即使在左表(table_name1)中没有匹配的行,其语法如下

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 Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
RIGHT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

  结果集:

LastName FirstName OrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678
    34764

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

SQL 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

  还是以上面的 Persons、Orders表为例,现在列出所有的人,以及他们的订单,以及所有的订单,以及订购它们的人

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

  结果集:

LastName FirstName OrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678
Bush George  
    34764

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

时间: 2024-10-31 17:03:25

SQL高级应用(Join、Inner Join、Left Join、Right Join、Full Join)的相关文章

高级T-SQL进阶系列 (一):使用 CROSS JOIN 介绍高级T-SQL

这是一个新进阶系列的第一篇文章,我们将浏览Transact-SQL(T-SQL)的更多高级特性.这个进阶系列将会包含一系列的文章,它们会扩展你在之前的两个TSQL进阶系列所掌握的TSQL的基础. TSQL DML 进阶 TSQL进阶:超越基础 本系列“高级Transact-SQL”将会包含如下T-SQL主题: 使用CROSS JOIN 操作符 使用APPLY操作符 理解通用表表达式(CTE's) 使用TSQL游标的记录级别处理 使用UNPIVOT实现列转行 使用排序函数对数据进行排序 使用相关函

left join 和 left outer join 的…

join 和 left outer join 的区别" />通俗的讲:   join 和 left outer join 的区别" />  A   left   join   B   的连接的记录数与A表的记录数同 join 和 left outer join 的区别" />  A   right   join   B   的连接的记录数与B表的记录数同 join 和 left outer join 的区别" />  A   left   j

[BTS]The join order has been enforced because a local join hint is used.;Duplicate key was ignored.".

在一个客户的BizTalk Server 2013 R2环境中会报如下的ERROR,目前还没找出是什么原因. Log Name:      ApplicationSource:        BizTalk ServerDate:          3/3/2015 7:59:12 AMEvent ID:      6912Task Category: BizTalk ServerLevel:         ErrorKeywords:      ClassicUser:          N

MySql的join(连接)查询 (三表 left join 写法)

1.内连接:将两个表中存在连结关系的字段符合连接条件的记录形成记录集 Select A.name,B.name from A inner join B on A.id=B.id和 Select A.name,B.name from A,B where A.id=B.id结果是一样的(内连接的inner关键字可省略): 2.外连接:分为左外连接和右外连接 左连接A.B表结果包括A的全部记录和符合条件的B的记录. 右联结A.B表的结果和左联结B.A的结果是一样的,也就是说: Select A.nam

SQL 高级(3)

SQL 高级(3) SQL SELECT INTO 语句 SQL SELECT INTO 语句可用于创建表的备份复件. SELECT INTO 语句 SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中. SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档. SQL SELECT INTO 语法 您可以把所有的列插入新表: SELECT * INTO new_table_name [IN externaldatabase] FROM old_tablen

SQL 高级(6)

SQL 高级(6) SQL VIEW(视图) 视图是可视化的表.本章讲解如何创建.更新和删除视图. SQL CREATE VIEW 语句 什么是视图? 在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表. 视图包含行和列,就像一个真实的表.视图中的字段就是来自一个或多个数据库中的真实的表中的字段.我们可以向视图添加 SQL 函数.WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表. 注释:数据库的设计和结构不会受到视图中的函数.where 或 join 语

SQL 高级(2)

SQL 高级(2) 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 是相同的. 原始的表 (用在例子中的): "Persons" 表:

二、个人总结的菜鸟教程|sql教程的知识点(SQL高级教程)

二.SQL高级教程 1.SQL SELECT TOP SELECT TOP 子句用于规定要返回的记录的数目. SELECT TOP 子句对于拥有数千条记录的大型表来说,是非常有用的. 注释:并非所有的数据库系统都支持 SELECT TOP 子句. sql server|ms access语法 select top number|percent column_name from table_name; mysql|oracle语法(与top等价) select Column_name from t

oracle sql 高级编程 历史笔记整理

20130909 周一 oracle sql 开发指南 第7章 高级查询 1.层次化查询select level,ttt.*,sys_connect_by_path(ttt.col1,',') from ttt start with .. Connect by prior -因为先建立树,再进行where过滤的.在where中过滤和在cooonect by中过滤是不一样的. 2.rollup cube高级查询 select grouping(col1) .. From ttt group by

SQL高级查询技巧

1.UNION,EXCEPT,INTERSECT运算符 A,UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表. 当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行.两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2. B, EXCEPT 运算符 EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表