【MySQL】不允许你不会创建高级联结(一)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 【MySQL】不允许你不会创建高级联结(一)

🎬 博客主页:博主链接

🎥 本文由 M malloc 原创,首发于 CSDN🙉

🎄 学习专栏推荐:LeetCode刷题集!

🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

📆 未来很长,值得我们全力奔赴更美好的生活✨

a6c0473e16e249c2b9ca02e5b793f35e.gif

1aabda9202314c9ab0c9028570866fda.png

😇MySQL的前情介绍

😁大家好呀,今天是我第N次写MySQL,也是最近才学习MySQL,也想着记录一下自己的学习过程,并且分享给大家尼!

😇本章详情

🐤本篇文章将讲解另外一些联结类型 (包括它们的含义和使用方法),介绍如何对被联结的表使用表别名和聚集函数。

😇使用表别名

前言

在前面的文章中介绍了如何使用别名引用被检索的表列。给列起别名的语法如下:

输入

SELECT Contact(RTrim(vend_name),'(',RTrim(vend_country),')') AS vend_title 
  FROM vendors 
    ORDER BY vend_name;

别名的意义

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

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

请看下面的SELECT语句。它与前上一篇文章的例子中所用的语句基本相同,但改成了使用别名:

SELECT cust_name,cust_contact FROM customers AS c,AS o, orderitems AS oi
  WHERE c.cust_id = o.cust_id
    AND oi.order_num = o.order_num
      AND prod_id = 'TNT2';

分析

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

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

😇使用不同类型的联结

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

😇自联结

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

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

输入

SELECT prod_id, prod_name FROM products
  WHERE vend_id = (SELECT vend_id FROM products WHERE prod_id = 'DTNTR');

分析

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

输出

dedf6d0adfba4189bee2e6144c156249.png

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

输入

SELECT p1.prod_id,p1.prod_name FROM products AS p1,products AS p2
  WHERE p1.vend_id = p2.vend_id
    AND p2.prod_id = 'DTNTR';

输出

fb7cfd80d81442088865487edd49333d.png

分析

此查询中需要的两个表实际上是相同的表,因此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过滤数据,返回所需的数据

用自联结而不用子查询

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

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6月前
|
存储 JSON 关系型数据库
《MySQL 简易速速上手小册》第9章:高级 MySQL 特性和技巧(2024 最新版)
《MySQL 简易速速上手小册》第9章:高级 MySQL 特性和技巧(2024 最新版)
75 1
|
6月前
|
存储 SQL 关系型数据库
二、MySQL高级分享2
二、MySQL高级分享2
71 0
|
存储 关系型数据库 MySQL
MySQL基础详讲(高级部分)
MySQL是一种关系型数据库管理系统(RDBMS),它是一种开源数据库软件,广泛用于Web应用程序的开发和数据存储
88 3
|
6月前
|
关系型数据库 MySQL 数据库
深入理解MySQL:从基础到高级数据库管理
深入理解MySQL:从基础到高级数据库管理
169 0
|
4月前
|
关系型数据库 MySQL 调度
MySQL高级功能与优化策略深度探索
MySQL高级功能与优化策略深度探索
|
5月前
|
SQL 存储 关系型数据库
精通MySQL:从基础到高级应用与最佳实践
第一章:MySQL基础入门 1.1 MySQL概述 介绍MySQL的历史、发展、优势以及应用领域
|
5月前
|
SQL 关系型数据库 MySQL
深入探索MySQL SELECT查询:从基础到高级,解锁数据宝藏的密钥
深入探索MySQL SELECT查询:从基础到高级,解锁数据宝藏的密钥
|
5月前
|
SQL 安全 关系型数据库
深入理解MySQL:从基础到高级应用及安全管理
第一章:MySQL基础入门 1.1 MySQL简介 简要介绍MySQL的历史、发展以及它在当前数据库领域的应用
|
5月前
|
SQL 存储 关系型数据库
精通MySQL:从基础到高级应用
第一章:MySQL入门 1.1 MySQL简介 介绍MySQL的历史、特点以及它作为关系型数据库管理系统(RDBMS)的优势
|
5月前
|
存储 关系型数据库 MySQL
精通MySQL:从基础到高级应用及性能优化
第一章:MySQL入门 1.1 MySQL简介 介绍MySQL的历史、版本和开源特性