mysql中多表连接(不使用join )为啥 超过三张表就报错?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql中多表连接(不使用join )为啥 超过三张表就报错?相关的知识,希望对你有一定的参考价值。

select * from
 app ,   a ,  pa 
where app.ID = a.APP_ID and a.ID = pa.APPLICATION_ID  //报错

   Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '=' 

三张表明明都是一个字符集

select * from
 app ,   a , 
where app.ID = a.APP_ID  //正常执行

id的字符集不一致一个是utf8_unicode_ci,一个是utf8_general_ci,所以不能用等号判断 参考技术A 不会报错吧,你看看报错信息,根据报错信息进行排查

Mysql 多表连接查询 inner join 和 outer join 的使用

JOIN的含义就如英文单词“join”一样,连接两张表,大致分为内连接,外连接,右连接,左连接,自然连接。这里描述先甩出一张用烂了的图,然后插入测试数据。

 

首先先列举本篇用到的分类(内连接,外连接,交叉连接)和连接方法(如下):

A)内连接:join,inner join

B)外连接:left join,left outer join,right join,right outer join,union

C)交叉连接:cross join

案例表:

t_users:

t_department:

第一种:内连接 inner join

内连接INNER JOIN是最常用的连接操作。从数学的角度讲就是求两个表的交集,从笛卡尔积的角度讲就是从笛卡尔积中挑出ON子句条件成立的记录。

有INNER JOIN,WHERE(等值连接),STRAIGHT_JOIN,JOIN(省略INNER)四种写法。

select d.id, d.department, t.name from t_users t
inner join t_department d on d.id = t.department_id

结果说明;只去表A表和B表共同有的on 条件部分数据;

第二种:外连接 left join,left outer join ,right join, right outer join, union

1)左连接LEFT JOIN的含义就是求两个表A表和B表的交集外加左表剩下的数据。依旧从笛卡尔积的角度讲,就是先从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表A表中剩余的记录(见最后三条)。

where b.id is null

 

 

select   t.name, t.department_id, d.department from t_users t
left join t_department d on d.id = t.department_id

 

2)右连接 RIGHT JOIN

同理右连接RIGHT JOIN就是求两个表A和B表的交集外加右表B剩下的数据。再次从笛卡尔积的角度描述,右连接就是从笛卡尔积中挑出ON子句条件成立的记录,然后加上右表中剩余的记录(见最后一条)

 

 where a.id is null

 

select   t.id userid,t.name, t.department_id, d.department from t_users t
right join t_department d on d.id = t.department_id

 3)外连接 FULL OUTER JOIN

外连接就是求两个表A和B集合的并集。从笛卡尔积的角度讲就是从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余的记录,最后加上右表中剩余的记录。另外MySQL不支持OUTER JOIN,但是我们可以对左连接和右连接的结果做 UNION 操作来实现。

情景一:A和B的并集

 

select   t.id userid,t.name, t.department_id, d.department from t_users t
left join t_department d on d.id = t.department_id
UNION
select   t.id userid,t.name, t.department_id, d.department from t_users t
right join t_department d on d.id = t.department_id

情景二:A和B中不满足某个条件的记录

如:即不在A表user里面;也不在B表department里面的数据;条件 is null

select   t.id userid,t.name, t.department_id, d.department from t_users t
left join t_department d on d.id = t.department_id
where d.id is null
UNION
select   t.id userid,t.name, t.department_id, d.department from t_users t
right join t_department d on d.id = t.department_id
where t.department_id is null

 

以上是关于mysql中多表连接(不使用join )为啥 超过三张表就报错?的主要内容,如果未能解决你的问题,请参考以下文章

数据库中多表连接的原理实现

Access的Left join多表联合查询

Mysql 多表连接查询 inner join 和 outer join 的使用

hive中多表full join主键重复问题

ssh中多表查询及Path expected for join的异常处理

MySQL 多表连接内连接