使用表别名

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

别名除了用于列名和计算字段外,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. 最强PostMan使用教程

    最近需要测试产品中的REST API,无意中发现了PostMan这个chrome插件,把玩了一下,发现postman秉承了一贯以来google工具强大,易用的特质.独乐乐不如众乐乐,特此共享出来给大伙 ...

  2. Java多线程:实现API接口创建线程方式详解

    先看例子: /**实现Runnable接口创建线程步骤: * 1.创建一个实现Runnable接口的类 * 2.重写Runnable类中抽象的run()方法 * 3.创建实现类的对象 * 4.声明Th ...

  3. Java使用自定义类加载器实现热部署

    热部署: 热部署就是在不重启应用的情况下,当类的定义即字节码文件修改后,能够替换该Class创建的对象.一般情况下,类的加载都是由系统自带的类加载器完成,且对于同一个全限定名的java类,只能被加载一 ...

  4. ubuntu 14.04 如何设置静态ip

    有线网络: 1. 找到文件并作如下修改: sudo vim /etc/network/interfaces 修改如下部分: auto eth0iface eth0 inet staticaddress ...

  5. C# 多态和接口

    1多态可以有属性,接口只有方法 2关键字不同,多态有静态多态(abstract)和动态多态(virtual),静态多态不能new()出自己,动态多态可以;多态中可以有自己的方法可设置不需要子类重写,接 ...

  6. python 内置模块之ConfigParser--配置读写

    用于对特定的配置进行操作,当前模块的名称在 python 3.x 版本中变更为 configparser. #配置文件test.cfg [section1] k1 = v1 k2 :v2 k3 = 1 ...

  7. [转载]goldendict下优质词典简介及安装

    使用Arch Linux一年以来,如果要问自己最为中意的词典程序是? 当然是Goldendict啦!想详细了解这款瑞士军刀的请猛戳这里. 以前在Win下都是用的lingoes, 感觉还不错,词典库很全 ...

  8. 用python制作训练集和测试集的图片名列表文本

    # -*- coding: utf-8 -*- from pathlib import Path #从pathlib中导入Path import os import fileinput import ...

  9. Springboot笔记(二)整合

    1.整合Freemarker 一种模板引擎,前端渲染模板的,类似于EL,jsp,不过比前两个好用 导入很简单   pom.xml <dependency> <groupId>o ...

  10. mybatis缓存问题导致无法查询到数据

    今天查询记录时,发现重复查询结果时出现空记录的情况 查看控制台信息,只有红色框选部分有进行查询数据,而其他没有.然而上图可看出有两条数据是能展现出来的,故有可能是mybatis缓存命中的. 因此在ma ...