目录
多表查询准备
测试数据导入
-- 部门管理
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课程