mysql熟悉
Posted begodpath
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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只为了归纳个人思想。不保证执行。
写的顺序:select ... from... where.... group by... having... order by..
执行顺序:from... where...group by... having.... select ... order by...
以上是关于mysql熟悉的主要内容,如果未能解决你的问题,请参考以下文章
[转]分析MySQL数据类型的长度mysql数据字段 中length和decimals的作用!熟悉mysql必看