刚收到网易面试通知,顺便回顾了下网易的笔试题,发现有一道题目理解不是很透,写个随笔记录下。

题目内容是这样的:数据库理论中取出右侧关系中所有与左侧关系的任一元组都不匹配的元组,用空值来填充所有来自左侧关系的属性,再把产生的元组加到自然连接的结果上,这种连接运算为_____。

在MySQL中,连接操作主要有五种:

1.交叉连接(CROSS JOIN)

交叉连接是最简单的连接类型,它对所有涉及连接的表相乘,然后创建一个包含所有内容的产物。例如有两个表attribute和color内容如下:

mysql> select * from attribute;
+-----------+
| attribute |
+-----------+
| eyes | 
| hair | 
+-----------+
2 rows in set (0.00 sec) 
mysql> select * from color;
+-------+
| color |
+-------+
| brown | 
| black | 
| gray | 
+-------+
3 rows in set (0.00 sec)

执行交叉连接操作:

SELECT * FROM color,attribute;
或者
SELECT * FROM color CROSS JOIN attribute;

结果如下:

+-------+-----------+
| color | attribute |
+-------+-----------+
| brown | eyes | 
| brown | hair | 
| black | eyes | 
| black | hair | 
| gray | eyes | 
| gray | hair | 
+-------+-----------+
6 rows in set (0.00 sec)

连接的结果为所有可能的结果集。

2.内连接(INNER JOIN)

内连接是构建一个两个表中连接部分相匹配的部分的结果集,不匹配的行将被排除在最后的结果集之外。也就是说有匹配就返回,没匹配就排除,http://www.w3cschool.cn/sql_join.html 中有介绍。语句:  

SELECT * FROM tableA ,tableB WHERE tableA.id = tableB.id;
或者
SELECT * FROM tableA INNER JOIN tableB WHERE tableA.id = tableB.id;

 3.外连接(LEFT JOIN,RIGHT JOIN)

交叉连接和内连接是是对称的,也就是连接的双方相互匹配,而外连接则是不对称的,连接的一方的所有行都包含在最后的记录中,不管它们是否鱼连接的另外一方匹配。

左外连接
SELECT * FROM tableA LEFT JOIN tableB USING(id);
SELECT * FROM tableA LEFT JOIN tableB ON tableA.id = tableB.id;
右外连接
SELECT * FROM tableA RIGHT JOIN tableB USING(id);
SELECT * FROM tableA RIGHT JOIN tableB ON tableA.id = tableB.id;

上面是连接的用法,具体来说当两个表中有同样的字段的时候,可以用USING关键字(也可以用ON),而有不同字段的时候使用ON。

而左外连接的时候左边的内容都要出现在结果集中,而右外连接的时候右边的内容都要出现在结果集中。 

4.自连接

自连接就是取出表中彼此关联的数据内容,假设有一个存储目录结构的表, id表示本目录ID,parent表示目录的上级目录,

SELECT a.label AS parent,b.label AS child FROM menu AS a, menu AS b WHERE a.id = b.parent;

系统创建两个虚拟表,然后进行join操作。

5.联合(UNION)

UNION将多个查询的结果输出连接到一个单独结果集。 

做题时不理解自然连接的概念,但是大致方向应该是right join,所以写了,结果也是对了...

看了下数据库系统概述,原来自然连接就是内连接...害我纠结老半天。