求获取今日未出勤员工的MySQL查询语句(双表场景)
嗨,我来帮你搞定这个查询需求!要找出今日未出勤的员工,核心就是找那些在员工表中有记录,但今日的出勤记录表中没有对应打卡记录的人~结合你提供的表结构,我给你两种实用的MySQL查询方案:
方案1:LEFT JOIN + IS NULL(直观易读)
这种方法通过左连接保留所有员工,再筛选出没有匹配到今日出勤记录的员工:
SELECT e.emp_id, e.emp_name, e.department -- 替换为你员工表的实际字段 FROM employees e LEFT JOIN attendance a ON e.emp_id = a.emp_id AND DATE(a.attendance_date) = CURDATE() -- 若出勤表日期字段是DATE类型,可去掉DATE() WHERE a.emp_id IS NULL;
逻辑说明:
LEFT JOIN会保留员工表的所有数据,只匹配今日的出勤记录;那些未打卡的员工,出勤表对应的字段会是NULL,通过a.emp_id IS NULL就能精准筛选出来。
方案2:NOT EXISTS(逻辑清晰)
这种方法直接判断员工今日是否没有出勤记录,语义更明确:
SELECT e.emp_id, e.emp_name, e.department FROM employees e WHERE NOT EXISTS ( SELECT 1 FROM attendance a WHERE a.emp_id = e.emp_id AND DATE(a.attendance_date) = CURDATE() );
逻辑说明:
子查询会检查当前员工是否存在今日的出勤记录,NOT EXISTS就代表该员工今日没有打卡,也就是我们要找的未出勤人员。
关键注意点
- 日期字段适配:如果出勤表的日期字段是
DATETIME/TIMESTAMP类型,必须用DATE()函数提取日期部分,否则会因为时间(时分秒)不匹配导致查询错误;如果是DATE类型,直接用a.attendance_date = CURDATE()即可。 - 表/字段替换:记得把
employees、attendance替换成你实际的表名,emp_id、attendance_date等字段也要对应你表中的真实字段名。 - 过滤在职员工:如果不需要统计离职员工,可以在员工表的WHERE条件里加上类似
e.emp_status = '在职'的过滤规则(根据你员工表的状态字段调整)。
内容的提问来源于stack exchange,提问作者Raja Osama
相关产品推荐
相关产品推荐

