当前位置: 首页 > news >正文

数据库原理及应用_数据库基础_第2章关系数据库标准语言SQL_数据查询(3)连接查询

前言

        "<数据库原理及应用>(MySQL版)".以下称为"本书"中2.3.3节

引入

        本书P54原话:连接查询是指对两个或两个以上的表或视图的查询.连接查询是关系数据库中最主要最有实际意义的查询,是关系数据库的一项核心功能.

        ---从两张以上的表中查询到内容,才是用得最多的.

学习准备

建立表

        参照本书P48和P49,建立三张表emp(雇员表),dept(部门表),salgrade(薪水等级表).如下

emp表

empnoenamejobmgrhiredatesalcommdeptno
7369SMITHCLERK790217/12/198080020
7499ALLENSALESMAN769820/2/1981160030030
7521WARDSALESMAN769822/2/1981125050030
7566JONESMANAGER78392/4/1981297520
7654MARTINSALESMAN769828/9/19811250140030
7698BLAKEMANAGER78391/5/1981285030
7782CLARKMANAGER78399/6/1981245010
7788SCOTTANALYST756619/4/1987300020
7839KINGPRESIDENT17/11/1981500010
7844TURNERSALESMAN76988/9/1981150030
7876ADAMSCLERK778823/5/1987110020
7900JAMESCLERK76983/12/198195030
7902FORDANALYST75663/12/1981300020
7934MILLERCLERK778223/1/1982130010

dept表

deptnodnameloc
10ACCOUNTINGNEW YORK
20RESEARCHDALLAS
30SALESCHICAGO
40OPERATIONSBOSTON

salgrade表

gradelosalhisal
17001200
212011400
314012000
420013000
530019999

观察发现emp(雇员表)和dept(部门表)存在联系,两者都有一列叫做deptno(部门号)

笛卡尔积

        连接查询的基本形态是笛卡尔积,理解成两张表相乘得到的结果是第一张表的一个元组与另一张表的每一个元组相乘,得到一张新的表.输入以下查询语句

SELECT deptno,dname,grade FROM dept,salgrade
ORDER BY deptno;

        得到的结果是

deptnodnamegrade
10ACCOUNTING1
10ACCOUNTING2
10ACCOUNTING3
10ACCOUNTING4
10ACCOUNTING5
20RESEARCH1
20RESEARCH2
20RESEARCH3
20RESEARCH4
20RESEARCH5
30SALES1
30SALES2
30SALES3
30SALES4
30SALES5
40OPERATIONS1
40OPERATIONS2
40OPERATIONS3
40OPERATIONS4
40OPERATIONS5

可以看出即使两张表毫无联系,也可以连接查询.对连接查询的结果有个印象(虽然结果也无意义)

        笛卡尔积在连接查询中有着重要的地位,所有的连接查询都是以笛卡尔积为基础,一定要理解.

初探连接查询

        连接查询是多表查询,和单表查询对比,FROM后面出现多个表的名称.

        为查询方便,可以为表起别名;当对一张表查询两次时,必须起别名.

        当两张表中有相同名称的列名(属性)时,冠以表名分开(可以使用表的别名)

        连接查询要有实在意义,避免无意义的连接查询(如上例),如果要描述上例中的查询,他表达的是:"查询每个部门每个职位的薪水等级",在无其他条件限制的情况下,没具体意义.

抽象理解

        两张表有相同的属性值(属性1-1),以此为依据找到其他属性的对应关系,

表1表2新表(表1连接表2)
属性1-1属性1-2属性1-1属性2-2属性1-1属性1-2属性2-2
值1值2值1值3值1值2值3

1.相等连接

        概念:又称为简单连接或内连接,它是把两个表中指定列的值相等的行连接起来.

        格式1:

                SELECT 列名1,....列名n FROM 表1,表2

                WHERE 条件表达式1,...条件表达式n

        格式2:

                SELECT 列名1,....列名n FROM 表1 INNER JOIN 表2 ON

                WHERE 条件表达式1,...条件表达式n

        推荐格式2---表1 INNER JOIN 表2 ON ,原因很简单,一眼就看出是连接查询

        含义:如"抽象理解"那张图所示---两张表中由相同属性值查找出不同属性间的关系. 

        本书P55例2-27,要求:查找薪资≥3000的人的讯息(雇员编号,雇员名,薪水,部门编号)---来自emp表及所在位置loc---来自dept表

        输入查询语句

SELECT empno,ename,sal,e.deptno,loc FROM emp e INNER JOIN dept d
ON e.deptno=d.deptno
WHERE sal>=3000
ORDER BY e.deptno;

              运行结果

2.自身连接

        概念:通过把一个表定义成两个不同别名的方法(即把一个表映射成两个表)来完成自身连接

        格式:

                SELECT 别名1.列名 别名, 别名2.列名 别名

                FROM 表1 别名1,表1 别名2

                WHERE 条件表达式1,...条件表达式n

        格式写法上和相等连接的格式1类似,格式有点难记,看后面的例子

        应用场景:

                自身连接的应用场景有点特殊,一张表中的两列存在相等的联系.如本书的emp表,有一列员工编号empno,一列管理员编号mgr.管理员同时也是员工.此时可以查询雇员对应的管理员是谁

        输入语句

SELECT e.ename 雇员,m.ename 管理员 FROM emp e,emp m
WHERE m.empno=e.mgr
AND e.deptno=20;

        运行结果

3.不等连接

        概念:连接运算符不使用等号的叫不等连接

        格式:略

        本书P56例2-29,要求查询在部门20工作的雇员的工资及工资等级信息

        输入语句

SELECT e.ename ,e.sal,s.grade FROM emp e,salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal
AND e.deptno=20;

        运行结果

说明:以笛卡尔积表去理解不等连接是比较容易的,乘积得到的表,用WHERE指明的条件一条条排除

4.左外连接

        左外连接的理解可以细化.

        1.左外连接也属于相等连接,ON后面内容判断第一个表的某项属性值和第二表的属性值相等.处理两个表连接的笛卡尔积,得到结果1

        2.在结果1中再用WHERE子句筛选,左表(第一个表)的属性值全部保留,第二个表属性值有就填没有就填NULL

=============================内容分割线↓===================================

细化是一种学习方法.当遇到某个学习内容无法消化,考虑把内容细化到能解决的程度.        

同时他也是问题解决的方法,当遇到当前问题没办法解决时,考虑把问题细化到能解决的程度.        

=============================内容分割线↑===================================

        格式(和相等连接类似):

                SELECT 列名1,....列名n FROM 表1 LEFT OUTER JOIN 表2 ON

                WHERE 条件表达式1,...条件表达式n

        举例:本书P56例2-30,要求以dept为左表,查询loc,dept.deptno,emp.deptno,ename,empno,左外连接emp表

        输入语句

SELECT loc,dept.deptno,emp.deptno,ename,empno FROM dept LEFT OUTER JOIN emp ON
dept.deptno=emp.deptno
WHERE dept.deptno=10 OR dept.deptno=40;

        运行结果

5.右外连接

        和左表连接几乎是镜像,不再赘述.

        注意:本书例2-30和例2-31的结果是相同的.再看两个查询语句,左表和右表换了位置,查询命令从LEFT OUTER JOIN换成了RIGHT OUTER JOIN,两两互换,结果没变.

        此时的左表是emp(FROM后的第一个表名),右表是dept,右外连接后右表(dept)内容全保留

        输入语句

SELECT loc,dept.deptno,emp.deptno,ename,empno FROM emp RIGHT OUTER JOIN dept ON
emp.deptno=dept.deptno
WHERE dept.deptno=10 OR dept.deptno=40;

        运行结果

小结

        连接查询的一点分析

        笛卡尔积是连接查询的基础.

        

http://www.dtcms.com/a/344156.html

相关文章:

  • 基于Python/django的仓库库存管理系统#基于Python的仓库管理系统#基django的J进销存管理系统
  • 力扣热题之贪心算法
  • halcon算子—gen_rectangle2和gen_rectangle1区别
  • Java泛型深度解析:从基础语法到高级应用
  • Java 19 新特性及具体应用
  • K8S高可用集群
  • 藏在 K8s 幕后的记忆中枢(etcd)
  • API模型与接口弃用指南:历史、替代方案及开发者应对策略
  • 疏老师-python训练营-Day53 对抗生成网络
  • Linux数字列排序命令
  • 【计算机视觉与深度学习实战】08基于DCT、DFT和DWT的图像变换处理系统设计与实现(有完整代码python3.13可直接粘贴使用)
  • 四十二、【核心功能强化】用例管理与调试:批量删除与在线请求测试
  • 使用EasyExcel自定义导出表格
  • 安全、高效、可靠的物理隔离网络安全专用设备———信刻光盘安全隔离与文件单向导入系统!
  • VLLM部署gpt-oss-20b踩坑记录
  • 集成电路学习:什么是SVM支持向量机
  • 快速了解神经网络
  • DigitalOcean Gradient AI平台现已支持OpenAI gpt-oss
  • 2025年大模型选型核心指南:Beyond GPT-4,如何理性评估Qwen、DeepSeek等强者?
  • TDengine IDMP 应用场景:微电网监控
  • nginx-如何卸载和升级编译安装的版本
  • 深入理解 hash -r:解决 Linux 命令缓存难题的关键密钥
  • 线性回归计算
  • 华为云物联网产品架构解析:资源空间、群组、产品、标签、网关、设备与子设备的关系梳理与设置指南
  • AI重构智慧展馆
  • 【数据分享】中国371个城市的坡度矢量数据和excel数据
  • [react] class Component and function Component
  • Android音频学习(十四)——加载音频设备
  • Mysql InnoDB 底层架构设计、功能、原理、源码系列合集【四、事务引擎核心 - MVCC与锁机制】
  • prompt提示词2