### Oracle 实验四:分组查询与链接查询
#### 分组函数
在Oracle数据库中,分组函数(也称为聚合函数)是用来对一组值执行计算并返回单一值的函数。常用的分组函数包括COUNT(), SUM(), AVG(), MAX(), MIN()等。
**案例一:查询30号所属于的编号的姓名、工资、奖金**
为了获取指定部门编号下的所有员工的姓名、工资及奖金,可以使用以下SQL语句:
```sql
SELECT ename, sal, comm
FROM emp
WHERE deptno = 30;
```
这里并没有明确提到使用分组函数,但基于题目描述中的“分组查询”,我们假设需要进一步了解该部门内员工的具体薪资分布情况。
**案例二:求每个部门的平均工资和最高工资,并进行排序**
对于这个需求,我们可以使用AVG()和MAX()分组函数,并结合GROUP BY子句来实现:
```sql
SELECT deptno, AVG(sal) AS avg_sal, MAX(sal) AS max_sal
FROM emp
GROUP BY deptno
ORDER BY avg_sal DESC;
```
此查询首先按部门编号进行分组,然后分别计算每个部门的平均工资和最高工资,并按平均工资降序排列。
#### 按照多列进行分组
在某些情况下,我们需要根据多个字段来分组数据,以获得更详细的信息。
**案例三:查询每个部门的每种岗位的平均工资和最高工资**
为了达到这一目的,我们可以扩展之前的查询,加入JOB字段作为额外的分组依据:
```sql
SELECT deptno, job, AVG(sal) AS avg_sal, MAX(sal) AS max_sal
FROM emp
GROUP BY deptno, job
ORDER BY deptno, job;
```
这将按部门编号和岗位进行分组,并计算每个部门每个岗位的平均工资和最高工资。
**案例四:查询编码在50以下的各部门的部门编号以及最高工资平均工资,显示平均工资大于2000**
为了筛选出符合条件的数据,可以在WHERE子句中添加条件,并继续使用AVG()和MAX()函数进行计算:
```sql
SELECT deptno, AVG(sal) AS avg_sal, MAX(sal) AS max_sal
FROM emp
WHERE empno < 50 AND deptno IN (SELECT deptno FROM dept)
GROUP BY deptno
HAVING AVG(sal) > 2000
ORDER BY deptno;
```
这里增加了IN子查询来确保只选择有效的部门编号,并使用HAVING子句过滤出平均工资大于2000的结果。
#### 连接查询
连接查询是指将两个或多个表中的数据合并到一个结果集中。根据连接类型的不同,可以分为内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL OUTER JOIN)。
**案例五:查询岗位为‘CLERK’的部门编号以及员工姓名**
这是一个简单的连接查询示例,它将emp表与dept表进行连接,以找到特定岗位的员工及其所在部门的信息:
```sql
SELECT d.deptno, e.ename
FROM emp e
JOIN dept d ON e.deptno = d.deptno
WHERE e.job = 'CLERK';
```
这里使用了INNER JOIN来进行等值连接。
**案例六:Dept与emp建立相等连接**
对于Dept与emp表之间的连接,同样可以通过INNER JOIN实现:
```sql
SELECT d.deptno, d.dname, e.ename
FROM dept d
INNER JOIN emp e ON d.deptno = e.deptno;
```
这将返回每个员工所在部门的名称。
**案例七:建立自身连接表中包含**
自身连接是指在一个查询中将同一个表当作不同的实体来处理。例如,如果需要比较同一个表中的不同记录,可以使用自身连接:
```sql
SELECT e1.ename AS emp_name, e2.ename AS manager_name
FROM emp e1
JOIN emp e2 ON e1.mgr = e2.empno;
```
这里e1代表员工表的一次引用,而e2代表另一次引用,通过mgr字段关联员工与其对应的经理。
通过对Oracle中的分组查询和链接查询的学习,我们可以更加灵活地处理复杂的数据关系,从而有效地提取有价值的信息。这些查询技巧不仅适用于Oracle数据库,也可以应用于其他支持SQL的标准数据库系统中。