理解mysql执行多表联合查询

摘要:
node+mysql多表联合查询通常使用以下联接方法查询多个表:正确的表(表2)匹配满足条件的记录。在之后通过条件查询查询用户表和user2表(内部联接)将查询第二个表的数据。第一个表的数据字段值为空。如下所示:user2表的数据字段值为空;第一个表中所有字段的查询值均为空。节点+MySQL多表联合查询在MySQL模块中。

阅读目录

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

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

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

基本语法如下:

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表中的数据如下所示:

理解mysql执行多表联合查询第1张

回到顶部

一:inner join(内连接)

基本语法如下:

select * from user inner join user2 on user.age = user2.age;

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

回到顶部

二:left join(左连接)

基本语法如下:

select * from user left join user2 on user.age = user2.age;

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

如下所示:

理解mysql执行多表联合查询第3张

回到顶部

三:right join(右连接)

基本语法如下:

select * from user right join user2 on user.age = user2.age;

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

如下所示:

理解mysql执行多表联合查询第4张

回到顶部

四:cross join(交叉连接)

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

理解mysql执行多表联合查询第5张

回到顶部

五:union操作

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。如下所示:
理解mysql执行多表联合查询第6张

回到顶部

六:node+mysql 多表联合查询

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

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

select * from user inner join user2 where user.age = user2.age;

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

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 后,可以看到如下所示:

理解mysql执行多表联合查询第8张

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

解决方法有如下几种:

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

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

{
  sql: 'select * from user inner join user2 where user.age = user2.age',
  nestTables: true
}

代码如下:

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();
      }
    }); 
  }
});

然后我们运行结果如下所示:

理解mysql执行多表联合查询第9张

如上图可以看到,包含两个对象user和user2,对象里面是各自的数据。

3. 第三种方法是为在query方法中使用nestTables属性并将属性值设定为一个分割字符,这会将被结合的两张表中的数据以一个对象的形式输出。该对象的属性名 为 字段所属表名+分割字符+字段名。

sql语句改为如下:

{
  sql: 'select * from user inner join user2 where user.age = user2.age',
  nestTables: '_'
}

所有代码如下:

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: '_'
    };
    connection.query(sql, (err, res) => {
      if (err) {
        console.log('查询数据失败');
      } else {
        console.log(res);
        connection.end();
      }
    }); 
  }
});

然后运行结果如下:

理解mysql执行多表联合查询第10张

免责声明:文章转载自《理解mysql执行多表联合查询》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇lunix常用命令mitmproxy进行拦截下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

layui 二级联动

layui 二级联动 HTML 部分 <form onsubmit="return false;"action="__SELF__"data-auto="true"method="post"class='form-horizontal layui-form' style='padding-top:20px'><input type="h...

C#基本面试题

重写和重载 重写: 要求:(三大同)参数相同,方法名相同,返回值相同 关键字:基类函数用virtual修饰,派生类用override修饰 注意:不能重写非虚方法或静态方法 重载: 要求:在同一作用域,可以存在相同的函数名,不同参数列表的函数,这组函数称为重载函数 其他 WebAPI和MVC的区别 1、MVC主要用于建站,WebAPI主要用于构建http...

layui在open弹出层回显,解决动态select数据回显问题

//监听数据表格工具条         table.on('tool(contentList)', function(obj){ //注:tool是工具条事件名,test是table原始容器的属性 lay-filter="对应的值"             var data = obj.data //获得当前行数据                 ,lay...

Oracle 存储过程,触发器,事务,锁

1.1存储过程   存储过程是一种命名的PL/SQL程序块,他可以有参数,也可以有若干个输入、输出参数。甚至可以有多个即做输入又做输出的参数,但他都没有返回值。存储过程被保存在数据库中,他不可以被SQL语句直接执行调用。通过EXECUTE命令或在PL/SQL命令中调用,因为存储过程是已经编译好的代码块,所以被调用或引用时,执行效率很高。 1.1.1 存储过...

解决cursor未关闭造成的死锁

参考:https://blog.csdn.net/zc474235918/article/details/72731363/ https://blog.csdn.net/zmx729618/article/details/51259135 # import pymysql # conn=pymysql.connect(host='127.0.0.1',...

Hive的基本操作

一、创建数据库   hive>create database mydb ; //hql和mysql语法极其相似   hive>show databases;//查看所有数据库 二、创建表   格式:     create [external] table <表名>(列的定义,....)  [row format delimited...