首页 > 其他分享 >6. DQL-多表查询

6. DQL-多表查询

时间:2024-07-09 15:30:44浏览次数:10  
标签:多表 查询 dept emp DQL deptno 连接 select

       本小节主要讲解数据库的多表查询功能,可实现从多个表中查询数据,多表查询内容包括内连接,外连接,笛卡尔积,等值连接,非等值连接,SQL99标准链接语法以及联合查询。

6.1.1 多表查询的介绍
  • 从多个表中获取数据
  • 思考如下问题?
  • 写一条查询语句,查询员工姓名、部门名称、工作地点?

 

6.1.2 连接的含义

       连接是在多个表之间通过一定的连接条件,使表之间发生关联,进而能从多个表之间获取数据。

       语法为:

select table1.column, table2.column
form table1, table2
where table1.column1 = table2.column2;

        1、在where子句中书写连接条件;

        2、如果在多个表中出现相同的列名,则需要使用表名作为来自该表的列名的前缀;

        3、n个表相连时,至少需要N-1个连接条件。

6.1.3 多表连接分类

按连接条件分:

      等值连接

      非等值连接

按其他连接方法分:

      外连接

      内连接

多表连接包含多种写法,我们主要介绍:

      基本写法:绝大多数符合SQL标准,其他关系型数据库也适用;

      ANNSI99写法:ANNSI标准提供的写法,所有关系型数据库必须支持。

6.2 笛卡尔积

6.2.1 笛卡尔积定义

      笛卡尔积,在数据库中表示将A表中每条记录与B表中的每条记录进行连接,连接后的查询结果就是笛卡尔积,也叫交叉连接。//了解即可看不懂也没事

6.2.2 笛卡尔积产生情况

      在实际应用中,笛卡尔积本身大多没有什么实际用处,而且还有一个附加问题:产生一个巨表。

      笛卡尔积在下列情况产生:

            链接条件被省略

            连接条件是无效的

      为了避免笛卡尔积的产生,通常要在where子句中包含一个有效连接条件

6.2.3 笛卡尔积写法

      笛卡尔积的写法

select emp.empno,emp.ename,emp.deptno,dept.deptno,dept.loc 
from emp,dept;

      笛卡尔积查询出的 记录总数=A表记录数*B表的记录数。

6.3 等值连接

      在实际应用中,笛卡尔积本身大多没有什么实际用处,只有在两个表连接时加上限制条件,才会有实际意义。

      连接的本质就是过滤掉或者避免产生无意义的两个表的组合数据。等值连接就是对连接条件进行有效的等值判断。

6.3.1 等值连接的介绍

      查询所有员工编号,姓名,部门编号,工作地点

select emp.empno,emp.ename,emp.deptno,dept.deptno,dept.loc
from emp,dept
where emp.deptno=dept.deptno;

EMPNO

ENAME

MGR

DEPTNO

LOC

7839

KING

10

NEW YORK

7698

BLAKE

30

30

CHICAGO

7782

CLARK

10

10

NEW YORK

7566

JONES

20

20

DALLAS

...

 

6.4 限制歧义列名

      在用到多个表时可以使用表名作前缀来限定列;

      通过使用表前缀可以提高性能;

      通过使用列的别名可以区分来自不同表但字段名相同的列;

6.5 使用表的别名

      通过使用表的别名来简化查询语句

      简化前 

select emp.empno,emp.ename,emp.deptno,dept.deptno,dept.loc
from emp,dept
where emp.deptno=dept.deptno;

      简化后 

select e.empno,e.ename,e.deptno,d.deptno,d.loc
from emp e,dept d
where e.deptno=d.deptno;

6.7 非等值连接

      查询每个员工的姓名,工资,工资等级

select e.ename,e.sal,s.grade
from emp e,salgrade s
where e.sal
between s.losal and s.hisal;

                     emp表

EMPNOENAMESAL
7839

KING

5000
7698BLAKE2850
7782CLARK2450
7566JONES2875
7654MARTIN1250
7499ALLEN1600
7844TURNER1500
7900JAMES950
14 rows selected..........

                      salgrade表 

GRADELOSALHISAL
17001200
212011400
314012000
420013000
530019999

      "emp表中的薪水实在salgrade表所规定的最低和最高范围内。"

6.8 多于两个表的连接

      如果想从员工表,部门表,工资级别表中同时检索数据,那么就会涉及三张表做连接。这个时候就需要至少两个连接条件。

      查询每个员工的员工姓名,员工工资,部门名称,工资级别。

select e.ename,e.sal,d.dname,s.grade 
from emp e,dept d,salgrade s 
where e.deptno = d.deptno and e.sal between s.losal and s.hisal;

 

6.9 多表连接的语法分析

      分析要查询的列都来自于哪些表,构成from子句;

      分析这些表之间的关联关系,构建各表之间的连接条件,通常N个表,至少要有N-1个连接条件;

      分析是否还有其它限制条件,补充到where子句的表关联关系之后,作为限制条件;

      根据用户想要显示的信息,补充select子句。

6.11 自连接

6.11.1 什么是自连接

      思考:查询每个员工的姓名和直接上级姓名?

      自身连接,也叫自连接,是一个表通过某种条件和本身进行连接的一种方式,就如同多个表连接一样。

select worker.ename ‘WNAME’,manager.ename ‘LNAME’
from emp worker, emp manager
where worker.mgr = manager.empno;

      在自连接中,就将自身表起n个名字(n代表你要连接几次)然后将这n个名字当作n个表,剩下的操作就和多表连接是一样的.

6.12 ANSI SQL:标准的连接语法

6.12.1 ANSI SQL:1999标准的连接语法

      除了上述已经讲过的连接语法外,多表查询还有美国国家标准协会(ANSI)的SQL标准语法:1999标准的连接语法。

select table1.column, table2.column
from table1
[join table2 
 on (table1.column_name = table2.column_name)]  | 
[left | right outer join table2 
 on (table1.column_name = table2.column_name)];
6.12.2 外连接介绍

      在多表连接时,可以使用外部连接来查看没有匹配连接条件的数据行

      左外连接以LEFT OUTER JOIN关键字左边的表为基表,该表所有行数据按照连接条件无论是否与右边表能匹配上,都会被显示出来。

      右外连接以RIGHT OUTER JOIN子句中的右边表为基表,该表所有行数据按照连接条件无论是否与左边表能匹配上,都会被显示出来。

6.12.3 左外连接写法

      查询所有雇员姓名,部门编号,部门名称,包括没有部门的员工也要显示出来.

select e.ename,e.deptno,d.loc 
from emp e 
left outer join dept d 
on (e.deptno = d.deptno);
6.12.4 右外连接写法

      查询所有雇员姓名,部门编号,部门名称,包括没有员工的部门也要显示出来.

select e.ename,e.deptno,d.loc 
from emp e 
right outer join dept d 
on (e.deptno = d.deptno);

6.13 联合查询

6.13.1 UNION查询

      //本小节了解即可 

      对于union查询,就是把多个查询结果合并起来,形成一个新的查询结果集(并集),ALL表示包含两个结果集中重复数据是否消除

      注:目前MySQL暂时不支持全外连接,所以可以使用union/union on进行实现

语法:

      select字段列表 from 表A

      union [all]

      select 字段列表 from 表B

查询所有部门(包括没有员工的部门)及所有员工(包括没有部门的员工)的   

select e.empno,e.ename,d.deptno,d.dname 
from emp e left outer join dept d on (e.deptno = d.deptno)
union 
select e.empno,e.ename,d.deptno,d.dname 
from emp e right outer join dept d on (e.deptno = d.deptno);

标签:多表,查询,dept,emp,DQL,deptno,连接,select
From: https://blog.csdn.net/weixin_55345689/article/details/140292460

相关文章

  • 数据库新开账号,并授予了相应表的查询权限。访问时,其他PC端远程被拒绝
    报错信息        DBMS:Casesensitivity:plain=mixed,delimited=exactDriver:(ver.,JDBC)Effectiveversion:MySQL(ver.0.0)[28000][1045]Accessdeniedforuser'woer_mysql_oa'@'172.16.41.94'(usingpassword:YES). 原因    上述报错可以......
  • powerquery中不同查询表之间的相互引用
    比如存在"客户信息"查询和"案件信息"查询。要在"案件信息"查询中,引用"客户信息"查询中的证件号这个字段下面的第一行。具体查询名称见下图。                                    图1查询内容 那么,......
  • Mysql中存储引擎简介、修改、查询、选择
    场景数据库存储引擎数据库存储引擎是数据库底层软件组件,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据的操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。现在许多数据库管理系统支持多种数据引......
  • Q:在PostgreSQL中跟踪和分析查询日志
    在PostgreSQL中,跟踪和分析查询日志是排查性能瓶颈的重要步骤。通过查看和分析查询日志,我们可以了解哪些查询在执行时遇到了问题,例如执行时间过长、资源消耗过大等。以下是一些建议和步骤,帮助你有效地跟踪和分析PostgreSQL的查询日志。 启用查询日志首先,你需要启用查询日志功......
  • RAG知识库之多表示索引
          在朴素RAG中通常会对文档、文本进行分块后进行文档嵌入,对所有文件、文本都没有经过采用Chunk方法可能有时候效果不是和好,尽管有着各种分块策略有针对大文件的、针对小文件的策略,但都难免可能会造成上下文语义丢失。      分块通常有两个非常重要的参数chunk_si......
  • 【后端面试题】【中间件】【NoSQL】MongoDB查询优化3(拆分、嵌入文档,操作系统)
    拆分大文档很常见的一种优化手段,在一些特定的业务场景中,会有一些很大的文档,这些文档有很多字段,而且有一些特定的字段还特别的大。可以考虑拆分这些文档大文档对MongoDB的性能影响还是很大的,就我个人经验而言,认为可以考虑从两个角度出发拆分大文档:按照字段的访问频率拆分:......
  • 商城项目库存管理系统采购需求查询------商城项目
    packagecom.alatus.mall.ware.service.impl;importorg.apache.commons.lang.StringUtils;importorg.springframework.stereotype.Service;importjava.util.Map;importcom.baomidou.mybatisplus.core.conditions.query.QueryWrapper;importcom.baomidou.mybatisplu......
  • 成绩查询
    进入题目猜测为sql注入直接sqlmap一把梭数据库表内容得到flag......
  • mysql执行查询的过程解析
    mysql执行查询的过程客户端先发送查询语句给服务器服务器检查缓存,如果存在则返回进行sql解析,生成解析树,再预处理,生成第二个解析树,最后再经过优化器,生成真正的执行计划根据执行计划,调用存储引擎的API来执行查询将结果返回给客户端。一、客户端到服务端之间的原理客户端和服......
  • 记一次.NET引用性能分析 - 客户说关联权限后查询不出数据
    背景:有客户说操作员关联权限后,某个页面查询不出数据,不关联权限就可以现象:1、用带权限的账号登进去后,查询不出数据,F12发现报错,"Anerroroccurredwhileexecutingthecommanddefinition.Seetheinnerexceptionfordetails."         2、浏览器......