MySQL 连接查询汇总
作者:互联网
MYSQL-连接查询:
# 连接查询:把多张表进行记录的连接(按照某个条件进行数据的拼接)
# 分类
1,内链接
2,外连接
# 左外
# 右外
3,自然连接
4,交叉连接
MYSQL-内链接 :
# inner join (inner关键字可以省略) [inner join比left join快]
# 从左表中取出每一条记录,与右表中的所有记录进行匹配
# 匹配必须是某个条件,在左表和右表中相同【公共部分】,才会保留结果.否则,不保留
# 基本语法
SELECT * FROM [左表] innder join [右表] on [左表].[字段]=[右表].[字段];
# 内连接,可以没有on,那么系统会保留所有的结果,没错.又是传说中的笛卡尔积
# '还可以使用where代替on,但是效率没有on高'
例子:
排他性: A,B表中至少有1个匹配时,才返回行。两表的【交集】
SQL语句如下:
select A.name,B.address from A
inner join B
on A.id = B.A_id
查询结果为:
name address
张 北京
王 上海
inner join 内连接等价于下面的sql:
SELECT A.name, B.address
FROM A, B
WHERE A.id = B.A_id
MYSQL-外连接:
1, 左外
左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行。
【通俗:就是2张表,查左表满足条件的所有以及右表中含有左表条件的数据,where (右表条件)..is not null显示不为null的数】
# 以某张表为主,取出里面的所有记录.每条与另外一张表.不管能不能匹配上条件.最终都会保留.如果不能匹配,那么其他表的字段都置空
# left join (left join 是left outer join的简写)
# 基本语法
SELECT
...
FROM
[左表]
LEFT JOIN
[右表]
ON
[条件]
# 会把左边所有的数据都显示出来,如果右表没有匹配的数据.以null显示
例:SELECT * from a_table a LEFT JOIN b_table b on a.a_id = b.b_id (where b_id is not NULL);
2,右外
右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
【通俗:就是2张表,查右表满足条件的所有以及左表中含有右表条件的数据,where (左表条件)..is not null显示不为null的数】
# right join
# 基本语法
SELECT
...
FROM
[左表]
RIGHT JOIN
[右表]
ON
[条件]
# 会把右表所有的数据都显示出来,如果左表没有匹配的数据.以null显示
例:SELECT * from a_table a RIGHT JOIN b_table b on a.a_id = b.b_id (where a_id is not NULL);
MYSQL-自然连接:
# natural join
# MYSQL方言,其他数据库不一定有
# '自动的匹配连接条件',但是.不怎么建议使用.是以'字段名称作为匹配模式'
# 基本语法
SELECT ...FROM [表1] natural join [表2]; //内连接
* 自动使用同名字段作为连接条件,结果中会合并该字段
SELECT ...FROM [表1] left natural join [表2]; //左外自然连接
SELECT ...FROM [表1] right natural join [表2]; //右外自然连接
MYSQL-交叉连接:
# cross join
# 从一张表中循环取出每一条记录,每条记录都去另外一张表进行匹配.而且匹配一定保留(没有条件匹配不带条件where...)
# 而连接本身字段就会增加(保留) -- 笛卡尔积(笛卡尔是没有意义的,【尽量要避免】)
# 存在的价值:保证连接这种结构的完整性而已.
# 基本语法
SELECT * from [左表] cross join [右表]; == select * from [左表],[右表];
select * from emp cross join dept;
# 也可以加上条件
select *
from emp e
cross join
dept d
on e.deptno=d.deptno ;
【两表连接如果要避免返回笛卡尔积,必须确保至少一方表是唯一的,否则在能查到记录的情况下,不论哪一种连接方式一定会返回笛卡尔积记录集的。】
MYSQL-全外:
# 全外(MYSQL不支持,但是我们可以通过其他方式实现)
# 这个就是,左右两表都是相同的,两个表的所有内容都必须全部出来,如果没有对应记录的,就用null填充
select * from 表1 left outer join 表2 on 表1.字段=表2.字段
union
select * from 表1 right outer join 表2 on 表1.字段=表2.字段;
-联合查询 ,把他们的结果集合并一下就出来了
例: SELECT * from a_table a LEFT JOIN b_table b on a.a_id = b.b_id (where b_id is not NULL) UNION SELECT * from a_table a
LEFT JOIN b_table b on a.a_id = b.b_id (where b_id is not NULL);
本文由博客一文多发平台 OpenWrite 发布!
标签:join,汇总,查询,左表,MySQL,id,匹配,连接,SELECT 来源: https://www.cnblogs.com/mengtaolog/p/13471738.html