理解关系表和关系表的设计。设计关系表的时候,将信息分散到多个表中,避免在一个表中存在太多重复信息。关系表能更好地扩展。

当信息存在多个表里时,如何在一条查询语句里获取来自不同表中的信息。
join就是一种机制,在同一个条查询语句中关联多个表中的信息。

从关系运算的角度来说,连接运算是从两个关系的笛卡尔积中选取满足条件的元组。
一般连接:从两个关系的笛卡尔积中选取属性间符合一定条件的元组
等值连接:属性间的条件为相等
自然连接:属性间的条件为相等,去掉结果属性列中的重复项
外连接:在一般连接的基础上,选取未匹配到的行。左连接即选取左边未匹配的行,右边相应的值设为空,右连接同理。

1、Inner Join

基于两个表之间的相等性测试的连接,这种连接称为内连接。

SELECT ta.iten1, tb.item2, tc.item3
FORM table_a AS ta, table_b AS tb, table_c AS tc
WHERE ta.tb_id = tb.id
AND tb.tc_id = tc.id

等价于

SELECT ta.iten1, tb.item2, tc.item3
FORM table_a AS ta INNER JOIN table_b AS tb INNER JOIN table_c AS tc
ON ta.tb_id = tb.id
AND tb.tc_id = tc.id

2、Self Join

用来代替子查询的方式
假设一个场景:某条数据库中的数据包含字段item1,item2。其中item1的值为text1,item2的值为text2;现要查询数据中所有与item1=text1时对应的text2相等的数据。
用子查询的方式:

SELECT t1.item1, t1.item2 FROM database_demo AS t1 WHERE t1.item2 = (SELECT t2.item2 FROM database_demo AS t2 WHERE t2.item1 = 'text1' )

改用自联结的方式为:

SELECT t1.item1, t1.item2 FROM database_demo AS t1, database_demo AS t2 WHERE t1.item2 = t2.item2 AND t2.item1 = 'text1'

自连接通常用于替换使用子查询的语句,这些子查询从与外部语句相同的表中检索数据。尽管最终结果是相同的,但是许多dbms进程的连接速度要比它们执行子查询快得多。通常值得尝试这两种方法来确定哪一种性能更好。

3、Nature Join

自然连接只是消除了那些多次出现的情况,因此每个列只返回一个。进行比较的属性必须是相同的属性,比较的条件也是相等条件。
自然连接是只选择唯一列的连接。这通常在一个表上使用通配符完成
(SELECT *),并显示列出所有其他表的列的子集。

SELECT C.*, O.order_num, O.order_date, OI.prod_id, OI.quantity, OI.item_price
FROM Customers AS C, Orders AS O, OrderItems AS OI
WHERE C.cust_id = O.cust_id
AND OI.order_num = O.order_num
AND prod_id = 'RGAN01';

在本例中,通配符仅用于第一个表,所有其他列都被显式列出,这样就不会检索到重复的列。

事实是,到目前为止您所创建的每个内部连接实际上都是一个自然连接,您可能永远都不需要一个不是自然连接的内部连接。

4、Outer Joins

大多数连接将一个表中的行与另一个表中的行关联起来。但有时,您希望包含没有相关行的行。
假设有如下场景:

  • 计算每个客户下了多少订单,包括尚未下订单的客户。
  • 列出所有产品和产品的订购数量,包括没有任何人订购的产品。
  • 计算平均销售规模,把尚未下订单的客户也考虑进来。
    在上面的使用场景中,联接包括了在相关的表中没有关联的行,这种类型的联接被叫做外联接。

下面的查询语句是一个简单的内部联接。

SELECT Customers.cust_id, Orders.order_num
FROM Customers INNER JOIN Orders
ON Customers.cust_id = Orders.cust_id;

查出的结果:

改用LEFT OUTER JOIN
检索所有客户的列表,包括那些没有下订单的客户

SELECT Customers.cust_id, Orders.order_num
FROM Customers LEFT OUTER JOIN Orders
ON Customers.cust_id = Orders.cust_id;

与将两个表中的行关联起来的内部连接不同,外部连接还包括没有关联行的行。在使用外部连接时,必须使用RIGHT或
LEFT关键字指定包含所有行的表(RIGHT为外连接右边表的行,LEFT为左的行)。

请记住,外部连接总是有两种基本形式—左外部连接和右外部连接。它们之间唯一的区别是它们所关联的表的顺序。换句话说,只需反转FROM或WHERE子句中的表顺序,左外连接就可以转换为右外连接。因此,这两种类型的外部连接可以互换使用,关于使用哪一种连接的决定纯粹是基于方便。

外部连接还有另一种变体,即完整的外部连接,它从两个表中检索所有行,并将可能相关的行关联起来。左外连接或右外连接包含来自单个表的不相关行,而完整的外连接包含来自两个表的不相关行。完整外部连接的语法如下

SELECT Customers.cust_id, Orders.order_num
FROM Orders FULL OUTER JOIN Customers
ON Orders.cust_id = Customers.cust_id;

MariaDB, MySQL, Open Office Base,或SQLite等不支持FULL OUTER JOIN

5、使用联接和聚合函数

SQL基础-联接(join)相关推荐

  1. sql之left join、right join、inner join的区别,连接自己时的查询结果测试

    sql之left join.right join.inner join的区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录  right join(右联接) 返回包 ...

  2. sql基础教程亚马逊_针对Amazon,Apple,Google的常见SQL面试问题

    sql基础教程亚马逊 SQL is used in a wide variety of programming jobs. It's important to be familiar with SQL ...

  3. sql 左联接 全联接_学习SQL:联接多个表

    sql 左联接 全联接 If you want to get something meaningful out of data, you'll almost always need to join m ...

  4. 学习SQL:INNER JOIN与LEFT JOIN

    INNER JOIN vs LEFT JOIN, that is the question. Today, we'll briefly explain how both of these two jo ...

  5. SQL之LEFT JOIN,EIGHT JOIN,INSERT JOIN的区别

    SQL之LEFT JOIN,EIGHT JOIN,INSERT JOIN的区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包 ...

  6. Oracle Database 11g : ocp之SQL 基础

    Oracle Database 11g : SQL 基础 第一章:使用SQL SELECT 语句检索数据 使用的表 1.空值 2:列别名 1:定义列别名 2:使用列别名 select FIRST_NA ...

  7. 一张图告诉你SQL使用inner join,left join 等

    sql之left join.right join.inner join的区别 union.union all的区别跳转https://www.cnblogs.com/logon/p/3748020.h ...

  8. SQL的连接(join)有哪些常见形式?解释一下?解释 SQL 的 left join 和 right join?

    SQL的连接(join)有哪些常见形式?解释一下?解释 SQL 的 left join 和 right join? SQL的连接(join)有哪些常见形式? sql连接查询:把多张表的列组合在一起,产 ...

  9. sql基础教程mysql_SQL基础教程(第2版)笔记整理

    花了一段时间把SQL基础教程(第2版)看完,并把笔记整理好. 数据定义语言(Data Define Language) 数据操作语言(Data Manipulation Language) 数据控制语 ...

最新文章

  1. 如何在jupyter notebook上传文件夹
  2. matlab的input函数总结
  3. eplan导出部件汇总表_干货分享:西门子产品数据表导入到博途和EPLAN应用举例...
  4. 使用计算机比喻的心理学研究取向,心理学入门:6个方面的研究取向
  5. android集成测试工具,android – 集成测试和Cucumber测试
  6. 可视化 nltk_词嵌入:具有Genism,NLTK和t-SNE可视化的Word2Vec
  7. 信息学奥赛一本通C++语言——1022: 整型与布尔型的转换
  8. python3 try except or_Python基础10:try except异常处理详解
  9. Qt编程之QtScript
  10. RDS binglog
  11. python猜字游戏猜三次_python的猜数字游戏
  12. FEC(前向纠错码)
  13. wordpress后台固定菜单消失不见了怎么办?
  14. xp计算机用户账户密码删除,xp强行删除管理员开机密码
  15. 程序员头发都是怎么没的?第二个原因扎心了!
  16. MT2523用户手册,MT2523设计指南资料
  17. ios微信组件跳转_在iOS9中突破微信App跳转的限制
  18. OO包设计原则遵循度自动分析检查工具JDM简介(原创)
  19. 我改变世界、我已看透、我不再是个程序员-IT创世诸神如是说
  20. 黑*头条_第8章_爬虫系统搭建

热门文章

  1. vim末行模式下的替换操作
  2. android 4.4 x86 iso,android x86官方版下载_android x86 4.4 iso 官方最新版[网盘资源]_零度软件园...
  3. 2021年全球壳聚糖收入大约93百万美元,预计2028年达到126.8百万美元
  4. mumu模拟器cpu设置_网易MuMu模拟器CPU虚拟化怎么设置?
  5. CSS重置默认样式reset.css代码模板
  6. Alpha 冲刺(6/10)
  7. jumpserver
  8. 第8章 SMS--短信服务
  9. Gambler's Ruin(赌徒破产问题 概率论)
  10. 证明HITTING SET 是NP完全