【MySQL】014-join连接语句用法详解
目录
0、警醒自己
一、SQL标准中Join的类型
1、含义解释
二、Inner Join(内连接)
1、概述
2、语法格式
3、使用演示
相关表:
相关表的SQL语句:
查询需求:
SQL语句:
执行结果:
三、Left Outer Join(左外连接)
1、概述
2、语法格式
3、补充
图示:
语法格式:
4、演示
SQL语句:
执行结果:
另一句SQL语句:
执行结果:
还有一句SQL语句:
执行结果:
四、RightOuter Join(右外连接)
1、概述
2、语法格式
3、演示
SQL语句:
执行结果:
五、Full Join(全连接)
1、概述
2、语法格式
第一种情况:
第二种情况:
3、演示问题
问题:
答案:
4、解决问题
原理:
语法格式:
SQL语句演示:
执行结果:
另一句SQL语句:
执行结果:
六、Cross Join(交叉连接或笛卡尔连接)
1、概述
2、语法格式
3、演示
SQL语句:
执行结果:
七、使用Join更新表
1、需求描述
2、SQL语句实现(存在问题)
3、执行结果
4、解决方案:
5、执行结果:
八、使用Join优化子查询
1、优化前
SQL语句:
执行结果:
2、优化后
SQL语句:
执行结果(据说效率更高了):
九、使用Join优化聚合子查询
1、打怪表相关SQL
2、需求描述
3、演示
SQL语句:
执行结果:
优化后的SQL语句:
执行结果:
0、警醒自己
1、学习不用心,骗人又骗己;
2、学习不刻苦,纸上画老虎;
3、学习不惜时,终得人耻笑;
4、学习不复习,不如不学习;
5、学习不休息,毁眼伤身体;
7、狗才等着别人喂,狼都是自己寻找食物;
一、SQL标准中Join的类型
1、含义解释
①内连接仅选出两张表中相互匹配的记录,外链接会选出其他不匹配的记录,最常用的是内连接;
②左外连接:包含所有左表中的记录,甚至是右表中没有和它匹配的记录;
③右外连接:包含所有右表中的记录,甚至是左表中没有和它匹配的记录;
二、Inner Join(内连接)
1、概述
仅选出两张表中相互匹配的记录;
(join和inner join没有区别)
基于链接谓词将两张表(如A和B)的列组合在一起,产生新的结果表;
(红色代表的是A和B共同拥有的字段,比如id、username等等,相当于将两张表组成一张表,再根据条件进行查询)
2、语法格式
select <select_list> from TableA A inner join TableB B on A.Key = B.Key
3、使用演示
相关表:
相关表的SQL语句:
-- 创建user1表CREATE TABLE `user1` (`id` int(11) NOT NULL COMMENT '主键',`user_name` varchar(255) DEFAULT NULL COMMENT '姓名',`over` varchar(255) DEFAULT NULL COMMENT '结局',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- 插入数据到user1表INSERT INTO `zibo`.`user1`(`id`, `user_name`, `over`) VALUES (1, '唐僧', '旃檀功德佛');INSERT INTO `zibo`.`user1`(`id`, `user_name`, `over`) VALUES (2, '猪八戒', '净坛使者');INSERT INTO `zibo`.`user1`(`id`, `user_name`, `over`) VALUES (3, '孙悟空', '斗战胜佛');INSERT INTO `zibo`.`user1`(`id`, `user_name`, `over`) VALUES (4, '沙僧', '金身罗汉');-- 创建user2表CREATE TABLE `user2` (`id` int(11) NOT NULL COMMENT '主键',`user_name` varchar(255) DEFAULT NULL COMMENT '姓名',`over` varchar(255) DEFAULT NULL COMMENT '结局',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- 插入数据到user2表INSERT INTO `zibo`.`user2`(`id`, `user_name`, `over`) VALUES (1, '孙悟空', '成佛');INSERT INTO `zibo`.`user2`(`id`, `user_name`, `over`) VALUES (2, '牛魔王', '被降服');INSERT INTO `zibo`.`user2`(`id`, `user_name`, `over`) VALUES (3, '蛟魔王', '被降服');INSERT INTO `zibo`.`user2`(`id`, `user_name`, `over`) VALUES (4, '鹏魔王', '被降服');INSERT INTO `zibo`.`user2`(`id`, `user_name`, `over`) VALUES (5, '狮驼王', '被降服');
查询需求:
同时是取经四人表与孙悟空和他的结拜兄弟表中的人的最终结局(同时在A、B两表中的实体的数据);
(两个表:A表和B表,A表中有孙悟空,B表中也有孙悟空,我们将A和B表连接组合,肯定是满足某一条件的数据进行整合,否则杂乱的数据无法排列,这个条件可以是名字相同,也可以是年龄相同等等)
SQL语句:
select a.user_name,a.over,b.over from user1 a inner join user2 b on a.user_name = b.user_name;
执行结果:
三、Left Outer Join(左外连接)
1、概述
包含所有左表中的记录,甚至是右表中没有和它匹配的记录;
2、语法格式
select <select_list> from TableA A left join TableB B on A.Key = B.Key
3、补充
图示:
语法格式:
select <select_list> from TableA A left join TableB B on A.Key = B.Key where B.key is null
4、演示
SQL语句:
select a.user_name,a.over,b.over from user1 a left join user2 b on a.user_name = b.user_name
执行结果:
另一句SQL语句:
select a.user_name,a.over,b.over from user1 a left join user2 b on a.user_name = b.user_name WHERE b.user_name is null;
执行结果:
还有一句SQL语句:
select a.user_name,a.over,b.over from user1 a left join user2 b on a.user_name = b.user_name WHERE b.user_name is not null;
执行结果:
四、RightOuter Join(右外连接)
1、概述
包含所有右表中的记录,甚至是左表中没有和它匹配的记录;
2、语法格式
select <select_list> from TableA A right join TableB B on A.Key = B.Key;
3、演示
(左连接和有连接正好是相反的,所以非常简单,咱们不上图了,直接演示;)
SQL语句:
select b.user_name,b.over,a.over from user1 a right join user2 b on a.user_name = b.user_name;
执行结果:
五、Full Join(全连接)
1、概述
全连接也就是左连接和右连接的合集;
(第一种情况)
(第二种情况)
2、语法格式
第一种情况:
select <select_list> from TableA A full join TableB B on A.Key = B.Key;
第二种情况:
select <select_list> from TableA A full join TableB B on A.Key = B.Key where a.key is null or b.key is null;
3、演示问题
问题:
select * from user1 a full join user2 b on a.user_name = b.user_name;
答案:
MySQL不支持全连接!
4、解决问题
原理:
全连接 = 左连接 + 有连接;
语法格式:
select <select_list> from TableA A left join TableB B on A.Key = B.Key union all select <select_list> from TableA A right join TableB B on A.Key = B.Key;
SQL语句演示:
select a.user_name,a.over,b.over from user1 a left join user2 b on a.user_name = b.user_name union all select b.user_name,b.over,a.over from user1 a right join user2 b on a.user_name = b.user_name;
执行结果:
另一句SQL语句:
select a.user_name,a.over,b.over from user1 a left join user2 b on a.user_name = b.user_name union all select b.user_name,b.over,a.over from user1 a right join user2 b on a.user_name = b.user_name where a.user_name is null or b.user_name is null;
执行结果:
六、Cross Join(交叉连接或笛卡尔连接)
1、概述
交叉连接,又称笛卡尔连接,或叉乘,如果A和B是两个集合,他们的交叉连接就是A x B;
集合A中的每一条数据与集合B中的每一条数据进行匹配产生的结果集;
2、语法格式
select * from TableA cross join TablkB;
3、演示
SQL语句:
select * from user1 cross join user2;
执行结果:
七、使用Join更新表
1、需求描述
将同时存在于user1和user2中的人的user1中的over字段更改为“齐天大圣”;
2、SQL语句实现(存在问题)
UPDATE user1
SET over = '齐天大圣'
WHEREuser1.user_name IN ( SELECT b.user_name FROM user1 a INNER JOIN user2 b ON a.user_name = b.user_name );
3、执行结果
4、解决方案:
(join和inner join没有区别)
UPDATE user1 a
JOIN ( SELECT b.user_name FROM user1 a INNER JOIN user2 b ON a.user_name = b.user_name ) b ON a.user_name = b.user_name
SET a.over = '齐天大圣';
5、执行结果:
八、使用Join优化子查询
1、优化前
SQL语句:
SELECTa.user_name,a.over,( SELECT b.over FROM user2 b WHERE a.user_name = b.user_name ) AS over2
FROMuser1 a;
执行结果:
2、优化后
SQL语句:
SELECTa.user_name,a.over,b.over AS over2
FROMuser1 aLEFT JOIN user2 b ON a.user_name = b.user_name;
执行结果(据说效率更高了):
九、使用Join优化聚合子查询
1、打怪表相关SQL
-- 创建打怪表
create table if not exists user_kills (id smallint unsigned primary key auto_increment,user_id smallint unsigned,timestr timestamp default CURRENT_TIMESTAMP,kills smallint unsigned
);-- 插入 user_kills 表数据
insert into user_kills(user_id, timestr, kills) values (2, timestamp('2013-01-10'), 10);
insert into user_kills(user_id, timestr, kills) values (2, timestamp('2013-02-01'), 2);
insert into user_kills(user_id, timestr, kills) values (2, timestamp('2013-02-05'), 12);
insert into user_kills(user_id, timestr, kills) values (4, timestamp('2013-01-10'), 3);
insert into user_kills(user_id, timestr, kills) values (4, timestamp('2013-02-11'), 5);
insert into user_kills(user_id, timestr, kills) values (2, timestamp('2013-02-06'), 1);
insert into user_kills(user_id, timestr, kills) values (3, timestamp('2013-01-11'), 20);
insert into user_kills(user_id, timestr, kills) values (2, timestamp('2013-02-12'), 10);
insert into user_kills(user_id, timestr, kills) values (3, timestamp('2013-02-07'), 17);
2、需求描述
查询出取经四人组中打怪最多的日期;
3、演示
SQL语句:
SELECTa.user_name,b.timestr,b.kills
FROMuser1 aJOIN user_kills b ON a.id = b.user_id
WHEREb.kills =(SELECTMAX( c.kills ) FROMuser_kills c WHEREc.user_id = b.user_id );
执行结果:
优化后的SQL语句:
SELECTa.user_name,b.timestr,b.kills
FROMuser1 aJOIN user_kills b ON a.id = b.user_idJOIN user_kills c ON c.user_id = b.user_id
GROUP BYa.user_name,b.timestr,b.kills
HAVINGb.kills = max( c.kills );
执行结果:
【MySQL】014-join连接语句用法详解相关推荐
- mysql like escape_mysql like语句用法详解 含通配符使用方法
mysql like语句用法详解 含通配符使用方法2017-11-07 20:46 在对数据进行模糊查询的时候,我们基本上都会用到like语句. 我们先来了解一下like语句中的通配符:百分号(%). ...
- MySQL中ESCAPE关键字的用法详解
MySQL中ESCAPE关键字的用法详解 MySQL中ESCAPE关键字的用法详解 1. mysql转义概述 2. escape验证 MySQL中ESCAPE关键字的用法详解 1. mysql转义概述 ...
- c语言for表达式1的作用,C语言for语句用法详解
C语言for语句用法详解 C语言是一门高级计算机编程语言,设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言.下面小编给大家介绍C语言f ...
- java if 用法详解_Java if判断语句用法详解
Java if判断语句用法详解 if关键字中文意思是如果,其细致的语法归纳来说总共有三种:if语句.if-else语句和if-else if-else语句,下面重点介绍if语句. if语句 语法 if ...
- 【C语言for语句用法详解】
** C语言for语句用法详解 说明 for语句用于重复执行一段语句块.通常会使用一个增量计数器递增和终止循环.for语句对于任何需要重复的操作是非常有用的. 结构 for(表达式1; 表达式2; 表 ...
- mysql exec call_exec和call用法详解
exec 和 call 用法详解 exec 和 call 执行一个procedure时, declare s_in varchar2(30):= ' where col=13 ' '; v_sql_s ...
- mysql中declare语句用法详解
mysql中的DECLARE语句是在复合语句中声明变量的指令. (1)Example with two DECLARE statements 两个DECLARE语句的实例 CREATE PROC ...
- Python中import语句用法详解
一. 什么是模块(module)? 在实际应用中,有时程序所要实现功能比较复杂,代码量也很大.若把所有的代码都存储在一个文件中,则不利于代码的复用和维护.一种更好的方式是将实现不同功能的代码分拆到多个 ...
- mysql执行事务的语句_详解MySQL执行事务的语法和流程
摘要:MySQL 提供了多种存储引擎来支持事务. MySQL 提供了多种存储引擎来支持事务.支持事务的存储引擎有 InnoDB 和 BDB,其中,InnoDB 存储引擎事务主要通过 UNDO 日志和 ...
- 【MySQL】MySQL中的查询语句的详解----等值连接、左连接、右连接、全连接
用两个表(t_worker,t_depart),关联字段t_worker.deptno和t_depart.deptno来演示一下MySQL的等值连接.左连接.右连接.全连接.数据库表:t_worker ...
最新文章
- 前瞻:Spring Boot 2.4.0 第二个里程碑版本发布
- PHP MySQL教程期末考试题及答案,PHPMySQL答案
- Android NDK环境搭建
- [网站链接]Debbie博客上的链接: [求职网站][博客链接][信息资源]……
- 七牛直播云服务技术揭秘
- diy感应usb摄像头拍照_DIY无线感应充电器
- linux命令 dstat,关于linux:每天学一个-Linux-命令103dstat
- 【字节网盘】emlog版收录导航主题模板
- 获取字符串中的汉字拼音首字母
- 20191121每日一句
- jquery mini下载_【芒果tv湖南卫视直播】-芒果TV播放器下载v6.3.4 官方正式版
- 安装mysql8避坑指南_2019 MySQL 8 安全安装避坑指南-Go语言中文社区
- Hibernate学习笔记(三) — Hibernate 的一级缓存意义
- php实现文件下载的几种方式
- 学习笔记:Java 并发编程①_基础知识入门
- 巧用千寻位置GNSS软件|逐点放样应用技巧
- 史玉柱退休继续“烧脑”手游成新宠
- 太牛了,搜狐快站上线微信插件 电商插件升级
- springboot项目搭建0000-导航篇
- HDU6194 后缀数组的应用
热门文章
- No such file or directory: ‘/tmp/tmpxxx/tmpxxx.py‘
- 【0520】密钥管理技术
- Axure原型|天猫、京东、拉钩等网站banner原型分享
- 1fichier.com-1TB免费FTP空间的使用
- 【深度强化学习】交叉熵方法
- Delphi中ComPort通信中的数据处理
- 2021中国工业软件上市企业公司排行2021中国智能制造企业排名
- 论文笔记 Question Answering over Freebase via Attentive RNN with Similarity Matrix based CNN
- 【开明关系系列之1】人脉关系大检阅
- 计算机无法删除tf卡的内容,SD卡文件无法删除怎么办?轻松掌握数据问题