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

news2024/11/16 17:30:34

🎬 博客主页:博主链接
🎥 本文由 M malloc 原创,首发于 CSDN🙉
🎄 学习专栏推荐:LeetCode刷题集!
🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📆 未来很长,值得我们全力奔赴更美好的生活✨

在这里插入图片描述
在这里插入图片描述

文章目录

  • 😇MySQL的前情介绍
  • 😇本章详情
  • 😇使用表别名
  • 😇使用不同类型的联结
    • 😇自联结
    • 😇自然联结
    • 😇WHERE子句的位置
    • 😇外部联结
  • 😇使用带聚集函数的联结
  • 😇使用联结和联结条件
  • 🤣如何巩固学习
  • 🤣本文小结

😇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子句中,以便检索出这个供应商生产的所有物品。

输出
在这里插入图片描述


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

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';

输出
在这里插入图片描述
分析

此查询中需要的两个表实际上是相同的表,因此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 c.*,o.order_num,o.order_date,oi.prod_id,oi.quantity,OI.item_price
	FROM customers AS c,order AS o,orderitems AS oi 
		WHERE c.cust_id = o.cust_id 
			AND oi.order_num = o.order_num
				AND prod_id = 'FB';

分析

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

in efect

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

😇WHERE子句的位置

WHERE子句的位置 在同时使用ORDER BY和WHERE子句时应该让ORDER BY位于WHERE之后,否则将会产生错误(关于ORDERBY的使用,请参阅作者的前几篇文章)

😇外部联结

提示

许多联结将一个表中的行与另一个表中的行相关联。但有时候会需要包含没有关联行的那些行。例如,可能需要使用联结来完成以下工作:

  1. 对每个客户下了多少订单进行计数,包括那些至今尚未下订单的客户;
  2. 列出所有产品以及订购数量,包括没有人订购的产品;
  3. 计算平均销售规模,包括那些至今尚未下订单的客户。

在上述例子中,联结包含了那些在相关表中没有关联行的行。这种类型的联结称为外部联结


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

输入

SELECT customers.cust_id,orders.order_num FROM customers INNER JOIN orders
	ON customers.cust_id = orders.cust_id;

外部联结语法类似。为了检索所有客户,包括那些没有订单的客户,可如下进行:

输入

SELECT customers.cust_id,orders.order_num FROM customers LEFT OUTER JOIN orders
	ON customers.cust_id = orders.cust_id;

输出
在这里插入图片描述
分析

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

输入

SELECT customers.cust_id, orders.order_num FROM customers RIGHT OUTER JOIN orders
	ON orders.cust_id = customers.cust_id;

外部联结的类型

外部联结的类型 存在两种基本的外部联结形式:左外部联结和右外部联结。它们之间的唯一差别是所关联的表的顺序不同。换句话说,左外部联结可通过颠倒FROM或WHERE子句中表的顺序转换为右外部联结。因此,两种类型的外部联结可互换使用,而究竟使用哪一种纯粹是根据方便而定.

😇使用带聚集函数的联结

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

为说明这一点,请看一个例子。如果要检索所有客户及每个客户所下的订单数,下面使用了COUNT()函数的代码可完成此工作:

输入

SELECT customers.cust_name,customers.cust_id, COUNT(orders.order_num) AS num_ord
	FROM customers INNER JOIN orders
		ON customers.cust_id = order.cust_id 
			GROUP BY customers.cust_id;

输出
在这里插入图片描述

分析

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

😇使用联结和联结条件

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

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

🤣如何巩固学习

提示:在学习的过程中,我们需要先自行进行思考,而不是一遇到不会的就放弃思考直接看答案,如果最后遇到真的不会的题目,我们可以适当的进行观看答案,看自己的思路是否正确,在作出正确的判断

🤣本文小结

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

好啦今日的分享到这里就结束啦,我是爱你们的M malloc希望可以帮助到你们噢,最后别忘记三连啦!!

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/737884.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈一下 webpack 以及 loader 和 plugin

话说,前端练习时长也快两年了,但是关于 webpack 的东西好像也没怎么研究过 😅 🚩一是没有这方面的需求:回想一下,关于 webpack 的配置相关工作,也就只有自己配置过一次 loader「使用 svg-sprit…

5G工业路由器赋能无人驾驶技术发展,无线车联网应用方案

随着无人驾驶技术进入大众视野,5G技术已广泛应用在各行各业中,无人驾驶也成了汽车自动化发展的核心趋势。无人驾驶技术需要满足低时延、高效率、大带宽、稳定性等硬性要求,工业路由器IR2730采用5G网络快速接入,拥有广泛连接能力&a…

appium 笔记

配置相关信息查看 appium.io 初始化: desired_caps {} desired_caps["automationName"] "UiAutomator2" desired_caps["platformName"] "Android" # 操作系统类型 desired_caps["platformVersion"] "5…

[入门必看]数据结构6.2:图的存储及基本操作

[入门必看]数据结构6.2:图的存储及基本操作 第六章 图6.2 图的存储及基本操作知识总览6.2.1 邻接矩阵法6.2.2 邻接表法6.2.36.2.4 十字链表、邻接多重表6.2.5 图的基本操作 6.2.1 邻接矩阵法图的存储——邻接矩阵法邻接矩阵法存储带权图(网)邻…

OpenAI再建顶级团队,重金招聘核心岗成员,阻止超级AI的威胁!

“AI确实可能会杀死人类。”这并不是哪家自媒体为博人眼球而发表的谣言,而是ChatGPT之父、OpenAI CEO山姆奥尔特曼在今年3月与MIT研究科学家Lex Fridman对话时亲口所说的一句话。 如今,这位全世界最受瞩目的老板决定采取行动,以阻止自己的预…

【算法】AcWing算法基础课笔记 第一章 基础算法 Part 1

🚀Write In Front🚀 📝个人主页:令夏二十三 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 📣系列专栏:AcWing 💬总结:希望你看完之后,能对你…

Python程序设计基础:列表与元组(一)

文章目录 一、列表的表示与访问1、列表的表示2、列表的访问 二、列表的元素操作1、元素的修改2、元素的增加3、元素的删除4、其他操作 三、列表操作1、列表的遍历2、列表的排序3、列表的切片4、列表的扩充5、列表的复制6、列表的删除 一、列表的表示与访问 1、列表的表示 列表…

自营外卖配送平台的商家如何对接第三方美饿的订单

自营外卖跑腿平台对接第三方美饿的好处 单说美团饿了么自身的流量优势,很多商家不能忽视,但是美团饿了么的高额配送成本与抽成,同样也不能忽视。很多商家希望选择自配送或者其他更划算的配送方式来节省成本。这时,区域性的自建外…

【Java】单例模式

单例模式 设计模式概述单例模式实现思路饿汉式懒汉式饿汉式 vs 懒汉式 设计模式概述 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式免去我们自己再思考和摸索。就像是经典的棋谱,不同的棋局,我…

AttributeError: module ‘collections‘ has no attribute ‘Iterable‘

vitables 出现 AttributeError: module collections has no attribute Iterable错误修改如下图:

PCIE转PMC载板

描述 这是一款被动适配卡,它支持通过要转换为 PCIe x4 通道边缘连接器的 AMC 接头,来选择 TI EVM;因此它可被插入一个台式计算机或使用 PCIe 接头的任何位置。选定的 TI EVM 支持 DSP 上的本地 PCIe。此卡作为适配器,需要可与 AMC…

Linux与Windows:操作系统的比较与技巧分享

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

Java 动态规划 Leetcode 62. 不同路径

代码展示&#xff1a; class Solution {public int uniquePaths(int m, int n) {//定义dp数组//二维数组多增加一行一列&#xff0c;方便对数组进行初始化int[][]dpnew int[m1][n1];//初始化dp[0][1]1;//填充数组for(int i1;i<m;i){for(int j1;j<n;j){dp[i][j]dp[i-1][j…

@Around踩坑记录

Around踩坑记录 先上结论&#xff1a; 如果你在定义切面的时候打算使用环绕通知➕定义注解的方式&#xff0c;那么在进行*Around*("(annotation(costTrace))") 类似这样的定义的时候&#xff0c;”costTrace“一定要与你定义切面中入参的参数名字一致&#xff0c;而…

【嵌入式Qt开发入门】Qt如何使用多线程——初识QThread

我们写的一个应用程序&#xff0c;应用程序跑起来后一般情况下只有一个线程&#xff0c;但是可能也有特殊情况。比如我们前几篇的例程都跑起来后只有一个线程&#xff0c;就是程序的主线程。线程内的操作都是顺序执行的。但试着想一下&#xff0c;我们的程序顺序执行&#xff0…

模拟日志数据

模拟日志数据。。 日志模拟器主要模拟站点的用户信息和用户行为日志数据 使用shell调用java类实现数据的生产 ! 所需文件如下: datagen.jar genlog.sh 注意: 存储数据的文件夹要预先创建好 Bash mkdir -p /tmp/doit/user_data mkdir -p /tmp/doit/log_data 将用来模拟生成…

【安全】Xsslabs(1~13)基于白盒测试浅析

目录 环境 关卡 level 1 level 2 level 3 level 4 level 5 level 6 level 7 level 8 扩展 level 9 level 10 level 11 level 12 level 13 总结 环境 PHP&#xff1a;php7.3.4nts 中间件&#xff1a;Nginx1.15.11 工具&#xff1a;Hackbar 关卡 level …

超长上下文处理:基于Transformer上下文处理常见方法梳理

原文链接&#xff1a;芝士AI吃鱼 目前已经采用多种方法来增加Transformer的上下文长度&#xff0c;主要侧重于缓解注意力计算的二次复杂度。 例如&#xff0c;Transformer-XL通过缓存先前的上下文&#xff0c;并允许随着层数的增加线性扩展上下文。Longformer采用了一种注意力…

【GLBCXX_3.4.21 not found】问题解决

问题描述 rootlocalhost:/home# rar -h rar&#xff1a;/lib64/libstdc.so.6 ,version "GLBCXX_3.4.21" not found 问题排查过程 下载相应的GCC源码&#xff0c;找到适合自己版本&#xff0c;这里选择是的是7.3.0 gcc源码下载地址&#xff1a;http://ftp.gnu.org/g…

fastadmin数据内容admin_id权限

/*** 是否开启数据限制* 支持auth/personal* 表示按权限判断/仅限个人* 默认为禁用,若启用请务必保证表中存在admin_id字段*/protected $dataLimit true;/*** 数据限制字段*/protected $dataLimitField admin_id;