内联结

内联结

作者:LAMP小白  点击:1765  发布日期:2012-10-24 23:39:00  返回列表
如果在SELECT语句的FROM子句中列出了多个数据表,并用INNER JOIN将他们的名字隔开,那么MYSQL将执行内联结

mysql> SELECT * FROM t1 INNER JOIN t2;
+----+----+----+----+
| i1 | c1 | i2 | c2 |
+----+----+----+----+
| 1 | a | 2 | c |
| 2 | b | 2 | c |
| 3 | c | 2 | c |
| 1 | a | 3 | b |
| 2 | b | 3 | b |
| 3 | c | 3 | b |
| 1 | a | 4 | a |
| 2 | b | 4 | a |
| 3 | c | 4 | a |
+----+----+----+----+
9 rows in set (0.00 sec)

这条与距离,SELECT * 的含义是,从FROM子句所列出的每一个数据表里选取每一个数据列
根据某个数据表里的每一个数据行与另一个数据表里的每一个数据行得到全部可能的组合的联结操作叫做生成笛卡尔积(cartesian product)
像这样来联结数据表有可能产生非常多的数据行

CROSS JOIN 和 JOIN 联结类型类似于INNER JOIN

mysql> SELECT t1.*, t2.* FROM t1 CROSS JOIN t2 WHERE t1.i1 = t2.i2;
+----+----+----+----+
| i1 | c1 | i2 | c2 |
+----+----+----+----+
| 2 | b | 2 | c |
| 3 | c | 3 | b |
+----+----+----+----+
2 rows in set (0.01 sec)

他们与 SELECT t1.*, t2.* FROM t1 JOIN t2 WHERE t1.i1 = t2.i2;
SELECT t1.*, t2.* FROM t1 INNER JOIN t2 WHERE t1.i1 = t2.i2;
SELECT t1.*, t2.* FROM t1,t2 WHERE t1.i1 = t2.i2;
是等价的

我们还可以用 ON 代替 WHERE

SELECT t1.*, t2.* FROM t1 INNER JOIN t2 ON t1.i1 = t2.i2;

另一种语法是使用一个USING()子句,但要求被联结的数据列必须是同名的

SELECT my1.*, my2.* FROM my1 INNER JOIN my2 USING (b);

避免歧义:1.首先在联结操作中给出数据列的名字
2.为数据表的实例分配一个别名


上一篇:查看数据库元数据 下一篇:快递查询API
0