赞
踩
笛卡尔(Descartes)乘积又叫直积。假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}
create table t_user(
id int auto_increment primary key,
account varchar(64) ,
age int ,
name varchar(16)
)
create table t_body(
id int auto_increment primary key,
account varchar(64) ,
high int ,
weight varchar(16)
)
每个表都留了一条另一个表没有的数据(account对应不上)
join其实就是inner join,是inner join缩写
SELECT <select_list>
FROM Table_A A
INNER JOIN Table_B B
ON A.Key = B.Key
select * from t_user join t_body ;
返回的笛卡尔积
select * from t_user join t_body on t_user.account = t_body.account;
内连接返回两个表中匹配的行。实现方式可以是使用等值连接(ON条件),或者使用隐式的交叉连接(WHERE条件)。
SELECT <select_list>
FROM Table_A A
INNER JOIN Table_B B
ON A.Key = B.Key
select * from t_user inner join t_body ;
可以看到不带条件的时候其实就是两个集合笛卡尔积的结果
select * from t_user inner join t_body on t_user.account = t_body.account ;
得到的是在左右两个表account相同的记录
select * from t_user inner join t_body where t_user.account = t_body.account ;
select * from t_user inner join t_body on t_user.age = t_body.high ;
跨字段试试
加一条记录给t_body
select * from t_user inner join t_body on t_user.id = t_body.account ;
可以看到结果也被正确筛选出来了,我们删除这条刚加的继续往下试
左连接返回左表中的所有行,以及右表中与左表匹配的行。如果右表中没有匹配的行,则返回NULL值。
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
select * from t_user left join t_body ;
select * from t_user left join t_body on t_user.account = t_body.account;
也就是左边表的所有行都保留,右边的如果有匹配上了就有数据,匹配不到就把字段的值设置为NULL
右连接返回右表中的所有行,以及左表中与右表匹配的行。如果左表中没有匹配的行,则返回NULL值。
SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
select * from t_user right join t_body ;
全连接返回左表和右表中的所有行,如果左表或右表中没有匹配的行,则返回NULL值。
SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
mysql不支持直接全连接操作,可以把左连接和右连接的结果组装到一起就是了,但是不建议这样做,性能差
select * from t_user full outer join t_body ;
SELECT *
FROM t_user
LEFT JOIN t_body ON t_user.account = t_body.account
UNION
SELECT *
FROM t_user
RIGHT JOIN t_body ON t_user.account = t_body.account
WHERE t_user.account IS NULL;
select * from t_user left outer join t_body
select * from t_user left outer join t_body on t_user.account = t_body.account ;
跟left join是一个样的
select * from t_user right outer join t_body on t_user.account = t_body.account ;
跟right join是一样的
左排除连接返回左表中没有在右表中找到匹配的行。它只返回左表中没有与右表匹配的行,而右表中匹配的行将被排除在结果集之外。
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL
select * from t_user left join t_body on t_user.account = t_body.account where t_body.account is null ;
右排除连接返回右表中没有在左表中找到匹配的行。它只返回右表中没有与左表匹配的行,而左表中匹配的行将被排除在结果集之外。
SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL
select * from t_user right join t_body on t_user.account = t_body.account where t_user.account is null ;
外部排除连接是左排除连接和右排除连接的结合,返回左表和右表中没有匹配的行。它返回左表和右表中没有与对方表匹配的行,而匹配的行将被排除在结果集之外。
SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL OR B.Key IS NULL
full outer join 在mysql是不支持的,需要组合实现,将左连接和右连接筛选出的数据组合
select * from t_user left join t_body on t_user.account = t_body.account where t_user.account is null or t_body.account is null
union
select * from t_user right join t_body on t_user.account = t_body.account where t_user.account is null or t_body.account is null;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。