高级技巧-使用Mysql 实现根据条件过滤整个分组数据
博客-mysql exists实现过滤所属条件对应分组的全部数据
在数据查询中,有时需要根据某一条件来过滤整个分组的数据,尤其是当某条记录满足特定条件时,需要将该组内的所有记录排除。本文将介绍如何使用 MySQL 的
EXISTS
关键字来实现这种分组过滤的功能。通过具体示例,我们展示了如何在复杂的数据库查询中高效地排除符合条件的分组数据
假设有一个旅游记录表,我想要查询 未去过长沙市旅游的人,
如果使用
where travel_city != ‘长沙’ 是实现不了的,因为一个人可能会去到很多地方,上述条件只是过滤了 去长沙的记录,但是我是想查询 没去过长沙的
这时候 可以使用exists条件实现
SELECT *
FROM travel_records t1
WHERE NOT EXISTS (
SELECT 1
FROM travel_records t2
WHERE t1.empId = t2.empId -- 同一员工(empId相同)
AND t2.travel_city = '长沙市' -- 条件:到过长沙市
);
实践
表结构和插入的数据
drop table travel_records ;
CREATE TABLE travel_records (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'Primary Key', -- 唯一标识
empId INT NOT NULL COMMENT '员工ID', -- 员工ID,用于分组
name VARCHAR(100) NOT NULL COMMENT '员工姓名', -- 员工姓名
age INT NOT NULL COMMENT '员工年龄', -- 员工年龄
travel_province VARCHAR(100) NOT NULL COMMENT '旅游的省', -- 旅游的省
travel_city VARCHAR(100) NOT NULL COMMENT '旅游的市', -- 旅游的市
travel_district VARCHAR(100) NOT NULL COMMENT '旅游的区或县' -- 旅游的区或县
) comment '人员旅游记录表';
插入数据
INSERT INTO travel_records (empId, name, age, travel_province, travel_city, travel_district) VALUES
(1001, '张三', 25, '湖南省', '长沙市', '岳麓区'),
(1001, '张三', 25, '湖北省', '武汉市', '武昌区'),
(1002, '李四', 30, '北京市', '北京市', '朝阳区'),
(1002, '李四', 30, '天津市', '天津市', '滨海新区'),
(1003, '王五', 35, '广东省', '广州市', '天河区'),
(1003, '王五', 35, '湖南省', '长沙市', '开福区'),
(1004, '赵六', 28, '上海市', '上海市', '浦东新区');
执行sql
# 正确的sql
SELECT *
FROM travel_records t1
WHERE NOT EXISTS (
SELECT 1
FROM travel_records t2
WHERE t1.empId = t2.empId -- 同一员工(empId相同)
AND t2.travel_city = '长沙市' -- 条件:到过长沙市
);
# 错误的sql
select * from travel_records where travel_city != '长沙市'