深入理解Oracle分組查詢

一、基本概念

Oracle分組查詢指的是將一張表按照某個欄位或幾個欄位進行分組,並在每個組內進行聚合運算,得到結果集。分組查詢最常見的聚合運算包括:計數、求和、平均數、最大值和最小值。通過分組查詢,我們可以更好地理解數據,進行數據分析。

二、分組查詢的語法

分組查詢的語法基本如下:

SELECT column1, column2, COUNT(column3)
FROM table_name
GROUP BY column1, column2;

其中,column1column2指定了要進行分組的欄位,COUNT(column3)指定了要進行聚合運算的欄位,table_name是表名。需要注意的是,分組查詢的結果集中只包含SELECT子句中的聚合函數、分組欄位以及常量,在GROUP BY子句中未出現的列不允許出現在SELECT子句中。

三、基本的分組查詢示例

我們通過一個簡單的示例來說明分組查詢的用法。

假設我們有以下一張員工表:

EMPNO | ENAME  | JOB       | MGR     | HIREDATE  | SAL    | COMM | DEPTNO
------+--------+-----------+---------+-----------+--------+------+-------
7369  | SMITH  | CLERK     | 7902    | 17-DEC-80 | 800.00 |      | 20
7499  | ALLEN  | SALESMAN  | 7698    | 20-FEB-81 | 1600.00| 300  | 30
7521  | WARD   | SALESMAN  | 7698    | 22-FEB-81 | 1250.00| 500  | 30
7566  | JONES  | MANAGER   | 7839    | 02-APR-81 | 2975.00|      | 20
7654  | MARTIN | SALESMAN  | 7698    | 28-SEP-81 | 1250.00| 1400 | 30
7698  | BLAKE  | MANAGER   | 7839    | 01-MAY-81 | 2850.00|      | 30
7782  | CLARK  | MANAGER   | 7839    | 09-JUN-81 | 2450.00|      | 10
7788  | SCOTT  | ANALYST   | 7566    | 19-APR-87 | 3000.00|      | 20
7839  | KING   | PRESIDENT|         | 17-NOV-81 | 5000.00|      | 10
7844  | TURNER | SALESMAN  | 7698    | 08-SEP-81 | 1500.00|    0 | 30
7876  | ADAMS  | CLERK     | 7788    | 23-MAY-87 | 1100.00|      | 20
7900  | JAMES  | CLERK     | 7698    | 03-DEC-81 | 950.00 |      | 30
7902  | FORD   | ANALYST   | 7566    | 03-DEC-81 | 3000.00|      | 20
7934  | MILLER | CLERK     | 7782    | 23-JAN-82 | 1300.00|      | 10

我們可以按照部門DEPTNO進行分組查詢,統計各部門的平均工資:

SELECT DEPTNO, AVG(SAL)
FROM EMP
GROUP BY DEPTNO;

以上命令將返回以下結果:

DEPTNO | AVG(SAL)
------+---------
10    | 2916.67
20    | 2175.00
30    | 1566.67

另外,我們也可以按照職位JOB進行分組查詢,統計各職位的平均工資:

SELECT JOB, AVG(SAL)
FROM EMP
GROUP BY JOB;

以上命令將返回以下結果:

JOB          | AVG(SAL)
-------------+---------
ANALYST      | 3000.00
CLERK        | 1157.14
MANAGER      | 2758.33
PRESIDENT    | 5000.00
SALESMAN     | 1400.00

四、分組查詢的having子句

在前面的示例中,我們僅僅是對數據進行了分組查詢,並且使用了聚合函數進行了統計。然而,我們還可以使用HAVING子句對分組結果進行過濾。

HAVING子句的用法和WHERE子句是類似的,區別在於HAVING子句是對分組結果進行過濾,而WHERE子句是對單行記錄進行過濾。

以下是一個示例:

SELECT DEPTNO, AVG(SAL)
FROM EMP
GROUP BY DEPTNO
HAVING AVG(SAL) > 2000;

以上命令將返回以下結果:

DEPTNO | AVG(SAL)
------+---------
10    | 2916.67

在以上命令中,我們使用HAVING AVG(SAL) > 2000對分組結果進行過濾,只返回平均工資大於2000的部門。

五、分組查詢中的排序

我們可以在分組查詢的結果中進行排序。排序的語法如下:

SELECT column1, column2, ...
FROM table_name
GROUP BY column1, column2, ...
ORDER BY column1, column2, ... [ASC|DESC];

其中,column1column2等指定了要進行分組的欄位,table_name是表名,ORDER BY指定了排序的方式(默認為升序,如果需要降序可以使用DESC選項)。

以下是一個示例:

SELECT DEPTNO, AVG(SAL)
FROM EMP
GROUP BY DEPTNO
ORDER BY AVG(SAL) DESC;

以上命令將返回以下結果:

DEPTNO | AVG(SAL)
------+---------
10    | 2916.67
20    | 2175.00
30    | 1566.67

在以上命令中,我們按照平均工資進行降序排序。

六、分組查詢的高級用法

在實際工作中,我們可能需要更加複雜的分組查詢。下面介紹幾種分組查詢的高級用法。

1. 多個聚合函數同時使用

我們可以在一個分組查詢中使用多個聚合函數,並且對不同的欄位進行聚合:

SELECT DEPTNO, AVG(SAL), COUNT(*)
FROM EMP
GROUP BY DEPTNO;

以上命令將返回以下結果:

DEPTNO | AVG(SAL) | COUNT(*)
------+----------+---------
10    | 2916.670|        3
20    | 2175.000|        5
30    | 1566.670|        6

在以上命令中,我們同時使用了平均工資和記錄數這兩個聚合函數,分別對SAL*進行了聚合計算。

2. 連接查詢和分組查詢結合使用

我們可以使用連接查詢和分組查詢結合使用。以下是一個基本的示例:

SELECT DEPT.DNAME, AVG(EMP.SAL)
FROM EMP JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO
GROUP BY DEPT.DNAME;

以上命令將返回以下結果:

DNAME   | AVG(SAL)
--------+---------
ACCOUNTING| 2916.67
RESEARCH  | 2175.00
SALES     | 1566.67

在以上示例中,我們將EMP表和DEPT表連接起來,然後按照部門名稱進行分組查詢,並計算出平均工資。

3. 分組查詢和子查詢結合使用

我們還可以使用子查詢和分組查詢結合使用。以下是一個基本的示例:

SELECT column1, column2, ...
FROM table_name
WHERE column1 IN (
  SELECT column1
  FROM table_name
  GROUP BY column1
  HAVING COUNT(*) > 1
);

在以上示例中,我們首先進行子查詢,找出所有出現了兩次及以上的column1,然後通過IN運算符進行過濾,篩選出相應的記錄。

七、總結

本文從基本概念、語法、示例以及高級用法等方面詳細闡述了Oracle分組查詢的使用方法。分組查詢是數據分析和統計的重要手段,對於我們理解數據、進行數據分析都有非常重要的幫助。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/279515.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-20 15:04
下一篇 2024-12-20 15:04

相關推薦

  • 如何將Oracle索引變成另一個表?

    如果你需要將一個Oracle索引導入到另一個表中,可以按照以下步驟來完成這個過程。 一、創建目標表 首先,需要在資料庫中創建一個新的表格,用來存放索引數據。可以通過以下代碼創建一個…

    編程 2025-04-29
  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • Oracle Start With詳解

    一、Start With概述 Start With是Oracle中連接查詢的一個重要語句,它允許我們在一個遞歸查詢中藉助樹結構進行查詢,並且支持多種關聯查詢方式。通過Start W…

    編程 2025-04-25
  • 深入理解byte轉int

    一、位元組與比特 在討論byte轉int之前,我們需要了解位元組和比特的概念。位元組是計算機存儲單位的一種,通常表示8個比特(bit),即1位元組=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25
  • Oracle Table函數詳解

    一、概覽 Table函數是Oracle中一種高級SQL操作,它可以將複雜的表達式轉換成虛擬表來供查詢使用。使用Table函數,可以作為輸入多個行,返回一張臨時表。Table函數可以…

    編程 2025-04-25
  • 深入了解LaTeX的腳註(latexfootnote)

    一、基本介紹 LaTeX作為一種排版軟體,具有各種各樣的功能,其中腳註(footnote)是一個十分重要的功能之一。在LaTeX中,腳註是用命令latexfootnote來實現的。…

    編程 2025-04-25
  • Oracle更新的全面闡述

    一、概述 Oracle是業界著名的關係型資料庫,無論在企業級應用開發還是數據管理方面,都有著廣泛的應用。更新是Oracle中一個非常重要的操作,它可以實現數據的修改、添加、刪除等操…

    編程 2025-04-25

發表回復

登錄後才能評論