MySQL 连接查询

摘要:
我们可以利用工会来实现我们的目标。上的过滤顺序优先于以下位置:;Semantic on是两个表的连接条件。其中将过滤上一个结果集。6.扩展:fulljion全连接(oracle中有fulljoin,但mysql中没有fulljoin)。

一.什么是连接查询

1.连接查询是一种非常常见的数据库操作,在两张(或者多张)表中进行匹配.

2.以mysql为例,支持Cross join(交叉连接), inner join(内连接), outer join(外连接),等其他连接.

 二、数据准备(创建emp员工表和dept部门表并插入数据)

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for emp
-- ----------------------------
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp`  (
  `id` int(11) NOT NULL,
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `dept_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `dept_id`(`dept_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of emp
-- ----------------------------
INSERT INTO `emp` VALUES (1, '刘备', 3);
INSERT INTO `emp` VALUES (2, '关羽', 3);
INSERT INTO `emp` VALUES (3, '张飞', 3);
INSERT INTO `emp` VALUES (4, '张角', 2);
INSERT INTO `emp` VALUES (5, '张宝', 2);
INSERT INTO `emp` VALUES (6, '张梁', 2);
INSERT INTO `emp` VALUES (7, '曹操', 1);
INSERT INTO `emp` VALUES (8, '曹丕', 1);
INSERT INTO `emp` VALUES (9, '曹植', 1);
INSERT INTO `emp` VALUES (10, '曹冲', 1);
INSERT INTO `emp` VALUES (11, '孙权', 0);

SET FOREIGN_KEY_CHECKS = 1;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for dept
-- ----------------------------
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept`  (
  `id` int(11) NOT NULL,
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES (1, '人力资源部');
INSERT INTO `dept` VALUES (2, '财务部');
INSERT INTO `dept` VALUES (3, '后勤部');
INSERT INTO `dept` VALUES (4, '法务部');

SET FOREIGN_KEY_CHECKS = 1;

三、连接实战

MySQL 连接查询第1张

select * from dept;
select * from emp;
-- 交叉连接 
select * from dept,emp; -- 44条数据 笛卡尔积 a表的长度 * b表的长度
select * from dept cross join emp;  -- 笛卡尔积在查询的时候没有太大的意义,在数学上表示所有可能性
-- 内连接是查询出满足条件的数据
--  inner join 隐式内连接
select * from emp as a,dept as b where a.dept_id=b.id;
-- 显式内连接 
select * from emp as a join dept as b on a.dept_id = b.id;
-- outer join 外连接(包含左外连接和右外连接)
-- 左外连接(以左表为主表,右表为从表)
-- 主表全部显示,从表只有匹配到才显示,如果没有匹配到就显示null
select * from emp a left join dept b on a.dept_id=b.id;
-- 右外连接(以右表为主表,左表为从表)
select * from emp a right join dept b on a.dept_id=b.id;

四、例题(A表示emp表,B表示dept表)

MySQL 连接查询第2张

select * from emp as a join dept as b on a.dept_id = b.id;  -- 显式内连接

MySQL 连接查询第3张

select * from emp as a left join dept as b on a.dept_id = b.id;

MySQL 连接查询第4张

select * from emp as a right join dept as b on a.dept_id = b.id;

MySQL 连接查询第5张   A表的非交集数据

select * from emp as a left join dept as b on a.dept_id = b.id where b.id is null;

MySQL 连接查询第6张B 表的非交集数据

select * from emp as a right join dept as b on a.dept_id = b.id where a.id is null;

MySQL 连接查询第7张

-- union 全连接
select * from emp as a left join dept as b on a.dept_id = b.id
union -- union 自动去重
select * from emp as a right join dept as b on a.dept_id = b.id;

select * from emp as a left join dept as b on a.dept_id = b.id
union all -- union all 不会自动去重
select * from emp as a right join dept as b on a.dept_id = b.id;

扩展:oracle里面有full join,但是在mysql中没有full join。我们可以使用union来达到目的。

MySQL 连接查询第8张

select * from emp as a left join dept as b on a.dept_id = b.id where b.id is null
union
select * from emp as a right join dept as b on a.dept_id = b.id where a.dept_id is null;

五、扩展:where 和 on 的区别?

  (1) 筛选的顺序 on 优先于 where ;

  (2) 语意 on 是两张表的连接条件(外键关联), where会把前面的结果集进行筛选(可以筛选所有字段条件)

六 、扩展: full jion 全连接(oracle里面有full join,但是在mysql中没有full join。我们可以使用union来达到目的。)

-- full join 的用法
select a.id,a.name,a.dept_id,b.id,b.name from emp as a full join dept as b on a.dept_id = b.id;

七、总结 : SQL连接查询,柠檬班公开课学习后总结! 不足之处后续补充!

免责声明:文章转载自《MySQL 连接查询》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用FreeRTOS进行性能和运行时分析linux总结shell下篇

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

相关文章

数据库性能优化

MySQL基础表和数据 数据库访问优化法则 了解计算机系统的硬件基本性能指标,可以快速找到SQL的性能瓶颈点,下面是当前主流计算机性能指标数据。 从图上可以看到基本上每种设备都有两个指标: 延时(响应时间):表示硬件的突发处理能力; 带宽(吞吐量):代表硬件持续处理能力。 从上图可以看出,计算机系统硬件性能从高到代依次为: CPU——Cache(L1-L...

MySQL高级知识(二)——Join查询

前言:该篇主要对MySQL中join语句的七种情况进行总结。 0.准备 join主要根据两表或多表之间列的关系,从这些表中进行数据的查询。 首先创建两张表:tb_emp(员工表)和tb_dept(部门表),并插入相关测试数据。 1.tb_emp表。 DROP TABLE IF EXISTS `tb_emp`; CREATE TABLE `tb_emp`...

MySQL 日期与时间的处理

1.查询当前日期时间:函数有now(),localtime(),current_timestamp(),sysdate()。 mysql> select now(),localtime(),current_timestamp(),sysdate(); +---------------------+---------------------+--...

FLASHBACK介绍

在介绍flashback之前先介绍下undo_retention相关参数 undo_retention:表示undo数据的过期时间。系统默认这个时间设置为900即15分钟。但要注意,保证undo数据在这个时间内有效的前提是undo表空间有                         足够的空间存储。如果undo空间已满且又有新事务执行则会覆盖...

MySQL数据库之xtrabackup物理备份(一)

前言:说到数据库备份,我们知道可以用来对数据库进行备份的工具有mysqldump、mydumer、mysqlpump等等,实际工作中,机器上的数据库不大的话,都是用mysqldump工具来备份,这些备份工具各有优缺点,这里不详细介绍,今天分享另一个数据库备份工具,叫XtraBackup。一、Xtrabackup介绍 1.官网说明 Percona XtraB...

关于mysql installer 的安装和环境变量配置

MySQL针对不同的用户提供了2中不同的版本: MySQL Community Server:社区版。由MySQL开源社区开发者和爱好者提供技术支持,对开发者开放源代码并提供免费下载。 MySQL Enterprise Server:企业版。包括最全面的高级功能和管理工具,不过对用户收费。 下面讲到的MySQL安装都是以免费开源的社区版为基础。打开My...