mysql必知必会-创建高级联结
使用表别名
使用别名引用被检索的表列
别名除了用于列名和计算字段外,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必知必会-创建高级联结的更多相关文章
- SQL 必知必会·笔记<11>创建高级联结
1. 使用表别名 SQL 除了可以对列名和计算字段使用别名,还允许给表名起别名.这样 做有两个主要理由: 缩短SQL 语句: 允许在一条SELECT 语句中多次使用相同的表. 使用表别名示例: SEL ...
- mysql必知必会
春节放假没事,找了本电子书mysql必知必会敲了下.用的工具是有道笔记的markdown文档类型. 下面是根据大纲已经敲完的章节,可复制到有道笔记的查看,更美观. # 第一章 了解SQL## 什么是S ...
- 《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 ...
- 《MySQL必知必会》学习笔记——前言
前言 MySQL已经成为世界上最受欢迎的数据库管理系统之一.无论是用在小型开发项目上,还是用来构建那些声名显赫的网站,MySQL都证明了自己是个稳定.可靠.快速.可信的系统,足以胜任任何数据存储业务的 ...
- MySQL必知必会(第4版)整理笔记
参考书籍: BookName:<SQL必知必会(第4版)> BookName:<Mysql必知必会(第4版)> Author: Ben Forta 说明:本书学习笔记 1.了解 ...
- 《mysql 必知必会》 速查指南
目录 增 添加一整行 插入多行 删 删除指定行 删除所有行 改 查 简单检索 结果筛选 结果排序 结果过滤 创建字段 处理函数 数据分组 其他高级用法 文章内容均出自 <MySQL 必知必会&g ...
- MySQL必知必会1-20章读书笔记
MySQL备忘 目录 目录 使用MySQL 检索数据 排序检索数据 过滤数据 数据过滤 用通配符进行过滤 用正则表达式进行搜索 创建计算字段 使用数据处理函数 数值处理函数 汇总数据 分组数据 使用子 ...
- 【MySQL 基础】MySQL必知必会
MySQL必知必会 简介 <MySQL必知必会>的学习笔记和总结. 书籍链接 了解SQL 数据库基础 什么是数据库 数据库(database):保存有组织的数据的容器(通常是一个文 件或一 ...
- 《MySQL 必知必会》读书总结
这是 <MySQL 必知必会> 的读书总结.也是自己整理的常用操作的参考手册. 使用 MySQL 连接到 MySQL shell>mysql -u root -p Enter pas ...
- 《mysql必知必会》读书笔记--存储过程的使用
以前对mysql的认识与应用只是停留在增删改查的阶段,最近正好在学习mysql相关内容,看了一本书叫做<MySQL必知必会>,看了之后对MySQL的高级用法有了一定的了解.以下内容只当读书 ...
随机推荐
- .net core 常见设计模式-IChangeToken
场景 一个对象A,希望它的某些状态在发生改变时通知到B(或C.D),常见的做法是在A中定义一个事件(或直接用委托),当状态改变时A去触发这个事件.而B直接订阅这个事件 这种设计有点问题B由于要订阅A的 ...
- [集训]FWT基础练习题
题意 给出n个长度为20的二进制数和数字k,每次询问给出一个二进制数,问从n个数中挑k个数(不能重复)的按位或能包含询问的组合有多少个.数字均小于等于5E5,1s. 思考 强行算出2^20个答案,再O ...
- 认识Class -- 终于不在怂
引子 本是新年,怎奈新冠肆掠,路上行人,男女老少几乎是全副口罩,形色匆匆:偶尔有一两个裸露口鼻的,估计都是没囤到口罩的,这几天药店几乎都是贴上大字:口罩没货.看着网络上病毒消息满天飞,我也响应 ...
- GIMP(Linux下的Photoshop),Centos7下安装过程
点当然是上官网:https://www.gimp.org/ 这英语看不懂,果断用谷歌的网页翻译. 点下载,就会有 看到这个,就点 下载一个安装的包 用命令行打上 [root@localhost 下载] ...
- 深入理解Java 中SPI 制
深入理解Java 中SPI 制 概述 SPI(Service Provider Interface),是JDK内置的一种服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用,比 ...
- ios启动流程
1.创建UIApplication (1.打开网页,发短信,打电话 . 2.设置应用程序提醒数字 . 3.设置联网状态 . 4.设置状态栏) 2.创建AppDelegate代理对象,并且成为UIApp ...
- CTF--HTTP服务--SQL注入POST参数-注入HTTP报文
开门见山 1. 扫描靶机 2. 对靶机开放端口进行扫描 3. 扫描全部信息 4. 用nikto -host 探测敏感信息 5. 用dirb探测敏感目录 6. 打开一些目录探测出的网页进行查看 7. 再 ...
- Docker基础内容之端口映射
随机映射 docker run -d -P training/webapp python app.py # -P会随机映射一个 49000~49900 的端口到内部容器开放的网络端口 映射所有接口地址 ...
- day03_流程控制语句
day03_流程控制语句 建议: 凡是次数确定的场景多用for循环,否则用while循环. 三元运算符 由?:符号表示的,具体的含义其实就和if-else结构的含义差不多,这种运算符会将某个条 ...
- Mavn 项目 引入第三方jar包 导致ClassNotFoundException
案例 我有一个Maven构建的项目,项目模块之间有依赖关系,我需要用到一个本地的jar包,而该jar包不能通过配置pom.xml文件从远程仓库自动下载,于是我直接导入该jar包到其中一个项目,不通过p ...