一、join从句共有5种类型

  • 内连接(inner join)
  • 全外连接(full outer join)
  • 左外连接(left outer join)
  • 右外连接(right outer join)
  • 交叉连接(cross join)

二、演示案例

新建两张表user1表和user2表

CREATE TABLE `user2` (`id` int(11),`user_name` varchar(255),`over` varchar(255) ,PRIMARY KEY (`id`)) ;
INSERT INTO `user2` VALUES ('', '孙悟空', '成佛');
INSERT INTO `user2` VALUES ('', '牛魔王', '被降服');
INSERT INTO `user2` VALUES ('', '蛟魔王', '被降服');
INSERT INTO `user2` VALUES ('', '鹏魔王', '被降服'); CREATE TABLE `user1` (`id` int(11),`user_name` varchar(255),`over` varchar(255),PRIMARY KEY (`id`)) ;
INSERT INTO `user1` VALUES ('', '唐僧', '檀功德佛');
INSERT INTO `user1` VALUES ('', '猪八戒', '净坛使者');
INSERT INTO `user1` VALUES ('', '孙悟空', '斗战胜佛');
INSERT INTO `user1` VALUES ('', '沙僧', '金身罗汉');

            

内连接:

将两张表的列组合在一起,产生新的结果表

问题:查询出同时存在于user1表和user2表中的数据

方法:

select a.user_name, a.over, b.user_name, b.over from user1 a inner join user2 b on a.user_name = b.user_name;

左外连接:

问题:查询user1表中哪些人不在user2表中

方法:

select a.user_name, a.over, b.user_name, b.over from user1 a left join user2 b on a.user_name = b.user_name where b.user_name is null;

右外连接:

问题:查询user2表中哪些人不在user1表中

方法:

select a.user_name, a.over, b.user_name, b.over from user1 a right join user2 b on a.user_name = b.user_name where a.user_name is null;

全连接:

mysql中并不支持直接使用full join,需要通过间接的方式实现,使用union all实现查询user1表和user2表中所有数据集合

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

交叉连接:

又称笛卡尔连接

select a.user_name, a.over, b.user_name, b.over from user1 a cross join user2 b

三、使用join优化

使用join更新表
问题:把同时存在于user1表和user2表中的记录的人在user1表中的over字段更新为‘齐天大圣’

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 = '齐天大圣'

使用join优化聚合子查询

这里我们需要另外再创建一张表记录打怪数量和日期

CREATE TABLE `user_kills` (`id` int(11),`user_id` int(11),`timestr` varchar(255) ,`kills` int(11), PRIMARY KEY (`id`)) ;

问题:查询每个人打怪最多的日期
方法一:

select a.user_name,b.timestr,b.kills from user1 a join user_kills b on a.id=b.user_id where b.kills=(select max(c.kills) from user_kills c where c.user_id=b.user_id);

子查询效率低

方法二:

select a.user_name,b.timestr,b.kills from user1 a join user_kills b on a.id=b.user_id join user_kills c on b.user_id=c.user_id group by a.user_name,b.timestr,b.kills HAVING b.kills=MAX(c.kills);

分组选择查询

问题:查询每个人打怪最多的两个日期

SELECT a.user_name, b.timestr, b.kills FROM user1 a JOIN user_kills b ON a.id = b.user_id WHERE (SELECT COUNT(c.id) FROM user_kills c where c.user_id = b.user_id and c.kills >= b.kills) <= 2 ORDER BY a.id;

mysql学习之join从句的更多相关文章

  1. mysql学习之join用法

    转载  一张图看懂 SQL 的各种 join 用法 一.JOIN 使用介绍 下面例子使用的数据表如下: -- ---------------------------- -- Table structu ...

  2. 我的MYSQL学习心得(五) 运算符

    我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  3. 我的MYSQL学习心得(十一) 视图

    我的MYSQL学习心得(十一) 视图 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  4. 我的MYSQL学习心得(十六) 优化

    我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  5. Mysql学习笔记(三)对表数据的增删改查。

    正文内容. 这一部分是最简单的,也是最麻烦的.简单是因为其实只包括增删该插四个部分.大体上看,增加数据.删除数据.修改数据.查询数据都不麻烦啊,我们日常都是常用的.这个谁不会呢?以前在培训机构学mys ...

  6. 我的MYSQL学习心得(十一)

    原文:我的MYSQL学习心得(十一) 我的MYSQL学习心得(十一) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYS ...

  7. Mysql 学习之EXPLAIN作用

    一.MYSQL的索引 索引(Index):帮助Mysql高效获取数据的一种数据结构.用于提高查找效率,可以比作字典.可以简单理解为排好序的快速查找的数据结构.索引的作用:便于查询和排序(所以添加索引会 ...

  8. 91 Testing MySQL学习总结

    91 Testing MySQL学习总结 --------- 在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System什么是数据库?数据 ...

  9. mysql学习【第4篇】:MySQL函数和编程

    狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! mysql学习[第4篇]:MySQL函数 官方文档 : 官方文档 常用函数 分类: 数学函数 , ...

随机推荐

  1. Mina整体体系结构分析

    mina在应用程序中处于什么样的地位? mina屏蔽了一些网络通信细节对socket进行封装,并且基于NIO非阻塞框架,可以帮助我们快速开发网络通信,常常用于用户游戏开发,中间件等服务端应用程序.

  2. DOM操作2

    一.API和WebAPI API就是接口,就是通道,负责一个程序和其他软件的沟通,本质是预先定义的函数. Web API是网络应用程序接口.包含了广泛的功能,网络应用通过API接口,可以实现存储服务. ...

  3. 关于 js 函数参数的this

    先看一道面试题: var number = 10; function fn() { console.log(this.number); } var obj = { number: 2, show: f ...

  4. Redis Mysql 双写一致性问题

    一:序 - 最近在对数据做缓存时候,会涉及到如何保证 数据库/Redis 一致性问题. - 刚好今天来总结下 一致性问题 产生的问题,和可能存在的解决方案. 二:(更新策略)-  先更新数据库,后更新 ...

  5. a=”hello”和b=”世界”编码成bytes类型

    a="hello" c=a.encode(encoding='utf-8') a = b'hello' b="世界" b = b.encode(encoding ...

  6. 简述with原理

    with open('x') as f: for line in f: print(line.replace('a', 'b')) 不管在处理文件过程中是否发生异常,都能保证 with 语句执行完毕后 ...

  7. selenium鼠标下滑操作

    # coding = utf-8 import time from selenium import webdriver from selenium.webdriver.common.by import ...

  8. 提高十连测day3

    提高十连测day3 A 我们可以枚举两个 $ 1 $ 之间的相隔距离,然后计算形如 $ 00100100 \cdots $ 的串在原串中最⻓⼦序列匹配即可,复杂度 $ O(n^2) $ .寻找 $ S ...

  9. class 绑定的数据对象不必内联定义在模板里

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. spring boot 集成RabbitMQ的异常

    com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.clos ...