博客
关于我
mysql加强(4)~多表查询:笛卡尔积、消除笛卡尔积操作(等值、非等值连接),内连接(隐式连接、显示连接)、外连接、自连接
阅读量:792 次
发布时间:2023-02-12

本文共 1245 字,大约阅读时间需要 4 分钟。

笛卡尔积与多表连接查询技术解析

一、笛卡尔积的理解与避免

笛卡尔积是数据库中多表查询没有连接条件时返回的结果。以实际例子来看,集合A={a, b}与集合B={1, 2, 3}的笛卡尔积为{ {a,1}, {a,2}, {a,3}, {b,1}, {b,2}, {b,3} },共计6条记录。

在实际开发中,笛卡尔积应尽量避免。通过在where子句中添加有效的连接条件(如等值连接),可以有效减少笛卡尔积的数据量。对于n张表,至少需要n-1个连接条件。

二、外键约束与数据库设计

外键约束(foreign key)用于限定一张表的某一列数据来自另一张表的主键列,确保数据合法性。外键的作用包括:

  • 数据检查:确保引用数据合法,避免随意写入。
  • 与查询无关,仅在数据插入时起作用。
  • 外键常伴随事务,需选择InnoDB存储引擎。
  • 性能较低,开发中通常通过业务逻辑检查数据合法性,而非依赖外键约束。

外键通常用于多对多关系(如多个员工属于同一部门),开发中常通过下拉框选择“多的一方”。

三、消除笛卡尔积:等值连接与非等值连接

  • 等值连接

    最常见的连接方式,通常基于主外键约束,连接条件为=

  • 非等值连接

    连接条件不使用等号,常见于范围查询或排序。例如:

    select e.ename, e.sal, d.dname, s.grade from emp e join dept d on e.deptno = d.deptno join salgrade s on e.sal between s.losal and s.hisal;
  • 四、多表连接查询技术

  • 多表查询分类

    • 内连接(显式或隐式)
    • 外连接(左外、右外、全外)
    • 自连接(一张表与自身连接)
  • 多表查询图示

    (图示内容已移除,仅保留文字描述)

  • 重名列处理

    重名列需在前添加表名作为别名。例如:

    select e.ename, d.dname from emp e, dept d where e.deptno = d.deptno;select e.ename, d.dname from emp e join dept d on e.deptno = d.deptno;
  • 内连接查询

    • 隐式连接:
      select [字段列表] from 表A, 表B where 条件;
    • 显式连接:
      select [字段列表] from 表A inner join 表B on 条件;
  • 外连接查询

    • 左外连接:保留左侧表全部数据,右侧未匹配则填充null
    • 右外连接:保留右侧表全部数据,左侧未匹配则填充null
  • 自连接

    一张表与自身连接,需通过别名区分不同记录。例如:

    select e1.ename, e2.ename from emp e1 join emp e2 on e1.mgr = e2.empno;
  • 五、多表连接查询总结

    多表连接查询通过一个列名寻找对应的另一个列名,实现跨表数据关联。理解并掌握内连接、外连接、自连接等技术,是数据库开发的核心技能。

    转载地址:http://bmbfk.baihongyu.com/

    你可能感兴趣的文章
    mysql学号的字符长度_MYSQL--2
    查看>>
    mysql安全模式: sql_safe_updates
    查看>>
    mysql安装,卸载,连接
    查看>>
    MySQL安装之没有配置向导
    查看>>
    mysql安装出现 conflicts with mysql*的解决办法
    查看>>
    mysql安装卡在最后一步解决方案(附带万能安装方案)
    查看>>
    mysql安装和启动命令小结
    查看>>
    Mysql安装教程(命令行)
    查看>>
    mysql安装版安装
    查看>>
    MySQL安装配置教程(非常详细),从零基础入门到精通,看完这一篇就够了
    查看>>
    mysql安装配置简介
    查看>>
    MySQL定义和变量赋值
    查看>>
    mysql定时任务事件清理单表数据
    查看>>
    MySQL定时器Events
    查看>>
    Mysql定时备份脚本
    查看>>
    mysql实战01|基础架构:一条SQL查询语句是如何执行的?
    查看>>
    Mysql实战之数据备份
    查看>>
    MySQL实战教程:从小白到大神的进阶之路!
    查看>>
    mysql实现成绩排名
    查看>>
    Mysql客户端中文乱码问题解决
    查看>>