mysql熟悉

基本语法和其它的没啥差别

多表查询中之前有几个搞不懂的地方

类似于 之前在学校学SQL server的时候,笛卡尔积究竟是啥东西。。求两个表的笛卡尔积只知道把记录相乘。。却不知道sql语句怎么写。

今天才知道。

原来

select * from A,B

不加任何条件,结果就是笛卡尔积。

如果需要两张表关联,就将它们的关联字段设成条件。

select * from A,B where A.id = B.aid

如果关联时想保留A表的全部记录,就使用A左连接B或者B右连接A。

select * from A a left join B b on a.id = b.aid 

外连接

  包括左外连接、右外连接、全外连接。其实就是 left outer join ,outer可以省略罢了。

内连接

  inner join on相当于where 里面写关联条件。

  select * from A a inner join B b on a.id = b.aid  相当于 select * from A,B where a.id = b.aid

外连接也就是比内连接多保留了两张表中没有过滤掉的记录。

如果想保留A,B中所有的记录,连接不上的置空,就用全外连接(但是Mysql不支持全外连接,可以用union来组合)

有些表中不好关联,比如 两张表同时通过某一字段和第三张表的一个字段iidd有对应关系。那么如果通过

select * from A a,B b,C c where a.id = c.iidd and b.id = c.iidd

这样一般是不符合业务逻辑的。通过a.id和c.iidd关联后,已经筛选掉了C表中其它B表可以关联的记录,然后再和B表关联,最终结果通常会缺少数据。

这时我们考虑到既然都要和C表关联,那么C表的记录在最后一次被关联前是不能缺少的。这样很明显使用左关联或右关联首先来保存C表数据,然后得到一张虚表后再和B表关联。

select * from (select * from A a right join C c on a.id = c.iidd),B b where a.id = b.iidd

这样又会产生一个问题,A表和C表右关联后的结果集,被B表的Id所筛选,导致A表关联后的数据缺少,这里的业务逻辑一般是取A表与C的关联记录和B与C的关联记录。

所以说继续使用外关联,可以得到目标数据。

select * from ((select * from A a right join C c on a.id = c.iidd) ac left join B b on ac.id = b.id)

______________

以上sql只为了归纳个人思想。不保证执行。

猜你喜欢

转载自www.cnblogs.com/Begodpath/p/9197886.html