【数据库】多表查询

多表查询

在讲解多表查询前,本人先来提出这么一个问题:

现给出一张表employee和一张表project
那么,若是我们采用如下sql语句,会得到什么结果:

SELECT works_on.*,project.* FROM works_on,project;

首先,本人来展示下表employee和表project的内容:


employee表 展示

project表 展示

那么,现在本人来展示下运行结果:

笛卡尔积 展示

上面这种不加条件的简单多表查询,就是本人在《数据结构与算法》专栏提到过的笛卡尔积
(即:将两张表的各列进行“两两相乘”所得的结果)


那么,现在本人来介绍下我们常用的多表查询的手段
常用的多表查询的手段

  • 内连接
  • 外连接
  • 子查询

那么,本人首先来介绍下 内连接

内连接:

格式:

  • 格式1:显式的内连接
    select a.* ,b.* from a inner join b on ab的连接条件

(inner可以不写)

  • 格式2:隐式的内连接
    select a.* ,b.* from a,b where ab的连接条件

作用:

只显示满足 ab的连接条件笛卡尔积

那么,现在本人就来展示下内连接:

-- 隐式内连接
SELECT works_on.emp_no,works_on.job,project.* FROM works_on,project WHERE works_on.`project_no`=project.`project_no`;

-- 显示内连接1
SELECT works_on.emp_no,works_on.job,project.* FROM works_on INNER JOIN project ON works_on.`project_no`=project.`project_no`;

-- 显示内连接2
SELECT works_on.emp_no,works_on.job,project.* FROM works_on JOIN project ON works_on.`project_no`=project.`project_no`;

现在本人来展示下运行结果:


内连接 展示

外连接:

格式

  • 左外连接:
    select a.,b. from a left [outer] join b on 连接条件;
    (outer 可以不写)

作用:
先展示join左边的(a)表所有数据
根据条件关联查询 join右边的表(b)
符合条件的则展示出来不符合null值展示

  • 右外连接:
    select a.* ,b.* from b right [outer] join a on 连接条件;
    (outer 可以不写)

作用:
先展示jion右边的(a)表所有数据,
根据条件关联查询join左边的表(b),
符合条件的则展示出来,不符合null值展示

那么,现在本人来展示下外连接:

-- 左连接
SELECT works_on.emp_no,works_on.job,project.* FROM works_on LEFT OUTER JOIN project ON works_on.`project_no`=project.`project_no`;

运行结果为:


左连接 展示

-- 右连接
SELECT works_on.emp_no,works_on.job,project.* FROM works_on RIGHT OUTER JOIN project ON works_on.`project_no`=project.`project_no`;

运行结果为:


右连接 展示

子查询:

格式
将一个查询的结果当作另一个查询的基表
SELECT a.* FROM a WHERE 字段名 IN(b的一个查询结果)
功能
一个查询依赖另一个查询

那么,现在本人来展示下子查询:

SELECT * FROM works_on WHERE project_no IN(SELECT project_no FROM project WHERE budget>100000);

那么,现在本人来展示下运行结果:


子查询 展示

学习了子查询的相关知识点,本人现在来讲解一个由子查询衍生出来的查询方法 —— 自查询

自连接查询(自查询):

实现手段
通过表的别名
一张表两个别名
将它视为两张表,来进行查询

那么,现在本人来展示下 自查询:

假设我有一张emp表,用于存储员工的信息
(员工编号empno、上司编号mgr、员工自身其他信息)

那么,我们就可以假设有两张表
一张员工表、一张上司表
如果员工的 上司编号mgr=上司的 员工编号empno
就表示另外一个员工这个员工上司

SELECT e1.`empno`,e1.mgr,e1.ename,e2.ename,e2.`empno` FROM emp e1,emp e2 WHERE e1.`mgr`=e2.`empno`;

总而言之,我们在多表查询的过程中,
巧妙运用中间表以及别名的机制,
在面对多种多表查询的需求时,就比较容易解决了


那么,本篇博文的知识点在这里就讲解完毕了。
(请观看本人博文 —— 《数据库 —— 专栏总集篇》)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容