MySql中join基础

在MySQL中,使用的最多就是join。理解他之后能对我们的业务代码有更深的概念。当然这里只是一个简单的入门,也只是个人理解,如有不正确的地方,也请见谅。

了解顺序

  1. 各种join的概念
  2. 对应关系
  3. (Hive中)join的原理

一.各种join的概念

  1. join的基本概念

    1. join实际上就是数学中的求交集。当我们说集合A={1,2,3,4,5},集合B={2,3},两个集合的交集时,实际上是在求两个集合的共同元素,也就是集合A的元素=集合B的 元素的个数。
    2. 放到现实世界中,集合A和集合B就不再是一维的,而是多维的。假设有两个人:

姓名


性别


年龄


籍贯


工作


小红



18


上海


UI设计师


小绿



18


北京


UI设计师

当我们在求这两个人的交集时,我们会说:小红和小绿在性别互斥,但是两人在年龄上却存在交集,两人在籍贯上互斥,但是在工作上却存在交集。

  1. 在数据库中,当我们把现实世界世界的关系抽象出来。每个实体,比如说人类,就成了一张表,每个具体的人,比如小红,就成了人类表中的一条数据。。表的join,实际上就是在寻找这写具体的记录之间的关系。
  1. 数据准备

    1. 班级表

class_no


class_name


A


A班


B


B班


create table class(

class_no varchar(5) comment ‘班级编号‘,

class_name varchar(10) comment ‘班级名称‘

) comment ‘班级表‘;

insert into class values(‘A‘,‘A班‘),

(‘B‘,‘B班‘);

  1. 学生表

student_class


student_name


A


小红


B


小白


C


小黑


A


小绿


create table student(

student_class varchar(5) comment ‘学生所属班级‘,

student_name varchar(10) comment ‘学生姓名‘

) comment ‘学生表‘;

insert into student values(‘A‘,‘小红‘),

(‘B‘,‘小白‘),

(‘C‘,‘小黑‘),

(‘A‘,‘小绿‘);

  1. cross join

    1. 通常我们在join时不加on条件,就会出现笛卡尔积的情况。通常时左表和右表中的数据逐行进行关联。示意图如下:
    2. 查询结果如下:

      1. 注意:这里是没有on语句的

select class_no,class_name,student_class,student_name from class cross join student;

  1. inner join

    1. 两个表根据制定的条件求并集,比如:寻找每个班级的学生,我们通常会加上条件 on class_no=student_class
    2. 查询结果以及语句

      1. 这里是有on条件

select class_no,class_name,student_class,student_name from class join student on class_no=student_class;

  1. left join

    1. 左连接通常是求补集的。他允许左表为空。即左表中的数据必须全部显示出来,但是右表中有没有我们不管的。
    2. 查询结果及语句

      1. 这时student表是放在第一位的,class表放在了第二位
      2. 使用了left join关键字
      3. 我们会发现没有班级的小黑也显示出来了

select class_no,class_name,student_class,student_name from student left join class on class_no=student_class;

  1. 但是:我们通常使用join是查询补集的。比如查询出没有班级的学生是谁。

    1. 注意:这里多了一个where

select class_no,class_name,student_class,student_name from student left join class on class_no=student_class where class_name is null;

  1. 各种join的示例

二.关于对应关系

  1. 表关联的对应关系

    1. 通常表关联存在三种对应关系:一对一,多对一,多对多的这三种情况。一对一:不会产生任何情况,就像一个身份证号对应一个人。多对一:这个是最常见的情况,比如一个老师教多个学生,一个班级有多个学生。。多对多:最容易出错的地方。就比如一个学生名称对应两个人,并且分布在不同的班级里。我们在使用join是通常是多对一或一对多的场景,但是我们如果误将多对多的场景理解为多对一,就会产生数据偏差,尤其值得注意。

三.关于Hive中的join

请参考:https://tech.meituan.com/hive_sql_to_mapreduce.html

原文地址:https://www.cnblogs.com/yanghuabin/p/9502010.html

时间: 2024-11-07 04:21:55

MySql中join基础的相关文章

MySql 中Join操作的用法

SQL标准中的Join的类型: 首先,设置表employees和department的数据为: 1.inner join - on操作类型 内连接inner join是基于连接谓词将两张表(如A和B)的列组合在一起的,产生新的结果表. 例子: SELECT * FROM employees a inner join department b ON a.department_id = b.department_id 查询结果为: 注意:inner join 可以简写为join,该查询得出的结果为两

MYSQL中JOIN的用法

近期用phpcms v9做项目,初期没有问题,后期随着数据量的增大,phpcms v9后台出现的栏目更新不动的情况,初期我以为是程序的问题,进行了程序排查,没有发现任何问题,登录上centos服务器后free命令发现内存也没有满.瞬间感觉很蛋疼,不知如何处理,后来登录阿里云账号,发现更新栏目时,cpu使用率直接到达100%,xhell远程登录进入服务器后用top检测cpu使用率的情况,发现MySQL占用的cpu使用率的100%,直接登录进入MySQL数据库,输入show full process

mysql中的基础查询 练习

#进阶1:基础查询 /* 语法: select 查询列表 from 表名; 类似于:System.out.println(打印东西); 特点: 1.查询列表可以是:表中的字段.常量值.表达式.函数 2.查询的结果是一个虚拟的表格 */ USE myemployees; #1.查询表中的单个字段 SELECT last_name FROM employees; #2.查询表中的多个字段 SELECT last_name,salary,email FROM employees; #3.查询表中的所有

Mysql中的基础函数

时间函数 select curdate();    返回2014-09-12,不包含时分秒 select curtime();    返回14:13:22,不包含年月日 select now();        返回2014-09-12 10:46:17 select unix_timestamp(now());    unix_timestamp(date)返回date的UNIX时间戳 select unix_timestamp('2013-09-01'); Unix时间戳是1970-01-0

MySQL中使用INNER JOIN来实现Intersect并集操作

MySQL中使用INNER JOIN来实现Intersect并集操作 一.业务背景 我们有张表设计如下: CREATE TABLE `user_defined_value` ( `RESOURCE_ID` varchar(20) DEFAULT NULL, `COLUMN_NAME` varchar(20) DEFAULT NULL, `VALUE` varchar(255) DEFAULT NULL, KEY `ID_IDX` (`RESOURCE_ID`) ) ENGINE=MyISAM D

Scrapy基础(十二)————异步导出Item数据到Mysql中

异步导出数据到Mysql中 上次说过从Item中同步写入数据库,因为网络的下载速度和数据库的I/O速度是不一样的所以有可能会发生下载快,但是写入数据库速度慢,造成线程的堵塞:关于堵塞和非堵塞,同步和异步的关系,因为没接触过,所以也不是很好的理解,这里查看了些资料,已做记录 链接1:https://www.zhihu.com/question/19732473;http://wiki.jikexueyuan.com/project/twisted-intro/ 实现异步写入mysql数据库的思路:

mysql中的semi-join

1. 背景介绍 什么是semi-join? 所谓的semi-join是指semi-join子查询. 当一张表在另一张表找到匹配的记录之后,半连接(semi-jion)返回第一张表中的记录.与条件连接相反,即使在右节点中找到几条匹配的记录,左节点 的表也只会返回一条记录.另外,右节点的表一条记录也不会返回.半连接通常使用IN  或 EXISTS 作为连接条件. 该子查询具有如下结构: SELECT ... FROM outer_tables WHERE expr IN (SELECT ... FR

MySQL中EXPLAIN解释命令

explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 先解析一条sql语句,看出现什么内容 EXPLAINSELECTs.uid,s.username,s.name,f.email,f.mobile,f.phone,f.postalcode,f.addressFROM uchome_space ASs,uchome_spacefieldASfWHERE 1 AND s.groupid=0AND s.uid=f.uid 1. i

Mysql中的分库分表

mysql中的分库分表分库:减少并发问题分表:降低了分布式事务分表1.垂直分表把其中的不常用的基础信息提取出来,放到一个表中通过id进行关联.降低表的大小来控制性能,但是这种方式没有解决高数据量带来的性能损耗.优点1.拆分后业务清楚,达到专库专用.2.可以实现热数据和冷数据的分离,将不经常变化的数据和变动较大的数据分散到不同的库/表里面.3.便于维护.缺点1.不能解决数据量大带来的性能损耗,读写的压力依旧很大.2.不同的业务不能夸库关联,只能通过业务关联.2.水平分表以某个字段按照一定的规则将一