http://my.oschina.net/adamboy/blog
MySQL多表连接查询Left Join,Right Join php开源嘛
在讲MySQL的Join语法前还是先回顾一下联结的语法,呵呵,其实连我自己都忘得差不多了,那就大家一起温习吧(如果内容有错误或有疑问,国内关于 MySQL联结查询的资料十分少,相信大家在看了本文后会对MySQL联结语法有相当清晰的了解,也不会被Oracle的外联结的(“+”号)弄得糊涂 了。
在SQL标准中规划的(Join)联结大致分为下面四种:
我的数据库中有两张表,分别为users和products如下:
users表:
products 表:
users表:
CREATE TABLE `users` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(40) collate utf8_unicode_ci NOT NULL,
`password` varchar(40) collate utf8_unicode_ci NOT NULL,
`status` int(11) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=6 ;
--
-- Dumping data for table `users`
--
INSERT INTO `users` (`id`, `name`, `password`, `status`) VALUES
(1, 'adam', '0000', 1),
(2, 'lht', '0000', 0),
(3, 'lihantuan', '0000', 0),
(4, 'lhq', '0000', 0),
(5, 'admin', '0000', 1);
Pruducts表:
CREATE TABLE `products` (`id` int(10) NOT NULL auto_increment,
`name` varchar(40) collate utf8_unicode_ci NOT NULL,
`comefrom` varchar(40) collate utf8_unicode_ci NOT NULL,
`maketime` timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=6 ;
--
-- Dumping data for table `products`
--
INSERT INTO `products` (`id`, `name`, `comefrom`, `maketime`) VALUES
(1, 'adam', 'china', '2011-05-16 15:53:03'),
(2, 'lht', 'japan', '2011-05-16 15:53:18'),
(3, 'lihantuan', 'America', '2011-05-16 15:53:37'),
(4, 'lhq', 'China', '2011-05-17 15:16:00'),
(5, 'lhw', 'CN', '2011-05-18 16:33:15');
1. 内联结:select users.*,products.comefrom from users,products where users.name = products.name,查询结果是(如果图片不显示,copy该语句到数据库里执行就能看到结果):
2. 外联结:分为外左联结和外右联结。 php开源嘛
左联结A、B表的意思就是将表A中的全部记录和表B中联结的字段与表A的联结字段符合联结条件的那些记录形成的记录集的联结,这里注意的是最后出来的记录集会包括表A的全部记录。
右联结A、B表的结果和左联结B、A的结果是一样的,也就是说:
Select A.name B.name From A Left Join B On A.id=B.id和Select A.name B.name From B Right Join A on B.id=A.id执行后的结果是一样的。
举例:外左联结(Select A.name B.name From A Left Join B On A.id=B.id)
数据库里执行查询:select users.*,products.comefrom from users left join products on users.name = products.name
将显示如下:(如果图片不显示,copy该语句到数据库里执行就能看到结果)
执行:select products.*,users.password from products left join users on products.name = users.name
将显示如下:
举例外右联结:Select A.name B.name From B Right Join A on B.id=A.id:
执行语句:select users.*,products.name from users right join products on users.name = products.name,将显示如下结果:(如果图片不显示,copy该语句到数据库里执行就能看到结果)
3.全联结:将两个表中存在联结关系的字段的所有记录取出形成记录集的联结(这个不需要记忆,只要是查询中提到了的表的字段都会取出,无论是否符合联结条件,因此意义不大)。
4.无联结:不用解释了吧,就是没有使用联结功能呗,也有自联结的说法。
这里我有个比较简便的记忆方法,内外联结的区别是内联结将去除所有不符合条件的记录,而外联结则保留其中部分。外左联结与外右联结的区别在于如果用A左联 结B则A中所有记录都会保留在结果中,此时B中只有符合联结条件的记录,而右联结相反,这样也就不会混淆了。其实大家回忆高等教育出版社出版的《数据库系 统概论》书中讲到关系代数那章(就是将笛卡儿积和投影那章)的内容,相信不难理解这些联结功能的内涵。