SQL第12课——联结表

三点:什么是联结?为什么使用联结?如何编写使用联结的select语句

12.1 联结

SQL最强大的功能之一就是能在数据查询的执行中联结(join)表。联结是利用SQL的select能执行的最重要的操作。

在使用联结前,需要了解关系表和关系数据库设计的一些基础知识。

12.1.1 关系表

例子:

一个产品目录的数据库表,一类物品占一行,每一行对物品的介绍包含:产品描述,价格,以及生产该产品的供应商。

现在有同一供应商生产的多种物品,那么在何处存储供应商名,地址,联系方式等供应商信息?

产品信息与供应商信息分开存储的理由:

  1. 同一供应商生产的每个产品,其供应商信息都是相同的,对每个产品重复此信息既浪费时间又浪费存储空间;

  2. 当供应商信息发生变化,例如供应商迁址或电话号码变动,只需要修改一次就行;

  3. 当有重复数据,很难保证每次输入该数据的方式都相同。不一致的数据在报表中就很难利用。

关系数据库设计的基础:相同的数据出现多次决不是一件好事。

关系表的设计把信息分解成多个表:一类数据一个表,各个表通过某些共同的值互相关联。

此例中可以建立两个表:一个存储供应商信息,另一个存储产品信息。

Vendors表包含所有供应商信息,每个供应商占一行,具有唯一的标识,此标识称为主键(primary key).可以是供应商ID或任何其他唯一值。

Products表只存储产品信息,除了存储供应商ID(Vendors表的主键)外,不存储其他有关供应商的信息。

Vendors表的主键将Vendors表和Products表关联。

好处:

  1. 供应商信息不重复,不会浪费时间和空间;

  2. 当供应商信息变动时,只需要更新Vendors表中的单个记录,相关表中的数据不用改动。

  3. 由于数据不重复,数据显然是一致的,使得处理数据和生成报表更简单。

关系数据可以有效地存储,方便地处理。关系数据库的可伸缩性更好。

可伸缩(scale):

能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称为可伸缩性好。

12.1.2 为什么使用联结

将数据分解为多个表能更有效地存储,更方便的处理,并且可伸缩性更好。

使用联结,联结是一种机制,用来在一条select语句中关联表。使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。

12.2 创建联结

指定要联结的所有表,并关联它们的方式。

vend_name来自一个表;prod_name, prod_price来自一个表。

要匹配的两列指定为:venders.vend_id和products.vend_id。

这里需要这种完全限定列名,一条select语句返回了两个不同表中的数据

12.2.1 where子句的重要性

where子句作为过滤条件,只包含那些匹配给定条件(这里是联结条件)的行。没有where子句,第一个表中的每一行将与第二个表中的每一行配对,而不管它们逻辑上是否能配在一起。

**笛卡儿积(cartesian product):**没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。返回笛卡儿积的联结,也称叉联结(cross join)

从上面的输出可以看出来,相应的笛卡儿积不是我们想要的,返回的数据用每个供应商匹配了每个产品,包括了供应商不正确的产品(即使供应商根本就没有产品)。

所有联结都必须有where子句!!!

12.2.2 内联结

目前为止使用的联结成为等值联结(equijoin),基于两个表之间的相等测试,也称为内联结(inner join).

联结条件用特定的on子句而不是where子句给出。传递给on的实际条件与传递给where的相同。

12.2.3 联结多个表

SQL不限制一条select语句中可以联结的表的数目。

创建联结的基本规则也相同。首先列出所有表,然后定义表之间的关系。

where子句定义两个联结条件,第三个联结条件用来过滤出订单20007中的物品。

!!!不要联结不必要的表,联结的表越多,性能下降越厉害。

执行复杂的select操作的两种方法:第11课中的子查询和第12课中的联结:

子查询:返回订购产品rgan01的顾客列表:

联结:

!!!联结的列名,在上述的例子中名字都是一样的,但是列名相同并不是必需的。

相关推荐
两点王爷7 小时前
PostgreSQL 常用 SQL 语句与 GIS 相关函数详解
数据库·后端
两点王爷7 小时前
PostgreSQL 好用又独特的特性与空间函数
数据库
梦帮科技7 小时前
AI 音乐产品的发布工程:验证门、数据发布、回滚与生产运维纪律
数据结构·数据库·架构·node.js·音视频·动态规划·推荐算法
TDengine (老段)9 小时前
TDengine 常见问题 TOP3
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
Lucifer三思而后行11 小时前
Oracle SQL 优化实战:明明走了索引,SQL 还是慢?
sql·oracle
螺蛳粉 螺蛳粉12 小时前
MySQL 分布式集群系列 · 第五篇——全方位对比:NDB、MGR、主从复制、分库分表怎么选?
数据库·分布式·mysql
泡泡鱼(敲代码中)13 小时前
MySQL 学习笔记:DCL、函数与约束 —— 安全、效率、完整性的三板斧
开发语言·笔记·sql·学习·mysql·gitee
这个DBA有点耶16 小时前
从OLTP到OLAP到HTAP:数据库负载分类的技术演进与选型指南
数据库·mysql·架构
润乾软件16 小时前
SQLazy: 在分组内搜索指定偏移量的相邻记录
sql·sqlazy
YangYang9YangYan17 小时前
商业数据分析校招项目怎么选,附项目设计与简历包装思路
大数据·数据库·数据分析