mysql join 内连接和外连接

来源:互联网 发布:linux ssr 客户端 编辑:程序博客网 时间:2024/06/05 09:04

table1:左表;table2:右表。

JOIN 按照功能大致分为如下三类:

INNER JOIN(内连接,或等值连接):也可以省去inner,比如join a on b,取得两个表中存在连接匹配关系的记录。

LEFT [OUTER]JOIN(左连接):取得左表(table1)完全记录,即是右表(table2)并无对应匹配记录。

RIGHT[OUTER] JOIN(右连接):与 LEFT JOIN 相反,取得右表(table2)完全记录,即是左表(table1)并无匹配对应记录。

cross join:交叉连接,得到的结果是两个表的乘积,即笛卡尔积

注意:mysql不支持Full join  --全外联接,不过可以通过UNION 关键字来合并 LEFT JOIN 与 RIGHT JOIN来模拟FULL join

另外,mysql在遇到右外联结的时候其优化器会将其改写成等价的左外联接

语法:

select * from A left join B on A.name = B.name;#或者:select * from A left outer join B on A.name = B.name;

select * from A right join B on A.name = B.name;

select * from A inner join B on A.name = B.name;#或者:select*from A join B on A.name=B.name;

SELECT * FROM t1 LEFT JOIN (t2, t3, t4) ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c);--相当于SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4) ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)

 最后要说的就是,在MySQL5.0以后,运算顺序得到了重视,所以对多表的联结查询可能会错误以子联结查询的方式进行。譬如你需要进行多表联结,因此你输入了下面的联结查询:

SELECT t1.id,t2.id,t3.id

    FROM t1,t2

    LEFT JOIN t3 ON (t3.id=t1.id)

    WHERE t1.id=t2.id;

 

但是MySQL并不是这样执行的,其后台的真正执行方式是下面的语句:

 

SELECT t1.id,t2.id,t3.id

    FROM t1,(  t2 LEFT JOIN t3 ON (t3.id=t1.id)  )

    WHERE t1.id=t2.id;

 

这并不是我们想要的效果,所以我们需要这样输入:

 

SELECT t1.id,t2.id,t3.id

    FROM (t1,t2)

    LEFT JOIN t3 ON (t3.id=t1.id)

    WHERE t1.id=t2.id;

 

在这里括号是相当重要的,因此以后在写这样的查询的时候我们不要忘记了多写几个括号,至少这样能避免很多错误

我要补充的是在MySQL现有版本中CROSS JOIN的作用和INNER JOIN是一样的(虽然在SQL Standard中是不一样的,然而在MySQL中他们的区别仅仅是INNER JOIN需要附加ON参数的语句,而CROSS JOIN不需要)

Select A.Name B.Hobby from A, B where A.id = B.id,这是隐式的内联结

它的作用和 Select A.Name from A INNER JOIN B ON A.id = B.id是一样的。这里的INNER JOIN换成CROSS JOIN也是可以的

1. NATURAL [LEFT] JOIN:这个句子的作用相当于INNER JOIN,或者是在USING子句中包含了联结的表中所有字段的Left JOIN(左联结)

2. STRAIGHT_JOIN:由于默认情况下MySQL在进行表的联结的时候会先读入左表,当使用了这个参数后MySQL将会先读入右表,这是个MySQL的内置优化参数,大家应该在特定情况下使用,譬如已经确认右表中的记录数量少,在筛选后能大大提高查询速度





原创粉丝点击