羊皮纸论坛目录 / 程式设计 / 资料库 / Mysql /

用SQL合并资料表

发表新主题
随机主题
上个主题
下个主题
|
用SQL合并资料表

INNER JOIN 方法

Sql = "SELECT * FROM 资料表1 INNER JOIN 资料表2 ON 条件"

SELECT * 的 * 代表所有栏位, 也就是从资料表选取所有栏位.
INNER JOIN的意思是将资料表1与资料表2合并, 而 ON 之後的条件要成立.
这条件怎麽写呢?
假如说资料表1有一个class栏位而资料表2也有一个class栏位, 那ON你可以写资料表1.class = 资料表2.class
xxx.yyy , xxx代表的是资料表, yyy代表的是栏位名称.

现在如果将这整段写出来的话:

程式项目名称
  1. /* 原始程式码 */
  2. Sql = "SELECT * FROM 资料表1 INNER JOIN 资料表2 ON 资料表1.class = 资料表2.class"

意思也就是如果资料表1的class栏位与资料表2的class栏位数值相等就将他们合并, 如果资料表1的class栏位含有资料表2的class栏位没有的数值, 就将其剔除, 反推亦同. INNER JOIN的意思就是当两个资料表的某栏位含有相同的资料再合并, 如果没有就剔除.

执行上面这段SQL以後就会产生一个同时含有资料表1与资料表2的资料的新资料表, 中间的连结栏位是用两个资料表的class栏位.

这个技巧可以怎麽使用呢? 就拿文章系统来讲, 如果你有一个文章列表, 和一个文章分类.
文章列表中纪录每一个文章的资料和分类, 而文章分类纪录著分类资讯, 你可以用这个方法来将两个资料表暂时合并 (在SQL被执行时合并) 来同时存取两个资料表的资料.

RIGHT JOIN 方法

刚刚的 INNER JOIN是很棒没有错, 但是如果今天有一个文章分类里面没有任何的文章, 那由於文章列表中没有对应的分类资料, 该分类就会被剔除...这...不大对吧?! 因此还有RIGHT JOIN的方法.

程式项目名称
  1. /* 原始程式码 */
  2. Sql = "SELECT * FROM 资料表1 RIGHT JOIN 资料表2 ON 资料表1.class = 资料表2.class"

其实大致上和刚刚是一样的, 只是RIGHT JOIN会以资料表2, 也就是运算子的右边的资料表为重, RIGHT JOIN会将所有右边资料表 (也就是资料表2) 的资料都加进来, 而只将左边资料表 (资料表1) 符合的资料加进来.

这样在做文章分类清单的时候, 就算一个文章列表里面没有任何文章, 那该分类仍然会显示出来.

LEFT JOIN 方法

有RIGHT JOIN, 当然就有 LEFT JOIN...

程式项目名称
  1. /* 原始程式码 */
  2. Sql = "SELECT * FROM 资料表1 LEFT JOIN 资料表2 ON 资料表1.class = 资料表2.class"

其实就是一样的意思啦, 之前的RIGHT JOIN是包含所有右边资料表的内容, 那LEFT JOIN当然就是包含所有左边资料表的内容棉!
只要记得:

  • INNER JOIN - 两边的资料表拥有相同的优先权, 要两边都有的资料才会被包含在新的资料表.
  • RIGHT JOIN - 右边的资料表拥有优先权, 右边所有的资料都会被包含, 而左边只有符合的资料才会被包含.
  • LEFT JOIN - 左边的资料表拥有优先权, 左边所有的资料都会被包含, 而右边只有符合的资料才会被包含.
  • 本文为转载文章 [原文]
  • 关键字 : 资料表2, 资料表1, class, RIGHT, INNER, 资料, 包含, SELECT, 方法, 资料表拥, 资料才会, 符合, 原始程式码, 优先权, 资料表, 相同, 栏位, 意思, 右边资料表, 右边
0 0
2013-12-05T15:08:00+0000


  • 当您未登入羊皮纸时,可以利用脸书 Facebook 登入来发表回响。若使用羊皮纸会员身份发表回响则可获得经验值及虚拟金币,用来参加羊皮纸推出的活动。
发表回响
 
验证字串