使用表别名

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

别名除了用于列名和计算字段外,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. emeditor安装及插件信息

    原文地址:https://www.52pojie.cn/thread-658917-1-1.html 废话不多说 官网:https://www.emeditor.com/download/ 安装版:6 ...

  2. 创建认证提供器 安全性与收尾工作 精通ASP-NET-MVC-5-弗瑞曼

  3. 从DirectX SDK升级到Windows SDK

    原来的DirectX SDK到June 2010,微软就不更新了.之后新的版本被集成到了Windows SDK中. 在微软的博客里找到一篇升级指南:http://blogs.msdn.com/b/ch ...

  4. 解决 C# GetPixel 和 SetPixel 效率问题(转)

    在对Bitmap图片操作的时候,有时需要用到获取或设置像素颜色方法:GetPixel 和 SetPixel, 如果直接对这两个方法进行操作的话速度很慢,这里我们可以通过把数据提取出来操作,然后操作完在 ...

  5. Dynamics 365 CRM 在 Connected Field Service 中部署 IoT Central (一)- 配置 IoT Central和IoT alert

    今天这个系列给大家带来怎样在connected field service中部署IoT Central 并且做连接. 首先, 这里提供微软官方的tutorial的链接https://docs.micr ...

  6. Java中的Swap,如何实现?

    程序员都知道,在C/C++里面交换值的方法: void swap(int &a,int &b) { int temp; temp=a; a=b; b=temp; } 但是在Java中这 ...

  7. 3分钟接入socket.io使用

    WebSocket 简介 传统的客户端和服务器通信协议是HTTP:客户端发起请求,服务端进行响应,服务端从不主动勾搭客户端. 这种模式有个明显软肋,就是同步状态.而实际应用中有大量需要客户端和服务器实 ...

  8. shiro盐值加密并验证

    在数据表中存的密码不应该是123456,而应该是123456加密之后的字符串,而且还要求这个加密算法是不可逆的,即由加密后的字符串不能反推回来原来的密码,如果能反推回来那这个加密是没有意义的.著名的加 ...

  9. Kafka源码工程examples项目配置log4j

    examples项目启动想知道有哪些错误,通过日志了解代码执行逻辑,但是启动SimpleConsumerDemo了报错如下: log4j.proproties也配置了 log4j.proproties ...

  10. 命令行开启WIFI

    netsh wlan set hostednetwork allow   //netsh wlan set hostednetwork mode=disallow netsh wlan set hos ...