PostgreSQL 別名的使用
別名是 SQL 的“命名魔法”,讓查詢 更簡(jiǎn)潔、可讀、可復(fù)用。
本文涵蓋 列別名、表別名、CTE 別名、函數(shù)別名、表達(dá)式別名、JSON 別名、窗口函數(shù)別名、命名規(guī)范、性能影響、常見陷阱、最佳實(shí)踐 等全部?jī)?nèi)容。
一、別名三大類型
| 類型 | 語法 | 作用 |
|---|---|---|
| 列別名 | column AS alias | 重命名輸出列 |
| 表別名 | table AS alias | 簡(jiǎn)化表名,解決沖突 |
| CTE 別名 | WITH cte_name AS (...) | 命名子查詢 |
二、準(zhǔn)備測(cè)試數(shù)據(jù)
CREATE TABLE employees (
id BIGSERIAL PRIMARY KEY,
full_name TEXT,
email_address TEXT,
dept_code VARCHAR(10),
annual_salary NUMERIC(10,2),
hire_date DATE,
tags TEXT[]
);
INSERT INTO employees (full_name, email_address, dept_code, annual_salary, hire_date, tags) VALUES
('Alice Johnson', 'alice.j@company.com', 'IT', 85000, '2023-01-15', '{"dev","lead"}'),
('Bob Smith', 'bob.s@company.com', 'HR', 52000, '2022-06-10', '{"hr"}'),
('Carol White', 'carol.w@company.com', 'IT', 92000, '2024-03-20', '{"dev","ai"}'),
('Dave Brown', NULL, 'IT', 78000, '2021-11-05', '{"dev"}'),
('Eve Davis', 'eve.d@company.com', 'HR', 48000, '2023-12-01', '{"hr","recruit"}');
三、列別名(Column Alias)
1. 基本語法
SELECT
full_name AS name,
annual_salary AS salary,
hire_date AS "Hire Date" -- 保留空格/大小寫
FROM employees;
2. 表達(dá)式別名
SELECT
full_name,
annual_salary / 12 AS monthly_salary,
UPPER(full_name) AS "FULL NAME",
COALESCE(email_address, 'N/A') AS email
FROM employees;
3. 聚合函數(shù)別名
SELECT
dept_code,
COUNT(*) AS headcount,
AVG(annual_salary) AS avg_salary,
STRING_AGG(full_name, ', ') AS team_members
FROM employees
GROUP BY dept_code;
四、表別名(Table Alias)
1. 簡(jiǎn)化長(zhǎng)表名
SELECT e.full_name, e.annual_salary FROM employees AS e; -- 等價(jià)于 FROM employees e;
2.自連接(Self-Join)
-- 員工與經(jīng)理
SELECT
e.full_name AS employee,
m.full_name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;
3. 多表 JOIN 避免沖突
SELECT
e.full_name,
d.name AS dept_name
FROM employees e
JOIN departments d ON e.dept_code = d.code;
五、CTE 別名(WITH 子句)
WITH
it_employees AS (
SELECT * FROM employees WHERE dept_code = 'IT'
),
high_earners AS (
SELECT full_name, annual_salary
FROM it_employees
WHERE annual_salary > 80000
)
SELECT * FROM high_earners;
六、函數(shù)與窗口函數(shù)別名
SELECT
full_name,
EXTRACT(YEAR FROM hire_date) AS hire_year,
ROW_NUMBER() OVER (PARTITION BY dept_code ORDER BY annual_salary DESC) AS rank_in_dept
FROM employees;
七、JSON 與數(shù)組別名
SELECT
full_name,
tags[1] AS primary_tag,
config->>'level' AS "Employee Level"
FROM employees;
八、別名命名規(guī)范(推薦)
| 類型 | 規(guī)范 | 示例 |
|---|---|---|
| 表別名 | 1-3 個(gè)字母,表名縮寫 | e, emp, d, dept |
| 列別名 | 清晰、駝峰或下劃線 | employee_name, deptName |
| CTE 別名 | 動(dòng)詞 + 名詞 | active_employees, monthly_sales |
| 避免 | 保留字、空格開頭 | order, group |
-- 推薦 SELECT e.full_name AS employee_name FROM employees e; -- 不推薦 SELECT employees.full_name AS name FROM employees; -- 太長(zhǎng)
九、別名與ORDER BY
1. 支持別名(推薦)
SELECT full_name, annual_salary AS salary FROM employees ORDER BY salary DESC;
2. 不支持列序號(hào)(不推薦)
ORDER BY 2 -- 模糊,易出錯(cuò)
十、性能影響:幾乎為 0
| 項(xiàng)目 | 影響 |
|---|---|
| 列別名 | 無(僅輸出層) |
| 表別名 | 無(優(yōu)化器內(nèi)部使用) |
| CTE 別名 | 可能物化(MATERIALIZED) |
-- 性能相同 SELECT full_name AS name FROM employees; SELECT full_name FROM employees;
十一、常見陷阱與解決方案
| 陷阱 | 說明 | 解決方案 |
|---|---|---|
| AS 省略導(dǎo)致歧義 | SELECT col AS FROM table | 始終加 AS |
| 別名與保留字沖突 | SELECT col AS order | 用雙引號(hào) "order" |
| GROUP BY 用別名 | 不允許 | 用原始列或列序號(hào) |
| WHERE 用別名 | 不允許 | 用原始表達(dá)式 |
-- 錯(cuò)誤:WHERE 不能用別名 SELECT full_name, annual_salary AS salary FROM employees WHERE salary > 80000; -- 語法錯(cuò)誤! -- 正確 SELECT full_name, annual_salary AS salary FROM employees WHERE annual_salary > 80000;
-- GROUP BY 別名錯(cuò)誤 SELECT dept_code, COUNT(*) AS cnt FROM employees GROUP BY cnt; -- 錯(cuò)誤! -- 正確 GROUP BY dept_code; -- 或 GROUP BY 1; -- 列序號(hào)
十二、最佳實(shí)踐 Checklist
| 項(xiàng)目 | 建議 |
|---|---|
| 表別名必加 | 提升可讀性 |
| 列別名清晰 | 避免 col1, col2 |
| AS 顯式使用 | 避免歧義 |
| ORDER BY 用別名 | 簡(jiǎn)潔 |
| WHERE/GROUP BY 用原始列 | 符合語法 |
| CTE 別名動(dòng)詞化 | filtered_data, aggregated_sales |
| 避免保留字 | 用 "order", "group" |
十三、一鍵生產(chǎn)級(jí)查詢模板
WITH active_employees AS (
SELECT
id,
full_name AS employee_name,
email_address AS email,
dept_code,
annual_salary AS salary,
hire_date
FROM employees
WHERE hire_date >= '2023-01-01'
),
dept_stats AS (
SELECT
dept_code,
COUNT(*) AS headcount,
AVG(salary) AS avg_salary,
MAX(salary) AS max_salary
FROM active_employees
GROUP BY dept_code
)
SELECT
ae.employee_name,
ae.email,
ae.salary,
ds.headcount,
ds.avg_salary,
RANK() OVER (PARTITION BY ae.dept_code ORDER BY ae.salary DESC) AS salary_rank
FROM active_employees ae
JOIN dept_stats ds ON ae.dept_code = ds.dept_code
ORDER BY ds.avg_salary DESC, ae.salary DESC;
十四、快速實(shí)戰(zhàn):5 分鐘掌握別名
-- 1. 列別名
SELECT full_name AS name, annual_salary AS salary FROM employees;
-- 2. 表別名 + 自連接
SELECT e.full_name AS emp, m.full_name AS mgr
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;
-- 3. CTE 別名
WITH it_team AS (SELECT * FROM employees WHERE dept_code = 'IT')
SELECT employee_name, salary FROM it_team;
-- 4. 窗口函數(shù)別名
SELECT
full_name,
dept_code,
ROW_NUMBER() OVER (PARTITION BY dept_code ORDER BY annual_salary DESC) AS rank
FROM employees;
-- 5. ORDER BY 別名
SELECT annual_salary * 12 AS yearly
FROM employees
ORDER BY yearly DESC;
現(xiàn)在就動(dòng)手:
在 employees 表中:
- 查詢
full_name→name,annual_salary→salary - 自連接查詢員工與經(jīng)理名(用
e和m別名) - 用 CTE 別名
high_earners篩選salary > 80000 - 計(jì)算月薪并用別名
monthly,按其降序 - 用
RANK()給每個(gè)部門薪資排名,用別名dept_rank
十五、別名 vs 視圖 vs 函數(shù)
| 方式 | 別名 | 視圖 | 函數(shù) |
|---|---|---|---|
| 復(fù)用性 | 僅當(dāng)前查詢 | 高 | 高 |
| 參數(shù)化 | No | No | Yes |
| 性能 | 最高 | 高 | 中等 |
| 適用 | 臨時(shí)命名 | 固定查詢 | 復(fù)雜邏輯 |
-- 視圖替代 CTE 別名 CREATE VIEW v_active_employees AS SELECT id, full_name AS name, annual_salary AS salary FROM employees WHERE hire_date >= '2023-01-01';
到此這篇關(guān)于PostgreSQL 別名的使用的文章就介紹到這了,更多相關(guān)PostgreSQL 別名內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
postgresql 中的幾個(gè) timeout參數(shù) 用法說明
這篇文章主要介紹了postgresql中的幾個(gè)timeout參數(shù)用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01
使用pg_basebackup對(duì)Postgre進(jìn)行備份與恢復(fù)的實(shí)現(xiàn)
這篇文章主要介紹了使用pg_basebackup對(duì)Postgre進(jìn)行備份與恢復(fù)的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01
PostgreSQL中擴(kuò)展moddatetime的使用
PostgreSQL的moddatetime擴(kuò)展通過觸發(fā)器自動(dòng)維護(hù)時(shí)間戳字段,輕量高效,適用于審計(jì)日志和多租戶系統(tǒng),具有一定的參考價(jià)值,感興趣的可以了解一下2025-06-06
PostgreSQL中pg_surgery的擴(kuò)展使用
pg_surgery是PostgreSQL的高風(fēng)險(xiǎn)擴(kuò)展,用于修復(fù)表、索引及事務(wù)ID回卷等極端數(shù)據(jù)庫(kù)問題,需謹(jǐn)慎操作,做好備份,僅由經(jīng)驗(yàn)豐富的數(shù)據(jù)庫(kù)管理員在別無選擇的情況下使用2025-06-06
安全高效的PostgreSQL數(shù)據(jù)庫(kù)遷移解決方案
PostgreSQL數(shù)據(jù)庫(kù)是一款高度可擴(kuò)展的開源數(shù)據(jù)庫(kù)系統(tǒng),支持復(fù)雜的查詢、事務(wù)完整性和多種數(shù)據(jù)類型由于各種業(yè)務(wù)需求,企業(yè)常常需要將數(shù)據(jù)在不同的云平臺(tái)或私有環(huán)境之間遷移,所以本文小編給大家介紹了安全高效的PostgreSQL數(shù)據(jù)庫(kù)遷移解決方案,需要的朋友可以參考下2023-11-11

