数据库多表链接查询的方式

2023-11-12

数据库中多表联查可以通过连接运算实现,即将多张表通过主外键关系关联在一起进行查询,分为非等值查询和等值查询两大类。

非等值查询语法:

select * from 表1,表2

此查询方式的实质是笛卡尔积的应用,即表1有x行,表2有y行,得到的结果就是x*y行。因此非等值查询在应对数据量较小的情况时可以选择,但当数据量庞大时,采用非等值查询方式会造成大量的数据,从而降低效率,因此不推荐使用非等值查询。

等值查询语法:

select * from 表1,表2 where 表1.字段1 = 表2.字段2....

等值查询是通过where 后面的判断条件去获取自己需要的数据,可以分为以下三种:

左连接: left join

select * from 表1 
left join 表2 
on 表1.字段1 = 表2.字段1

以left join 左边的表(表1)为主表,从左表中返回所有的记录,即便在右表(表2)中没有匹配的行。

取左表中独有的数据:

on 的后面,根据条件进行过滤筛选,再生成临时查询结果。

where 的后面,从临时查询结果中再根据条件进行筛选,生成最终结果。

select * from A 
left join B
on A.id = B.id
where B.id is null

如果是三张表,则可通过两个 left join 来连接,即把前面两张表先 left join 之后当成一张表(虚拟表),然后再与第三张表 left join。

右连接:right join

select * from 表1
right join 表2
on 表1.字段1 = 表2.字段1

与 left join 相对应,右边的表(表2)为主表,从右表中返回所有的记录,即便在左表(表1)中没有匹配的行。

取右表独有的数据:

select * from A 
right join B
on A.id = B.id
where A.id is null

其运行过程与左表同理

交集:inner join

组合两个表中的记录,只要在公共字段中有相符合的值,都会被取到,即在表中至少一个匹配时,就会返回记录,实际结果为两张或多张表的交集。

select * from 表1
inner join 表2
on 表1.字段名 = 表2.字段名

取两表共有的数据

select * from A
inner join B
on A.id = B.id

 值得注意的是,inner join不会统计空值

并集:union与union all

union与union all都是求多表的并集,但两种方式得到的结果截然不同,具体如下。

union 语法:

select * from A
union
(select * from B)

 可以看到,union合并的是结果集,不区分来自于哪一张表,所有可以合并多张表查询出来的数据,但是会过滤掉重复的数据。

注意:

1.当表列名不一致时,会以第一张表的表头为准

2.不同数据类型可以并到一个列中

3.如果查询的表的列数量不相等是,就会报错

4.每个字句中的的排序是没有意义的,mysql在进行合并的适合会忽略掉,如需要排序,可以对合并后的整张表进行排序

union all 语法:

select * from A
union all
(select * from B)

 可以看到,union all 得到的结果也是结果的并集,但是不会把重复的数据过滤掉,而是全部显示出来。

除了以上几种大类之外,在查询中还有许多的子查询,这里暂时不做过多的叙述,虽然我们在做多表联查时可以使用left join,right join,inner join等查询方式,但是阿里巴巴Java开发手册中规定,超过三个表禁止使用join,因为数据量过大时,mysql查询不出来,因此在使用时我们需要注意。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库多表链接查询的方式 的相关文章

  • 非规范化如何提高数据库性能?

    我听说过很多关于非规范化的内容 它是为了提高某些应用程序的性能而进行的 但我从来没有尝试过做任何相关的事情 所以 我只是好奇 规范化数据库中的哪些地方会使性能变差 或者换句话说 非规范化原则是什么 如果我需要提高性能 如何使用此技术 非规范
  • SQL Group BY,每个组的前 N ​​个项目

    我有一个 SQL 查询 可以获取给定商店中销量最高的 5 件商品 SELECT TOP 5 S UPCCode SUM TotalDollarSales FROM Sales S WHERE S StoreId 1 GROUP BY S U
  • Oracle:如果表存在

    我正在为 Oracle 数据库编写一些迁移脚本 并希望 Oracle 有类似于 MySQL 的东西IF EXISTS构造 具体来说 每当我想删除 MySQL 中的表时 我都会执行类似的操作 DROP TABLE IF EXISTS tabl
  • 让 Prometheus 发送 SQL 查询

    我正在尝试使用普罗米修斯 https prometheus io 监视我的 MySQL 数据库 但似乎找不到添加 SQL 查询的区域 例如 我想运行一个返回值的 SQL 查询 然后将该值添加到图表中 发送警报 有没有办法让 Promethe
  • 案例陈述以确定我是否应该结合

    我目前想做某种条件联合 给出以下示例 SELECT age name FROM users UNION SELECT 25 AS age Betty AS name 假设我只想在 用户 计数 gt 2 时合并第二个语句 否则不合并两者 总之
  • 通过将行旋转为动态数量的列来在 MySQL 中创建摘要视图

    我在 MySQL 中有一个表 其中包含以下字段 id company name year state 同一客户和年份有多行 以下是数据示例 id company name year state 1 companyA 2008 1 2 com
  • SQLSTATE[HY000] [2002] 资源暂时不可用 - mysql - innodb 和 pdo

    在我的错误日志中得到大量结果 如下所列 数据库中的所有表都是 innodb 并且就与这些表的任何交互而言 一切都是带有准备好的语句的 pdo 正如我所说 所有错误几乎与下面列出的错误相同 但发生在几个不同的页面上 无论页面如何 错误行始终指
  • T-sql、刻度、时间戳

    是否有可能在 t sql 中获得像 DateTime Ticks 这样的 C 内容 感谢帮助 您不太可能从 SQL 中获得与 DateTime Ticks 相同的精度 因为 SQL 不能以那么高的精度表达时间 SQL Server 只存储大
  • 与 FOREIGN KEY 约束冲突

    我有两张桌子 学术界 CREATE TABLE dbo R ACADEMIE ID ACADEMIE dbo IDENTIFIANT NOT NULL LC ACADEMIE CODE dbo LIBELLE COURT NOT NULL
  • 使用 xmlagg 时出现子查询错误和太多值

    我在连接许多大型表中的所有数据时遇到问题 我昨天对此提出了问题 但不幸的是 listagg 似乎不是一个好的选择 链接子查询返回多行 https stackoverflow com questions 54651144 subquery r
  • 当我输入 dateadd 或 datediff 代码时,我总是收到此错误“ORA-00904“DATEADD”无效标识符。”

    我有一个大学项目 并且有一个包含入院和出院日期属性的患者表 我需要删除超过 7 年的记录 我使用了以下代码 delete from patient where dis date gt datedadd yy 7 getdate 我收到错误
  • 如何对 SQL Server Express 进行实时更改

    我一直在使用 VS studio 开发一个 ASP NET Web 应用程序 我正在使用 SQL Server Express 在开发过程中 我一直在我的服务器上测试我的网络应用程序 每次我需要更新数据库时 我都会简单地删除旧数据库 位于我
  • ActiveRecord 嵌套 SELECT——我可以在没有手动 SQL 的情况下完成它吗?

    我有一张桌子 上面有 除其他外 一个名字和一个等级 我想返回所有唯一名称的集合 但对于返回的每个名称 我想选择排名最高的行 这很简单 有两个嵌套的 SELECT 语句 SELECT FROM SELECT FROM foo ORDER BY
  • Mysql 在给定日期时间范围内插入随机日期时间

    使用 SQL 我可以在给出范围的列中插入随机日期时间值吗 例如 给定一个范围2010 04 30 14 53 27 to 2012 04 30 14 53 27 我对范围部分感到困惑 因为我刚刚做了这个 INSERT INTO someta
  • 关系代数 - 笛卡尔积与自然连接?

    我正在准备考试 但未能找到一个可靠的标准来确定笛卡尔积是否x要使用或者如果自然连接 X 是要使用的 我想出了一个粗略的指南 如果您需要投影与要连接的表中的属性同名的属性 则必须使用x并说明要投影的表名称 tableA colname1 ta
  • Laravel 使用数据库自​​动完成文本字段

    我正在尝试制作如下所示的自动完成表单 但该表单没有显示建议 因为我的数据库查询没问题 形成科尔 控制器方法代码 Routes 当我搜索链接时 我得到如下查询结果 显示结果 id 1 value 苏拉夫霍森 id 2 value 苏拉夫霍森
  • PLSQL 中的时区转换

    我需要将系统日期和时间转换为特定时区 例如东部时间 我无法假设我当前的时区 如何在plsql中转换它 请帮我 假设你有一个TIMESTAMP WITH TIME ZONE 例如systimestamp 您可以使用AT TIME ZONE句法
  • 如何删除实体框架6中的多对多关系

    如果将项目连接为多对多关系 则从数据库中删除项目时会出现问题 我的数据库看起来像 Project lt JobInProject gt Job ProjectID JobInProjectID JobID ProjectID JobID 主
  • 执行存储过程时 ExecuteNonQuery() 返回 -1

    我正在尝试在 Visual Studio 中执行存储过程 下面给出 CREATE PROCEDURE dbo addStudent stuName varchar 50 address varchar 100 tel varchar 15
  • 当您执行“SELECT *”时,SQL Server 如何确定列的顺序?

    当您执行以下操作时 SQL Server 如何确定列的顺序SELECT 我知道 订购依据 对于订购至关重要data 但我预计列名保持一致 注意 我的代码是not取决于返回列的实际顺序 我只想知道 SQL Server 如何决定对列名进行排序

随机推荐

  • 浅谈Node中的模块化

    关于这篇文章早在去年年初的时候我就想写一片关于模块化的文章 但是推到现在才来完成也有很多好处 巩固之前对Node的理解 毕竟在我目前的项目中还没有一款项目是用到了Node开发 所以导致我对Node的一些基本知识已经忘记 一 什么是模块化 现
  • mac安装Golang开发环境及快速入门

    目录 一 Mac brew 安装go环境 1 1 安装步骤 1 2 设置GOPATH 及环境变量 1 3 编写第一个go程序 二 快速入门 2 1 快速入门需求 2 2 go学习 自用 2 2 1 go基础程序 2 2 2 变量声明 2 2
  • java递归和非递归实现快排

    Java递归和非递归实现快排 文章目录 Java递归和非递归实现快排 前言 一 快速排序基本逻辑 二 过程演示 三 实现代码 总结 前言 最近复习数据结构 顺便复习快速排序的过程 一 快速排序基本逻辑 快排以某个关键字为基准 将待排序序列分
  • Jenkins 构建打包

    Jenkins构建打包方便了开发人员冗余的打包操作 具体怎么使用呢 这里我们来了解一下 jenkins操作面板 这里有两个情况 1 如果打包配置里已经指定了打包分支 这里会显示 立即构建 2 如果配置了多个打包分支 这里会显示 Build
  • Qt relaease添加调试

    Qt relaease添加调试 设置Qt安装路径下mkspecs common msvc desktop conf里的内容 QMAKE CFLAGS RELEASE WITH DEBUGINFO QMAKE CFLAGS OPTIMIZE
  • AndroidManifest中activity属性参数设置大全

    activity属性设置大全 android alwaysRetainTaskState true false android clearTaskOnLaunch true false android configChanges mcc m
  • 多节锂电串联保护板ic_如何有效保护锂电池板,一款优质的MOS管就能解决

    锂电池几乎应用于我们日常接触到的各类电器之中 但如何保护锂电池 你又是否知道呢 其实在锂电池保护板 最主要的元器件是IC与MOS MOS对锂电池板的保护作用非常大 它可以检测过充电 检测过放电 检测充电时过电电流 检测放电时过电电流 检测短
  • 在vue项目中使用SockJS实现websocket通信

    1 引入SockJS 和Stomp npm install sockjs client npm install stompjs import SockJS from sockjs client import Stomp from stomp
  • python里面读取h5文件报错OSError: Can‘t read data (address of object past end of allocation)

    报错如下 File h5py objects pyx line 54 in h5py objects with phil wrapper File h5py objects pyx line 55 in h5py objects with
  • C#通过WEBREQUEST调用WEBSERVICE

    1 首先通过WSDL说明创建SOAP消息 XML 2 创建WEBREQUEST 将XML加入WEBREQUEST的RequestStream 3 通过WEBREQUEST的Write函数发起请求 4 通过WEBREQUEST的GetResp
  • C语言中的小数

    一个数字 是有默认类型的 对于整数 默认是 int 类型 对于小数 默认是 double 类型 小数分为两种类型 float 4字节 double 8字节 表现形式 十进制形式 4 023 75 0 0 27 指数形式 7 25 102 0
  • Python爬取个性签名

    coding utf 8 import tkinter from tkinter import from tkinter import messagebox import requests import re from PIL import
  • spyder的cell如何使用(未写)

    目前不知道如何使用 看不出不同的cell分界线在哪
  • 常用知识点总结-自用

    文章目录 1 nohup 2 tmux 3 计算程序运行时间 4 计算模型大小 1 nohup nohup python u 文件名 gt log log 2 tmux 启动会话 tmux new s name 从会话跳出 ctrl b d
  • Mysql安装

    压缩包安装参考 https baijiahao baidu com s id 1632332658294840653 wfr spider for pc 配置环境变量 把mysql的bin目录配置到path变量 新增my ini文件初始化配
  • 如何安装openmpi

    安装openmpi 官网下载tar gz文件 解压缩 tar zxvf cd 到文件目录下 configure prefix usr local openmpi 安装目录 make j4 sudo make install 4核编译 添加环
  • Java反射获取SuperClass中的字段

    包 org springframework util ReflectionUtils ReflectionUtils findField clazz fieldName public class ReflectionTest public
  • DX滑块验证码别乱捅!一不小心就反爬了。

    大家好 我是TheWeiJun 欢迎来到我的公众号 今天我们将探讨一个有趣的话题 逆向滑块验证码 在互联网时代 随着网络安全问题日益引起人们的关注 各种验证码技术被广泛应用于各种网站和应用程序中 其中包括了滑块验证码 尽管滑块验证码是一种流
  • 最新论文阅读(20)

    TensorQuant A Simulation Toolbox for Deep Neural Network Quantization 2017年10月 TensorQuant toolbox Fraunhofer ITWM 一个研究所
  • 数据库多表链接查询的方式

    数据库中多表联查可以通过连接运算实现 即将多张表通过主外键关系关联在一起进行查询 分为非等值查询和等值查询两大类 非等值查询语法 select from 表1 表2 此查询方式的实质是笛卡尔积的应用 即表1有x行 表2有y行 得到的结果就是