使用表别名

使用别名引用被检索的表列

别名除了用于列名和计算字段外,SQL还允许给表名起别名。这样做
有两个主要理由:

  • 缩短SQL语句;
  • 允许在单条 SELECT 语句中多次使用相同的表。

可以看到, FROM 子句中3个表全都具有别名。 customers AS c
建立 c 作为 customers 的别名,等等。这使得能使用省写的 c 而
不是全名 customers 。在此例子中,表别名只用于 WHERE 子句。但是,表
别名不仅能用于 WHERE 子句,它还可以用于 SELECT 的列表、 ORDER BY 子句
以及语句的其他部分。

应该注意,表别名只在查询执行中使用。与列别名不一样,表别名
不返回到客户机

使用不同类型的联结

迄今为止,我们使用的只是称为内部联结或等值联结(equijoin)的简
单联结。现在来看3种其他联结,它们分别是自联结、自然联结和外部联结

自联结

如前所述,使用表别名的主要原因之一是能在单条 SELECT 语句中不
止一次引用相同的表。下面举一个例子

假如你发现某物品(其ID为 DTNTR )存在问题,因此想知道生产该物
品的供应商生产的其他物品是否也存在这些问题。此查询要求首先找到
生产ID为 DTNTR 的物品的供应商,然后找出这个供应商生产的其他物品。
下面是解决此问题的一种方法

这是第一种解决方案,它使用了子查询。内部的 SELECT 语句做
了一个简单的检索,返回生产ID为 DTNTR 的物品供应商的
vend_id 。该ID用于外部查询的 WHERE 子句中,以便检索出这个供应商生
产的所有物品

现在来看使用联结的相同查询:

此查询中需要的两个表实际上是相同的表,因此 products 表在
FROM 子句中出现了两次。虽然这是完全合法的,但对 products
的引用具有二义性,因为MySQL不知道你引用的是 products 表中的哪个
实例。
为解决此问题,使用了表别名。 products 的第一次出现为别名 p1 ,
第二次出现为别名 p2 。现在可以将这些别名用作表名。例如, SELECT 语
句使用 p1 前缀明确地给出所需列的全名。如果不这样,MySQL将返回错
误,因为分别存在两个名为 prod_id 、 prod_name 的列。MySQL不知道想
要的是哪一个列(即使它们事实上是同一个列)。 WHERE (通过匹配 p1 中
的 vend_id 和 p2 中的 vend_id )首先联结两个表,然后按第二个表中的
prod_id 过滤数据,返回所需的数据。

用自联结而不用子查询 自联结通常作为外部语句用来替代
从相同表中检索数据时使用的子查询语句。虽然最终的结果是
相同的,但有时候处理联结远比处理子查询快得多。应该试一
下两种方法,以确定哪一种的性能更好

自然联结

无论何时对表进行联结,应该至少有一个列出现在不止一个表中(被
联结的列)。标准的联结(前一章中介绍的内部联结)返回所有数据,甚
至相同的列多次出现。自然联结排除多次出现,使每个列只返回一次。

自然联结是这样一种联结,其中你只能选择那些唯一的列。这一
般是通过对表使用通配符( SELECT * ),对所有其他表的列使用明确的子
集来完成的。下面举一个例子:

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

事实上,迄今为止我们建立的每个内部联结都是自然联结,很可能
我们永远都不会用到不是自然联结的内部联结

外部联结

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

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


SELECT 语句使用了关
键字 OUTER JOIN 来指定联结的类型(而不是在 WHERE 子句中指
定)。但是,与内部联结关联两个表中的行不同的是,外部联结还包括没
有关联行的行。在使用 OUTER JOIN 语法时,必须使用 RIGHT 或 LEFT 关键字
指定包括其所有行的表( RIGHT 指出的是 OUTER JOIN 右边的表,而 LEFT
指出的是 OUTER JOIN 左边的表)。上面的例子使用 LEFT OUTER JOIN 从 FROM
子句的左边表( customers 表)中选择所有行。为了从右边的表中选择所

没有 = 操作符 MySQL不支持简化字符 = 和 =* 的使用,这两
种操作符在其他DBMS中是很流行的。

外部联结的类型 存在两种基本的外部联结形式:左外部联结
和右外部联结。它们之间的唯一差别是所关联的表的顺序不
同。换句话说,左外部联结可通过颠倒 FROM 或 WHERE 子句中
有行,应该使用 RIGHT OUTER JOIN

使用带聚集函数的联结

聚集函数用来汇总数据。虽然至今为止聚集函数
的所有例子只是从单个表汇总数据,但这些函数也可以与联结一起使用

此 SELECT 语句使用 INNER JOIN 将 customers 和 orders 表互相关联。
GROUP BY 子句按客户分组数据,因此,函数调用 COUNT
(orders.order_num) 对每个客户的订单计数,将它作为 num_ord 返回

这个例子使用左外部联结来包含所有客户,甚至包含那些没有
任何下订单的客户。结果显示也包含了客户 Mouse House ,它
有 0 个订单。

使用联结和联结条件

在总结关于联结的这两章前,有必要汇总一下关于联结及其使用的
某些要点。

  • 注意所使用的联结类型。一般我们使用内部联结,但使用外部联
    结也是有效的。
  • 保证使用正确的联结条件,否则将返回不正确的数据。
  • 应该总是提供联结条件,否则会得出笛卡儿积。
  • 在一个联结中可以包含多个表,甚至对于每个联结可以采用不同
    的联结类型。虽然这样做是合法的,一般也很有用,但应该在一
    起测试它们前,分别测试每个联结。这将使故障排除更为简单。

本章从讲授如何以及为什么要使用
别名开始,然后讨论不同的联结类型及对每种类型的联结使用的各种语
法形式。我们还介绍了如何与联结一起使用聚集函数,以及在使用联结
时应该注意的某些问题

mysql必知必会-创建高级联结的更多相关文章

  1. SQL 必知必会·笔记<11>创建高级联结

    1. 使用表别名 SQL 除了可以对列名和计算字段使用别名,还允许给表名起别名.这样 做有两个主要理由: 缩短SQL 语句: 允许在一条SELECT 语句中多次使用相同的表. 使用表别名示例: SEL ...

  2. mysql必知必会

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

  3. 《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 ...

  4. 《MySQL必知必会》学习笔记——前言

    前言 MySQL已经成为世界上最受欢迎的数据库管理系统之一.无论是用在小型开发项目上,还是用来构建那些声名显赫的网站,MySQL都证明了自己是个稳定.可靠.快速.可信的系统,足以胜任任何数据存储业务的 ...

  5. MySQL必知必会(第4版)整理笔记

    参考书籍: BookName:<SQL必知必会(第4版)> BookName:<Mysql必知必会(第4版)> Author: Ben Forta 说明:本书学习笔记 1.了解 ...

  6. 《mysql 必知必会》 速查指南

    目录 增 添加一整行 插入多行 删 删除指定行 删除所有行 改 查 简单检索 结果筛选 结果排序 结果过滤 创建字段 处理函数 数据分组 其他高级用法 文章内容均出自 <MySQL 必知必会&g ...

  7. MySQL必知必会1-20章读书笔记

    MySQL备忘 目录 目录 使用MySQL 检索数据 排序检索数据 过滤数据 数据过滤 用通配符进行过滤 用正则表达式进行搜索 创建计算字段 使用数据处理函数 数值处理函数 汇总数据 分组数据 使用子 ...

  8. 【MySQL 基础】MySQL必知必会

    MySQL必知必会 简介 <MySQL必知必会>的学习笔记和总结. 书籍链接 了解SQL 数据库基础 什么是数据库 数据库(database):保存有组织的数据的容器(通常是一个文 件或一 ...

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

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

  10. 《mysql必知必会》读书笔记--存储过程的使用

    以前对mysql的认识与应用只是停留在增删改查的阶段,最近正好在学习mysql相关内容,看了一本书叫做<MySQL必知必会>,看了之后对MySQL的高级用法有了一定的了解.以下内容只当读书 ...

随机推荐

  1. 玩转Django2.0---Django笔记建站基础十一(二)((音乐网站开发))

    11.5 歌曲排行榜 歌曲排行榜是通过首页的导航链接进入的,按照歌曲的播放次数进行降序显示.从排行榜页面的设计图可以看到,网页实现三个功能:网页顶部搜索.歌曲分类筛选和歌曲信息列表,其说明如下: 1. ...

  2. [校内训练20_01_19]ABC

    1.SB题 2.有n个点,m条边,每次加入一条边,你要挑出一些边,使得形成的图每个点度数都为奇数,且最长的边最短. 3.给一个N次多项式,问有多少个质数在任意整数处的点值都是p的倍数,输出它们.$N ...

  3. Python PE8编程规范

    参考博客:https://blog.csdn.net/weixin_39723544/article/details/82144280 1.使用四个空格而不是tab进行缩进 2.默认使用utf-8编码 ...

  4. linux 命令全名

    su:Swith user  切换用户,切换到root用户cat: Concatenate  串联uname: Unix name  系统名称df: Disk free  空余硬盘du: Disk u ...

  5. 《考研机试》(一)C/C++基础

    1.setfill/setw使用 2.定义结构体 3.关于字符串读取 4.排序问题:复试不要求一般用:冒泡排序 5.数字和字符之间转换 6.进制转化:10进制转8进制 7.质数判断 8.字符串拷贝函数 ...

  6. 基于TensorFlow的MNIST手写数字识别-深入

    构建多层卷积神经网络时需要多组W和偏移项b,我们封装2个方法来产生W和b 初级MNIST中用0初始化W和b,这里用噪声初始化进行对称打破,防止产生梯度0,同时用一个小的正值来初始化b避免dead ne ...

  7. Codeforces_799

    A.求两个时间比较一下. #include<bits/stdc++.h> using namespace std; int n,t,k,d; int main() { ios::sync_ ...

  8. [python]getpass模块

    python3的input函数不能隐藏用户输入,可以用getpass模块的getpass方法获取用户输入的时候用于隐藏显示密码. *需要注意的是该方法在IDE中看不到隐藏效果,在内置IDLE中会有Ge ...

  9. CCF_ 201512-3_画图

    直接模拟就行了,注意坐标系方向与平常数组不一样,填充操作用深搜和广搜都可以,这里用了广搜. #include<iostream> #include<cstdio> #inclu ...

  10. re模块 常用函数

    1. findall() 函数 find('正则表达式',‘待匹配的字符串’) #返回匹配到字符串,并存放在列表中 详解见:https://www.cnblogs.com/nbk-zyc/p/1111 ...