is_deleted作为连接条件和筛选条件的区别

本文通过具体案例对比了SQL中is_deleted字段作为连接条件与筛选条件时的不同效果,揭示了这两种方式如何影响查询结果的数量及内容,并提供了可以实际运行的SQL语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、数据源

1.user表

image-20211217162722809

2.departments表

image-20211217162856721

二、作为连接条件

案例1:只给主表加is_deleted = 0

select t1.id,t1.name, t1.is_deleted as 't1.is_deleted', t2.department_id, t2.department_name,t2.is_deleted as 't2.is_deleted'
from user  t1
left join departments t2 on t1.department_id = t2.department_id and  t1.is_deleted = 0 
order  BY t1.id asc;

image-20211217163131050

结果分析:3条记录,因为左连接把t1都查出来了,而在t1.is_deleted = 0的这个条件下,让t1.is_deleted = 1记录的不参与连接。
因此t1.is_deleted = 1记录的右边列没有关联数据。

案例2:只给副表加is_deleted = 0

select t1.id,t1.name, t1.is_deleted as 't1.is_deleted', t2.department_id, t2.department_name,t2.is_deleted as 't2.is_deleted'
from user  t1
left join departments t2 on t1.department_id = t2.department_id and  t2.is_deleted = 0 
order  BY t1.id asc;

image-20211217163713521

结果分析:3条记录,因为左连接把t1都查出来了,而在t2.is_deleted = 0的这个条件下,让t2.is_deleted = 1记录的不参与连接。
因此t2.is_deleted = 1记录没有出现出现在结果集中。

案例3:同时给主表和副表加is_deleted = 0

select t1.id,t1.name, t1.is_deleted as 't1.is_deleted', t2.department_id, t2.department_name,t2.is_deleted as 't2.is_deleted'
from user  t1
left join departments t2 on t1.department_id = t2.department_id  and  t1.is_deleted = 0  and  t2.is_deleted = 0 
order  BY t1.id asc;

image-20211217163819626

结果分析:3条记录,因为左连接把t1都查出来了,而在’ t1.is_deleted = 0 and t2.is_deleted = 0 '的这个条件下,
让t1.is_deleted = 1和t2.is_deleted = 1记录的不参与连接。
因此只有t2.is_deleted = 1记录没有出现出现在结果集中。

三、作为筛选条件

案例1:只给主表加is_deleted = 0

select t1.id,t1.name, t1.is_deleted as 't1.is_deleted', t2.department_id, t2.department_name,t2.is_deleted as 't2.is_deleted'
from user  t1
left join departments t2 on t1.department_id = t2.department_id 
where t1.is_deleted = 0 
order  BY t1.id asc;

image-20211217164109594

结果分析:2条记录,因为左连接把t1都查出来了,而筛选条件t1.is_deleted = 0 把 't1.is_deleted = 1’的过滤掉了。

案例2:只给副表加is_deleted = 0

select t1.id,t1.name, t1.is_deleted as 't1.is_deleted', t2.department_id, t2.department_name,t2.is_deleted as 't2.is_deleted'
from user  t1
left join departments t2 on t1.department_id = t2.department_id  
where  t2.is_deleted = 0 
order  BY t1.id asc;

image-20211217164227521

结果分析:1条记录,把t2.is_deleted = 1的两条记录过滤掉了

案例3:同时给主表和副表加is_deleted = 0

select t1.id,t1.name, t1.is_deleted as 't1.is_deleted', t2.department_id, t2.department_name,t2.is_deleted as 't2.is_deleted'
from user  t1
left join departments t2 on t1.department_id = t2.department_id  
where t1.is_deleted = 0   and  t2.is_deleted = 0 
order  BY t1.id asc;

image-20211217164300346

结果分析:1条记录,把t1.is_deleted = 1 和 t2.is_deleted = 1的两条记录过滤掉了。

四、总结
①:is_deleted = 0 作为连接条件不会让记录条数减少,记录总数取决于主表和筛选条件,和连接条件没关系。
②:is_deleted = 0 作为连接条件会和副表相关的列值为null。
③:is_deleted = 0 作为筛选条件,会让记录条数减少。
五、如果你也想跑一下
-- user表及数据

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(11) NOT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `department_id` int(11) NULL DEFAULT NULL,
  `is_deleted` smallint(1) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `user` VALUES (1, '张翠', 1, 1);
INSERT INTO `user` VALUES (2, '李华', 1, 0);
INSERT INTO `user` VALUES (3, '王一', 2, 0);

-- departments表及数据

DROP TABLE IF EXISTS `departments`;
CREATE TABLE `departments`  (
  `department_id` int(11) NOT NULL COMMENT 'id',
  `department_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部门名字',
  `is_deleted` smallint(1) NOT NULL DEFAULT 0,
  PRIMARY KEY (`department_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `departments` VALUES (1, 'IT', 1);
INSERT INTO `departments` VALUES (2, '人力资源', 0);


表名 表标题(沐数) 字段序号 字段名称 字段标题(沐数) e_customer 客户信息表 1 CUSTOMID 客户ID e_customer 客户信息表 2 CUSTOMNAME 客户姓名 e_customer 客户信息表 3 COUNTRY 国家 e_customer 客户信息表 4 IS_DELETED 数据删除标签 e_emp 员工信息表 1 emp_id 员工编号 e_emp 员工信息表 2 company 公司简称 e_emp 员工信息表 3 name 人员姓名 e_emp 员工信息表 4 gender 性别 e_emp 员工信息表 5 birth_date 出生日期 e_emp 员工信息表 6 ethnic 民族 e_emp 员工信息表 7 service_years 工龄 e_emp 员工信息表 8 education 学历 e_emp 员工信息表 9 qualification 职业资格 e_emp 员工信息表 10 function 岗位职能 e_emp 员工信息表 11 talent_type 骨干类型 e_emp 员工信息表 12 position 岗位类别 e_emp 员工信息表 13 major 专业类别 e_emp 员工信息表 14 status 在岗状态 e_emp_changes 员工变动信息表 1 emp_id 员工ID e_emp_changes 员工变动信息表 2 emp_code 员工编号 e_emp_changes 员工变动信息表 3 change_reason 变动原因 e_emp_changes 员工变动信息表 4 employment_type 劳动关系类别 e_emp_changes 员工变动信息表 5 year 年度 e_emp_changes 员工变动信息表 6 month 月度 e_emp_changes 员工变动信息表 7 type 类型 e_emp_changes 员工变动信息表 8 is_deleted 删除标签 e_emp_training 员工培训记录 1 class_no 课程编号 e_emp_training 员工培训记录 2 emp_id 员工编号 e_emp_training 员工培训记录 3 course 课程名称 e_emp_training 员工培训记录 4 grade 成绩 e_emp_training 员工培训记录 5 created_at 考核时间 e_order 订单表 1 ORDERID 订单编号 e_order 订单表 2 ZTIME 下单时间 e_order 订单表 3 PRODUCTID 产品编号 e_order 订单表 4 SALE_AMOUNT 销售数量 e_order 订单表 5 CUSTOMID 客户编号 e_product 产品信息表 1 PRODUCTID 产品编号 e_product 产品信息表 2 PRODUCTNAME 产品名称 e_product 产品信息表 3 PRICE 【实操题】在岗状态: NULL 在岗; -1 离职; -2 已作废; 查询累计到每个年度的离职人数 结果输出:年度、当年离职人数、累计离职人数
最新发布
03-21
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值