SQL学习(联结表)

linux 内核vxlan收发包流程 1.vxlan口收包处理流程 前面几章详细介绍了vxlan接口的使用,而且已经知道vxlan是 MAC IN UDP中的封装,因此,在解封装之前,一切按照原有流程走,在此复习一下内核收发包流程(驱动层的数据处理这次不再解析,直接从__netif_receive_skb_core开始) #物理网卡处理中断,触发softirq i40e_intr └─napi_schedule_irqoff #i40e softirq把包放到per cpu backlog,触发softirq i40e_napi_p 阅读详情

联结

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

关系表

假如有一个包含产品目录的数据库表,其中每种类别的物品占一行。对于每种木品要存储的信息包括产品描述和价格,以及生产该产品的供应商消息。

现在,假如有由同一供应商生产的多种物品,那么何处存储供应商信息(如,供应商名、地址、联系方法等)呢?将这些数据与产品信息分开存储的理由如下。

  • 因为同一供应商生产的每个产品的供应商的信息都是相同的,对每个产品重复此信息既浪费时间又浪费存储空间。
  • 如果供应商信息改变(例如,供应商搬家或电话号码变动),只需改动一次即可。
  • 如果有重复数据,很难保证每次输入该数据的方式都相同。不一致的数据在报表中很难利用。
    关键是,相同数据出现多次决不是一件好事,此因素是关系数据库设计的基础。关系表的设计就是要保证把信息分解成多个表,一类数据一个表。各表通过某些常用的值互相关联。
    在这个例子中,可以建立两个表,一个用来存储供应商表,另一个存储产品信息。Vendors表包含所有供应商信息,每个供应商占一行,每个供应商具有唯一标识。此标识称为主键,可以是供应商ID或任何其他唯一值。
    product表只存储产品信息,它除了供应商ID外不存储其他供应商信息。vendors的主键又叫作products的外键,它将vendors表与products表关联,利用供应商ID能从vendors表中找出相应供应商的详细信息。
    外键:外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。

关系数据可以有效地存储和方便地处理。因此,关系数据库的可伸缩性远比非关系数据库要好。

联结是一种机制,用来在一条SELECT语句中关联表,因此称之为联结。

创建联结

mysql> SELECT vend_name, prod_name, prod_price FROM vendors,products WHERE vendors.vend_id = products.vend_id ORDER BY vend_name, prod_name;
+-------------+----------------+------------+
| vend_name   | prod_name      | prod_price |
+-------------+----------------+------------+
| ACME        | Bird seed      |      10.00 |
| ACME        | Carrots        |       2.50 |
| ACME        | Detonator      |      13.00 |
| ACME        | Safe           |      50.00 |
| ACME        | Sling          |       4.49 |
| ACME        | TNT (1 stick)  |       2.50 |
| ACME        | TNT (5 sticks) |      10.00 |
| Anvils R Us | .5 ton anvil   |       5.99 |
| Anvils R Us | 1 ton anvil    |       9.99 |
| Anvils R Us | 2 ton anvil    |      14.99 |
| Jet Set     | JetPack 1000   |      35.00 |
| Jet Set     | JetPack 2000   |      55.00 |
| LT Supplies | Fuses          |       3.42 |
| LT Supplies | Oil can        |       8.99 |
+-------------+----------------+------------+
14 rows in set (0.00 sec)

从FROM子句中可以看出,与以前的SELECT语句不一样,这条语句的FROM子句列出了两个表,分别是vendors和products。它们就是这条SELECT语句联结的两个表的名字,这两个表用WHERE子句正确联结。

内部联结

目前为止所有的联结称为等值联结,它基于两个表之间的相等测试。这种联结称为内部联结。其实,对于这种联结可以使用稍微不同的语法来明确指定联结的类型。

mysql> SELECT prod_name, vend_name, prod_price FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id;
+----------------+-------------+------------+
| prod_name      | vend_name   | prod_price |
+----------------+-------------+------------+
| .5 ton anvil   | Anvils R Us |       5.99 |
| 1 ton anvil    | Anvils R Us |       9.99 |
| 2 ton anvil    | Anvils R Us |      14.99 |
| Fuses          | LT Supplies |       3.42 |
| Oil can        | LT Supplies |       8.99 |
| Detonator      | ACME        |      13.00 |
| Bird seed      | ACME        |      10.00 |
| Carrots        | ACME        |       2.50 |
| Safe           | ACME        |      50.00 |
| Sling          | ACME        |       4.49 |
| TNT (1 stick)  | ACME        |       2.50 |
| TNT (5 sticks) | ACME        |      10.00 |
| JetPack 1000   | Jet Set     |      35.00 |
| JetPack 2000   | Jet Set     |      55.00 |
+----------------+-------------+------------+
14 rows in set (0.00 sec)

这两个表之间的关系是FROM子句的组成部分,以INNER JOIN指定。联结条件用特定的ON子句而不是WHERE子句给出。传递给ON的实际条件与传递给WHERE的相同。

联结多个表

mysql> SELECT prod_name, vend_name, prod_price, quantity FROM orderitems,products,vendors WHERE products.vend_id = vendors.vend_id AND orderitems.prod_id = products.prod_id AND order_num = 20005;
+----------------+-------------+------------+----------+
| prod_name      | vend_name   | prod_price | quantity |
+----------------+-------------+------------+----------+
| .5 ton anvil   | Anvils R Us |       5.99 |       10 |
| 1 ton anvil    | Anvils R Us |       9.99 |        3 |
| TNT (5 sticks) | ACME        |      10.00 |        5 |
| Bird seed      | ACME        |      10.00 |        1 |
+----------------+-------------+------------+----------+
4 rows in set (0.00 sec)

这里的FROM子句列出了3个表,而WHERE子句定义了两个联结条件。

性能考虑:MySQL在运行时关联指定的每个表以联结处理,这种处理可能是非常耗资源的,因此应该仔细,不要联结不必要的表。联结的表越多,性能下降的越厉害。

使用表别名

SELECT cust_name,cust_contact 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 = 'TNT2';

可以看到,FROM子句中3个表全都具有别名,这样做可以缩短SQL语句。
表别名只在查询执行中使用。与列别名不一样,表别名不返回客户机。

使用不同类型的联结

迄今为止,我们使用的只是称为内部联结或等值联结的简单联结。还有其它3种联结,它们分别是自联结,自然联结和外部联结。

自联结

mysql> SELECT prod_id,prod_name FROM products WHERE vend_id = (SELECT vend_id FROM products WHERE prod_id = 'DTNTR');
+---------+----------------+
| prod_id | prod_name      |
+---------+----------------+
| DTNTR   | Detonator      |
| FB      | Bird seed      |
| FC      | Carrots        |
| SAFE    | Safe           |
| SLING   | Sling          |
| TNT1    | TNT (1 stick)  |
| TNT2    | TNT (5 sticks) |
+---------+----------------+
7 rows in set (0.00 sec)

使用自联结后

mysql> SELECT p1.prod_id,p1.prod_name FROM products AS p1,products AS p2 WHERE p1.vend_id = p2.vend_id AND p2.prod_id = 'DTNTR';
+---------+----------------+
| prod_id | prod_name      |
+---------+----------------+
| DTNTR   | Detonator      |
| FB      | Bird seed      |
| FC      | Carrots        |
| SAFE    | Safe           |
| SLING   | Sling          |
| TNT1    | TNT (1 stick)  |
| TNT2    | TNT (5 sticks) |
+---------+----------------+
7 rows in set (0.01 sec)

查询中需要的两个表实际上是相同的表,因此products表在FROM子句中出现了两次。虽然这是完全合法的,但对products的引用具有二义性,因此MySQL不知道你引用的是products表中的哪个实例。

为解决此问题,使用了表别名。products的第一次出现为别名p1,第二次出现为别名p2。

自然联结

无论何时对表进行联结,应该至少有一个列出现在不止一个表中。标准的联结返回所有数据,甚至相同的列出现多次。自然联结排除多次出现,使每个列只返回一次。
系统不完成这项工作,由自己完成。这一般是通过对表使用通配符(SELECT *),对所有其他表的列使用明确的子集来完成的。

mysql> SELECT c.*, o.order_num, o.order_date,oi.prod_id,oi.quantity 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 = 'FB';
+---------+-------------+----------------+-----------+------------+----------+--------------+--------------+-----------------+-----------+---------------------+---------+----------+
| cust_id | cust_name   | cust_address   | cust_city | cust_state | cust_zip | cust_country | cust_contact | cust_email      | order_num | order_date          | prod_id | quantity |
+---------+-------------+----------------+-----------+------------+----------+--------------+--------------+-----------------+-----------+---------------------+---------+----------+
|   10001 | Coyote Inc. | 200 Maple Lane | Detroit   | MI         | 44444    | USA          | Y Lee        | ylee@coyote.com |     20005 | 2005-09-01 00:00:00 | FB      |        1 |
|   10001 | Coyote Inc. | 200 Maple Lane | Detroit   | MI         | 44444    | USA          | Y Lee        | ylee@coyote.com |     20009 | 2005-10-08 00:00:00 | FB      |        1 |
+---------+-------------+----------------+-----------+------------+----------+--------------+--------------+-----------------+-----------+---------------------+---------+----------+
2 rows in set (0.01 sec)

这个例子中,通配符只对第一个表使用。所有其他列明确列出,所以没有重复的列被检索出来。

外部联结

许多联结表将一个表中的行与另一个表中的行相关联。但有时候会需要包含没有关联行的那些行。

  • 对每个客户下了多少订单进行计数,包括那些尚未下订单的客户
  • 列出所有产品以及订购数量,包括没有人订购的产品
  • 计算平均销售规模,包括那些尚未下订单的客户

下面SELECT语句给出一个简单的内部联结。它检索所有客户及其订单。

mysql> SELECT customers.cust_id, orders.order_num FROM customers INNER JOIN orders ON customers.cust_id = orders.cust_id;
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
|   10001 |     20005 |
|   10001 |     20009 |
|   10003 |     20006 |
|   10004 |     20007 |
|   10005 |     20008 |
+---------+-----------+
5 rows in set (0.00 sec)

外部联结语法类似。为了检索所有客户,包括那些没有订单的客户,可如下进行

mysql> SELECT customers.cust_id, orders.order_num FROM customers LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id;
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
|   10001 |     20005 |
|   10001 |     20009 |
|   10002 |      NULL |
|   10003 |     20006 |
|   10004 |     20007 |
|   10005 |     20008 |
+---------+-----------+
6 rows in set (0.00 sec)

与内部联结关联两个表中的行不同的是,外部联结还包括没有关联行的行。在使用OUTER JOIN语法时,必须使用RIGHT或LEFT关键字指定包括所有行的表。上面的例子使用LEFT OUTER JOIN 从FROM子句的左边表中选择所有行。

注意:应该总是提供联结条件,否则会得出笛卡儿积。

Hexo博客使用PDF.js clone了一个pdf.js 然后兴高采烈地到文章里使用{% pdf %}标签 结果浏览器弹出了个下载框(使用GitHub的raw) 不知道是不是因为使用GitHub的原因导致这个问题 后来我测试的时候报了个错 优快云上的解决方法 到时候我再试试把资源放回lib/里面看看行不行 目录1.clone1.1.官方方法1.2.NexT主题方法1.3.补充2.修改文件2.1.修改viewer.htm... 阅读详情

相关推荐

写一个b站爬虫(思路)

part 0 安装 scrapy, requests part 1 信息获取 打开番剧索引链接(https://www.bilibili.com/anime/index/) F12控制台,选中NETWORK,来到xhr文件,我们可以找到了存放番剧json的地方

kou的博客 484

权宜之计002:晕了吧唧的OUTER JOIN

Technorati 标签: outer join,Jet SQL,ACCESS,参数查询 版权声明:可以任意转载,转载时请务必以超链接形式标明如下文章原始出处和作者信息及本声明作者:xixi出处:http://blog.youkuaiyun.com/slowgrace/archive/2008/10/05/3016635.aspx 话说我在ACCESS中写了个这样的嵌套joi

2233

HAL库:中断处理函数 及 weak弱声明中断回调函数 详解

HAL库中断处理函数 及 weak弱声明中断回调函数

L_Z_J_I的博客 5169

外部链接

外部链接的概念:又称为“反向链接”或导入链接,是指其他网站的链接指向你的网站. 外部链接包括:单向链接和双向链接(友情链接) 外部链接的意义: 增加网站权重 提高网站关键词排名 提高网站流量 外部链接的注意事项: 循序渐进,不要一下增加很多 注重质量,不要单纯追求数量 内容相关性强 什么是单向外链? 定义:A网页有链接指向B网页,而B网页没有链接指向A网页 当A网页与B网页属于不同的网站时,这个连接成为“单向外链” 单向外链的特点:不导出链接 锚文本形式:...

缘 源 园 1925

硬件测试入门--环路响应(Bode)测试

环路分析的一个重要作用就是分析开关电源的稳定性。扫频测试原理主要是给开关电源电路注入一个频率变化的正弦信号,测量开关电源在频域上的特性,通过分析穿越频率、增益裕度和相位裕度来判断环路是否稳定,可以为电子工程师设计稳定的控制电路提供直观的数据。开关电源的稳定性关系到整个应用系统的可靠性,利用伯德图可以看出在不同频率下系统增益的大小和相位。通过伯德图来对开关电源的环路稳定性进行判断和分析已经成为评估开关电源可靠性必不可少的方法。

songninging的博客 1万+

SpringBoot3 + OAuth2.1实战:5分钟搞定授权码模式(含完整代码)

本文详细介绍了如何在SpringBoot3环境中快速实现OAuth2.1的授权码模式,包括环境配置、核心安全实现及完整代码示例。通过Spring Security集成,开发者可以高效构建企业级安全认证系统,解决版本兼容性问题,提升开发效率。

weixin_29216353的博客 138

mysql

二、中阶部分1、使用数据处理函数1.1 文本处理函数1.2 日期和时间处理函数1.3 数值处理函数2、汇总数据3、分组数据3.2 过滤分组3.3 SELECT子句顺序4、使用子查询5、联结表6、创建高级联结6.1 自联结6.2 自然联结6.3 外部联结7、组合查询8、全文本搜索8.2 使用查询扩展8.3 布尔文本搜索9、插入数据10、更新和删除数据 1、使用数据处理函数 本章介绍什么是函数,MySQL支持何种函数,以及如何使用这些函数。 大多数SQL实现支持以下类型的函数。 1.用于处理文本串(如删除或填充

weixin_42332634的博客 659

基于MySQL的京东用户行为分析

对京东用户行为的分析,利用AARRR模型进行分析。

SelenaSelena的博客 1909

MySQL的内部联结,外部联结(左联结,右联结),自然联结

一、SELECT语句 一个典型的SQL查询语句具有如下形式: SELECT A1,A2, ... ,An FROM r1, r2, ... ,rm WHERE P;select子句列出查询结果中所需要的属性。 from子句是一个查询求值中需要访问的关系列表。 where子句是一个作用在from子句关系属性上的谓词。 其中from这个子句定义的是一个在该子句中列出的关系上的笛卡尔积

PinkFriday的博客 6256

51单片机IAP在线升级

51单片机IAP在线升级 爱矽半导体E85F3325单片机IAP在线升级教程,此处可查看更新及demo下载 文章目录前言一、ROM资源二、KEIL有关知识1.BL51连接器:2.LX51连接器:三、Keil其他相关项说明:四、MCU启动文件说明:五、例程BOOTLOADER使用说明六、例程使用可更改说明:七、程序使用通信方式:XMODEM八、APP程序说明九、APP代码升级说明十、代码合并烧写 前言 扩展-IAP 主要用于产品出厂后应用程序的更新作用 ,类似于其他引导装载升级程序的方法,在系统中必须始终

qq_42415953的博客 6667

GoAnywhere MFT 身份验证绕过漏洞(CVE-2024-0204)

GoAnywhere MFT 身份验证绕过漏洞(CVE-2024-0204)

weixin_43567873的博客 387

外部联接(Outer Join)和笛卡尔积(Cartesian Product)

在这个关于“常见的 SQL 查询错误”的系列中,我们一直在探索看似直观的 SQL 查询构造方法如何导致反模式,从而导致错误结果和/或性能降低。上周,我们暂停了这个系列,讨论了 SQL 中的谓词。在本期文章中,我们将学习它们的位置如何对查询执行产生负面影响,尤其是在外部联接中。 什么是外部联接? 在链接相关的表和视图时,可使用四种基本的联接类型:内部联接、左联接、右联接和外部联接。内部联接不会返回任何一个表中在另一个表中不匹配的行。外部联接可以返回一个或两个表中不匹配的行。而最后三种连接类型都是外部联接的

Navicat 官方账号 1636

15张图详解三方支付:总架构、5大核心业务处理流程、备付金管理

用户可以将银行卡与零钱账户绑定,建立银行结算账户与支付账户的连接,然后将银行账户资金充值到零钱账户中,或将零钱账号中的余额提现至绑定的银行卡。因此,用户在A支付机构的零钱一般只能支付给A支付机构的商户,如支付宝的零钱不能支付给微信的商户。这五大业务的协同运作,使得第三方支付机构这一庞大的支付服务平台能够为市场提供卓越的支付能力。到了结算时间,网联会向备付金集中存管账户提交结算指令,在第三方支付机构备付金集中存管账户内完成最终的结算,并将结算结果及额度变动情况通知给第三方支付机构,具体流程如图13所示。

银行信息系统应用架构详解 1044

SQL学习之联结表的使用

1、简介:"联结(join)表"是SQL最强大的功能之一。联结是利用SQL的SELECT能执行的最重要的操作,很好地理解联结及其语法是学习SQL的极为重要的部分! 在能够有效的使用联结前,必须了解关系表以及关系型数据库设计的一些基础知识。 2、关系表 下面通过一个列子来理解关系表。 有一个包含产品目录的数据库表,其中每类物品占一行。对于每一种物品,要存储的信息包括产品描述、价格以及生产该产...

weixin_34109408的博客 255

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【SQL自学打卡|DAY12】——联结表专项学习

抓住中秋假期的尾巴学习SQL吧!

m0_62279905的博客 542

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

SQL学习笔记之联结表

联结 联结能够将多个表关联起来进行数据检索 关系表 关系表就是把信息拆解成多个表,每个表存储一类信息,各个表通过某些共同值相互关联,每个表中没有重复信息,因此也叫关系数据库 关系数据库(无重复信息)的优点: 信息不会重复,因此不浪费内存空间 因为每个信息都是独一无二的,每次信息变动只进行一次改动 数据不重复,因此生成报表更为简单 非关系数据库(有重复信息)的缺点: 同样的信息重复很多次,浪费...

weixin_39729469的博客 172

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SQL学习十、联结表

SQL最强大的功能之一就是能在数据查询的执行中联结(join)表。 相关概念 1、关系表 理解关系表,最好可以通过一个例子。 比如我们有这样一张水果订单表oderlist,表中每一行是一个水果订单,里面包含(主键id、水果名、数量、单价、订单号、用户id、用户名称、订单时间、水果供应商、供应商地址、供应商电话、供应商邮箱、供应商联系人)。 通过表中的数据我们可以看出同一个供应商供应了多个订单,这...

麻薯帅比的博客 616

SQL学习之--联结表

SQL最强大的功能之一就是能在数据查询的执行中联结(join)表。 关系表 理解关系表,可以来看一个例子。 有一个包含产品目录的数据库表,其中每类物品占一行。对于每一种物品,要存储的信息包括产品描述,,价格,以及生产该产品的供应商。 把它们放在一张表中必然会有重复的信息,一个供应商的信息将重复在他生产的产品后出现,相同的数据出现多次绝不是一件好事,这是关系数据库设计的基础。关系

u012767227的博客 567

sql必知必会学习记录(十二)- 联结表

sql必知必会学习记录(十二)- 联结表 联结 等值联结(内部联结) SELECT vend_name, prod_name, prod_price FROM vendors, products WHERE vendors.vend_id = products.vend_id ORDER BY vend_name, prod_name 笛卡儿积(cartesian pro...

zhaozhen的博客 192

学习笔记 |《SQL必知必会》| ch12 — ch13 高级联结表

第12课 联结表 这一课会介绍什么是联结,为什么使用联结,如何编写使用联结的 SELECT语句。 12.1 联结 12.1.1 关系表 关系表的设计就是要把信息分解成多个表,一类数据一个表。 各表通过某些共同的值互相关联,所以才叫关系数据库。 12.1.2 为什么使用联结 可伸缩scale 能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称为可伸缩性好。 联结,是一种机制,用来在...

大虎牙的博客 1703

SQL必知必会 学习笔记 11,12 课 (子查询,联结表)

SQL必知必会 学习笔记 11,12 课 (子查询,联结表)

m0_56021250的博客 756

SQL-小白最佳入门sql查询二

偷偷的查我资料就罢了,你竟然还用资料计算我,企图我;

知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;) 6289

《SQL必知必会》学习笔记

SQL(Structured Query Language)结构化查询语言,SQL是一种专门用来与数据库沟通的语言。不是某个特定数据库厂商专有的语言,因此学习SQL几乎能与所有数据库打交道。简单易学。灵活,可以进行复杂和高级的数据库操作。

Leon_Chenl的博客 1198

SQL语句

1.检索数据 语句:SELECT … FROM …; ex.: SELECT prod_name FROM Products; 检索单列 SELECT prod_name, prod_id FROM Products; 检索多列 SELECT * FROM Products; 返回所有列 SELECT DISTINCT vend_id FROM Products; 加DISTINCT关键字,只返回...

weixin_42214315的博客 350

根据SQL必知必会学习SQL(MYSQL)

文章目录一、检索所有列1.select1.1检索单个列1.2 检索多个列1.3 检索所有列1.4 检索不同值1.5 限制结果1.6 使用注释二、排序检索数据2.1 按照多个列排序2.2 按照列位置排序2.3 指定排序方向三,过滤数据3.1 使用where子句4.2检查单个值4.3不匹配查询4.4范围值查询4.5空值查询五,高级数据过滤5.1使用and5.2使用or5.3使用in六,用通配符进.

weixin_45819715的博客 2115

SQL必知必会 总结笔记

文章目录1. 检索数据检索单个列检索多个列检索不同值限制结果注释2. 排序检索数据排序单个列多个列排序按列位置进行排序指定序列方向3. 过滤数据使用WHERE语句使用WHERE子句4. 用通配符进行过滤LIKE操作符%通配符下划线方括号 [ ]5. 创建计算字段6. 使用数据处理函数7. 汇总数据8. 分组数据9. 使用子查询10. 联结表11. 创建高级联结12. 组合查询13. 插入数据14....

Bean771606540的博客 766
上一篇: SQL学习(使用子查询)
下一篇: SQL学习(组合查询)
Cengineering
博客等级 码龄13年 51粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值