异想天开

What's the true meaning of light, Could you tell me why

关系型数据库的连接

日期:2015-06-25 10:51:33
  
最后更新日期:2015-06-26 10:06:38
以mysql为例:
之前知道mysql表连接分为内连接和外连接。
内连接分为left join,inner join,right join,还有一种就是直接放from语句里作卡氏积。发现有一点没有理解完全到位。
假设A表和B表,利用studentid字段来左连接,内连接,右连接,以及from语句里。
创建两张测试表:
[code lang="cpp"]
CREATE TABLE `memo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`studentid` int(11) DEFAULT NULL,
`content` varchar(256) NOT NULL COMMENT '备忘内容,格式为xml',
`remindtime` datetime NOT NULL COMMENT '提醒时间',
`modifytime` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `studentid` (`studentid`,`content`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1


CREATE TABLE `memo1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`studentid` int(11) DEFAULT NULL,
`content` varchar(256) NOT NULL COMMENT '备忘内容,格式为xml',
`remindtime` datetime NOT NULL COMMENT '提醒时间',
`modifytime` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `studentid` (`studentid`,`content`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
[/code]
之前一点没理解好的就是,若studentid为null时怎么办?先不管studentid怎么产生null的。
插入几条测试数据:
[code lang="cpp"]
mysql> insert into memo set content='22222' , studentid=1;
mysql> insert into memo set content='22222';
mysql> insert into memo1 set content='22222' , studentid=1;
mysql> insert into memo1 set content='111' , studentid=2;
mysql> insert into memo1 set content='11111'
[/code]

[code lang="cpp"]
memo表
mysql> select * from memo ;
+----+-----------+---------+---------------------+---------------------+
| id | studentid | content | remindtime | modifytime |
+----+-----------+---------+---------------------+---------------------+
| 1 | 1 | 22222 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 2 | NULL | 22222 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
+----+-----------+---------+---------------------+---------------------+

memo1表
mysql> select * from memo1 ;
+----+-----------+---------+---------------------+---------------------+
| id | studentid | content | remindtime | modifytime |
+----+-----------+---------+---------------------+---------------------+
| 1 | 1 | 22222 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 2 | 2 | 22222 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 3 | NULL | 11111 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
+----+-----------+---------+---------------------+---------------------+
[/code]
左连接:
[code lang="cpp"]
mysql> select m.id,m.studentid,m.content,m1.* from memo m left join memo1 m1 on m.studentid=m1.studentid ;
+----+-----------+---------+------+-----------+---------+---------------------+---------------------+
| id | studentid | content | id | studentid | content | remindtime | modifytime |
+----+-----------+---------+------+-----------+---------+---------------------+---------------------+
| 1 | 1 | 22222 | 1 | 1 | 22222 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 2 | NULL | 22222 | NULL | NULL | NULL | NULL | NULL |
+----+-----------+---------+------+-----------+---------+---------------------+---------------------+
[/code]
总结:
left join 左连接 就是显示A表中有的数据,若B表中没有则为空。当A表的连接字段为null时,则显示B表字段全为null。
inner join 内连接 就是显示A表和B表中都有的记录,若连接字段为null时,则不显示。
right join 右连接 就是显示B表中有的数据,若A表中没有则为空。当B表的连接字段为null时,则显示A表字段全为null。
full join 全连接 inner +(left-inner)+(right-inner)
外连接
连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接。