MySQL多表查询Left Join,Right Join学习笔记

http://my.oschina.net/adamboy/blog
php

MySQL多表链接查询Left Join,Right Join php开源嘛数据库

         在讲MySQLJoin语法前仍是先回顾一下联结的语法,呵呵,其实连我本身都忘得差很少了,那就你们一块儿温习吧(若是内容有错误或有疑问,国内关于 MySQL联结查询的资料十分少,相信你们在看了本文后会对MySQL联结语法有至关清晰的了解,也不会被Oracle的外联结的(号)弄得糊涂 了。spa

         SQL标准中规划的(Join)联结大体分为下面四种:.net

个人数据库中有两张表,分别为users和products以下:code

users表:
blog

products 表:图片

users表:ci

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);
unicode

Pruducts表:rem

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开源嘛

        左联结AB表的意思就是将表A中的所有记录和表B中联结的字段与表A的联结字段符合联结条件的那些记录造成的记录集的联结,这里注意的是最后出来的记录集会包括表A的所有记录。

右联结AB表的结果和左联结BA的结果是同样的,也就是说:

Select A.name B.name From A Left Join B On A.id=B.idSelect 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左联 BA中全部记录都会保留在结果中,此时B中只有符合联结条件的记录,而右联结相反,这样也就不会混淆了。其实你们回忆高等教育出版社出版的《数据库系 统概论》书中讲到关系代数那章(就是将笛卡儿积和投影那章)的内容,相信不难理解这些联结功能的内涵。

相关文章
相关标签/搜索