以下是完整的MySQL脚本,实现所有要求:
```sql
-- 1. 创建EMPLOYEES表
CREATE TABLE EMPLOYEES (
employee_id INT PRIMARY KEY,
employee_name VARCHAR(50) NOT NULL,
gender ENUM('男','女') NOT NULL,
department_id INT NOT NULL,
salary DECIMAL(10,2) NOT NULL
);
-- 2. 插入数据
INSERT INTO EMPLOYEES (employee_id, employee_name, gender, department_id, salary) VALUES
(1, '张三', '男', 10, 8500.00),
(2, '李四', '男', 20, 9200.00),
(3, '王芳', '女', 10, 7800.00),
(4, '赵敏', '女', 30, 10500.00),
(5, '刘强', '男', 10, 9500.00);
-- 3. 创建简单视图
CREATE VIEW EMP_VIEW AS
SELECT employee_id, employee_name, department_id
FROM EMPLOYEES
WHERE department_id = 10;
-- 4. 创建复杂视图
CREATE VIEW DEPT_AVG_SALARY_VIEW AS
SELECT department_id, ROUND(AVG(salary), 2) AS avg_salary
FROM EMPLOYEES
GROUP BY department_id;
-- 5. 创建单列索引
CREATE INDEX EMP_NAME_INDEX ON EMPLOYEES(employee_name);
-- 6. 创建复合索引
CREATE INDEX DEPT_SAL_INDEX ON EMPLOYEES(department_id, salary);
-- 7. 查询视图数据
SELECT * FROM EMP_VIEW;
SELECT * FROM DEPT_AVG_SALARY_VIEW;
```
### 执行说明:
1. **表结构**:
- `employee_id` 作为主键(INT类型)
- `gender` 使用ENUM类型确保只有'男'/'女'
- `salary` 使用DECIMAL类型保留两位小数
2. **插入数据**:
- 包含5条示例数据,覆盖不同部门和性别
3. **简单视图**:
- 仅显示部门编号=10的员工
- 包含三列:员工编号、姓名、部门编号
4. **复杂视图**:
- 计算每个部门的平均工资
- 使用ROUND()保留两位小数
- 分组统计部门薪资
5. **索引**:
- 单列索引在`employee_name`上优化姓名查询
- 复合索引在`(department_id, salary)`上优化部门薪资相关查询
6. **视图查询**:
- `EMP_VIEW` 查询结果:
```
+-------------+---------------+---------------+
| employee_id | employee_name | department_id |
+-------------+---------------+---------------+
| 1 | 张三 | 10 |
| 3 | 王芳 | 10 |
| 5 | 刘强 | 10 |
+-------------+---------------+---------------+
```
- `DEPT_AVG_SALARY_VIEW` 查询结果:
```
+---------------+------------+
| department_id | avg_salary |
+---------------+------------+
| 10 | 8600.00 |
| 20 | 9200.00 |
| 30 | 10500.00 |
+---------------+------------+
```
> **注意**:在MySQL中执行时,确保使用具有CREATE TABLE、CREATE VIEW等权限的用户(如root)执行脚本,或先创建SYSTEM用户并授权。实际部署时建议添加外键约束等完整性设计。