首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL的多表联合查询

MySQL的多表联合查询

原创
作者头像
Power
发布2025-02-28 21:41:04
发布2025-02-28 21:41:04
66300
代码可运行
举报
运行总次数:0
代码可运行

一、MySQL多表联合查询介绍

MySQL多表联合查询包括内连接、外连接、笛卡尔积连接查询三种。今天我们通过实验来演示7种SQL JOINS的基本用法。

1.1 语法

常见的两表连接查询的基本语法结构如下:

代码语言:javascript
代码运行次数:0
运行
复制
select 表名.字段名,表名.字段名,表名.字段名,...
from 左表表名 (as)左表别名
left/right/inner join  右表表名 (as) 右表别名 
on 左表.连接字段=右表.连接字段 
where 查询条件;

1.2 SQL执行顺序

(1)手写

代码语言:javascript
代码运行次数:0
运行
复制
SELECT DISTINCT
    <select_list>
FROM
    <left table><join type>
JoIN <right_table>oN<join_condition>
WHERE
    <where_condition>
GROUP BY
    <group_by_list>
HAVING
    <having_condition>
ORDER BY
    <order_by_condition>
LIMIT <limit number>

(2)机读

代码语言:javascript
代码运行次数:0
运行
复制
FROM <left_table>
ON <join_condition>
<join_type> JOIN <right_table>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
SELECT
DISTINCT <select_list>
ORDER BY <order_by_condition>
LIMIT <limit_number>
MySQL的多表联合查询(图1)
MySQL的多表联合查询(图1)

二、MySQL多表联合查询演示

2.1 数据准备

代码语言:javascript
代码运行次数:0
运行
复制
CREATE DATABASE ucloud;
USE ucloud;

CREATE TABLE tbl_dept(
id INT(11) NOT NULL AUTO_INCREMENT,
deptName VARCHAR(30) DEFAULT NULL,
locAdd VARCHAR(40) DEFAULT NULL,
PRIMARY KEY(id)
)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE tbl_emp(
id INT(11) NOT NULL AUTO_INCREMENT,
NAME VARCHAR(20) DEFAULT NULL,
deptld INT(11) DEFAULT NULL,
PRIMARY KEY(id),
KEY fk_dept_id(deptld)
#CONSTRAINT fk_dept_id FOREIGN KEY(deptld) REFERENCES tbl_dept(id)
)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO tbl_dept(deptName,locAdd) VALUES('RD',11);
INSERT INTO tbl_dept(deptName,locAdd) VALUES('HR',12);213`0
INSERT INTO tbl_dept(deptName,locAdd) VALUES('MK',13)0;
INSERT INTO tbl_dept(deptName,locAdd) VALUES('MIS',14);
INSERT INTO tbl_dept(deptName,locAdd) VALUES('FD',15);

INSERT INTO tbl_emp(NAME,deptld) VALUES('z3',1);
INSERT INTO tbl_emp(NAME,deptld) VALUES('z4',1);
INSERT INTO tbl_emp(NAME,deptld) VALUES('z5',1);
INSERT INTO tbl_emp(NAME,deptld) VALUES('w5',2);
INSERT INTO tbl_emp(NAME,deptld) VALUES('w6',2);
INSERT INTO tbl_emp(NAME,deptld) VALUES('s7',3);
INSERT INTO tbl_emp(NAME,deptld) VALUES('s8',4);
INSERT INTO tbl_emp(NAME,deptld) VALUES('s9',51);
MySQL的多表联合查询(图2)
MySQL的多表联合查询(图2)
MySQL的多表联合查询(图3)
MySQL的多表联合查询(图3)
MySQL的多表联合查询(图4)
MySQL的多表联合查询(图4)
MySQL的多表联合查询(图5)
MySQL的多表联合查询(图5)

2.2 左连接left (outer) join

左连接的定义:左连接全称为左外连接,是外连接的一种。它是以左表为基础,根据ON后给出的连接条件将两表连接起来。结果会将左表所有的记录列出,而右表只列出ON后与左表满足条件的部分。

MySQL的多表联合查询(图6)
MySQL的多表联合查询(图6)
代码语言:javascript
代码运行次数:0
运行
复制
mysql> select * from tbl_emp a left join tbl_dept b on a.deptld=b.id;
MySQL的多表联合查询(图7)
MySQL的多表联合查询(图7)
MySQL的多表联合查询(图8)
MySQL的多表联合查询(图8)
代码语言:javascript
代码运行次数:0
运行
复制
mysql> select * from tbl_emp a left join tbl_dept b on a.deptld=b.id where b.id is null;
MySQL的多表联合查询(图9)
MySQL的多表联合查询(图9)

2.3 右连接right (outer) join

右连接的定义:右连接全称为右外连接,也是外连接的一种。与左连接刚好相反,它是以右表为基础,根据ON后给出的连接条件将两表连接起来。结果会将右表所有的记录列出,而左表只列出ON后与右表满足条件的部分。

MySQL的多表联合查询(图10)
MySQL的多表联合查询(图10)
代码语言:javascript
代码运行次数:0
运行
复制
mysql> select * from tbl_emp a right join tbl_dept b on a.deptld=b.id;
MySQL的多表联合查询(图11)
MySQL的多表联合查询(图11)
MySQL的多表联合查询(图12)
MySQL的多表联合查询(图12)
代码语言:javascript
代码运行次数:0
运行
复制
mysql> select * from tbl_emp a right join tbl_dept b on a.deptld=b.id where a.deptld is null;
MySQL的多表联合查询(图13)
MySQL的多表联合查询(图13)

2.4 内连接inner join

内连接是一种一一映射关系,即左右两张表都同时存在的记录才能显示出来,用韦恩图表示是两个集合的交集。

MySQL的多表联合查询(图14)
MySQL的多表联合查询(图14)
代码语言:javascript
代码运行次数:0
运行
复制
mysql> select * from tbl_emp a inner join tbl_dept b on a.deptld=b.id;
MySQL的多表联合查询(图15)
MySQL的多表联合查询(图15)

2.5 Other JOINS

MySQL的多表联合查询(图16)
MySQL的多表联合查询(图16)
MySQL的多表联合查询(图17)
MySQL的多表联合查询(图17)
代码语言:javascript
代码运行次数:0
运行
复制
mysql> select * from tbl_emp a left join tbl_dept b on a.deptld=b.id where b.id is null
    -> union
    -> select * from tbl_emp a right join tbl_dept b on a.deptld=b.id where a.deptld is null;
MySQL的多表联合查询(图18)
MySQL的多表联合查询(图18)
MySQL的多表联合查询(图19)
MySQL的多表联合查询(图19)
代码语言:javascript
代码运行次数:0
运行
复制
mysql> select * from tbl_emp a left join tbl_dept b on a.deptld=b.id
    -> union
    -> select * from tbl_emp a right join tbl_dept b on a.deptld=b.id;
代码语言:javascript
代码运行次数:0
运行
复制
select * from tbl_emp a full outer join tbl_dept b on a.deptld=b.id;
【注】MySQL不支持该语法,Oracle支持。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、MySQL多表联合查询介绍
    • 1.1 语法
    • 1.2 SQL执行顺序
  • 二、MySQL多表联合查询演示
    • 2.1 数据准备
    • 2.2 左连接left (outer) join
    • 2.3 右连接right (outer) join
    • 2.4 内连接inner join
    • 2.5 Other JOINS
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档