您的位置:首页 > 数据库 > MySQL

Mysql之多表查询(连接查询)

2020-02-15 10:43 246 查看

连接查询

含义:又称多表查询。当我们要查询的字段来自多个表,就会用到连接查询

笛卡尔乘积现象: 表1 有m行,表2 有n行 结果:m*n行

如何发生:没有有效的连接条件
如何避免:添加有效的连接条件

分类:

年代分类:
sql192标准:仅仅支持内连接
sql199标准,支持内连接+外连接(左外,右外)+交叉连接

功能分类:
内连接:
等值连接
非等值连接
自链接
外连接:
左外连接
右外连接
全外连接
交叉连接:

-----------------------sql92标准------------------

#一、内连接
语法:
select 查询列表
from 表1 别名,表2 别名
where 连接条件
and 筛选条件
group by 分组列表
having 分组后筛选
order by 排序列表

-----------------------SQL99语法------------------

一、内连接

语法:

SELECT 查询列表
FROM 表名1 别名
【INNER】 JOIN  表名2 别名
ON 连接条件
WHERE 筛选条件
GROUP BY 分组列表
HAVING 分组后筛选
ORDER BY 排序列表;

特点:
一,添加排序,分组,筛选
二,inner可以省略
三,筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读
四,inner join连接 和 sql192语法中的等值连接效果是一样的,都是查询多表的交集

分类:
内连接(⭐):inner
外连接
左外(⭐):left(outer)
右外(⭐):right(outer)
全外 : full(outer)
交叉连接: cross

SQL92和SQL99的区别:

SQL99,使用JOIN关键字代替了之前的逗号,并且将连接条件和筛选条件进行了分离,提高阅读性!!!

举个栗子(SQL99):

这里有两张表,一张女生表beauty,一张男生表boys,现在我们想将所有女生和 她们的男朋友显示出来

select g.`name`,b.boyName
from beauty g
INNER JOIN boys b
on g.boyfriend_id=b.id

结果:

二、外连接

/*
应用场景:查询一个表有 另一个表没有的记录

特点:
1.外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接查询结果=内连接结果+主表中有而从表中没有的记录
2.左外连接,left左边的是主表
右外连接,right join右边的是主表
3.左外和右外交换两个表的顺序,可以实现同样的效果

举个例子:

这里有两张表,一张女生表beauty,一张男生表boys,现在我们想将所有女生和 她们的男朋友显示出来,没有男朋友的,男朋友就显示空应该怎么做呢?

这里我们使用左外连接

select g.`name`,b.boyName
from beauty g
LEFT JOIN boys b
on g.boyfriend_id=b.id

得到的结果

这里我们筛选掉没有男朋友的妹子,添加筛选条件

select g.`name`,b.boyName
from beauty g
LEFT JOIN boys b
on g.boyfriend_id=b.idWHERE b.id is not null


上述一个张无忌拥有三个妹子是正常现象!!!

右外连接

这里右外连接与左外连接相同,只是要区分主表和从表就OK
我们发现:
左外连接的主表从表互换,就是右外连接的结果,这里就不再赘述。

全外连接

-- 全外连接= 内连接结果+表1中有但表2中没有+表2中有表1中没有的

交叉连接(就是一个笛卡尔乘积)

这里有48条记录,刚好是一个笛卡尔乘积12*4

select g.*,b.*
from beauty g
CROSS JOIN boys b;

  • 点赞
  • 收藏
  • 分享
  • 文章举报
仰望星空wdc 发布了18 篇原创文章 · 获赞 1 · 访问量 417 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: