资源描述:
《mysql之左连接与右连接.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
Mysql的左连接与右连接区别1.SQLLEFTJOIN关键字LEFTJOIN关键字会从左表(table_name1)那里返回所有的行,即使在右表(table_name2)中没有匹配的行。2.SQLRIGHTJOIN关键字RIGHTJOIN关键字会右表(table_name2)那里返回所有的行,即使在左表(table_name1)中没有匹配的行。3.在Mysql中的DevDB中创建两个表CreateTabledepartmentCREATETABLE`department`(`ID`int(11)NOTNULLAUTO_INCREMENT,`CODE`varchar(100)DEFAULTNULL,`NAME`varchar(200)DEFAULTNULL,PRIMARYKEY(`ID`))ENGINE=InnoDBAUTO_INCREMENT=5DEFAULTCHARSET=utf8CreateTablejobCREATETABLE`job`(`id`int(11)NOTNULLAUTO_INCREMENT,`FirstName`varchar(32)DEFAULTNULL,`LastName`varchar(32)DEFAULTNULL,`LoginName`varchar(32)DEFAULTNULL,`dep_id`int(11)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=5DEFAULTCHARSET=utf84.在department表和Job表中插入数据?12345insertinto`department`(`ID`,`CODE`,`NAME`)values('1','JavaR&D','JavaR&D');insertinto`department`(`ID`,`CODE`,`NAME`)values('2','MysqlR&D','MysqlR&D'); insertinto`department`(`ID`,`CODE`,`NAME`)values('3','InterfaceR&D','InterfaceR&D');insertinto`department`(`ID`,`CODE`,`NAME`)values('4','AndroidR&D','AndroidR&D');insertinto`department`(`ID`,`CODE`,`NAME`)values('5','IOSR&D','IOSR&D');?12345insertinto`Job`(`id`,`FirstName`,`LastName`,`LoginName`,`dep_id`)values('1','Peter','Qiu','Qiu','1');insertinto`Job`(`id`,`FirstName`,`LastName`,`LoginName`,`dep_id`)values('2','Tom','Lee','Lee','2');insertinto`Job`(`id`,`FirstName`,`LastName`,`LoginName`,`dep_id`)values('3','Garfield','Wang','Wang','3');insertinto`Job`(`id`,`FirstName`,`LastName`,`LoginName`,`dep_id`)values('4','哆啦A梦','Jone','Jone',NULL);insertinto`Job`(`id`,`FirstName`,`LastName`,`LoginName`,`dep_id`)values('5','Westlife','西城男孩','Westlife','8');department表数据IDCODENAME1JavaR&DJavaR&D2MysqlR&DMysqlR&D3InterfaceR&DInterfaceR&D4AndroidR&DAndroidR&D5IOSR&DIOSR&DJob表数据idFirstNameLastNameLoginNamedep_id1PeterQiuQiu12TomLeeLee23GarfieldWangWang34哆啦A梦JoneJone(NULL)5Westlife西城男孩Westlife85.以Job表进行左连接(leftjoin)?123/*以Job表进行左连接,此时数据主要以Job表为主,关联department表,如果Job的dep_id为null或者在department表中无对应的Id匹配对应的字段自动填充null*/SELECT*FROMJobtable_name1LEFTJOINdepartmenttable_name2ONtable_name1.`dep_id`=table_name2.`ID`; 查出来的数据idFirstNameLastNameLoginNamedep_idIDCODENAME1PeterQiuQiu11JavaR&DJavaR&D2TomLeeLee22MysqlR&DMysqlR&D3GarfieldWangWang33InterfaceR&DInterfaceR&D4哆啦A梦JoneJone(NULL)(NULL)(NULL)(NULL)5Westlife西城男孩Westlife8(NULL)(NULL)(NULL)6.以Job表进行右连接(rightjoin)?123/*以Job表进行右连接,此时数据主要以department表为主,关联Job表,如果Job的dep_id为null或者在department表中无对应的Id匹配对应的字段自动填充null*/SELECT*FROMJobtable_name1RIGHTJOINdepartmenttable_name2ONtable_name1.`dep_id`=table_name2.`ID`;查出来的数据idFirstNameLastNameLoginNamedep_idIDCODENAME1PeterQiuQiu11JavaR&DJavaR&D2TomLeeLee22MysqlR&DMysqlR&D3GarfieldWangWang33InterfaceR&DInterfaceR&D(NULL)(NULL)(NULL)(NULL)(NULL)4AndroidR&DAndroidR&D(NULL)(NULL)(NULL)(NULL)(NULL)5IOSR&DIOSR&D 脚本如下:droptabletable1;CREATETABLE`andrew`.`table1`(`name`VARCHAR(32)NOTNULL,`city`VARCHAR(32)NOTNULL)ENGINE=MyISAM;insertintoTABLE1(name,city)values('PersonA','BJ');insertintoTABLE1(name,city)values('PersonB','BJ');insertintoTABLE1(name,city)values('PersonC','SH');insertintoTABLE1(name,city)values('PersonD','SZ');commit;droptabletable2;CREATETABLE`andrew`.`table2`(`name`VARCHAR(32)NOTNULL,`city`VARCHAR(32)NOTNULL)ENGINE=MyISAM;insertintoTABLE2(name,city)values('PersonW','BJ');insertintoTABLE2(name,city)values('PersonX','SH');insertintoTABLE2(name,city)values('PersonY','SH');insertintoTABLE2(name,city)values('PersonZ','NJ');commit;1.外连接–左连接结果table1居左,故谓之左连接。这种情况下,以table1为主,即table1中的所有记录均会被列出。有一下三种情况:a.对于table1中的每一条记录对应的城市如果在table2中也恰好存在而且刚好只有一条,那么就会在返回的结果中形成一条新的记录。如上面PersonA和PersonB对应的情况。b.对于table1中的每一条记录对应的城市如果在table2中也恰好存在而且有N条,那么就会在返回的结果中形成N条新的记录。如上面的PersonC对应的情况。c.对于table1中的每一条记录对应的城市如果在table2中不存在,那么就会在返回的结果中形成一条条新的记录,且该记录的右边全部NULL。如上面的PersonD对应的情况。不符合上面三条规则的记录不会被列出。2.外连接–右连接结果table2居右,故谓之右连接。这种情况下,以table2为主,即table2中的所有记录均会被列出。有一下三种情况:a.对于table2中的每一条记录对应的城市如果在table1中也恰好存在而且刚好只有一条,那么就会在 返回的结果中形成一条新的记录。如上面PersonX和PersonY对应的情况。b.对于table2中的每一条记录对应的城市如果在table1中也恰好存在而且有N条,那么就会在返回的结果中形成N条新的记录。如上面的PersonW对应的情况。c.对于table2中的每一条记录对应的城市如果在table1中不存在,那么就会在返回的结果中形成一条条新的记录,且该记录的左边全部NULL。如上面的PersonZ对应的情况。不符合上面三条规则的记录不会被列出。3.内连接内连接的数据记录中,不会存在字段为NULL的情况。可以简单地认为,内链接的结果就是在左连接或者右连接的结果中剔除存在字段为NULL的记录后所得到的结果。甚至可以认为,如果两个表中仅分别剩下内连接运算后所得的数据记录,如table1中只有PersonA、PersonB和PersonC,table2中只有PersonW、PersonX和PersonY,那么这两个表的之间的左连接和右连接的返回的结果是一样的。注意:select*fromtable1ainnerjointable2bona.city=b.city和select*fromtable1ajointable2bona.city=b.city的效果是一样的,即如果join的左边没有诸如left、right或者inner这样的关键字时,缺省的是内连接。另,MySQL不支持fulljoin。