mysql技能-mysqljoin结合查询实例精讲_web开发网_MySQL
今天遇到mysql联合多表查询 无从下手 有些知识好久没用了忘记了所以就边网上找mysql联合查询的相关资料 然后总结出以下内容 希望web开发网的行为能能大家进行php学习带来协助 讲MySQLJ
今天遇到mysql联合多表查询 无从下手 有些知识好久没用了忘记了所以就边网上找mysql联合查询的相关资料 然后总结出以下内容
希望web开发网的行为能能大家进行php学习带来协助
讲MySQLJoin语法前还是先回顾一下联结的语法
MYSQL规范中规划的Join联结大致分为下面四种:
1.内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结。
2.外联结:分为外左联结和外右联结。
左联结AB表的意思就是将表A中的全部记录和表B中联结的字段与表A联结字段符合联结条件的那些记录形成的记录集的联结,这里注意的最后进去的记录集会包括表A全部记录。
右联结AB表的结果和左联结BA结果是一样的也就是说:
SelectA.nameB.nameFromALeftJoinBOnA.id=B.id
和SelectA.nameB.nameFromBRightJoinAonB.id=A .id执行后的结果是一样的
3.全联结:将两个表中存在联结关系的字段的所有记录取出形成记录集的联结(这个不需要记忆,只要是查询中提到表的字段都会取出,无论是否符合联结条件,因此意义不大)
实例讲解MySQL联合查询.那下面就具体讲讲简单的JOIN用法了首先我假设有2个表A和B表结构和字段分别为:
表A
IDName
1Tim
2Jimmy
3John
4Tom
表B
IDHobby
1Football
2Basketball
2Tennis
4Soccer
======www.iiwnet.com=========
1.内联结:
SelectA.NameB.HobbifromA,BwhereA.id=B.id这是隐式的内联结,查询的结果是
NameHobby
TimFootball
JimmiBasketball
JimmiTennis
TomSoccer
作用和 SelectA.NamefromAINNERJOINBONA.id=B.id一样的这里的INNERJOIN换成CROSSJOIN也是可以的
2.外左联结
SelectA.NamefromALeftJOINBONA.id=B.id典型的外左联结,这样查询得到结果将会是保存所有A表中联结字段的记录,若无与其相对应的B表中的字段记录则留空,结果如下:
NameHobby
TimFootball
JimmiBasketbalTennis
John
TomSoccer
所以从上面结果看出,因为A表中的John记录的ID没有在B表中有对应ID因此为空,但Name栏仍有John记录。
3.外右联结
如果把上面查询改成外右联结:SelectA.NamefromARightJOINBONA.id=B.id则结果将会是
NameHobby
TimFootball
JimmiBasketball
JimmiTennis
TomSoccer
======www.iiwnet.com=========
这样的结果都是可以从外左联结的结果中猜到
说到这里大家是否对联结查询了解多了?这个原本看来高深的概念一下子就理解了恍然大悟了吧(呵呵,开玩笑了?最后给大家讲讲MySQL联结查询中的某些参数的作用:
1.USINGcolumn_list其作用是为了方便书写联结的多对应关系,大部分情况下USING语句可以用ON语句来代替,如下面例子:
aLEFTJOINbUSINGc1,c2,c3其作用相当于下面语句
aLEFTJOINbONa.c1=b.c1ANDa.c2=b.c2ANDa.c3=b.c3
只是用ON来代替会书写比拟麻烦而已。
2.NA TURA L[LEFT]JOIN这个句子的作用相当于INNERJOIN或者是USING子句中包含了联结的表中所有字段的LeftJOIN左联结)
3.SPA IGHT_JOIN由于默认情况下MySQL进行表的联结的时候会先读入左表,当使用了这个参数后MySQL将会先读入右表,这是个MySQL内置优化参数,大家应该在特定情况下使用,譬如已经确认右表中的记录数量少,筛选后能大大提高查询速度。
最后要说的就是MySQL5.0以后,运算顺序得到重视,所以对多表的联结查询可能会过失以子联结查询的方式进行。譬如你需要进行多表联结,因此你输入了下面的联结查询:
SELECTt1.id,t2.id,t3.id
FROMt1,t2
LEFTJOINt3ONt3.id=t1.id
WHEREt1.id=t2.id;
但是MySQL并不是这样执行的其后台的真正执行方式是下面的语句:
SELECTt1.id,t2.id,t3.id
FROMt1,t2LEFTJOINt3ONt3.id=t1.id
WHEREt1.id=t2.id;
这并不是想要的效果,所以我需要这样输入:
SELECTt1.id,t2.id,t3.id
FROMt1,t2
LEFTJOINt3ONt3.id=t1.id
WHEREt1.id=t2.id;
这里括号是相当重要的因此以后在写这样的查询的时候我不要忘记了多写几个括号,至少这样能防止很多过失(因为这样的过失是很难被开发人员发现的




