MySQL,等值联结、内部联结、多表连接、自联结、自然联结、外部联结、带聚集函数的联结

  • 1、表模型(概略)

2、联结表

使用一条select语句,检索出存储在多张表的数据。

2.1、等值联结

SELECT A.vend_id,A.vend_name,B.*
FROM vendors as A,products as B    # 规定要联结的表
WHERE A.vend_id=B.vend_id;    # 如何产生联结

2.1、内部联结

SELECT A.vend_id,A.vend_name,B.*
FROM vendors as A INNER JOIN products as B
ON A.vend_id=B.vend_id;

ps:与上一句select同效果,注意内联结的条件不用where,而用on。

2.3、多表联结

SELECT A.prod_id,C.vend_name,B.prod_name,B.prod_price,A.item_price
FROM orderitems as A, products as B, vendors as C
WHERE A.prod_id=B.prod_idAND B.vend_id=C.vend_id;

3、高级联结

3.1、自联结

在单条select语句中不止一次引用相同的表。

例:产品ID为2023207的商品存在问题,需要检查该产品供应商所生产的其它产品是否也有问题。

解决方案有:

  • 方案一:select中嵌套子select查询
    • 检索id=2023207对应的供应商id;
    • 根据返回的供应商id,检索该供应商对应的所有商品id
      SELECT * FROM products
      WHERE vend_id = (SELECT vend_id FROM products WHERE prod_id=2023207);
  • 方案二:表联结
    • 产品表 联结 产品表;
    • where条件
      • 匹配共有字段产生联结关系
      • 指定产品id=2023207
        SELECT A1.*
        FROM products as A1,products as A2
        WHERE A1.vend_id = A2.vend_idAND A2.prod_id=2023207;

3.2、自然联结

联结时,排除相同的列多次出现,情况如上文2.1节的结果图中有2个wend_id字段。

系统无法自动排除这种情况,需要手动指定需要的列、手动去除重复的列。

3.3、外部联结

对另一个表中没有关联的行进行联结。

例一:左外联结

检索所有客户的订单情况,包括未下单的客户。

SELECT A.cust_id,A.cust_name,B.*
FROM customers as A  LEFT OUTER JOIN orders as B	#从左边匹配,从customers表选中所有行
ON A.cust_id=B.cust_id;

例二:右外联结

检索所有订单对应的用户

SELECT A.cust_id,A.cust_name,B.*
FROM customers as A  RIGHT OUTER JOIN orders as B	#从右边匹配,从orders表选中所有行
ON A.cust_id=B.cust_id;

3.4、带聚集函数的联结

# 每个客户所下的订单数(仅包含已下单的客户)
## 聚集函数+内联结
SELECT customers.cust_id,customers.cust_name,COUNT(orders.order_num) as zongshu
FROM customers INNER JOIN orders
ON customers.cust_id=orders.cust_id
GROUP BY customers.cust_id;# 每个客户所下的订单数(包含未下单的客户)
## 聚集函数+外联结
SELECT customers.cust_id,customers.cust_name,COUNT(orders.order_num) as zongshu
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id=orders.cust_id
GROUP BY customers.cust_id;# 每个客户所下的订单数(包含未下单的客户)
## 聚集函数+嵌套查询
SELECT cust_id,cust_name,(SELECT COUNT(*) FROM  orders WHERE orders.cust_id=customers.cust_id) as order_sum
FROM customers
GROUP BY cust_id;

4、练习

## 分组
#  查询每个订单的总价
SELECT order_num,SUM(item_price) FROM orderitems GROUP BY order_num;## 2表联结
# 查询每个供应商供应的产品信息
SELECT vendors.vend_name,products.prod_id,products.prod_name,products.prod_priceFROM vendors,productsWHERE vendors.vend_id = products.vend_id;## 分组 + 表联结:通过用户id联结用户表、订单表
SELECT cust_id,cust_name,(SELECT COUNT(*) FROM  orders WHERE orders.cust_id=customers.cust_id) as order_sum
FROM customers
GROUP BY cust_id;## 2张表的联结,通过共有字段prod_id联结商品表、订单详情表
# 查询订单详情里,具体的商品名、商品价格
SELECT orderitems.prod_id,prod_name,prod_price FROM products,orderitems WHERE products.prod_id = orderitems.prod_id;## 三表联结:订单详情表、商品表、供应商表
# 查询订单详情表中每个商品的供应商名称及供应商价格
SELECT vendors.vend_id,vend_name,products.prod_id,products.prod_name,prod_price,item_price 
FROM products,orderitems,vendorsWHERE orderitems.prod_id = products.prod_id AND vendors.vend_id = products.vend_id; ## 表的联结
# 查询每个用户购买的产品名称、价格
SELECT cust_name,prod_name,prod_price FROM orderitems,orders,customers,products
WHERE orders.order_num = orderitems.order_num AND orders.cust_id = customers.cust_id AND products.prod_id = orderitems.prod_id;

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】二叉树的模拟实现

前言:前面我们学习了堆的模拟实现,今天我们来进一步学习二叉树,当然了内容肯定是越来越难的,各位我们一起努力! 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:数据结构 👈 &…

6 最大积水量

蛮力求解 #include <iostream> using namespace::std; using std::cout; using std::cin; int zdjsl(int n, int height[]) {int sum 0;int left_max[n];int right_max[n];left_max[0] height[0];right_max[n-1] height[n-1];for(int i1; i<n; i){left_max[i] m…

IDEA shorten command line介绍和JAR manifest 导致mybatis找不到接口类处理

如果类路径太长&#xff0c;或者有许多VM参数&#xff0c;程序就无法启动。原因是大多数操作系统都有命令行长度限制。在这种情况下&#xff0c;IntelliJIDEA将试图缩短类路径。最好选中 classpath file模式。 shorten command line 选项提供三种选项缩短类路径。 none&#x…

IDEA出现闪退或打不开的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法4. 补充1. 问题所示 打开IDEA的时候过一会便闪退,可以再IDEA的右下角看到如下提示 (如果没有该提示,软件右下角也会有个红色感叹号,点开查看原因即可) 点开details方便排查闪退的具体原因: There is insufficient memory for the…

【Lidar】Open3D点云DBSCAN聚类算法:基于密度的点云聚类(单木分割)附Python代码

1 DBSCAN算法介绍 DBSCAN聚类算法是一种基于密度的聚类算法&#xff0c;全称为“基于密度的带有噪声的空间聚类应用”&#xff0c;英文名称为Density-Based Spatial Clustering of Applications with Noise。 DBSCAN聚类算法能够发现任意形状的类别&#xff0c;并且对噪音数据具…

第二百一十五回 如何创建单例模式

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"分享三个使用TextField的细节"沉浸式状态样相关的内容&#xff0c;本章回中将介绍 如何创建单例模式.闲话休提&#xff0c;让我们一起Talk Flutter吧。 …

初学gitrepo的种种

经过各种折腾之后&#xff0c;发现git其实还是很简单的&#xff1b; 首先你需要两台机器&#xff0c;一台作为服务器&#xff0c;一台作为开发机器&#xff0c;开发机器从服务器上拉取代码。 目 目录 git建仓 开发机器拉取代码 初始化仓代码 repo管理 repo工具的下载 …

晶体管的工作状态判断和工作条件

晶体管是模拟电路中基础的器件&#xff0c;对于电子工程师来说&#xff0c;了解晶体管工作的条件和判断晶体管的工作状态都是非常基础的&#xff0c;本文将带大家一起学习或回顾一下。 一、晶体管工作的条件 1.集电极电阻Rc&#xff1a; 在共发射极电压放大器中&#xff0c;…

Re解析(正则表达式解析)

正则表达式基础 元字符 B站教学视频&#xff1a; 正则表达式元字符基本使用 量词 贪婪匹配和惰性匹配 惰性匹配如下两张图&#xff0c;而 .* 就表示贪婪匹配&#xff0c;即尽可能多的匹配到符合的字符串&#xff0c;如果使用贪婪匹配&#xff0c;那么结果就是图中的情况三 p…

智能高效的Go开发工具GoLand v2023.3发布,支持AI辅助编码!

GoLand 使 Go 代码的阅读、编写和更改变得非常容易。即时错误检测和修复建议&#xff0c;通过一步撤消快速安全重构&#xff0c;智能代码完成&#xff0c;死代码检测和文档提示帮助所有 Go 开发人员&#xff0c;从新手到经验丰富的专业人士&#xff0c;创建快速、高效、和可靠的…

使用Gensim训练Word2vec模型

1、训练Gensim模型 import gensim # gensim 4.3.2 import jieba import re import warnings import logging warnings.filterwarnings(ignore)with open("dataset/sanguo.txt", r,encodingutf-8)as f: # 读入文本&#xff0c;此处使用的是三国演义&#xff0c;可自…

开启创意之旅:免费、开源的噪波贴图(noise texture)生成网站——noisecreater.com详细介绍

在当今数字创意领域&#xff0c;噪波贴图&#xff08;Noise Texture&#xff09;是游戏渲染、游戏开发、美术设计以及影视制作等行业不可或缺的艺术素材之一。为了满足广大创作者的需求&#xff0c;noisecreater.com应运而生&#xff0c;成为一款免费、开源的噪波贴图生成工具。…