
以下文章來源于數(shù)有道 ,作者數(shù)據星爺
SQL查詢是數(shù)據分析工作的基礎,也是CDA數(shù)據分析師一級的核心考點,人工智能時代,AI能為我們節(jié)省多少工作量?本來想用deepseek部署,被卡出三界外,不在五行中,后來選擇了通義靈碼。
環(huán)境
AI環(huán)境:VScode+通義靈碼
練習網站:https://sqlfiddle.com/postgresql/online-compiler
數(shù)據庫:數(shù)據庫是一個有組織的數(shù)據集合,通常以電子表格的形式存儲。它由多個表組成,每個表代表一種特定類型的數(shù)據集合。
表:表是數(shù)據庫中數(shù)據的基本存儲單位,類似于Excel中的工作表。表由行(記錄)和列(字段)構成。每一行代表一條記錄,每一列代表一個屬性。
例如,在一個電商數(shù)據庫中,可能會有以下幾張表:
SQL(Structured Query Language,結構化查詢語言)是一種用于管理和操作關系型數(shù)據庫的標準語言。它的基本結構包括以下幾個部分:
假設我們有一個名為 users 的表,包含以下字段:
我們可以編寫一個簡單的SQL查詢來獲取所有用戶的姓名和郵箱:
SELECT name, email FROM users;
如果我們只想獲取名字中包含 "張" 的用戶,可以使用 WHERE 子句:
SELECT name, email
FROM users
WHERE name LIKE '%張%';
通過理解數(shù)據庫和表的概念以及SQL語言的基本結構,你可以開始構建簡單的查詢語句來檢索和操作數(shù)據。這是學習SQL的基礎,后續(xù)我們將在此基礎上深入學習更復雜的查詢和操作。
數(shù)據檢索是SQL中最常用的操作之一,它允許你從數(shù)據庫中提取所需的數(shù)據。我們將詳細講解如何使用SELECT語句及其相關子句來實現(xiàn)各種數(shù)據檢索操作。
首先,我們創(chuàng)建一個包含10條員工數(shù)據的臨時表 employees。
WITH employees AS (
SELECT 1 AS id, '張三' AS name, '銷售部' AS department, 5000 AS salary UNION ALL
SELECT 2, '李四', '市場部', 6000 UNION ALL
SELECT 3, '王五', '銷售部', 5500 UNION ALL
SELECT 4, '趙六', '技術部', 7000 UNION ALL
SELECT 5, '孫七', '市場部', 6500 UNION ALL
SELECT 6, '周八', '技術部', 7500 UNION ALL
SELECT 7, '吳九', '銷售部', 4500 UNION ALL
SELECT 8, '鄭十', '市場部', 5000 UNION ALL
SELECT 9, '錢十一', '技術部', 8000 UNION ALL
SELECT 10, '王十二', '銷售部', 4000
)
示例 要獲取所有員工的姓名和部門:
WITH employees AS (
SELECT 1 AS id, '張三' AS name, '銷售部' AS department, 5000 AS salary UNION ALL
SELECT 2, '李四', '市場部', 6000 UNION ALL
SELECT 3, '王五', '銷售部', 5500 UNION ALL
SELECT 4, '趙六', '技術部', 7000 UNION ALL
SELECT 5, '孫七', '市場部', 6500 UNION ALL
SELECT 6, '周八', '技術部', 7500 UNION ALL
SELECT 7, '吳九', '銷售部', 4500 UNION ALL
SELECT 8, '鄭十', '市場部', 5000 UNION ALL
SELECT 9, '錢十一', '技術部', 8000 UNION ALL
SELECT 10, '王十二', '銷售部', 4000
)
SELECT name, department
FROM employees;
結果:
示例 要獲取工資大于5000的員工信息:
WITH employees AS (
SELECT 1 AS id, '張三' AS name, '銷售部' AS department, 5000 AS salary UNION ALL
SELECT 2, '李四', '市場部', 6000 UNION ALL
SELECT 3, '王五', '銷售部', 5500 UNION ALL
SELECT 4, '趙六', '技術部', 7000 UNION ALL
SELECT 5, '孫七', '市場部', 6500 UNION ALL
SELECT 6, '周八', '技術部', 7500 UNION ALL
SELECT 7, '吳九', '銷售部', 4500 UNION ALL
SELECT 8, '鄭十', '市場部', 5000 UNION ALL
SELECT 9, '錢十一', '技術部', 8000 UNION ALL
SELECT 10, '王十二', '銷售部', 4000
)
SELECT name, salary
FROM employees
WHERE salary > 5000;
結果
示例 要按工資從高到低排序員工信息:
WITH employees AS (
SELECT 1 AS id, '張三' AS name, '銷售部' AS department, 5000 AS salary UNION ALL
SELECT 2, '李四', '市場部', 6000 UNION ALL
SELECT 3, '王五', '銷售部', 5500 UNION ALL
SELECT 4, '趙六', '技術部', 7000 UNION ALL
SELECT 5, '孫七', '市場部', 6500 UNION ALL
SELECT 6, '周八', '技術部', 7500 UNION ALL
SELECT 7, '吳九', '銷售部', 4500 UNION ALL
SELECT 8, '鄭十', '市場部', 5000 UNION ALL
SELECT 9, '錢十一', '技術部', 8000 UNION ALL
SELECT 10, '王十二', '銷售部', 4000
)
SELECT name, salary
FROM employees
ORDER BY salary DESC;
結果
示例 要獲取前5名最高工資的員工信息,并按工資降序排序:
WITH employees AS (
SELECT 1 AS id, '張三' AS name, '銷售部' AS department, 5000 AS salary UNION ALL
SELECT 2, '李四', '市場部', 6000 UNION ALL
SELECT 3, '王五', '銷售部', 5500 UNION ALL
SELECT 4, '趙六', '技術部', 7000 UNION ALL
SELECT 5, '孫七', '市場部', 6500 UNION ALL
SELECT 6, '周八', '技術部', 7500 UNION ALL
SELECT 7, '吳九', '銷售部', 4500 UNION ALL
SELECT 8, '鄭十', '市場部', 5000 UNION ALL
SELECT 9, '錢十一', '技術部', 8000 UNION ALL
SELECT 10, '王十二', '銷售部', 4000
)
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 5;
結果
示例 要獲取屬于 "銷售部" 的前3名最高工資的員工信息,并按工資降序排序:
WITH employees AS (
SELECT 1 AS id, '張三' AS name, '銷售部' AS department, 5000 AS salary UNION ALL
SELECT 2, '李四', '市場部', 6000 UNION ALL
SELECT 3, '王五', '銷售部', 5500 UNION ALL
SELECT 4, '趙六', '技術部', 7000 UNION ALL
SELECT 5, '孫七', '市場部', 6500 UNION ALL
SELECT 6, '周八', '技術部', 7500 UNION ALL
SELECT 7, '吳九', '銷售部', 4500 UNION ALL
SELECT 8, '鄭十', '市場部', 5000 UNION ALL
SELECT 9, '錢十一', '技術部', 8000 UNION ALL
SELECT 10, '王十二', '銷售部', 4000
)
SELECT name, salary
FROM employees
WHERE department = '銷售部'
ORDER BY salary DESC
LIMIT 3;
結果
通過上述示例,你可以看到如何使用 WITH 子句創(chuàng)建一個臨時表,并在此基礎上進行各種數(shù)據檢索操作。這些示例涵蓋了 SELECT、WHERE、ORDER BY 和 LIMIT 的基本用法,幫助你更好地理解和驗證查詢結果。
使用COUNT(), SUM(), AVG(), MAX(), MIN()等聚合函數(shù)
使用GROUP BY對數(shù)據進行分組
首先,我們創(chuàng)建一個包含10條員工數(shù)據的臨時表 employees。
WITH employees AS (
SELECT 1 AS id, '張三' AS name, '銷售部' AS department, 5000 AS salary UNION ALL
SELECT 2, '李四', '市場部', 6000 UNION ALL
SELECT 3, '王五', '銷售部', 5500 UNION ALL
SELECT 4, '趙六', '技術部', 7000 UNION ALL
SELECT 5, '孫七', '市場部', 6500 UNION ALL
SELECT 6, '周八', '技術部', 7500 UNION ALL
SELECT 7, '吳九', '銷售部', 4500 UNION ALL
SELECT 8, '鄭十', '市場部', 5000 UNION ALL
SELECT 9, '錢十一', '技術部', 8000 UNION ALL
SELECT 10, '王十二', '銷售部', 4000
)
聚合函數(shù)用于對一組值執(zhí)行計算并返回單個值。常用的聚合函數(shù)包括:
示例- count 計算總員工數(shù):
WITH employees AS (
SELECT 1 AS id, '張三' AS name, '銷售部' AS department, 5000 AS salary UNION ALL
SELECT 2, '李四', '市場部', 6000 UNION ALL
SELECT 3, '王五', '銷售部', 5500 UNION ALL
SELECT 4, '趙六', '技術部', 7000 UNION ALL
SELECT 5, '孫七', '市場部', 6500 UNION ALL
SELECT 6, '周八', '技術部', 7500 UNION ALL
SELECT 7, '吳九', '銷售部', 4500 UNION ALL
SELECT 8, '鄭十', '市場部', 5000 UNION ALL
SELECT 9, '錢十一', '技術部', 8000 UNION ALL
SELECT 10, '王十二', '銷售部', 4000
)
SELECT COUNT(*) AS total_employees
FROM employees;
結果:
total_employees
10
示例-sum 計算所有員工的總薪水:
WITH employees AS (
SELECT 1 AS id, '張三' AS name, '銷售部' AS department, 5000 AS salary UNION ALL
SELECT 2, '李四', '市場部', 6000 UNION ALL
SELECT 3, '王五', '銷售部', 5500 UNION ALL
SELECT 4, '趙六', '技術部', 7000 UNION ALL
SELECT 5, '孫七', '市場部', 6500 UNION ALL
SELECT 6, '周八', '技術部', 7500 UNION ALL
SELECT 7, '吳九', '銷售部', 4500 UNION ALL
SELECT 8, '鄭十', '市場部', 5000 UNION ALL
SELECT 9, '錢十一', '技術部', 8000 UNION ALL
SELECT 10, '王十二', '銷售部', 4000
)
SELECT SUM(salary) AS total_salary
FROM employees;
結果:
total_salary
59000
示例-avg 計算所有員工的平均薪水:
WITH employees AS (
SELECT 1 AS id, '張三' AS name, '銷售部' AS department, 5000 AS salary UNION ALL
SELECT 2, '李四', '市場部', 6000 UNION ALL
SELECT 3, '王五', '銷售部', 5500 UNION ALL
SELECT 4, '趙六', '技術部', 7000 UNION ALL
SELECT 5, '孫七', '市場部', 6500 UNION ALL
SELECT 6, '周八', '技術部', 7500 UNION ALL
SELECT 7, '吳九', '銷售部', 4500 UNION ALL
SELECT 8, '鄭十', '市場部', 5000 UNION ALL
SELECT 9, '錢十一', '技術部', 8000 UNION ALL
SELECT 10, '王十二', '銷售部', 4000
)
SELECT AVG(salary) AS average_salary
FROM employees;
結果:
average_salary
5900.00
示例-max 返回最高薪水:
WITH employees AS (
SELECT 1 AS id, '張三' AS name, '銷售部' AS department, 5000 AS salary UNION ALL
SELECT 2, '李四', '市場部', 6000 UNION ALL
SELECT 3, '王五', '銷售部', 5500 UNION ALL
SELECT 4, '趙六', '技術部', 7000 UNION ALL
SELECT 5, '孫七', '市場部', 6500 UNION ALL
SELECT 6, '周八', '技術部', 7500 UNION ALL
SELECT 7, '吳九', '銷售部', 4500 UNION ALL
SELECT 8, '鄭十', '市場部', 5000 UNION ALL
SELECT 9, '錢十一', '技術部', 8000 UNION ALL
SELECT 10, '王十二', '銷售部', 4000
)
SELECT MAX(salary) AS max_salary
FROM employees;
結果:
max_salary
8000
示例-min 返回最低薪水:
WITH employees AS (
SELECT 1 AS id, '張三' AS name, '銷售部' AS department, 5000 AS salary UNION ALL
SELECT 2, '李四', '市場部', 6000 UNION ALL
SELECT 3, '王五', '銷售部', 5500 UNION ALL
SELECT 4, '趙六', '技術部', 7000 UNION ALL
SELECT 5, '孫七', '市場部', 6500 UNION ALL
SELECT 6, '周八', '技術部', 7500 UNION ALL
SELECT 7, '吳九', '銷售部', 4500 UNION ALL
SELECT 8, '鄭十', '市場部', 5000 UNION ALL
SELECT 9, '錢十一', '技術部', 8000 UNION ALL
SELECT 10, '王十二', '銷售部', 4000
)
SELECT MIN(salary) AS min_salary
FROM employees;
結果:
min_salary
4000
GROUP BY 子句用于將結果集按一個或多個列進行分組,通常與聚合函數(shù)一起使用。
示例-count 按部門分組,計算每個部門的員工數(shù):
WITH employees AS (
SELECT 1 AS id, '張三' AS name, '銷售部' AS department, 5000 AS salary UNION ALL
SELECT 2, '李四', '市場部', 6000 UNION ALL
SELECT 3, '王五', '銷售部', 5500 UNION ALL
SELECT 4, '趙六', '技術部', 7000 UNION ALL
SELECT 5, '孫七', '市場部', 6500 UNION ALL
SELECT 6, '周八', '技術部', 7500 UNION ALL
SELECT 7, '吳九', '銷售部', 4500 UNION ALL
SELECT 8, '鄭十', '市場部', 5000 UNION ALL
SELECT 9, '錢十一', '技術部', 8000 UNION ALL
SELECT 10, '王十二', '銷售部', 4000
)
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;
結果:
示例-sum 按部門分組,計算每個部門的總薪水:
WITH employees AS (
SELECT 1 AS id, '張三' AS name, '銷售部' AS department, 5000 AS salary UNION ALL
SELECT 2, '李四', '市場部', 6000 UNION ALL
SELECT 3, '王五', '銷售部', 5500 UNION ALL
SELECT 4, '趙六', '技術部', 7000 UNION ALL
SELECT 5, '孫七', '市場部', 6500 UNION ALL
SELECT 6, '周八', '技術部', 7500 UNION ALL
SELECT 7, '吳九', '銷售部', 4500 UNION ALL
SELECT 8, '鄭十', '市場部', 5000 UNION ALL
SELECT 9, '錢十一', '技術部', 8000 UNION ALL
SELECT 10, '王十二', '銷售部', 4000
)
SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department;
結果:
示例-avg 按部門分組,計算每個部門的平均薪水:
WITH employees AS (
SELECT 1 AS id, '張三' AS name, '銷售部' AS department, 5000 AS salary UNION ALL
SELECT 2, '李四', '市場部', 6000 UNION ALL
SELECT 3, '王五', '銷售部', 5500 UNION ALL
SELECT 4, '趙六', '技術部', 7000 UNION ALL
SELECT 5, '孫七', '市場部', 6500 UNION ALL
SELECT 6, '周八', '技術部', 7500 UNION ALL
SELECT 7, '吳九', '銷售部', 4500 UNION ALL
SELECT 8, '鄭十', '市場部', 5000 UNION ALL
SELECT 9, '錢十一', '技術部', 8000 UNION ALL
SELECT 10, '王十二', '銷售部', 4000
)
SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department;
結果:
示例-max-min 按部門分組,返回每個部門的最高和最低薪水:
WITH employees AS (
SELECT 1 AS id, '張三' AS name, '銷售部' AS department, 5000 AS salary UNION ALL
SELECT 2, '李四', '市場部', 6000 UNION ALL
SELECT 3, '王五', '銷售部', 5500 UNION ALL
SELECT 4, '趙六', '技術部', 7000 UNION ALL
SELECT 5, '孫七', '市場部', 6500 UNION ALL
SELECT 6, '周八', '技術部', 7500 UNION ALL
SELECT 7, '吳九', '銷售部', 4500 UNION ALL
SELECT 8, '鄭十', '市場部', 5000 UNION ALL
SELECT 9, '錢十一', '技術部', 8000 UNION ALL
SELECT 10, '王十二', '銷售部', 4000
)
SELECT department, MAX(salary) AS max_salary, MIN(salary) AS min_salary
FROM employees
GROUP BY department;
結果:
通過上述示例,你可以看到如何使用聚合函數(shù)和 GROUP BY 子句來對數(shù)據進行分組和計算。這些示例涵蓋了 COUNT()、SUM()、AVG()、MAX() 和 MIN() 的基本用法,并結合 GROUP BY 進行分組操作。
我們將詳細講解SQL中的多表操作,包括內連接(INNER JOIN)、左連接(LEFT JOIN)、右連接(RIGHT JOIN)和全外連接(FULL OUTER JOIN)。我們將使用 WITH 子句創(chuàng)建兩個臨時表 employees 和 departments,然后進行各種多表查詢。
首先,我們創(chuàng)建兩個臨時表 employees 和 departments。
WITH employees AS (
SELECT 1 AS id, '張三' AS name, 1 AS department_id, 5000 AS salary UNION ALL
SELECT 2, '李四', 2, 6000 UNION ALL
SELECT 3, '王五', 1, 5500 UNION ALL
SELECT 4, '趙六', 3, 7000 UNION ALL
SELECT 5, '孫七', 2, 6500 UNION ALL
SELECT 6, '周八', 3, 7500 UNION ALL
SELECT 7, '吳九', 1, 4500 UNION ALL
SELECT 8, '鄭十', 2, 5000 UNION ALL
SELECT 9, '錢十一', 3, 8000 UNION ALL
SELECT 10, '王十二', 1, 4000
),
departments AS (
SELECT 1 AS id, '銷售部' AS department_name UNION ALL
SELECT 2, '市場部' UNION ALL
SELECT 3, '技術部'
)
內連接返回兩個表中滿足連接條件的所有行。
示例 要獲取每個員工及其所屬部門的名稱:
WITH employees AS (
SELECT 1 AS id, '張三' AS name, 1 AS department_id, 5000 AS salary UNION ALL
SELECT 2, '李四', 2, 6000 UNION ALL
SELECT 3, '王五', 1, 5500 UNION ALL
SELECT 4, '趙六', 3, 7000 UNION ALL
SELECT 5, '孫七', 2, 6500 UNION ALL
SELECT 6, '周八', 3, 7500 UNION ALL
SELECT 7, '吳九', 1, 4500 UNION ALL
SELECT 8, '鄭十', 2, 5000 UNION ALL
SELECT 9, '錢十一', 3, 8000 UNION ALL
SELECT 10, '王十二', 1, 4000
),
departments AS (
SELECT 1 AS id, '銷售部' AS department_name UNION ALL
SELECT 2, '市場部' UNION ALL
SELECT 3, '技術部'
)
SELECT e.name, d.department_name, e.salary
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;
結果
左連接返回左表中的所有行,以及右表中滿足連接條件的行。如果右表中沒有匹配的行,則結果為 NULL。
示例 要獲取所有員工及其所屬部門的名稱,即使某些員工沒有部門:
WITH employees AS (
SELECT 1 AS id, '張三' AS name, 1 AS department_id, 5000 AS salary UNION ALL
SELECT 2, '李四', 2, 6000 UNION ALL
SELECT 3, '王五', 1, 5500 UNION ALL
SELECT 4, '趙六', 3, 7000 UNION ALL
SELECT 5, '孫七', 2, 6500 UNION ALL
SELECT 6, '周八', 3, 7500 UNION ALL
SELECT 7, '吳九', 1, 4500 UNION ALL
SELECT 8, '鄭十', 2, 5000 UNION ALL
SELECT 9, '錢十一', 3, 8000 UNION ALL
SELECT 10, '王十二', 1, 4000 UNION ALL
SELECT 11, '無部門員工', NULL, 4000 -- 添加一個沒有部門的員工
),
departments AS (
SELECT 1 AS id, '銷售部' AS department_name UNION ALL
SELECT 2, '市場部' UNION ALL
SELECT 3, '技術部'
)
SELECT e.name, d.department_name, e.salary
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;
結果
右連接返回右表中的所有行,以及左表中滿足連接條件的行。如果左表中沒有匹配的行,則結果為 NULL。
示例 要獲取所有部門及其所屬員工的名稱,即使某些部門沒有員工:
WITH employees AS (
SELECT 1 AS id, '張三' AS name, 1 AS department_id, 5000 AS salary UNION ALL
SELECT 2, '李四', 2, 6000 UNION ALL
SELECT 3, '王五', 1, 5500 UNION ALL
SELECT 4, '趙六', 3, 7000 UNION ALL
SELECT 5, '孫七', 2, 6500 UNION ALL
SELECT 6, '周八', 3, 7500 UNION ALL
SELECT 7, '吳九', 1, 4500 UNION ALL
SELECT 8, '鄭十', 2, 5000 UNION ALL
SELECT 9, '錢十一', 3, 8000 UNION ALL
SELECT 10, '王十二', 1, 4000
),
departments AS (
SELECT 1 AS id, '銷售部' AS department_name UNION ALL
SELECT 2, '市場部' UNION ALL
SELECT 3, '技術部' UNION ALL
SELECT 4, '人力資源部' -- 添加一個沒有員工的部門
)
SELECT e.name, d.department_name, e.salary
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.id;
結果
全外連接返回兩個表中的所有行,如果某個表中沒有匹配的行,則結果為 NULL。需要注意的是,并非所有數(shù)據庫系統(tǒng)都支持 FULL OUTER JOIN,例如 MySQL 不支持,但可以通過 UNION 實現(xiàn)類似效果。
示例 要獲取所有員工及其所屬部門的名稱,以及所有部門及其所屬員工的名稱,即使某些員工或部門沒有匹配:
WITH employees AS (
SELECT 1 AS id, '張三' AS name, 1 AS department_id, 5000 AS salary UNION ALL
SELECT 2, '李四', 2, 6000 UNION ALL
SELECT 3, '王五', 1, 5500 UNION ALL
SELECT 4, '趙六', 3, 7000 UNION ALL
SELECT 5, '孫七', 2, 6500 UNION ALL
SELECT 6, '周八', 3, 7500 UNION ALL
SELECT 7, '吳九', 1, 4500 UNION ALL
SELECT 8, '鄭十', 2, 5000 UNION ALL
SELECT 9, '錢十一', 3, 8000 UNION ALL
SELECT 10, '王十二', 1, 4000
),
departments AS (
SELECT 1 AS id, '銷售部' AS department_name UNION ALL
SELECT 2, '市場部' UNION ALL
SELECT 3, '技術部' UNION ALL
SELECT 4, '人力資源部' -- 添加一個沒有員工的部門
)
SELECT e.name, d.department_name, e.salary
FROM employees e
FULL OUTER JOIN departments d ON e.department_id = d.id;
結果
通過上述示例,你可以看到如何使用內連接、左連接、右連接和全外連接來操作多個表。這些示例涵蓋了 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL OUTER JOIN 的基本用法,并結合 WITH 子句創(chuàng)建臨時表進行驗證。
我們將詳細講解SQL中的高級特性,包括公用表表達式(CTE)、子查詢和窗口函數(shù)。我們將使用 WITH 子句創(chuàng)建臨時表 employees 和 departments,然后進行各種高級查詢。
首先,我們創(chuàng)建兩個臨時表 employees 和 departments。
WITH employees AS (
SELECT 1 AS id, '張三' AS name, 1 AS department_id, 5000 AS salary UNION ALL
SELECT 2, '李四', 2, 6000 UNION ALL
SELECT 3, '王五', 1, 5500 UNION ALL
SELECT 4, '趙六', 3, 7000 UNION ALL
SELECT 5, '孫七', 2, 6500 UNION ALL
SELECT 6, '周八', 3, 7500 UNION ALL
SELECT 7, '吳九', 1, 4500 UNION ALL
SELECT 8, '鄭十', 2, 5000 UNION ALL
SELECT 9, '錢十一', 3, 8000 UNION ALL
SELECT 10, '王十二', 1, 4000
),
departments AS (
SELECT 1 AS id, '銷售部' AS department_name UNION ALL
SELECT 2, '市場部' UNION ALL
SELECT 3, '技術部'
)
公用表表達式(CTE)是一個臨時結果集,可以在查詢中多次引用。CTE 使用 WITH 子句定義。
示例 要計算每個部門的平均薪水,并使用 CTE 來簡化查詢:
WITH employees AS (
SELECT 1 AS id, '張三' AS name, 1 AS department_id, 5000 AS salary UNION ALL
SELECT 2, '李四', 2, 6000 UNION ALL
SELECT 3, '王五', 1, 5500 UNION ALL
SELECT 4, '趙六', 3, 7000 UNION ALL
SELECT 5, '孫七', 2, 6500 UNION ALL
SELECT 6, '周八', 3, 7500 UNION ALL
SELECT 7, '吳九', 1, 4500 UNION ALL
SELECT 8, '鄭十', 2, 5000 UNION ALL
SELECT 9, '錢十一', 3, 8000 UNION ALL
SELECT 10, '王十二', 1, 4000
),
departments AS (
SELECT 1 AS id, '銷售部' AS department_name UNION ALL
SELECT 2, '市場部' UNION ALL
SELECT 3, '技術部'
),
department_avg_salary AS (--每個部門平均薪水
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
)
SELECT d.department_name, das.avg_salary
FROM departments d
JOIN department_avg_salary das ON d.id = das.department_id;
結果
子查詢是嵌套在另一個查詢中的查詢。子查詢可以出現(xiàn)在 SELECT、FROM、WHERE 子句中。
示例 要獲取薪水高于平均薪水的員工:
WITH employees AS (
SELECT 1 AS id, '張三' AS name, 1 AS department_id, 5000 AS salary UNION ALL
SELECT 2, '李四', 2, 6000 UNION ALL
SELECT 3, '王五', 1, 5500 UNION ALL
SELECT 4, '趙六', 3, 7000 UNION ALL
SELECT 5, '孫七', 2, 6500 UNION ALL
SELECT 6, '周八', 3, 7500 UNION ALL
SELECT 7, '吳九', 1, 4500 UNION ALL
SELECT 8, '鄭十', 2, 5000 UNION ALL
SELECT 9, '錢十一', 3, 8000 UNION ALL
SELECT 10, '王十二', 1, 4000
)
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
結果:
窗口函數(shù)對一組行進行計算,并返回每個行的計算結果。窗口函數(shù)通常與 OVER 子句一起使用。
ROW_NUMBER(),RANK() 和 DENSE_RANK()
WITH employees AS (
SELECT 1 AS id, '張三' AS name, 1 AS department_id, 5000 AS salary UNION ALL
SELECT 2, '李四', 2, 6000 UNION ALL
SELECT 3, '王五', 1, 4500 UNION ALL
SELECT 4, '趙六', 3, 7000 UNION ALL
SELECT 5, '孫七', 2, 6500 UNION ALL
SELECT 6, '周八', 3, 7500 UNION ALL
SELECT 7, '吳九', 1, 4500 UNION ALL
SELECT 8, '鄭十', 2, 5000 UNION ALL
SELECT 9, '錢十一', 3, 8000 UNION ALL
SELECT 10, '王十二', 1, 4000
)
SELECT
name, department_id, salary,
ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS row_number,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank_salary,
DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS dense_rank_salary
FROM employees
結果:
NTILE(2)
WITH employees AS (
SELECT 1 AS id, '張三' AS name, 1 AS department_id, 5000 AS salary UNION ALL
SELECT 2, '李四', 2, 6000 UNION ALL
SELECT 3, '王五', 1, 4500 UNION ALL
SELECT 4, '趙六', 3, 7000 UNION ALL
SELECT 5, '孫七', 2, 6500 UNION ALL
SELECT 6, '周八', 3, 7500 UNION ALL
SELECT 7, '吳九', 1, 4500 UNION ALL
SELECT 8, '鄭十', 2, 5000 UNION ALL
SELECT 9, '錢十一', 3, 8000 UNION ALL
SELECT 10, '王十二', 1, 4000
)
SELECT
name, department_id, salary,
NTILE(2) OVER (PARTITION BY department_id ORDER BY salary DESC) AS ntile_2
FROM
employees;
結果:
LAG() 和 LEAD()
WITH employees AS (
SELECT 1 AS id, '張三' AS name, 1 AS department_id, 5000 AS salary UNION ALL
SELECT 2, '李四', 2, 6000 UNION ALL
SELECT 3, '王五', 1, 4500 UNION ALL
SELECT 4, '趙六', 3, 7000 UNION ALL
SELECT 5, '孫七', 2, 6500 UNION ALL
SELECT 6, '周八', 3, 7500 UNION ALL
SELECT 7, '吳九', 1, 4500 UNION ALL
SELECT 8, '鄭十', 2, 5000 UNION ALL
SELECT 9, '錢十一', 3, 8000 UNION ALL
SELECT 10, '王十二', 1, 4000
)
SELECT
name, department_id, salary,
LAG(salary, 1, 0) OVER (PARTITION BY department_id ORDER BY salary) AS lag_salary,
LEAD(salary, 1, 0) OVER (PARTITION BY department_id ORDER BY salary) AS lead_salary
FROM employees;
結果:
FIRST_VALUE() 和 LAST_VALUE()
WITH employees AS (
SELECT 1 AS id, '張三' AS name, 1 AS department_id, 5000 AS salary UNION ALL
SELECT 2, '李四', 2, 6000 UNION ALL
SELECT 3, '王五', 1, 4500 UNION ALL
SELECT 4, '趙六', 3, 7000 UNION ALL
SELECT 5, '孫七', 2, 6500 UNION ALL
SELECT 6, '周八', 3, 7500 UNION ALL
SELECT 7, '吳九', 1, 4500 UNION ALL
SELECT 8, '鄭十', 2, 5000 UNION ALL
SELECT 9, '錢十一', 3, 8000 UNION ALL
SELECT 10, '王十二', 1, 4000
)
SELECT
name, department_id, salary,
FIRST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY salary) AS first_value_salary,
LAST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY salary) AS last_value_salary
FROM employees;
結果
????注意: LAST_VALUE() 默認情況下會在窗口內逐行計算,如果需要在整個分區(qū)計算,可以使用 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING。
WITH employees AS (
SELECT 1 AS id, '張三' AS name, 1 AS department_id, 5000 AS salary UNION ALL
SELECT 2, '李四', 2, 6000 UNION ALL
SELECT 3, '王五', 1, 4500 UNION ALL
SELECT 4, '趙六', 3, 7000 UNION ALL
SELECT 5, '孫七', 2, 6500 UNION ALL
SELECT 6, '周八', 3, 7500 UNION ALL
SELECT 7, '吳九', 1, 4500 UNION ALL
SELECT 8, '鄭十', 2, 5000 UNION ALL
SELECT 9, '錢十一', 3, 8000 UNION ALL
SELECT 10, '王十二', 1, 4000
)
SELECT
name, department_id, salary,
FIRST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY salary) AS first_value_salary,
LAST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_value_salary
FROM employees;
結果:
聚合函數(shù)在窗口中的用法允許你在窗口內進行聚合計算,例如計算窗口內的總和、平均值等。這通常使用 OVER 子句來定義窗口。
計算每個員工的累積薪水(按薪水降序排列)。
WITH employees AS (
SELECT 1 AS id, '張三' AS name, 1 AS department_id, 5000 AS salary UNION ALL
SELECT 2, '李四', 2, 6000 UNION ALL
SELECT 3, '王五', 1, 5500 UNION ALL
SELECT 4, '趙六', 3, 7000 UNION ALL
SELECT 5, '孫七', 2, 6500 UNION ALL
SELECT 6, '周八', 3, 7500 UNION ALL
SELECT 7, '吳九', 1, 4500 UNION ALL
SELECT 8, '鄭十', 2, 5000 UNION ALL
SELECT 9, '錢十一', 3, 8000 UNION ALL
SELECT 10, '王十二', 1, 4000
)
SELECT
name, salary,
SUM(salary) OVER (ORDER BY salary DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_salary
FROM
employees;
結果:
????在這個示例中,SUM(salary) OVER (ORDER BY salary DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 計算從第一個行到當前行的累積薪水。
計算每個員工的移動平均薪水(按薪水降序排列,窗口大小為3)。
WITH employees AS (
SELECT 1 AS id, '張三' AS name, 1 AS department_id, 5000 AS salary UNION ALL
SELECT 2, '李四', 2, 6000 UNION ALL
SELECT 3, '王五', 1, 5500 UNION ALL
SELECT 4, '趙六', 3, 7000 UNION ALL
SELECT 5, '孫七', 2, 6500 UNION ALL
SELECT 6, '周八', 3, 7500 UNION ALL
SELECT 7, '吳九', 1, 4500 UNION ALL
SELECT 8, '鄭十', 2, 5000 UNION ALL
SELECT 9, '錢十一', 3, 8000 UNION ALL
SELECT 10, '王十二', 1, 4000
)
SELECT name, salary,
AVG(salary) OVER (ORDER BY salary DESC ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg_salary
FROM employees;
結果:
????在這個示例中,AVG(salary) OVER (ORDER BY salary DESC ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) 計算當前行及其前兩行的平均薪水。
計算每個員工的窗口內行數(shù)(按薪水降序排列,窗口大小為3)。
WITH employees AS (
SELECT 1 AS id, '張三' AS name, 1 AS department_id, 5000 AS salary UNION ALL
SELECT 2, '李四', 2, 6000 UNION ALL
SELECT 3, '王五', 1, 5500 UNION ALL
SELECT 4, '趙六', 3, 7000 UNION ALL
SELECT 5, '孫七', 2, 6500 UNION ALL
SELECT 6, '周八', 3, 7500 UNION ALL
SELECT 7, '吳九', 1, 4500 UNION ALL
SELECT 8, '鄭十', 2, 5000 UNION ALL
SELECT 9, '錢十一', 3, 8000 UNION ALL
SELECT 10, '王十二', 1, 4000
)
SELECT name, salary,
COUNT(*) OVER (ORDER BY salary DESC ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS window_count
FROM employees;
結果:
????在這個示例中,COUNT(*) OVER (ORDER BY salary DESC ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) 計算當前行及其前兩行的行數(shù)。
計算每個員工的窗口內最大值和最小值(按薪水降序排列,窗口大小為3)。
WITH employees AS (
SELECT 1 AS id, '張三' AS name, 1 AS department_id, 5000 AS salary UNION ALL
SELECT 2, '李四', 2, 6000 UNION ALL
SELECT 3, '王五', 1, 5500 UNION ALL
SELECT 4, '趙六', 3, 7000 UNION ALL
SELECT 5, '孫七', 2, 6500 UNION ALL
SELECT 6, '周八', 3, 7500 UNION ALL
SELECT 7, '吳九', 1, 4500 UNION ALL
SELECT 8, '鄭十', 2, 5000 UNION ALL
SELECT 9, '錢十一', 3, 8000 UNION ALL
SELECT 10, '王十二', 1, 4000
)
SELECT name, salary,
MAX(salary) OVER (ORDER BY salary DESC ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS max_salary,
MIN(salary) OVER (ORDER BY salary DESC ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS min_salary
FROM employees;
結果:
????在這個示例中,MAX(salary) OVER (ORDER BY salary DESC ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) 和 MIN(salary) OVER (ORDER BY salary DESC ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) 分別計算當前行及其前兩行的最大值和最小值。
通過上述示例,你可以看到如何使用 FIRST_VALUE() 和 LAST_VALUE() 窗口函數(shù)來獲取窗口內的第一個和最后一個值,以及如何在窗口中使用聚合函數(shù)(如 SUM()、AVG()、COUNT()、MAX() 和 MIN())進行復雜的計算。
下是三個綜合的SQL案例,涵蓋了我們之前學習的各種概念,包括數(shù)據檢索、聚合與分組、多表操作以及高級特性(如窗口函數(shù)和公用表表達式)。這些案例將幫助你更好地理解和應用這些知識。
分析每個部門的員工薪資情況,包括平均薪資、最高薪資、最低薪資以及每個員工的薪資排名。
WITH employees AS (
SELECT 1 AS id, '張三' AS name, 1 AS department_id, 5000 AS salary UNION ALL
SELECT 2, '李四', 2, 6000 UNION ALL
SELECT 3, '王五', 1, 5500 UNION ALL
SELECT 4, '趙六', 3, 7000 UNION ALL
SELECT 5, '孫七', 2, 6500 UNION ALL
SELECT 6, '周八', 3, 7500 UNION ALL
SELECT 7, '吳九', 1, 4500 UNION ALL
SELECT 8, '鄭十', 2, 5000 UNION ALL
SELECT 9, '錢十一', 3, 8000 UNION ALL
SELECT 10, '王十二', 1, 4000
),
departments AS (
SELECT 1 AS id, '銷售部' AS department_name UNION ALL
SELECT 2, '市場部' UNION ALL
SELECT 3, '技術部'
)
WITH employees AS (
SELECT 1 AS id, '張三' AS name, 1 AS department_id, 5000 AS salary UNION ALL
SELECT 2, '李四', 2, 6000 UNION ALL
SELECT 3, '王五', 1, 5500 UNION ALL
SELECT 4, '趙六', 3, 7000 UNION ALL
SELECT 5, '孫七', 2, 6500 UNION ALL
SELECT 6, '周八', 3, 7500 UNION ALL
SELECT 7, '吳九', 1, 4500 UNION ALL
SELECT 8, '鄭十', 2, 5000 UNION ALL
SELECT 9, '錢十一', 3, 8000 UNION ALL
SELECT 10, '王十二', 1, 4000
),
departments AS (
SELECT 1 AS id, '銷售部' AS department_name UNION ALL
SELECT 2, '市場部' UNION ALL
SELECT 3, '技術部'
),
department_stats AS (
SELECT department_id,
AVG(salary) AS avg_salary,
MAX(salary) AS max_salary,
MIN(salary) AS min_salary
FROM employees
GROUP BY department_id
)
SELECT e.name,
e.salary,
d.department_name,
ds.avg_salary,
ds.max_salary,
ds.min_salary,
RANK() OVER (PARTITION BY e.department_id ORDER BY e.salary DESC) AS salary_rank
FROM employees e
JOIN departments d ON e.department_id = d.id
JOIN department_stats ds ON e.department_id = ds.department_id;
分析每個銷售員的銷售業(yè)績,包括總銷售額、平均銷售額以及每個銷售員的排名。
WITH sales AS (
SELECT 1 AS id, '張三' AS salesperson, 1000 AS amount UNION ALL
SELECT 2, '李四', 1500 UNION ALL
SELECT 3, '張三', 2000 UNION ALL
SELECT 4, '李四', 2500 UNION ALL
SELECT 5, '王五', 3000 UNION ALL
SELECT 6, '王五', 3500 UNION ALL
SELECT 7, '張三', 4000 UNION ALL
SELECT 8, '李四', 4500 UNION ALL
SELECT 9, '王五', 5000 UNION ALL
SELECT 10, '張三', 5500
)
WITH sales AS (
SELECT 1 AS id, '張三' AS salesperson, 1000 AS amount UNION ALL
SELECT 2, '李四', 1500 UNION ALL
SELECT 3, '張三', 2000 UNION ALL
SELECT 4, '李四', 2500 UNION ALL
SELECT 5, '王五', 3000 UNION ALL
SELECT 6, '王五', 3500 UNION ALL
SELECT 7, '張三', 4000 UNION ALL
SELECT 8, '李四', 4500 UNION ALL
SELECT 9, '王五', 5000 UNION ALL
SELECT 10, '張三', 5500
),
sales_summary AS (
SELECT salesperson,
SUM(amount) AS total_sales,
AVG(amount) AS avg_sales
FROM sales
GROUP BY salesperson
)
SELECT salesperson,
total_sales,
avg_sales,
RANK() OVER (ORDER BY total_sales DESC) AS sales_rank
FROM sales_summary;
分析股票價格的變化趨勢,包括最高價、最低價以及每日價格變化。
WITH stock_prices AS (
SELECT '2023-01-01' AS date, 100 AS open_price, 105 AS close_price UNION ALL
SELECT '2023-01-02', 105, 110 UNION ALL
SELECT '2023-01-03', 110, 108 UNION ALL
SELECT '2023-01-04', 108, 112 UNION ALL
SELECT '2023-01-05', 112, 115 UNION ALL
SELECT '2023-01-06', 115, 113 UNION ALL
SELECT '2023-01-07', 113, 118 UNION ALL
SELECT '2023-01-08', 118, 120 UNION ALL
SELECT '2023-01-09', 120, 119 UNION ALL
SELECT '2023-01-10', 119, 122
)
WITH stock_prices AS (
SELECT '2023-01-01' AS date, 100 AS open_price, 105 AS close_price UNION ALL
SELECT '2023-01-02', 105, 110 UNION ALL
SELECT '2023-01-03', 110, 108 UNION ALL
SELECT '2023-01-04', 108, 112 UNION ALL
SELECT '2023-01-05', 112, 115 UNION ALL
SELECT '2023-01-06', 115, 113 UNION ALL
SELECT '2023-01-07', 113, 118 UNION ALL
SELECT '2023-01-08', 118, 120 UNION ALL
SELECT '2023-01-09', 120, 119 UNION ALL
SELECT '2023-01-10', 119, 122
),
daily_stats AS (
SELECT date,
close_price,
LAG(close_price) OVER (ORDER BY date) AS prev_close_price,
MAX(close_price) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS max_close_price,
MIN(close_price) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS min_close_price
FROM stock_prices
)
SELECT date,
close_price,
prev_close_price,
max_close_price,
min_close_price,
close_price - prev_close_price AS price_change
FROM daily_stats;
6.3.4 結果
通過這三個綜合案例,你可以看到如何將數(shù)據檢索、聚合與分組、多表操作以及高級特性(如窗口函數(shù)和公用表表達式)結合起來,解決實際問題。這些案例涵蓋了從簡單到復雜的查詢,幫助你更好地理解和應用SQL知識。
隨著各行各業(yè)進行數(shù)字化轉型,數(shù)據分析能力已經成了職場的剛需能力,這也是這兩年CDA數(shù)據分析師大火的原因。和領導提建議再說“我感覺”“我覺得”,自己都覺得心虛,如果說“數(shù)據分析發(fā)現(xiàn)……”,肯定更有說服力。想在職場精進一步還是要學習數(shù)據分析的,統(tǒng)計學、概率論、商業(yè)模型、SQL,Python還是要會一些,能讓你工作效率提升不少。備考CDA數(shù)據分析師的過程就是個自我提升的過程。
CDA 考試官方報名入口:https://www.cdaglobal.com/pinggu.html
數(shù)據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
DSGE 模型中的 Et:理性預期算子的內涵、作用與應用解析 動態(tài)隨機一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據分析師:解鎖表結構數(shù)據特征價值的專業(yè)核心 表結構數(shù)據(以 “行 - 列” 規(guī)范存儲的結構化數(shù)據,如數(shù)據庫表、Excel 表、 ...
2025-09-17Excel 導入數(shù)據含缺失值?詳解 dropna 函數(shù)的功能與實戰(zhàn)應用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應用 在數(shù)據分析與統(tǒng)計學領域,假設檢驗是驗證研究假設、判斷數(shù)據差異是否 “ ...
2025-09-16CDA 數(shù)據分析師:掌控表格結構數(shù)據全功能周期的專業(yè)操盤手 表格結構數(shù)據(以 “行 - 列” 存儲的結構化數(shù)據,如 Excel 表、數(shù)據 ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數(shù)量的準確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進行 HTTP 網絡請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據分析師:激活表格結構數(shù)據價值的核心操盤手 表格結構數(shù)據(如 Excel 表格、數(shù)據庫表)是企業(yè)最基礎、最核心的數(shù)據形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調用、數(shù)據爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數(shù)據的科學計數(shù)法問題 為幫助 Python 數(shù)據從業(yè)者解決pd.read_csv讀取長浮點數(shù)據時的科學計數(shù)法問題 ...
2025-09-12CDA 數(shù)據分析師:業(yè)務數(shù)據分析步驟的落地者與價值優(yōu)化者 業(yè)務數(shù)據分析是企業(yè)解決日常運營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務邏輯:從規(guī)則拆解到數(shù)據把關的實戰(zhàn)指南 在業(yè)務系統(tǒng)落地過程中,“業(yè)務邏輯” 是連接 “需求設計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據驅動下的精準零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當下,精準營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據分析師與戰(zhàn)略 / 業(yè)務數(shù)據分析:概念辨析與協(xié)同價值 在數(shù)據驅動決策的體系中,“戰(zhàn)略數(shù)據分析”“業(yè)務數(shù)據分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據聚類分析:從操作實踐到業(yè)務價值挖掘 在數(shù)據分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數(shù)據解讀到決策支撐的價值導向 統(tǒng)計模型作為數(shù)據分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10CDA 數(shù)據分析師:商業(yè)數(shù)據分析實踐的落地者與價值創(chuàng)造者 商業(yè)數(shù)據分析的價值,最終要在 “實踐” 中體現(xiàn) —— 脫離業(yè)務場景的分 ...
2025-09-10機器學習解決實際問題的核心關鍵:從業(yè)務到落地的全流程解析 在人工智能技術落地的浪潮中,機器學習作為核心工具,已廣泛應用于 ...
2025-09-09SPSS 編碼狀態(tài)區(qū)域中 Unicode 的功能與價值解析 在 SPSS(Statistical Product and Service Solutions,統(tǒng)計產品與服務解決方案 ...
2025-09-09