首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >理解mysql执行多表联合查询

理解mysql执行多表联合查询

原创
作者头像
IT工作者
发布于 2022-02-09 08:47:31
发布于 2022-02-09 08:47:31
2.2K00
代码可运行
举报
文章被收录于专栏:程序技术知识程序技术知识
运行总次数:0
代码可运行

查询多张表一般有如下连接方法:

1)内连接:join, inner join 2)外连接:left join, left outer join, right join, right outer join, union; 3) 交叉连接:cross join

join的含义是:用于多表中字段直接的联系。

基本语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from table1 inner|left|right join table2 on conditiona

说明:table1 是指第一张表。table2是指第二张表。 on 后面的含义是:满足这个条件。

join按照功能可以分成如下三类:

1) inner join(内连接,或叫等值连接):取得两个表中存在连接匹配关系的记录。 2)left join(左连接):取得左表(table1)完全记录,右表(table2)如果有条件相符合的记录就匹配,否则为null; 3) right join(右连接): 取得右表(table2)完全记录,左表(table1)如果有条件相符合的记录就匹配,否则为null;

我们来看一个列子:

如下是user1表和user2表中的数据如下所示:

一:inner join(内连接)

基本语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from user inner join user2 on user.age = user2.age;

如上代码的含义是:查询user表和user2表(内连接) 通过on后面的条件查询,user表中的age字段 等于 user2表中的age这个条件满足的话,才会把两个表中的数据都查询出来的,否则的话,查询数据就是空哦。如下所示:

二:left join(左连接)

基本语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from user left join user2 on user.age = user2.age;

如上代码的含义是:如果user表中的age字段值 等于 user2表中的age字段的值的话,那么就会把所有的数据都查询出来,如果该表中的字段age值不相等的话,那么user表中的记录会全部查询出来,user2表中的所有字段为null值。

如下所示:

三:right join(右连接)

基本语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from user right join user2 on user.age = user2.age;

和上面的 left join 的含义相反,就是说 如果条件相等的话,就会把两张表的数据都查询出来,如果不相等的话,就会把第二张表的数据查询出来,第一张表的数据字段值为null.

如下所示:

四:cross join(交叉连接)

交叉连接,得到的结果是两个表的乘积; 效果和 inner join 类似,如下所示:

五:union操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from user left join user2 on user.username = user2.username union select * from user right join user2 on user.username = user2.username;

上面代码的含义是:查询user表和user2表,如果该两张表的username值相等的话,使用left join(左链接) 和 right join(右连接),如果都相等的话,就把两张表所有的数据查询出来。否则的话,两张表字段不相等的话,那么第一个条件 left join查询后的数据就是 按照user表查询出所有的数据,user2表中的数据字段值为null;union的含义的意思可以理解为或者的意思,我们可以理解它为or的意思,第二个条件是使用 right join 连接符,意思是如果username字段不相等的话,就按照第二张表的数据全部查询出来,第一张表的所有字段查询值为null。如下所示:

六:node+mysql 多表联合查询

在mysql模块中,我们可以使用Connection对象的query方法的第一个参数编写sql语句来执行多表联合查询,但是如果在sql语句中指定了相同的字段(比如相同的字段在不同的表中),那么在默认的情况下,后面的字段会覆盖前面的字段查询出来的数据。从而不是我们想要的结果。我们是想要把这两张表的数据同时查询出来。为了演示下,我们新建两张表,一张是user表,该表有4个字段,分别是id,username, password, age; 另外一张表是user2表,该表有四个字段,分别是id,username,password,age等字段。如下所示:

我们现在使用Connection对象的query方法结合查询这两张表中的所有数据,查询语句如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from user inner join user2 where user.age = user2.age;

因此所有的代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const mysql = require('mysql');
/*
 createConnection方法创建一个表示与Mysql数据库服务器之间连接的 Connection对象
*/
const connection = mysql.createConnection({
  host: 'localhost',
  port: 3306,
  database: 'my_db',
  user: 'root',
  password: '123456'
});

/*
 connection 对象被创建之后,可以使用该对象的 connect方法建立mysql数据库服务器之间的连接
*/
connection.connect((err) => {
  if (err) {
    console.log(err);
    console.log('数据库连接失败');
  } else {
    console.log('数据库连接成功');
    const sql = 'select * from user inner join user2 where user.age = user2.age';
    connection.query(sql, (err, res) => {
      if (err) {
        console.log('查询数据失败');
      } else {
        console.log(res);
        connection.end();
      }
    }); 
  }
});

然后我们在命令行中,运行 node app.js 后,可以看到如下所示:

如上图我们可以看到,查询后的数据就是user2表中的数据,user1表的数据被覆盖了,因为user表中的字段和user2表中的字段是一样的,虽然在不同的表中,但是因为字段一样,后面的user2表会把user表中的字段覆盖掉。

解决方法有如下几种:

1. 第一种是给sql语句重复的字段使用别名。这种方法比较繁琐,因为如果表中有多个字段相同的话,要设置多个别名。这种方法不折腾。

2. 第二种方法为在query方法中使用 nestTables属性,并将属性值设置为true。因此会将两个表中的数据以两个对象的形式输出来。如下sql语句改为如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  sql: 'select * from user inner join user2 where user.age = user2.age',
  nestTables: true
}

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const mysql = require('mysql');
/*
 createConnection方法创建一个表示与Mysql数据库服务器之间连接的 Connection对象
*/
const connection = mysql.createConnection({
  host: 'localhost',
  port: 3306,
  database: 'my_db',
  user: 'root',
  password: '123456'
});

/*
 connection 对象被创建之后,可以使用该对象的 connect方法建立mysql数据库服务器之间的连接
*/
connection.connect((err) => {
  if (err) {
    console.log(err);
    console.log('数据库连接失败');
  } else {
    console.log('数据库连接成功');
    const sql = {
      sql: 'select * from user inner join user2 where user.age = user2.age',
      nestTables: true
    };
    connection.query(sql, (err, res) => {
      if (err) {
        console.log('查询数据失败');
      } else {
        console.log(res);
        connection.end();
      }
    }); 
  }
});

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL实战:小白能轻松上手的多表关联查询性能优化实战
"张工,订单列表查询又超时了!"凌晨两点接到值班同事的电话时,我的咖啡杯悬在了半空。打开监控系统,发现一个看似普通的订单详情查询SQL竟扫描了上亿条数据。原来这个查询涉及5张业务表的关联,在数据量突破千万级后,执行时间从毫秒级飙升到分钟级。
小明互联网技术分享社区
2025/07/05
3420
MySQL实战:小白能轻松上手的多表关联查询性能优化实战
MySQL的多表联合查询
MySQL多表联合查询包括内连接、外连接、笛卡尔积连接查询三种。今天我们通过实验来演示7种SQL JOINS的基本用法。
Power
2025/02/28
4960
Nodejs学习笔记(四)--- 与MySQL交互(felixge/node-mysql)
简介和安装   Node.js与MySQL交互操作有很多库,具体可以在 https://www.npmjs.org/search?q=mysql  查看。   我选择了felixge/node-mys
Porschev
2018/01/16
2.5K0
Nodejs学习笔记(四)--- 与MySQL交互(felixge/node-mysql)
多表查询与7种JOINS的实现
前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。比如:员工表和部门表,这两个表依靠“部门编号”进行关联。
timerring
2023/02/16
1.5K0
多表查询与7种JOINS的实现
Mysql 多表联合查询效率分析及优化
1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用',' 如:
黄规速
2022/04/14
3.9K0
关于MySQL多表联合查询,你真的会用吗?
上节课给大家介绍了MySQL子查询的基本内容,具体可回顾MySQL子查询的基本使用方法(四),本节课我们准备给大家介绍MySQL的多表联合查询。大家都知道,MySQL多表联合查询包括内连接、外连接、笛卡尔积连接查询三种。今天我们先重点介绍常用的外连接与内连接查询,即left join /right join/inner join的基本用法。
用户7569543
2021/11/02
9.9K0
玩转Mysql系列 - 第11篇:深入了解连接查询及原理
当我们查询的数据来源于多张表的时候,我们需要用到连接查询,连接查询使用率非常高,希望大家都务必掌握。
路人甲Java
2019/09/20
1.3K0
MySQL常用操作
一、查看类 查看mysql当前的各类指标status; `show status;` 查看字符集 show variables like "%character%"; show character set; 查看当前用户 select user(); 查看排序规则SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; show variables like "%collat
KaliArch
2018/06/24
3.1K3
MySQL常用操作
MySQL多表查询核心优化
在一般的项目开发中,对数据表的多表查询是必不可少的。而对于存在大量数据量的情况时(例如百万级数据量),我们就需要从数据库的各个方面来进行优化,本文就先从多表查询开始。其他优化操作,后续另外更新,敬请关注。
全栈程序员站长
2022/09/05
1.2K0
Join 语句执行过程性能差,原因可能是什么?哪里需要建立索引?
可能你会一脸懵逼,But 实际上,其实考的就是 join 这个知识点,不难,看完这篇文章你就会啦~
飞天小牛肉
2022/02/23
8070
Join 语句执行过程性能差,原因可能是什么?哪里需要建立索引?
MySQL多表联合查询
例 2:查询 tb_course 表中的 id 字段和 tb_students_info 表中的 course_id 字段相等的内容
Alone-林
2022/08/20
11.1K0
MySQL数据库,从入门到精通:第六篇——全面掌握MySQL多表查询技巧
MySQL数据库,从入门到精通:第一篇——MySQL概念详解 MySQL数据库,从入门到精通:第二篇——MySQL关系型数据库与非关系型数据库的比较 MySQL数据库,从入门到精通:第三篇——MySQL 数据库规范和基础查询语句 MySQL数据库,从入门到精通:第四篇——MySQL中常用的运算符及其用法 MySQL数据库,从入门到精通:第五篇——MySQL排序和分页 MySQL数据库,从入门到精通:第六篇——全面掌握MySQL多表查询技巧 MySQL数据库,从入门到精通:第七篇——MySQL单行函数应用 MySQL数据库,从入门到精通:第八篇——MySQL聚合函数实战探究:优化SELECT过程助力高效查询 MySQL数据库,从入门到精通:第九篇——MySQL子查询 MySQL数据库,从入门到精通:第十篇——MySQL表创建和管理指南 MySQL数据库,从入门到精通:第十一篇——MySQL数据处理之增删改指南 MySQL数据库,从入门到精通:第十二篇——MySQL数据类型详解 MySQL数据库,从入门到精通:第十三篇——MySQL数据表约束详解 MySQL数据库,从入门到精通:第十四篇——MySQL视图详解 MySQL数据库,从入门到精通:第十五篇——MySQL存储过程和函数详解 MySQL数据库,从入门到精通:第十六篇——MySQL变量、流程控制和游标详解 MySQL数据库,从入门到精通:第十七篇——MySQL 触发器的使用方法及注意事项 MySQL数据库,从入门到精通:第十八篇——MySQL 8新特性全解析
默 语
2024/11/20
3550
MySQL数据库,从入门到精通:第六篇——全面掌握MySQL多表查询技巧
MySQL多表查询
单表查询:select * from table1; 多表查询:select *from table1,table2;
WuShF
2023/09/21
6410
MySQL多表查询
步步深入:MySQL架构总览->查询执行流程->SQL解析顺序
转载自 https://www.cnblogs.com/annsshadow/p/5037667.html
allsmallpig
2021/02/25
7710
MySQL多表关联查询
SQL 连接(JOIN) 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。连接的结果可以在逻辑上看作是由SELECT语句指定的列组成的新表。左连接与右连接的左右指的是以两张表中的哪一张为基准,它们都是外连接。外连接就好像是为非基准表添加了一行全为空值的万能行,用来与基准表中找不到匹配的行进行匹配。假设两个没有空值的表进行左连接,左表是基准表,左表的所有行都出现在结果中,右表则可能因为无法与基准表匹配而出现是空值的字段。
全栈程序员站长
2022/08/23
5.6K0
MySQL多表关联查询
关于gorm多表联合查询(left join)的小记
Golang很流行,但是有些方面资料很少而且不详实,譬如:gorm的联合查询,当然,也不推荐复杂语句使用orm模型。
hotqin888
2020/08/05
31.9K1
关于gorm多表联合查询(left join)的小记
node-mysql文档翻译
如果需要以前的版本0.9.x系列的文档,请访问v0.9 branch. 有时你可以从github中安装最新版本的node-mysql,具体怎么做请参考下面的示例:
stys35
2020/12/17
1.8K0
【MySQL】014-join连接语句用法详解
①内连接仅选出两张表中相互匹配的记录,外链接会选出其他不匹配的记录,最常用的是内连接;
訾博ZiBo
2025/01/06
7800
【MySQL】014-join连接语句用法详解
【MySQL】02_子查询与多表查询
指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入。
鸡先生
2022/10/29
3.1K0
【MySQL】02_子查询与多表查询
第06章_多表查询
前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。比如:员工表和部门表,这两个表依靠 “部门编号” 进行关联。
程序员Leo
2023/08/07
3420
第06章_多表查询
推荐阅读
相关推荐
MySQL实战:小白能轻松上手的多表关联查询性能优化实战
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验