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

4.5.4.数据查询连接

在关系型数据库中,连接(Join)是 SQL 查询中最常用的操作之一,它用于在两个或多个表之间建立逻辑关系,将相关数据组合成一个结果集。

理解连接机制对于优化查询性能、设计高效数据库结构非常重要。

1.SQL连接的基本概念

连接(Join是指根据表之间的某种关联条件(通常是主键-外键关系或其他匹配条件),把多张表的数据组合成一个综合的结果集。

目的:将多个表的数据关联查询,避免数据冗余,提高数据结构的规范化。

条件:通常使用 ON 或 USING 指定匹配字段。

返回结果:每一行通常是多表匹配字段的笛卡尔积过滤结果。

2.SQL连接的类型

SQL连接主要分为以下几种类型:

2.1.内连接(INNER JOIN)

概念:只返回在两张表中匹配的行。

SQL 语法:

SELECTA.id, A.name, B.salary

FROMEmployee A

INNER JOINSalary B

ONA.id = B.emp_id;

机制:

1)对两个表进行匹配(通常根据索引或全表扫描)。

2)仅保留满足 ON 条件的记录。

应用场景:

只需要匹配的数据,不关心缺失值。

2.2.左连接(LEFT JOIN / LEFT OUTER JOIN)

概念:返回左表的所有行,即使右表没有匹配的行,右表字段显示为NULL

SQL 语法:

SELECT A.id, A.name, B.salary

FROM Employee A

LEFT JOINSalary B

ONA.id = B.emp_id;

机制:

遍历左表每一行。

查找右表中满足条件的行,如果没有匹配,右表字段填充 NULL。

应用场景:

左表数据完整性重要,需要显示未匹配右表的记录。

2.3.右连接(RIGHT JOIN / RIGHT OUTER JOIN)

概念:返回右表的所有行,即使左表没有匹配,左表字段显示为 NULL。

SQL 语法:

SELECT A.id, A.name, B.salary

FROM Employee A

RIGHT JOINSalary B

ON A.id = B.emp_id;

应用场景:右表数据完整性重要,需要显示未匹配左表的记录。

注意:左连接和右连接可以互换,主要看哪个表为“主表”。

2.4.全连接(FULL OUTER JOIN

概念:返回左右表的所有行,匹配的显示值,不匹配的用 NULL 补充。

SQL 语法(部分数据库如 MySQL 需用 UNION 实现):

SELECT A.id, A.name, B.salary

FROM Employee A

LEFT JOIN Salary B ON A.id = B.emp_id

UNION

SELECT A.id, A.name, B.salary

FROM Employee A

RIGHT JOIN Salary B ON A.id = B.emp_id;

应用场景:需要完整显示两张表的数据,无论是否匹配。

2.5.自连接(SELF JOIN

概念:表与自身连接,通常用于层级关系或比较。

SQL 语法:

SELECT A.name AS Employee, B.name AS Manager

FROM Employee A

INNER JOIN Employee B

ON A.manager_id = B.id;

应用场景:处理树状、层级结构,如员工-经理关系、分类-子类关系。

2.6.交叉连接(CROSS JOIN

概念:返回两张表的笛卡尔积(所有行的组合),无连接条件。

SQL 语法:

desc yonghu;

select A.id,B.addtime

FROM yonghu A

CROSS JOINyonghuzu B;

应用场景:需要生成所有组合情况,例如测试、组合分析。

4.性能优化建议

1)使用合适的连接类型

避免不必要的全连接和笛卡尔积,尽量用INNER JOINLEFT JOIN

2)创建索引

对连接字段建立索引,提升查找速度。

3)减少数据量

连接前先筛选数据(使用 WHERE 或子查询)。

4)选择小表驱动大表

在嵌套循环中,把小表作为外层表,提高效率。

5)分析执行计划

使用EXPLAIN或数据库执行计划工具,查看连接策略和扫描方式,调整查询结构。

http://www.cnnetsun.cn/news/115514.html

相关文章:

  • torch报错:ibtorch_cpu.so: cannot enable executable stack as shared object requires: Invalid argument
  • 计算机小程序毕设实战-基于springboot+微信小程序的餐厅预约系统设计与实现基于SpringBoot的在线点餐系统微信小程序【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 【课程设计/毕业设计】基于微信小程序跑腿平台的设计与实现代码基于springboot+微信小程序的跑腿小程序的设计与实现【附源码、数据库、万字文档】
  • jquery的基本使用(2)
  • HTML5结合Vue3实现超大文件分片上传的加密传输方案?
  • 基于增量动力分析方法IDA求解易损性曲线的Matlab代码探秘
  • mysql面试题整理
  • 瞄准科技特长生!3 大核心编程考级赛事(CTL/YCL/GESP)深度对比
  • day38打卡
  • JavaEE进阶——SpringBoot日志从入门到精通
  • 结构体简单题
  • 时间序列回归预测:LSTM、CNN - LSTM、PSO - CNN - LSTM、GAPSO - CNN - LSTM大比拼
  • 飞轮储能系统的建模与 MATLAB 仿真:永磁同步电机作为飞轮驱动电机
  • 车间进度总卡壳?生产小工单的3个必备功能,90%企业都用错了
  • 如何用 ShedLock 让 Spring Boot 的定时任务在多实例环境下只执行一次
  • 基于MPC的永磁同步电机非线性终端滑模控制仿真研究
  • ISSA - CNN - BiLSTM多输入单输出回归的Python实现与改进
  • Q学习(Q-learning)路径规划算法实战
  • ANSYS/LS - dyna防爆涂层砂浆砖框架结构爆破荷载损伤响应案例探索
  • 基于TOA/FOA的无源定位方法MATLAB仿真探索
  • 基于一致性算法改进的自适应虚拟阻抗控制:解决双机并联功率分布不均
  • springboot框架对接物联网,配置TCP协议依赖,与设备通信,让TCP变的如此简单
  • 微软和布朗大学最新发现:让AI助手拥有18000多种技能的革命性突破
  • MATLAB仿真:二维TOA传感器网络定位与时钟偏差拟合,最小二乘求解
  • 【参数辨识】基于卡尔曼滤波(KF)估计离散线性系统对垂直起降(VTOL)飞行器的鲁棒辨识附matlab代码
  • 桥梁与隧道安全守护者 抗冰冻型风速监测方案
  • 05-FreeRTOS的内存管理
  • 基于改进蛇优化算法(GOSO/ISO)优化随机森林数据回归预测模型(含初始化种群混沌映射、减法...
  • 基于大数据的人脸识别系统设计与实现开题报告
  • 车载 Android 系统稳定性问题全解析:从性能到黑屏的排查指南