表连接查询(多表查询,内连接,左外连接,右外连接)-程序员宅基地

技术标签: mysql  

  • 什么是表连接:同时对多张表进行查询操作,表与表之间要通过连接条件来连接。一般这个连接条件是主键列是否等于外键列。表连接的主要三种方式是:
连接方式 概念说明
内连接 分为显示内连接和隐式内连接,查询的数据必须左右两表都存在才会显示
左连接 又叫左外连接,查询的数据以左表为准,即使左表中的数据在其他表中没有匹配也会查询出来,且会以null补齐
右连接 又叫右外连接,和左外连接相反,查询的数据以右表为准,即使右表中的数据在其他表中没有匹配也会查询出来,且会以null补齐

数据准备:

#创建一个数据库company
CREATE DATABASE IF NOT EXISTS company;

#创建部门表
CREATE TABLE dept(
	id INT PRIMARY KEY AUTO_INCREMENT,
	`name` VARCHAR(20)
);

#往部门表中插入多条数据
INSERT INTO dept(`name`) VALUES ('研发部'),('销售部'),('财务部');

#查询部门表中数据
SELECT * FROM dept;


#创建员工表
CREATE TABLE employee(
	id INT PRIMARY KEY AUTO_INCREMENT,
	`name` VARCHAR(10),
	address VARCHAR(30),
	age INT,
	sex CHAR(1),
	dept_id INT,
	FOREIGN KEY (dept_id) REFERENCES dept(id)  #外键,关联部门表(部门表的主键)
);

#往员工表中插入多条员工信息
INSERT INTO employee VALUES
	(NULL,'小明','南昌',24,'男',1),
	(NULL,'小红','九江',20,'女',1),
	(NULL,'小兰','抚州',19,'女',2),
	(NULL,'小龙','宜春',18,'男',2),
	(NULL,'小军','赣州',23,'男',3);
	
#查询员工表中的数据
SELECT * FROM employee;

部门表:
在这里插入图片描述
员工表:
在这里插入图片描述

一、多表查询

1.1 完成多表操作的两种方式:
(1)通过表连接查询
(2)通过子查询

1.2 笛卡尔积现象

  • 什么是笛卡尔积:
-- 需求:查询所有的员工和所有的部门
SELECT * FROM dept,employee;

结果如下:
在这里插入图片描述
结果分析:左表是部门表,右表是员工表,左表中每一行记录与右表中的每一行记录全都匹配一次。
结果的行数=左表中行数x右表中行数
在这里插入图片描述
1.3 清除笛卡尔积现象的影响

-- 设置过滤条件
-- 指定过滤条件 主表.主键=从表.外键
SELECT * FROM dept,employee WHERE dept.id = employee.dept_id;

--可以给表起别名
SELECT * FROM dept d,employee e WHERE d.id = e.dept_id;

结果如下:
在这里插入图片描述
注:以上过滤以后的结果成为隐式内连接

二、内连接

2.1 隐式内连接

  • 概念:看不到JOIN关键字,条件使用WHERE指定;上述解决笛卡尔积现象的案例就是隐式内连接。

2.2 显式内连接

  • 概念:无论是显式内连接还是隐式内连接其查询结果是一样的,只是写法不同。显式内连接使用INNER JOIN …ON语句,可以省略INNER

select 列名 from 左表 inner join 右表 on 主表.主键=从表.外键

SELECT * FROM dept INNER JOIN employee ON dept.id = employee.dept_id;
  • 案例:查询小龙的信息,显示员工id,姓名,地址,年龄和所在的部门名称,我们发现需要联合2张表同时才能查询出需要的数据,使用内连接
SELECT e.id,e.name,e.address,e.age,d.name     --(4)
FROM employee e INNER JOIN dept d      --(1)
ON d.id = e.dept_id                    --(2)
WHERE e.name = "小龙";                 --(3)

结果如下:
在这里插入图片描述
2.3 内连接查询步骤:
(1)确定查询哪些表
(2)确定表连接的条件,通常是 主表.主键=从表.外键
(3)确定查询条件
(4)确定查询的列

三、左外连接

左连接的概念:查询的数据以左表为准,即使在其他表中没有匹配的记录也会显示出来。

select 列名 from 左表 left join 右表 on 表连接条件

注:左外连接使用LEFT OUTER JOIN … ON,其中OUTER可以省略

  • 案例:在部门表中增加一个行政部,需要查询所有的部门和员工,将部门表设置成左表,员工表设置成右表;比较内连接和左外连接的区别。
    (1)内连接查询
--向部门表插入行政部
INSERT INTO dept VALUE(NULL,"行政部");

--内连接
SELECT * FROM dept d INNER JOIN employee e ON d.id = e.dept_id

结果如下:
在这里插入图片描述
结果分析:可以看出在使用内连接的情况下与员工表没有匹配记录的行政部不见了

(2)左连接查询

#左外连接
SELECT * FROM dept d LEFT JOIN employee e ON d.id = e.dept_id

结果如下:
在这里插入图片描述
结果分析:左表的数据全部显示出来,而右表中如没以左表匹配的记录则显示为null。

四、右外连接

右连接的概念:查询的数据以右表为准,即使在其他表中没有匹配的记录也会显示出来

select 列名 from 左表 right join 右表 on 表连接条件

注:右外连接使用RIGHT OUTER JOIN … ON, 其中OUTER可以省略

  • 案例:在员工表中增加一个员工,但该员工还未分配部门;比较内连接和右外连接的区别。
--在员工表中插入一个未分配部门的员工信息
INSERT INTO employee VALUE(NULL,"小赵","吉安",26,"男",NULL);

SELECT * FROM employee;

结果如下:
在这里插入图片描述
(1)内连接查询

--内连接查询
SELECT * FROM dept d INNER JOIN employee e ON d.id = e.dept_id;

结果如下:
在这里插入图片描述
结果分析:可以看出在使用内连接的情况下与部门表没有匹配记录的员工小赵不见了。

(2)右外连接查询

--右外连接查询
SELECT * FROM dept d RIGHT JOIN employee e ON d.id = e.dept_id;

结果如下:
在这里插入图片描述
结果分析:右表的数据全部显示出来,而左表中如没以右表匹配的记录则显示为null。

五、全连接

根据上面简述,我们知道左连接是无论如何左表的数据都能够显示全,右连接是右表的数据无论如何都能够显示全,那么如果我们希望左表和右表的数据都能够显示全面呢(在对方表中没有匹配的数据就以null补齐)?这种连接查询我们称之为全连接(full join),但是很遗憾,MySQL并没有提供全连接,但Oracle支持;
虽然MySQL不支持全连接,但是我们可以利用MySQL提供的其它功能来完成全连接的功能:left join + right join

SELECT * FROM dept d LEFT JOIN employee e ON d.id = e.dept_id
UNION        --union 是并集的意思
SELECT * FROM dept d RIGHT JOIN employee e ON d.id =e.dept_id;

结果如下:
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45097432/article/details/119716759

智能推荐

mysql Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’_can't connect to local mysql server through socket-程序员宅基地

文章浏览阅读1.6w次,点赞11次,收藏14次。mysql Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock_can't connect to local mysql server through socket '/var/lib/mysql/mysql.soc

[Mac]图像处理JPEG工具箱jpegtbx_1.4的MATLAB编译及使用_% 需要包含有jpeg压缩的工具包jpegtbx_1.4-程序员宅基地

文章浏览阅读1.5k次,点赞4次,收藏5次。macOS上如何在MATLAB中编译使用jpegtbx_1.4?预备:jpegtbx_1.4全称是JPEG Toolbox v1.4,是一个对JPEG图像进行处理的函数集合。这个工具箱可以借助MATLAB提取出JPEG图像的头信息、编码信息、DCT系数矩阵、量化表、哈夫曼表等JPEG元素,以供我们图像处理、信息隐藏来使用。这个工具箱基于IJG(i.e. Independent JPEG Gro..._% 需要包含有jpeg压缩的工具包jpegtbx_1.4

php初学实验题二_php建立一个静态页面,可以输入5个同学的成绩,点击“计算”按钮之后,跳转到动态-程序员宅基地

文章浏览阅读1k次。实验目的:1、了解数组的概念2、掌握定义、创建数组的方法3、掌握获取、输出数组元素的方法4、掌握遍历数组元素的方法5、掌握数组的合并、反转、排序数组元素实验环境:Windows10,phpstudy8.1,apache2.4,MySQL5.7。实验一:题目:定义一个数组,数组元素包括“星期一”、“星期二”、“星期三”、“星期四”、“星期五”、“星期六”、“星期日”。使用foreach语句,在网页上显示:实验源码:<!doctype html><html_php建立一个静态页面,可以输入5个同学的成绩,点击“计算”按钮之后,跳转到动态

《我爱上班》-程序员完整版(年会超逗节目, 附各种搞笑动作)_程序员年会节目-程序员宅基地

文章浏览阅读4.4w次,点赞8次,收藏16次。年会程序员节目表演_程序员年会节目

DBeaver 深色主题安装教程_dbeave install new software-程序员宅基地

文章浏览阅读8.7k次,点赞9次,收藏14次。dbeaver 深色主题安装教程官方GitHub安装教程1、Copy URL of extension update site: 2、In DBeaver main menu open Help -> Install New Software3、Paste update site URL into Work with field and press Enter4、Check items you wish to install (in most cases just all items) 5_dbeave install new software

计算机组成原理<五>——存储系统_dram的地址线复用技术-程序员宅基地

文章浏览阅读3.8k次,点赞33次,收藏70次。接受平凡,努力出众,承认普通,但拒绝沉沦于平庸。大家好,我是你们的老朋友,小KK。存储系统基本概念存储器的层次结构_dram的地址线复用技术

随便推点

ARM 体系结构、处理器内核、内存及 IO-程序员宅基地

文章浏览阅读1.8k次。教材:嵌入式系统及应用,罗蕾、李允、陈丽蓉等,电子工业出版社体系结构ARM 是典型的 RISC 体系,许多指令能够在单周期内执行高速缓存内核MPU – 内存保护单元控制内存访问权限控制内存区域的属性(cacheable, bufferable)MMU – 内存管理单元具有MPU的所有特性;提供虚拟地址到物理地址的转换Cache(高速缓存)快速的本地内存;存放最近被访问过的内存的副本TCM

span设置值、获取span 的值_java document select 设置span文本值-程序员宅基地

文章浏览阅读2.2w次。设置span的值$("#aa").text("新增用户信息"); 说明:#aa是span的id;text("这里是设置的值");注意:一定要双引号,获取span 的值var aa = $("#aa").html();获取并设置值var aa = $("#aa").html().innerHtml="新增用户信息";..._java document select 设置span文本值

【Android】performClick()方法_android performclick-程序员宅基地

文章浏览阅读3.1k次。1. performClick()方法的作用: performClick()方法 是使用代码主动去调用控件的点击事件(模拟人手去触摸控件) 2. 使用注意事项: 如果同时使用了view.setOnTouchListener()方法,则有可能存在拦截view.performClick()的响应事件, 因为当view.OnTouchEvent()在event.getActio..._android performclick

Eclipse中java项目引用dll库的路径设置(System.loadLibrary()调用Dll路径问题)-程序员宅基地

文章浏览阅读2k次。右击项目名|选择属性properties|在左边列表内选择“Java Build Path”|在右边选项卡用选择“source”|点开项目名前的“+”号,选择“Native library location”,“Edit”选择上面dll路径。(当然如果将dll拷贝到workspace下也可以用相对路径。也可右击“src”设定其properties内Native Library项。)..._system.loadlibrary 路径

C++学习15:侯捷C++标准库和C++11入门_侯捷的算法与数据结构-程序员宅基地

文章浏览阅读729次。1 粗看STL程序=数据结构+算法数据结构:容器Containers算法:Algorithms容器和算法在C++标准库中给了定义,要看懂,要会用,要常用。2 C++11有助于使用的三个主题2.1 variadic templates,数量不定的模板参数语法:typename…,这三个点已经成为了语言的一部分。void print(){}template<typena..._侯捷的算法与数据结构