​数据库查询进阶--多表查询

news2024/12/22 15:15:16

 目录

目录

1. 概述

2. 内连接(Inner Join)

2.1 语法

2.2 示例

3. 左连接(Left Join)

3.1 语法

3.2 示例

4. 右连接(Right Join)

4.1 语法

4.2 示例

5. 全外连接(Full Outer Join)

5.1 语法

5.2 示例

​编辑

6. 交叉连接(Cross Join)

6.1 语法

6.2 示例

7. 自连接(Self Join)

7.1 语法

7.2 示例

8、表格对比

9、多表查询的注意事项



1. 概述

在关系型数据库中,多表查询是一种常见的操作,用于检索和组合多个表的数据结果。通过多表查询,可以根据不同表之间的关联关系获取更全面和详细的数据。

2. 内连接(Inner Join)

内连接是最常用的多表查询类型,它通过匹配两个或多个表中的相关列来检索满足条件的记录。

2.1 语法

SELECT 列名
FROM 表1
INNER JOIN 表2 ON 条件

2.2 示例

假设有以下两个表:CustomersOrders。它们通过 CustomerID 列建立了关联关系。

SELECT Customers.CustomerName, Orders.OrderDate
FROM Customers
INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID

       内连接 inner join,inner可省略,与基本连接相似,只是表现不同,实现效果一样。只是等值连接放在on语序块中。

相对于内连接还有外连接,分为左连接(也称左外连接Left Outer Join)、右连接(Right Outer Join)和全连接(Full Outer Join)三种类型。

  • 左外连接:返回左表中的所有记录,以及符合连接条件的右表记录。
  • 右外连接:返回右表中的所有记录,以及符合连接条件的左表记录。
  • 全外连接:返回左表和右表中的所有记录,无论是否符合连接条件。

3. 左连接(Left Join)

左连接是另一种常见的多表查询类型,它返回左表中的所有记录以及与之关联的右表中的匹配记录。

3.1 语法

SELECT 列名
FROM 表1
LEFT JOIN 表2 ON 条件

3.2 示例

继续使用上述的 CustomersOrders 表,我们可以执行以下查询来获取所有客户以及他们对应的订单信息,即使他们没有订单。

SELECT Customers.CustomerName, Orders.OrderDate
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID

 

4. 右连接(Right Join)

右连接是左连接的逆操作,它返回右表中的所有记录以及与之关联的左表中的匹配记录。

4.1 语法

SELECT 列名
FROM 表1
RIGHT JOIN 表2 ON 条件

4.2 示例

在上述的 CustomersOrders 表的例子中,以下查询将返回所有订单以及订单对应的客户信息,即使客户信息不完整。

SELECT Customers.CustomerName, Orders.OrderDate
FROM Customers
RIGHT JOIN Orders ON Customers.CustomerID = Orders.CustomerID

 

5. 全外连接(Full Outer Join)

外连接返回两个表中的所有记录,无论是否有匹配的行。

5.1 语法

SELECT Customers.CustomerName, Orders.OrderDate
FROM Customers
RIGHT JOIN Orders ON Customers.CustomerID = Orders.CustomerID

5.2 示例

通过以下查询,我们可以获取所有客户和订单的信息,无论是否存在匹配。

SELECT Customers.CustomerName, Orders.OrderDate
FROM Customers
FULL OUTER JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

6. 交叉连接(Cross Join)

交叉连接(也称为叉积或笛卡尔积)是一种不基于任何条件关系的连接类型。它返回两个表的所有组合结果。

6.1 语法


SELECT 列名
FROM 表1
CROSS JOIN 表2

6.2 示例

假设有以下两个表:CustomersOrders。使用以下查询,我们可以获取所有可能的客户和订单组合结果:

SELECT Customers.CustomerName, Orders.OrderDate
FROM Customers
CROSS JOIN Orders;

7. 自连接(Self Join)

自连接是指在同一表中连接两个或多个实例。它通常用于解决需要查找层级结构数据的问题。

7.1 语法

sql
SELECT 列名
FROM 表1 t1
INNER JOIN 表1 t2 ON 条件

7.2 示例

假设有以下一张名为 Employees 的表,其中包含每个员工的 ID、姓名和经理 ID。

IDNameManagerID
1John Doe3
2Jane Doe3
3Jim SmithNULL
4Bob Ford3

使用以下查询,我们可以获取每个员工及其对应的经理信息:

sql
SELECT e.Name AS Employee, m.Name AS Manager
FROM Employees e
INNER JOIN Employees m ON e.ManagerID = m.ID;

8、表格对比

查询方式包含的记录空值
内连接只包含满足连接条件的记录不包含空值
左连接包含满足连接条件的记录和左表中不满足连接条件的记录右表中不满足连接条件的记录为NULL
右连接包含满足连接条件的记录和右表中不满足连接条件的记录左表中不满足连接条件的记录为NULL
全外连接包含满足连接条件的记录以及左表和右表中不满足连接条件的记录如果某个表中没有满足连接条件的记录,对应的列值为NULL
交叉连接包含左表和右表的所有可能组合不包含空值
自连接包含满足查询条件的记录不包含空值

9、多表查询的注意事项

举个例子:

        假设有两个表:Customers(顾客)和Orders(订单),它们之间通过CustomerID列建立了关联。

表名别名:

SELECT c.CustomerName, o.OrderDate
FROM Customers AS c
JOIN Orders AS o ON c.CustomerID = o.CustomerID;

         在上述查询中,使用了AS关键字为表CustomersOrders设置了别名co

列名冲突:

sqlSELECT OrderID
FROM Customers AS c
JOIN Orders AS o ON c.CustomerID = o.CustomerID;

         当两个表中存在相同名称的列(例如,OrderID),需要使用表名或别名来限定列,以避免冲突。

表之间的关联:

SELECT c.CustomerName, o.OrderDate
FROM Customers AS c
JOIN Orders AS o ON c.CustomerID = o.CustomerID;

         在上述查询中,使用JOIN语句将表CustomersOrders连接起来,通过CustomerID列建立关联。这样,我们可以获取顾客的姓名和订单的日期。

使用合适的连接类型:


SELECT c.CustomerName, o.OrderDate
FROM Customers AS c
LEFT JOIN Orders AS o ON c.CustomerID = o.CustomerID;

           在某些情况下,可能需要使用不同类型的连接操作符,如LEFT JOIN。这将返回所有Customers表中的记录,无论其在Orders表中是否有匹配项。

查询性能优化:

SELECT c.CustomerName, o.OrderDate
FROM Customers AS c
JOIN Orders AS o ON c.CustomerID = o.CustomerID
WHERE c.Country = 'China';

        为了提高查询性能,可以在涉及到关联的列上创建索引。在上述查询中,如果Customers表的Country列上有索引,可以加快检索顾客所在国家为中国的订单数据的速度。

字段命名一致性:

SELECT c.CustomerName, o.OrderDate
FROM Customers AS c
JOIN Orders AS o ON c.CustomerID = o.CustomerID;

        在查询中,尽量为字段使用一致、易理解的名称。例如,使用CustomerName表示顾客姓名,OrderDate表示订单日期,以确保字段命名的一致性和可读性。

谨慎使用通配符:

SELECT *
FROM Customers AS c
JOIN Orders AS o ON c.CustomerID = o.CustomerID;

        谨慎使用通配符(*)来选择所有列。最好明确指定需要的列,以免查询结果包含不必要的数据。明确列出所需的列,例如SELECT c.CustomerName, o.OrderDate,可以减少数据传输和提高查询效率。

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

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

相关文章

vue实现进度条+背景定位

最近在做一个数字孪生项目,用于展示地铁车辆的进场动画及部件,使用的vueunity,但是 unity模型在加载完成之前会有个加载进度条,页面背景色是黑色,中间只有个一进度条框 可以看到很单调很丑,并且客户也不满…

2023软件测试八股文,涵盖所有面试题

Part1 1、你的测试职业发展是什么? 测试经验越多,测试能力越高。所以我的职业发展是需要时间积累的,一步步向着高级测试工程师奔去。而且我也有初步的职业规划,前3年积累测试经验,按如何做好测试工程师的要点去要求自…

如何优化前端性能?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 优化前端性能1. 减少HTTP请求2. 压缩资源3. 使用浏览器缓存4. 使用CDN5. 延迟加载6. 使用响应式设计7. 减少重绘和回流8. 代码优化9. 使用现代Web技术 ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前…

vue event bus 事件总线

vue event bus 事件总线 创建 工程: H:\java_work\java_springboot\vue_study ctrl按住不放 右键 悬着 powershell H:\java_work\java_springboot\js_study\Vue2_3入门到实战-配套资料\01-随堂代码素材\day04\准备代码\08-事件总线-扩展 vue --version vue crea…

免杀对抗-内存加载-shellcode转换-UUID+MAC+IPV4

内存加载-UUID地址-ShellCode转换 介绍:通用唯一识别码(UUID),是用于计算机体系中以识别信息数目的一个128位标识符,根据标准方法生成,不依赖中央机构的注册和分配,UUID具有唯一性。 演示语言:c 1.使用以下代码将c语言…

如何使用 API 接口获取商品数据,从申请 API 接口、使用 API 接口到实际应用,一一讲解

在当今的数字化时代,应用程序接口(API)已经成为数据获取的重要通道。API 接口使得不同的应用程序能够方便地进行数据交换,从而促进了信息的广泛传播和利用。在众多的数据源中,商品数据是一个非常重要的领域&#xff0c…

leetcode面试题0808有重复字符串的排列组合

描述 输入一个长度为 n 字符串&#xff0c;打印出该字符串中字符的所有排列&#xff0c;你可以以任意顺序返回这个字符串数组。 例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。 数据范围&#xff1a;n<10 要求&#xff1a;空间复…

Mysql高级语句(视图表 、存储过程、条件语句、循环语句)

Mysql高级语句&#xff08;视图表 、存储过程、条件语句、循环语句&#xff09; 一、 CREATE VIEW&#xff08;视图&#xff09;1.1、 视图表概述1.2、 视图表能否修改&#xff1f;&#xff08;面试题&#xff09;1.3、 基本语法1.3.1、 创建1.3.2、 查看1.3.3 、删除 1.4、 通…

基于微信小程序的场地预约系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

react create-react-app v5 从零搭建项目

前言&#xff1a; 好久没用 create-react-app做项目了&#xff0c;这次为了个h5项目&#xff0c;就几个页面&#xff0c;决定自己搭建一个&#xff08;ps:mmp 好久没用&#xff0c;搭建的时候遇到一堆问题&#xff09;。 我之前都是使用 umi 。后台管理系统的项目 使用 antd-…

你听说过推挽电路吗?避免交越失真

推挽电路就是用两个三级管或者场效应管构成的放大电路&#xff0c;这个电路的特点就是输出电阻小&#xff0c;能够驱动大的负载&#xff0c;从而能够使得单片机管脚直接驱动发光二极管、蜂鸣器。上面的三极管是N型三极管&#xff0c;下面的三极管是P型三极管&#xff0c; 当输入…

【深度学习实验】卷积神经网络(五):深度卷积神经网络经典模型——VGG网络(卷积层、池化层、全连接层)

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. conv_layer&#xff08;创建卷积块&#xff09; 2. vgg_conv_block&#xff08;卷积模块&#xff1a;卷积层*n、池化层&#xff09; 3. vgg_fc_layer&#xff08;…

华为云云耀云服务器L实例评测|华为云云耀云服务器docker部署srs,可使用HLS协议

华为云云耀云服务器L实例评测&#xff5c;华为云云耀云服务器docker部署srs&#xff0c;可使用HLS协议 什么是华为云云耀云L实例 云耀云服务器L实例&#xff0c;面向初创企业和开发者打造的全新轻量应用云服务器。提供丰富严选的应用镜像&#xff0c;实现应用一键部署&#x…

信创办公–基于WPS的EXCEL最佳实践系列 (获取外部数据)

信创办公–基于WPS的EXCEL最佳实践系列 &#xff08;获取外部数据&#xff09; 目录 应用背景操作步骤1、导入数据2、刷新数据 应用背景 通常企业的数据会存储在数据库或不同的系统中&#xff0c;而我们想要在自己用的工作WPS的excel表格里使用这些数据&#xff0c;我们可以使…

QT入门10个小demo——MP4视频播放器

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 一、前…

美摄AIGC创新引擎,助力企业快速搭建AIGC能力(一)

AIGC作为当下最热的重要赛道&#xff0c;迅速在视频、图像、文案、绘画等生产创作领域出圈&#xff0c;吸引了百度、阿里、腾讯、谷歌等众多互联网大厂&#xff0c;纷纷布局和计划推出AIGC类的产品。 全新的视频内容生产方式&#xff0c;AIGC利用人工智能技术实现视频内容的自…

DEV gridview多表头设计

先上图&#xff1a; 第一步转化gridview变成bandedGridview类型 一步步按照自己想要的格式添加&#xff0c;先把表头格式全部弄好&#xff0c;然后在拖拉对应的列。 注意&#xff1a;全部弄完后把列表头设置不可见

踩坑 | vue项目运行后使用require()图片也不显示

文章目录 踩坑 | vue项目运行后使用require()图片也不显示问题描述解决办法1&#xff1a;src属性直接传入地址解决办法2 踩坑 | vue项目运行后使用require()图片也不显示 问题描述 在网上查阅之后&#xff0c;发现结论是在使用vue动态加载图片时&#xff0c;必须使用require。…

一篇爆款产品软文怎么写?媒介盒子告诉你三步

随着数字技术的加速发展&#xff0c;企业推广产品的方式已经逐渐从线下过度到线上&#xff0c;而线上推广中比较常见的方式就是软文推广&#xff0c;软文推广成本较低&#xff0c;用户接受度也更高&#xff0c;但是一篇爆款产品软文应该怎么写呢&#xff1f;下面就让媒介盒子告…

nvm安装后node或npm不是内部或外部命令

nvm安装后出现node或npm不是内部或外部命令 进行以下步骤解决 找到nvm安装所在位置&#xff0c;新建一个空的nodejs文件夹 打开 windowr —> sysdm.cpl —> 高级 —>环境变量 将下图中两个位置的地址改成刚刚新建的nodejs空文件夹所在的位置 nvm安装后都是会自动添加…