mysql - 查找薪资表中缺失的员工

标签 mysql

我有2个表,如下

`mysql> describe employees;
+------------+---------------+------+-----+---------+-------+
| Field      | Type          | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| emp_no     | int(11)       | NO   | PRI | NULL    |       |
| birth_date | date          | NO   |     | NULL    |       |
| first_name | varchar(14)   | NO   |     | NULL    |       |
| last_name  | varchar(16)   | NO   |     | NULL    |       |
| gender     | enum('M','F') | NO   |     | NULL    |       |
| hire_date  | date          | NO   |     | NULL    |       |
+------------+---------------+------+-----+---------+-------+
6 rows in set (0.01 sec)

mysql> describe salaries;
+-----------+---------+------+-----+---------+-------+
| Field     | Type    | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| emp_no    | int(11) | NO   | PRI | NULL    |       |
| salary    | int(11) | NO   |     | NULL    |       |
| from_date | date    | NO   | PRI | NULL    |       |
| to_date   | date    | NO   |     | NULL    |       |
+-----------+---------+------+-----+---------+-------+
4 rows in set (0.00 sec)`

考虑到每个员工都必须领薪水,我预计行数 在工资表中与员工中的表相同,因此员工中存在所有 emp_no 也包含在工资中。但是在执行 Count 语句时我看到下面的结果。

`mysql> select count(*) from employees;
+----------+
| count(*) |
+----------+
|   300024 |
+----------+
1 row in set (0.00 sec)
mysql> select count(*) from salaries;
+----------+
| count(*) |
+----------+
|  2844047 |
+----------+
1 row in set (0.00 sec)

这表明员工中很少有人,但工资却缺失,所以我这样做了 下面查询一下是否有。

`mysql> select * from employees where emp_no not in (select emp_no from salaries) ;
 Empty set (0.96 sec)`

emp_no 作为主键是唯一的,那么为什么两个表中的行数不同, 即使当我使用 not in 查询上面的结果时返回空集。

我还在员工中发现了一些相同的名字,但雇用日期不同,但 emp_no 对他们来说是不同的。

 `mysql> select * from employees where first_name='Zvonko' and last_name='Perko';
 +--------+------------+------------+-----------+--------+------------+
 | emp_no | birth_date | first_name | last_name | gender | hire_date  |
 +--------+------------+------------+-----------+--------+------------+
 |  20909 | 1961-04-24 | Zvonko     | Perko     | F      | 1990-12-14 |
 | 488633 | 1961-08-01 | Zvonko     | Perko     | F      | 1995-08-08 |
 +--------+------------+------------+-----------+--------+------------+

我哪里出错了?有人可以告诉我吗?

最佳答案

您的工资表的行数比您的员工表的行数多。大约三百万对大约三十万。

工资表有一个由两部分组成的主键,这意味着一名员工可能有多个具有不同 from_dates 的工资。你知道,为了加薪之类的。

关于mysql - 查找薪资表中缺失的员工,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27091987/

相关文章:

php - 在查询中使用 while 循环

mysql - 使用存储过程或查询

php - PDO 无法将行移动到不同的数据库

java - 出现不正确的 SQL 语法

java - JPA 执行查询但未插入数据

mysql - 如何在左连接查询中计数

php - 这个 php/mysql 登录系统安全吗?

mysql - 防止空密码登录MySQL

php - 从 Wordpress 用户元表中获取数据

php - 比较两个不同表中的字符串