首先要介绍一下集合的概念:集合具有无序性、唯一性。

无序性:指集合内部元素没有相对顺序的概念,对于两个集合而言,只要元素值和元素个数相同则两个集合相等。

唯一性:指集合内部元素不存在值相等的元素。

上图所示集合是错误的,因为有2个‘3’违背了唯一性

上图所示的两个集合是相同的,集合元素是无序的

集合的运算:交集、并集、相乘

交集:两个集合公共元素组成的集合

并集:连个集合所有元素组成的集合

相乘:也成笛卡尔积,两个集合所有元素组合的集合

集合1*集合2的结果如下:

其中(1,3)是集合1中的‘1’和集合2中的‘3’的组合

一张表其实就相当于一个集合,每一行是集合的一个元素

现在有两表

goods表:包含商品ID,栏目ID,商品名

channel表:栏目ID,栏目名

现在想得到一张报价单包含商品ID,商品名,栏目ID,栏目名,该如何去做?

全相乘:笛卡尔积 总共有4*4=16 条记录

即两表各个行的所有组合

从两个表行的所有组合中选出满足要求的行

虽然得出了正确答案,但是如果goods表和channel表很大的话,如goods表有1W条记录,channel也有1W条记录。则需要在内存中生成一张1W*1W的临时表,而且绝大部分记录都不是我们所需的。所以全相乘浪费了空间、降低了效率。

现在考虑怎样才能高效实现要求呢?常见的多表关联有左连接、右连接、内连接,哪些能帮助我们来实现上述要求呢?

左连接的语法:表A LEFT JOIN 表B ON 关联条件                      (从表B中找出与表A满足关联条件的行)

右连接的语法:表A RIGHT JOIN 表B ON 关联条件                   (从表A中找出与表B满足关联条件的行)

内连接的语法:表A INNER JOIN 表B ON 关联条件                   (求出表A和表B的公共集)

左连接:

第四条记录后面两个字段为NULL,因为'捷安特'的栏目信息在 表B中没有找到。

右连接:和左连接类似,可以相互转换如:表A LEFT JOIN 表B ON 关联条件  等价于 表B RIGHT JOIN 表A ON 关联条件

推荐使用左连接,比较符合常规逻辑

内连接:

从左右连接和内连接的结果看,内连接少了一条记录,而左右连接出现了NULL的情况。那左右连接和内连接之间到底有什么关联呢?

如有两个表,表A和表B,他们可以通过公共字段来关联,他们之间的关系可以用下图来表示

A INNER JOIN B
:得出的结果是表A和表B的公有数据集C

A lEFT JOIN B:得出的结果是表A记录集A1+公有数据集C,A1中会有NULL出现

B RIGHT JOIN A:得出的结果是公有数据C+表B记录集B1,B1中会有NULL出现

mysql---多表关联的更多相关文章

  1. MySQL 多表关联更新及删除

    目录: <MySQL中的两种临时表> <MySQL 多表关联更新及删除> <mysql查询优化之三:查询优化器提示(hint)> 一.      多表关联更新 问题 ...

  2. MySql多表关联,根据某列取前N条记录问题

    近来遇到一个问题:“MySql多表关联,根据某列取前N条记录”. 刚开始一直在想,SQL语句是否可以做到直接查询出来,但几经折磨,还是没能写出SQL语句,-------如果有大牛的话,望指点迷津.我把 ...

  3. MySQL多表关联数据同时删除

    MySQL多表关联时的多表删除: DELETE t1, t2FROM    t1LEFT JOIN t2 ON t1.id = t2.idWHERE    t1.id = 25

  4. [MySQL]多表关联查询技巧

    示例表A: author_id author_name 1 Kimmy 2 Abel 3 Bill 4 Berton 示例表B: book_id author_id start_date end_da ...

  5. mysql多表关联update

    日常的开发中一般都是写的单表update语句,很少写多表关联的update. 不同于SQL Server,在MySQL中,update的多表连接更新和select的多表连接查询在使用的方法上存在一些小 ...

  6. MySQL多表关联查询数量

    //多表关联查询数量select user, t1.count1, t2.count2from user tleft join ( select user_id, count(sport_type) ...

  7. JDBC MySQL 多表关联查询查询

    public static void main(String[] args) throws Exception{ Class.forName("com.mysql.jdbc.Driver&q ...

  8. MySQL多表关联查询与存储过程

    --  **************关联查询(多表查询)**************** -- 需求:查询员工及其所在部门(显示员工姓名,部门名称) -- 1.1 交叉连接查询(不推荐.产生笛卡尔乘积 ...

  9. mysql多表关联更新

    update 表A inner join 表B on 表A.关联字段 = 表B.关联字段 set 表a.待更新字段01 = 表B.字段01 , 表a.待更新字段021 = 表B.字段02 where ...

  10. mysql 多表关联查询

    多个表右链接查询 名字,学校名称,学校类型,城市名称,国家地区 左链接查询 子查询 索引 #创建MySQL时添加索引 mysql> create table userIndex( id int ...

随机推荐

  1. BZOJ 1143: [CTSC2008]祭祀river 最长反链

    1143: [CTSC2008]祭祀river Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...

  2. Rational Rose--简介

    Rational Rose Rational Rose是Rational公司出品的一种面向对象的统一建模语言的可视化建模工具.用于可视化建模和公司级水平软件应用的组件构造. 目前版本的Rational ...

  3. Qualcomm Web Site For Android Development

    https://www.codeaurora.org/xwiki/bin/QAEP/release https://support.cdmatech.com/login/ https://chipco ...

  4. iOS开发——高级技术&摇一摇功能的实现

    摇一摇功能的实现 在AppStore中多样化功能越来越多的被使用了,所以今天就开始介绍一些iOS开发的比较实用,但是我们接触的比较少的功能,我们先从摇一摇功能开始 在 UIResponder中存在这么 ...

  5. log_slave_updates在线修改

    http://planet.mysql.com/entry/?id=20450 mysql> show variables like 'log_slave_updates'; +-------- ...

  6. java_jdbc_基本连接池

    MyDataSource实现封装连接池,MyConnection实现connection类,通过代理模式相互调用 package cn.itcast; import java.sql.*; publi ...

  7. 用antlr文法编写的hermit swrl规则(分享)

    /* * To change this license header, choose License Headers in Project Properties. * To change this t ...

  8. 根据ip地址从第三方接口获取详细的地理位置

    最近项目某个功能需要根据ip地址从第三方接口获取详细的地理位置,从网上找了很多例子,主要接口有新浪的,淘宝的,腾讯的.试了淘宝的,如果是数量级小的还可以,如果数量级达到上十万级就速度慢了,会导致系统崩 ...

  9. c++中io流的使用

    #include <strstream> #include <iostream.h> #include <string> using namespace std; ...

  10. 基于Selenium2+Java的UI自动化(1) - 原理和环境搭建

    一.Selenium2的原理 Selenium1是thoughtworks公司的一个产品经理,为了解决重复烦躁的验收工作,写的一个自动化测试工具,其原理是用JS注入的方 式来模拟人工的操作,但是由于J ...