联结

SQL最强大的功能之一就是能在数据检索查询的执行中联结(join)
表。联结是利用SQL的 SELECT 能执行的最重要的操作,很好地理解联结
及其语法是学习SQL的一个极为重要的组成部分

外键(foreign key) 外键为某个表中的一列,它包含另一个表
的主键值,定义了两个表之间的关系

关系数据库的可伸缩性远比非关系数据库要好

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

为什么要使用联结

正如所述,分解数据为多个表能更有效地存储,更方便地处理,并
且具有更大的可伸缩性。但这些好处是有代价的。
如果数据存储在多个表中,怎样用单条 SELECT 语句检索出数据?
答案是使用联结。简单地说,联结是一种机制,用来在一条 SELECT
语句中关联表,因此称之为联结。使用特殊的语法,可以联结多个表返
回一组输出,联结在运行时关联表中正确的行

维护引用完整性 重要的是,要理解联结不是物理实体。换句
话说,它在实际的数据库表中不存在。联结由MySQL根据需
要建立,它存在于查询的执行当中

创建联结

联结的创建非常简单,规定要联结的所有表以及它们如何关联即可

现在来看 FROM 子句。与以前的 SELECT 语句不一样,这条语句的 FROM
子句列出了两个表,分别是 vendors 和 products 。它们就是这条 SELECT
语句联结的两个表的名字。这两个表用 WHERE 子句正确联结, WHERE 子句
指示MySQL匹配 vendors 表中的 vend_id 和 products 表中的 vend_id
可 以 看 到 要 匹 配 的 两 个 列 以 vendors.vend_id 和 products.
vend_id 指定。这里需要这种完全限定列名,因为如果只给出 vend_id ,
则MySQL不知道指的是哪一个(它们有两个,每个表中一个)

完全限定列名 在引用的列可能出现二义性时,必须使用完
全限定列名(用一个点分隔的表名和列名)。如果引用一个
没有用表名限制的具有二义性的列名,MySQL将返回错误

WHERE子句的重要性

利用 WHERE 子句建立联结关系似乎有点奇怪,但实际上,有一个很充
分的理由。请记住,在一条 SELECT 语句中联结几个表时,相应的关系是
在运行中构造的。在数据库表的定义中不存在能指示MySQL如何对表进
行联结的东西。你必须自己做这件事情。在联结两个表时,你实际上做
的是将第一个表中的每一行与第二个表中的每一行配对。 WHERE 子句作为
过滤条件,它只包含那些匹配给定条件(这里是联结条件)的行。没有
WHERE 子句,第一个表中的每个行将与第二个表中的每个行配对,而不管
它们逻辑上是否可以配在一起。

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

笛卡儿积不是我们所想要的

不要忘了 WHERE 子句 应该保证所有联结都有 WHERE 子句,否
则MySQL将返回比想要的数据多得多的数据。同理,应该保
证 WHERE 子句的正确性。不正确的过滤条件将导致MySQL返回
不正确的数据

叉联结 有时我们会听到返回称为叉联结(cross join)的笛卡
儿积的联结类型

内部联结

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

此语句中的 SELECT 与前面的 SELECT 语句相同,但 FROM 子句不
同。这里,两个表之间的关系是 FROM 子句的组成部分,以 INNER
JOIN 指定。在使用这种语法时,联结条件用特定的 ON 子句而不是 WHERE
子句给出。传递给 ON 的实际条件与传递给 WHERE 的相同。

使用哪种语法 ANSI SQL规范首选 INNER JOIN 语法。此外,
尽管使用 WHERE 子句定义联结的确比较简单,但是使用明确的
联结语法能够确保不会忘记联结条件,有时候这样做也能影响
性能。

联结多个表

SQL对一条 SELECT 语句中可以联结的表的数目没有限制。创建联结
的基本规则也相同。首先列出所有表,然后定义表之间的关系


此例子显示编号为 20005 的订单中的物品。订单物品存储在
orderitems 表中。每个产品按其产品ID存储,它引用 products
表中的产品。这些产品通过供应商ID联结到 vendors 表中相应的供应商,
供应商ID存储在每个产品的记录中。这里的 FROM 子句列出了3个表,而
WHERE 子句定义了这两个联结条件,而第三个联结条件用来过滤出订单
20005 中的物品

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

子查询并不总是执行复杂 SELECT 操作的最有效的
方法,下面是使用联结的相同查询

这个查询中返回数据需要使用3个表。但这里
我们没有在嵌套子查询中使用它们,而是使用了两个联结。这
里有3个 WHERE 子句条件。前两个关联联结中的表,后一个过滤产品 TNT2
的数据。

多做实验 正如所见,为执行任一给定的SQL操作,一般存在
不止一种方法。很少有绝对正确或绝对错误的方法。性能可能
会受操作类型、表中数据量、是否存在索引或键以及其他一些
条件的影响。因此,有必要对不同的选择机制进行实验,以找
出最适合具体情况的方法

联结是SQL中最重要最强大的特性,有效地使用联结需要对关系数据
库设计有基本的了解。本章随着对联结的介绍讲述了关系数据库设计的
一些基本知识,包括等值联结(也称为内部联结)这种最经常使用的联
结形式。

mysql必知必会--联 结 表的更多相关文章

  1. 《MySQL必知必会》官方提供的数据库和表

    数据用于配合<MySQL必知必会>(MySQL Crash Course)这本书使用,配套SQL文件也可在Ben Forta网站下载. Ben Forta网址:http://forta.c ...

  2. MySQL必知必会-官方数据库表及SQL脚本导入生成

    最近在复习SQL语句,看的是MySQL必知必会这本书,但是发现附录中只有表设计,没有表的具体数据.所以在学习相应的语句中体验不是很好,去网上查了数据库的内容,自己慢慢导入到了数据库中.把表放出来作为参 ...

  3. 读书笔记--SQL必知必会12--联结表

    12.1 联结 联结(join),利用SQL的SELECT在数据查询的执行中联结表. 12.1.1 关系表 关系数据库中,关系表的设计是把信息分解成多个表,一类数据一个表,各表通过某些共同的值互相关联 ...

  4. django基础之day04,必知必会13条,双下划线查询,字段增删改查,对象的跨表查询,双下划线的跨表查询

    from django.test import TestCase # Create your tests here. import os import sys if __name__ == " ...

  5. 《MySQL 必知必会》读书总结

    这是 <MySQL 必知必会> 的读书总结.也是自己整理的常用操作的参考手册. 使用 MySQL 连接到 MySQL shell>mysql -u root -p Enter pas ...

  6. mysql学习--mysql必知必会1

     例如以下为mysql必知必会第九章開始: 正則表達式用于匹配特殊的字符集合.mysql通过where子句对正則表達式提供初步的支持. keywordregexp用来表示后面跟的东西作为正則表達式 ...

  7. 《MySQL必知必会》[01] 基本查询

    <MySQL必知必会>(点击查看详情) 1.写在前面的话 这本书是一本MySQL的经典入门书籍,小小的一本,也受到众多网友推荐.之前自己学习的时候是啃的清华大学出版社的计算机系列教材< ...

  8. mysql必知必会系列(一)

    mysql必知必会系列是本人在读<mysql必知必会>中的笔记,方便自己以后查看. MySQL. Oracle以及Microsoft SQL Server等数据库是基于客户机-服务器的数据 ...

  9. mysql必知必会

    春节放假没事,找了本电子书mysql必知必会敲了下.用的工具是有道笔记的markdown文档类型. 下面是根据大纲已经敲完的章节,可复制到有道笔记的查看,更美观. # 第一章 了解SQL## 什么是S ...

  10. 《MySQL必知必会》整理

    目录 第1章 了解数据库 1.1 数据库基础 1.1.1 什么是数据库 1.1.2 表 1.1.3 列和数据类型 1.1.4 行 1.1.5 主键 1.2 什么是SQL 第2章 MySQL简介 2.1 ...

随机推荐

  1. 【Oracle】分区表详解

    此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念     2.表分区的具体作用     3.表分区的优缺点     4.表分区的几种类型及操作方法     5.对表分区的维护 ...

  2. 【Java并发基础】管程简介

    前言 在Java 1.5之前,Java语言提供的唯一并发语言就是管程,Java 1.5之后提供的SDK并发包也是以管程为基础的.除了Java之外,C/C++.C#等高级语言也都是支持管程的. 那么什么 ...

  3. 机器学习-K最近邻算法

    一.介绍 二.编程 练习一(K最近邻算法在单分类任务的应用): import numpy as np #导入科学计算包import matplotlib.pyplot as plt #导入画图工具fr ...

  4. JS基础——ATM机终端程序编写(3.0)

    利用函数进行代码实现,要点:将每一项操作单独写成一个函数,在需要时进行调用,弄清参数的传递. 创建模拟账户 使用数组创建账户 let user = ["xiaohei", 1234 ...

  5. [JLOI2014]松鼠的新家(树链剖分)

    [JLOI2014]松鼠的新家(luogu) Description 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间 ...

  6. linux--->阿里云centos6.9环境配置安装lnmp

    阿里云centos6.9环境配置安装lnmp mysql安装 本人博客:http://www.cnblogs.com/frankltf/p/8615418.html PHP安装 1.安装依赖关系 yu ...

  7. Docker快速上手之搭建SpringBoot项目

    Docker是基于Go语言实现的云开源项目. Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装.分发.部署.运行等生命周期 ...

  8. Go语言实现:【剑指offer】把字符串转换成整数

    该题目来源于牛客网<剑指offer>专题. 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入描述: 输入一个字符串,包括数字字母符号,可以为空. 输出描述: 如果是合 ...

  9. c++ 中全局/静态存储区的内存污染问题

    今天研究用回溯法解决八皇后问题,碰到了一个有趣的小问题. 看这篇随笔前,最好先看看我上一篇所写的 c++ 内存分配中一个有趣的小问题. 先看代码 #pragma once #pragma execut ...

  10. 如何查看MySql的sql语句性能

    原文链接:https://blog.csdn.net/jwq101666/article/details/78561022Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通 ...