JavaWeb——MySQL-多表查询(1/7)-概述(多表查询准备、笛卡尔积现象、消除无效笛卡尔积与多表查询分类)

目录

多表查询准备

笛卡尔积现象

多表查询语法基础

笛卡尔积困境剖析

消除无效笛卡尔积与多表查询分类

关联条件过滤无效数据

多表查询类型概览


多表查询准备

测试数据导入

-- 部门管理
create table tb_dept
(
    id          int unsigned primary key auto_increment comment '主键ID',
    name        varchar(10) not null unique comment '部门名称',
    create_time datetime    not null comment '创建时间',
    update_time datetime    not null comment '修改时间'
) comment '部门表';

insert into tb_dept (id, name, create_time, update_time)
values (1, '学工部', now(), now()),
       (2, '教研部', now(), now()),
       (3, '咨询部', now(), now()),
       (4, '就业部', now(), now()),
       (5, '人事部', now(), now());


-- 员工管理
create table tb_emp
(
    id          int unsigned primary key auto_increment comment 'ID',
    username    varchar(20)      not null unique comment '用户名',
    password    varchar(32) default '123456' comment '密码',
    name        varchar(10)      not null comment '姓名',
    gender      tinyint unsigned not null comment '性别, 说明: 1 男, 2 女',
    image       varchar(300) comment '图像',
    job         tinyint unsigned comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师',
    entrydate   date comment '入职时间',
    dept_id     int unsigned comment '部门ID',
    create_time datetime         not null comment '创建时间',
    update_time datetime         not null comment '修改时间'
) comment '员工表';

INSERT INTO tb_emp
(id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time)
VALUES (1, 'jinyong', '123456', '金庸', 1, '1.jpg', 4, '2000-01-01', 2, now(), now()),
       (2, 'zhangwuji', '123456', '张无忌', 1, '2.jpg', 2, '2015-01-01', 2, now(), now()),
       (3, 'yangxiao', '123456', '杨逍', 1, '3.jpg', 2, '2008-05-01', 2, now(), now()),
       (4, 'weiyixiao', '123456', '韦一笑', 1, '4.jpg', 2, '2007-01-01', 2, now(), now()),
       (5, 'changyuchun', '123456', '常遇春', 1, '5.jpg', 2, '2012-12-05', 2, now(), now()),
       (6, 'xiaozhao', '123456', '小昭', 2, '6.jpg', 3, '2013-09-05', 1, now(), now()),
       (7, 'jixiaofu', '123456', '纪晓芙', 2, '7.jpg', 1, '2005-08-01', 1, now(), now()),
       (8, 'zhouzhiruo', '123456', '周芷若', 2, '8.jpg', 1, '2014-11-09', 1, now(), now()),
       (9, 'dingminjun', '123456', '丁敏君', 2, '9.jpg', 1, '2011-03-11', 1, now(), now()),
       (10, 'zhaomin', '123456', '赵敏', 2, '10.jpg', 1, '2013-09-05', 1, now(), now()),
       (11, 'luzhangke', '123456', '鹿杖客', 1, '11.jpg', 5, '2007-02-01', 3, now(), now()),
       (12, 'hebiweng', '123456', '鹤笔翁', 1, '12.jpg', 5, '2008-08-18', 3, now(), now()),
       (13, 'fangdongbai', '123456', '方东白', 1, '13.jpg', 5, '2012-11-01', 3, now(), now()),
       (14, 'zhangsanfeng', '123456', '张三丰', 1, '14.jpg', 2, '2002-08-01', 2, now(), now()),
       (15, 'yulianzhou', '123456', '俞莲舟', 1, '15.jpg', 2, '2011-05-01', 2, now(), now()),
       (16, 'songyuanqiao', '123456', '宋远桥', 1, '16.jpg', 2, '2007-01-01', 2, now(), now()),
       (17, 'chenyouliang', '123456', '陈友谅', 1, '17.jpg', NULL, '2015-03-21', NULL, now(), now());

于图形化工具(如 IDEA)全选复制脚本内容后粘贴执行,于指定数据库创建部门表(dpt)与员工表(emp)及插入测试数据。部门表含基础字段与部门名称字段,员工表含基础字段及关联部门表主键的外键字段dept_id,构建一对多关系模型,为多表查询演练提供数据支撑。

笛卡尔积现象

多表查询语法基础

        多表查询语法在单表查询基础上拓展,于FROM子句指定多张表(以逗号分隔)实现跨表数据检索,如

SELECT *
FROM emp,
     dpt;

可从员工与部门表查询数据,但未关联条件易引发笛卡尔积问题。

笛卡尔积困境剖析

        执行上述多表查询语句,结果集为两表记录组合,行数为员工表(17 条)与部门表(5 条)记录数乘积(85 条)。

        以员工与部门匹配为例,各员工与各部门组合,多数组合无业务意义(如员工与无关部门匹配),形成大量无效数据冗余,影响查询效率与数据准确性,需依业务规则消除无效笛卡尔积,精准获取有效数据。

消除无效笛卡尔积与多表查询分类

关联条件过滤无效数据

        为解笛卡尔积难题,依业务逻辑在查询语句WHERE子句添加关联条件,如

SELECT *
FROM tb_emp,
     tb_dept
where tb_emp.dept_id = tb_dept.id;

使员工表dept_id与部门表id匹配,筛出员工真实所属部门记录,消除无效组合,精准获取员工与对应部门信息。

多表查询类型概览

  • 连接查询

        内连接外连接。内连接聚焦查询表交集数据;外连接分左外与右外,左外连接以左表为基含左表全部及交集数据,右外连接以右表为基含右表全部及交集数据,各连接类型依业务场景按需选用,精准提取目标数据。

  • 子查询

        在查询语句嵌套子查询实现复杂筛选,依主查询需求灵活构建子查询条件,增强查询逻辑表达力与数据筛选精度,后续将深入剖析其语法与应用场景,为处理复杂多表查询需求赋能。


END


学习自:黑马程序员——JavaWeb课程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值