码迷,mamicode.com
首页 > 数据库 > 详细

mysql熟悉

时间:2018-06-19 13:43:50      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:左连接   天才   地方   个人   sel   使用   问题   执行   不能   

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

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

类似于 之前在学校学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只为了归纳个人思想。不保证执行。

 

 

写的顺序:select ... from... where.... group by... having... order by.. 
执行顺序:from... where...group by... having.... select ... order by...

 

mysql熟悉

标签:左连接   天才   地方   个人   sel   使用   问题   执行   不能   

原文地址:https://www.cnblogs.com/Begodpath/p/9197886.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!