mysql---多表关联
首先要介绍一下集合的概念:集合具有无序性、唯一性。
无序性:指集合内部元素没有相对顺序的概念,对于两个集合而言,只要元素值和元素个数相同则两个集合相等。
唯一性:指集合内部元素不存在值相等的元素。
上图所示集合是错误的,因为有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---多表关联的更多相关文章
- MySQL 多表关联更新及删除
目录: <MySQL中的两种临时表> <MySQL 多表关联更新及删除> <mysql查询优化之三:查询优化器提示(hint)> 一. 多表关联更新 问题 ...
- MySql多表关联,根据某列取前N条记录问题
近来遇到一个问题:“MySql多表关联,根据某列取前N条记录”. 刚开始一直在想,SQL语句是否可以做到直接查询出来,但几经折磨,还是没能写出SQL语句,-------如果有大牛的话,望指点迷津.我把 ...
- MySQL多表关联数据同时删除
MySQL多表关联时的多表删除: DELETE t1, t2FROM t1LEFT JOIN t2 ON t1.id = t2.idWHERE t1.id = 25
- [MySQL]多表关联查询技巧
示例表A: author_id author_name 1 Kimmy 2 Abel 3 Bill 4 Berton 示例表B: book_id author_id start_date end_da ...
- mysql多表关联update
日常的开发中一般都是写的单表update语句,很少写多表关联的update. 不同于SQL Server,在MySQL中,update的多表连接更新和select的多表连接查询在使用的方法上存在一些小 ...
- MySQL多表关联查询数量
//多表关联查询数量select user, t1.count1, t2.count2from user tleft join ( select user_id, count(sport_type) ...
- JDBC MySQL 多表关联查询查询
public static void main(String[] args) throws Exception{ Class.forName("com.mysql.jdbc.Driver&q ...
- MySQL多表关联查询与存储过程
-- **************关联查询(多表查询)**************** -- 需求:查询员工及其所在部门(显示员工姓名,部门名称) -- 1.1 交叉连接查询(不推荐.产生笛卡尔乘积 ...
- mysql多表关联更新
update 表A inner join 表B on 表A.关联字段 = 表B.关联字段 set 表a.待更新字段01 = 表B.字段01 , 表a.待更新字段021 = 表B.字段02 where ...
- mysql 多表关联查询
多个表右链接查询 名字,学校名称,学校类型,城市名称,国家地区 左链接查询 子查询 索引 #创建MySQL时添加索引 mysql> create table userIndex( id int ...
随机推荐
- Android虚拟环境的工具集Genymotion完整安装教程
Genymotion提供Android虚拟环境的工具集.相信很多Android开发者一定受够了速度慢.体验差效率及其地下的官方模拟器了.如果你没有物理机器,又不想忍受官方模拟器的折磨,Genymoti ...
- 本地win8系统部署网站遇到的问题
网站开发环境:vs2013 .操作系统是win8.1系统. iis8 win8系统激活码:00261-30000-00000-AA825 需要部署的网站文件夹放在了桌面上,在iis里配置时,无法启 ...
- Android开发环境中的概念和工具介绍
最近学习Android开发,以前使用C/C++多一些,现在再补点Java知识,不管是哪种语言,都不过是一种工具而已,真的学起来,大同小异,无谓优劣.学习Android编程肯定是要先从环境搭建开始,无论 ...
- iOS开发——UI篇OC篇&SpriteKit详解
SpriteKit详解 SpriteKit,iOS/Mac游戏制作的新纪元 这是我的WWDC2013系列笔记中的一篇,完整的笔记列表请参看这篇总览.本文仅作为个人记录使用,也欢迎在许可协议范围内转载或 ...
- C++ stringstream介绍,使用方法与例子
From: http://www.usidcbbs.com/read-htm-tid-1898.html C++引入了ostringstream.istringstream.stringstream这 ...
- 学习笔记之Linux Shell脚本教程:30分钟玩转Shell脚本编程
Linux Shell脚本教程:30分钟玩转Shell脚本编程 http://c.biancheng.net/cpp/shell/
- php输出错误信息
error_reporting(E_ALL); ini_set('display_errors','on'); header("Content-Type:text/html;charset ...
- Linux批量替换文件内容
问题描述:现在需要将rack1目录下*.send文件中的"-ip="替换成“-localIp=10.0.0.1/n-ip=” 刚才那个批量文本内容替换,只能替换内存中的内容,并不会 ...
- 关于Arrays类总结
Arrays是java中的工具类,其中所有的方法都是static.类名就可以直接调用其中的方法. 本文部分引用自: http://www.importnew.com/8952.html Arrays. ...
- 关于struts2的上传和下载
1. 1文件上传技术: JSPSmartUpload:应用在Model1年代.(嵌入到JSP) FileUpload:应用在Model2年代. Servlet3.o:完成文件上传. Struts2框架 ...