emp表结构及查询
### emp表结构及查询知识点详解 #### 一、emp表结构概述 在Oracle数据库中,`emp`表是`sctto`用户下四个基础表之一,对于初学者来说,掌握其结构与查询方法有助于深入理解SQL语言。此表主要用于存储员工信息。 - **EMPNO**:员工编号,数据类型为`NUMBER(4)`,主键,不允许为空。 - **ENAME**:员工姓名,数据类型为`VARCHAR2(10)`。 - **JOB**:职位名称,数据类型为`VARCHAR2(9)`。 - **MGR**:上级主管编号,数据类型为`NUMBER(4)`。 - **HIREDATE**:入职日期,数据类型为`DATE`。 - **SAL**:基本薪资,数据类型为`NUMBER(7,2)`。 - **COMM**:佣金,数据类型为`NUMBER(7,2)`。 - **DEPTNO**:部门编号,数据类型为`NUMBER(2)`。 #### 二、dept表结构概述 `dept`表用于存储部门信息,同样属于`sctto`用户。 - **DEPTNO**:部门编号,数据类型为`NUMBER(2)`,主键,不允许为空。 - **DNAME**:部门名称,数据类型为`VARCHAR2(14)`。 - **LOC**:办公地点,数据类型为`VARCHAR2(13)`。 #### 三、salgrade表结构概述 `salgrade`表用于存储薪资等级信息。 - **GRADE**:薪资等级,数据类型为`NUMBER`。 - **LOSAL**:最低薪资,数据类型为`NUMBER`。 - **HISAL**:最高薪资,数据类型为`NUMBER`。 #### 四、bonus表结构概述 `bonus`表用于记录员工的奖金信息。 - **ENAME**:员工姓名,数据类型为`VARCHAR2(10)`。 - **JOB**:职位名称,数据类型为`VARCHAR2(9)`。 - **SAL**:基本薪资,数据类型为`NUMBER`。 - **COMM**:佣金,数据类型为`NUMBER`。 #### 五、SQL查询语句示例 下面是一些基于上述表结构的常见SQL查询语句示例: 1. **选择部门编号为30的所有员工信息** ```sql SELECT * FROM emp WHERE deptno = 30; ``` 2. **查找所有职位为CLERK且部门编号为10或20的员工** ```sql SELECT ename, empno, dname FROM emp e INNER JOIN dept d ON e.deptno = d.deptno WHERE job = UPPER('clerk'); ``` 3. **查找佣金大于工资的所有员工** ```sql SELECT * FROM emp WHERE comm > sal; ``` 4. **查找佣金超过工资60%的所有员工** ```sql SELECT * FROM emp WHERE comm > sal * 0.6; ``` 5. **查找部门编号为10且职位为MANAGER或部门编号为20且职位为CLERK的员工** ```sql SELECT * FROM emp WHERE (deptno = 10 AND job = UPPER('manager')) OR (deptno = 20 AND job = UPPER('clerk')); ``` 6. **查找部门编号为10且职位为MANAGER或部门编号为20且职位为CLERK或既不是MANAGER也不是CLERK但工资大于等于2000的员工** ```sql SELECT * FROM emp WHERE (deptno = 10 AND job = UPPER('manager')) OR (deptno = 20 AND job = UPPER('clerk')) OR (job <> UPPER('manager') AND job <> UPPER('clerk') AND sal >= 2000); ``` 7. **查找有佣金的所有不同职位** ```sql SELECT DISTINCT job FROM emp WHERE comm > 0; ``` 8. **查找佣金低于100的所有员工** ```sql SELECT * FROM emp WHERE NVL(comm, 0) < 100; ``` 9. **查找入职当天即为当月最后一天的员工** ```sql SELECT * FROM emp WHERE hiredate = LAST_DAY(hiredate); ``` 10. **查找入职时间超过25年的员工** ```sql SELECT * FROM emp WHERE MONTHS_BETWEEN(SYSDATE, hiredate) / 12 > 25; SELECT * FROM emp WHERE hiredate < ADD_MONTHS(SYSDATE, -12 * 25); ``` 11. **查找名字首字母大写的员工** ```sql SELECT ename FROM emp WHERE ename = INITCAP(ename); ``` 12. **查找名字长度为6个字符的员工** ```sql SELECT ename FROM emp WHERE LENGTH(ename) = 6; ``` 13. **查找名字包含'R'的员工** ```sql SELECT ename FROM emp WHERE ename LIKE '%R%'; ``` 通过这些示例,我们可以看到如何结合表中的字段来构造复杂的SQL查询语句,这对于数据分析、报告生成等场景非常有用。此外,这些查询还可以根据具体需求进一步扩展,比如添加排序、分组等功能,从而更好地满足业务需求。