表连接查询(多表查询,内连接,左外连接,右外连接)
- 什么是表连接:同时对多张表进行查询操作,表与表之间要通过连接条件来连接。一般这个连接条件是主键列是否等于外键列。表连接的主要三种方式是:
连接方式 | 概念说明 |
---|---|
内连接 | 分为显示内连接和隐式内连接,查询的数据必须左右两表都存在才会显示 |
左连接 | 又叫左外连接,查询的数据以左表为准,即使左表中的数据在其他表中没有匹配也会查询出来,且会以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;
结果如下:
表连接查询(多表查询,内连接,左外连接,右外连接)相关推荐
- 内连接,外连接(左外,右外),全连接(交集),交叉连接(笛卡尔积)
内连接,外连接(左外,右外),全连接(交集),交叉连接(笛卡尔积) 先略两个表 首先左连接:SELECT * FROM test1 a LEFT JOIN test2 b ON a.id = b.id ...
- 数据库的简单查询和复杂查询
简单查询 a) 模糊条件查询 示例:查询员工姓名中含有字母e的员工有哪些 SELECT * FROM emp WHERE ename LIKE '%e%' ; 练习:查询姓名中以e结尾的员工有哪些 S ...
- MySQL 数据查询.多表查询.内连接
一.多表连接查询: 内连接:相当于查询A和B交集部分的数据 外连接: 左外连接:查询左表所有数据,以及两表相交的部分数据 右外连接:查询右表所有数据,以及两表相交的部分数据 自连接:当前表与自身的连接 ...
- 【MySQL】(八)多表查询——内连接查询、外连接查询、子查询
目录 1. 多表关系简介 1.1 一对多 1.2 多对多 1.3 一对一 2. 多表查询与笛卡尔积 2.1 多表查询与数据准备 2.2 笛卡尔积简介 3. 内连接查询 3.1 内连接的定义 3.2 隐 ...
- Oracle数据库多表连接查询操作以及查询操作的补充
文章目录 一.查询语句概述 1.查询语句基本语法格式 2.伪表和伪劣 二.单表查询 1.select子句 2.FROM子句 3.WHERE子句 4.DISTINCT关键字 5.GROUP BY子句与聚 ...
- 周末杂谈:在MYSQL中,添加数据行后,使用右外连接查询所有课程的选修情况,要求列出课程编号、课程名称、选修人数,表中没有的课程列值为空的解决方法
周末杂谈:在MYSQL中,添加数据行后,使用右外连接查询所有课程的选修情况,要求列出课程编号.课程名称.选修人数,表中没有的课程列值为空的解决方法 实验前期准备 course表(课程表) 在其中: c ...
- open表和closed表_什么是左外连接?左外连接在工作表查询中的应用
大家好,我们今天接着讲连接的方式的第二种,左外连接.在上两讲中,我们讲了内连接,并用内连接分别连接数据库和EXCEL进行了实例的应用讲解,我们今日讲解第二种连接:左外联接. 所谓左外联接,是以左表为基 ...
- 连接查询(交叉连接,内连接,外连接,自然连接)
创建一个学生表和一个课程表.先放出实验的表结构: create table student( id int, name varchar(15), gender varchar(15), cid int ...
- mysql 三个表的外连接方式,MySQL表连接使用详解,内连接,外连接,交叉连接
本章节向大家介绍如何使用 MySQL 的 JOIN 在两个或多个表中查询数据. 前提如下供后面学习所用: 查看学生表的全部记录SELECT * FROM STUDENT; 查看地址表的全部记录:SEL ...
最新文章
- SQL Server孤立账户解决办法
- python 静态方法 类方法 的作用_Python实例方法、类方法、静态方法的区别与作用详解...
- 手把手教你EMD算法原理与Python实现(更新)
- C C coding rule Using Directives Must Be Placed Within
- UEStudio使用入门
- matlab从入门到精通-常用的几种缺失值处理方法
- sklearn one_hot向量输出维度第2维大小的本质
- C#的static,interface,virtual,abstract,override的区别用法
- “阿里云 Cloud AIoT Native” 等你一“名”惊人
- ashx 跨域_ASP.NET通用HTTP处理程序(ashx的),支持JSONP
- 【sqlite权威指南】笔记3 sqlite入门
- 伦敦帝国学院M+T实验室,全奖博士招生
- 2021年,深度学习还有哪些有潜力且处于上升期的研究方向?
- git 2015-5-26
- My.WinformMvc,一个 Winform MVC 框架
- 利用linux内核代码玩转c链表
- 激光slam理论与实践
- Tensorflow多输入模型构建以及Dataset数据构建
- 装系统提示缺少计算机所需的介质驱动程序,win8系统UEFi安装提示“缺少计算机所需的介质驱动程序”的图文步骤...
- 《逆流而上+阿里巴巴技术成长之路》 免费电子版