很多朋友对于mysql不用join怎么实现多表查询和mysql不建议使用join如何查询不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
本文目录
mysql两表关系查询
我来讲一下这个问题吧:
题主说的查询应该是这样吧:select*fromawhereidin(selectidfromb);对于这条sql语句它的执行计划其实并不是先查询出b表的所有id,然后再与a表的id进行比较。mysql会把in子查询转换成exists相关子查询,所以它实际等同于这条sql语句:select*fromawhereexists(select*frombwhereb.id=a.id);
而exists相关子查询的执行原理是:循环取出a表的每一条记录与b表进行比较,比较的条件是a.id=b.id.看a表的每条记录的id是否在b表存在,如果存在就行返回a表的这条记录。
exists查询有什么弊端?由exists执行原理可知,a表(外表)使用不了索引,必须全表扫描,因为是拿a表的数据到b表查。而且必须得使用a表的数据到b表中查(外表到里表中),顺序是固定死的。
如何优化?建索引。但是由上面分析可知,要建索引只能在b表的id字段建,不能在a表的id上,mysql利用不上。
这样优化够了吗?还差一些。由于exists查询它的执行计划只能拿着a表的数据到b表查(外表到里表中),虽然可以在b表的id字段建索引来提高查询效率。但是并不能反过来拿着b表的数据到a表查,exists子查询的查询顺序是固定死的。
为什么要反过来?因为首先可以肯定的是反过来的结果也是一样的。这样就又引出了一个更细致的疑问:在双方两个表的id字段上都建有索引时,到底是a表查b表的效率高,还是b表查a表的效率高?
该如何进一步优化?把查询修改成innerjoin连接查询:select*fromainnerjoinbona.id=b.id;(但是仅此还不够,接着往下看)
为什么不用leftjoin和rightjoin?这时候表之间的连接的顺序就被固定住了,
比如左连接就是必须先查左表全表扫描,然后一条一条的到另外表去查询,右连接同理。仍然不是最好的选择。
为什么使用innerjoin就可以?innerjoin中的两张表,如:ainnerjoinb,但实际执行的顺序是跟写法的顺序没有半毛钱关系的,最终执行也可能会是b连接a,顺序不是固定死的。如果on条件字段有索引的情况下,同样可以使用上索引。
那我们又怎么能知道a和b什么样的执行顺序效率更高?答:你不知道,我也不知道。谁知道?mysql自己知道。让mysql自己去判断(查询优化器)。具体表的连接顺序和使用索引情况,mysql查询优化器会对每种情况做出成本评估,最终选择最优的那个做为执行计划。
在innerjoin的连接中,mysql会自己评估使用a表查b表的效率高还是b表查a表高,如果两个表都建有索引的情况下,mysql同样会评估使用a表条件字段上的索引效率高还是b表的。
而我们要做的就是:把两个表的连接条件的两个字段都各自建立上索引,然后explain一下,查看执行计划,看mysql到底利用了哪个索引,最后再把没有使用索引的表的字段索引给去掉就行了。
SQL联合查询
CROSSJOIN交叉连接。是一种没有任何限制条件的连接方式,结果为笛卡尔积。SQL语法如下:
上面SQL等同于: INNERJOIN(默认是JOIN)内连接。在表中存在至少一个匹配时返回行,可以理解为两张表中同时符合某种条件的行的组合。内连接还分为等值连接、不等连接和自连接。SQL语法如下:等值连接:使用“=”作为连接条件
不等连接:没有使用“=”作为连接条件
自连接:自己连接自己,即连接的表只有一张
LEFTJOIN左连接。外连接的一种,从左表(table1)返回所有的行,即使右表(table2)中没有匹配,如果右表中没有匹配,则结果为NULL。SQL语法如下: RIGHTJOIN右连接。外连接的一种,从右表(table2)返回所有的行,即使左表(table1)中没有匹配,如果左表中没有匹配,则结果为NULL。SQL语法如下: FULLJOIN全连接。外连接的一种,只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行,集合了LEFTJOIN和RIGHTJOIN的结果。SQL语法如下: 其中,MySQL不支持FULLJOIN,可使用LEFTJOIN、UNION、RIGHTJOIN结合实现FULLJOIN的查询,示例: UNION联合查询(去重)。用于合并两个或多个SELECT语句的结果集。UNION内部的每个SELECT语句必须拥有相同数量和相同顺序的列,列也必须拥有相似的数据类型。SQL语法如下: 注:UNION查询的结果中,不存在重复的值。 UNIONALL联合查询(不去重)。用于合并两个或多个SELECT语句的结果集。UNION结果集中的列名总是等于UNION中第一个SELECT语句中的列名。SQL语法如下: 或者: 注:UNIONALL查询的结果中,允许存在重复的值。
使用UNION或者UNIONALL时,只能在最后一个SELECT语句使用ORDERBY命令。
mysql join规则
MySQL的join用法主要有三种:innerjon内连接,leftjoin左连接,rightjoin右连接。
内连接又叫等值连接,此时的inner可以省略。获取两个表中有匹配关系的记录,即两表取交集。
以左表为基础,获取匹配关系的记录,如果右表中没有匹配项,NULL表示。
以右表为基础,获取匹配关系的记录,如果左表中没有匹配项,NULL表示。
mysql不用join怎么实现多表查询
可以使用子查询、联合查询、嵌套查询等方式来实现多表查询,以下为具体示例:
1.子查询
```
SELECT*
FROMtable1
WHEREidIN(
SELECTid
FROMtable2
WHEREname='xxx'
)
```
2.联合查询
```
SELECT*
FROMtable1
UNION
SELECT*
FROMtable2
```
3.嵌套查询
```
SELECT*
FROMtable1
WHEREid=(
SELECTid
FROMtable2
WHEREname='xxx'
)
```
关于mysql不用join怎么实现多表查询到此分享完毕,希望能帮助到您。