-- 表别名
SELECT 列名 FROM 表名 AS 别名;
-- 列别名
SELECT 列名 AS 别名 FROM 表名;
-- 在实际使用中,AS关键字通常可以省略
SELECT 列名 别名 FROM 表名;
SELECT * FROM 表名 别名;
-- 1. 字母数字下划线(通常)
SELECT name AS employee_name FROM employees;
-- 2. 使用双引号(MySQL用反引号)可以包含特殊字符
SELECT salary AS "Annual Salary" FROM employees; -- PostgreSQL/SQL Server
SELECT salary AS `Annual Salary` FROM employees; -- MySQL
SELECT salary AS [Annual Salary] FROM employees; -- SQL Server
-- 3. 别名中可包含空格
SELECT first_name || ' ' || last_name AS "Full Name" FROM employees;
-- 好的别名:有意义的、简洁的
SELECT
e.employee_id AS emp_id,
e.first_name AS fname,
e.last_name AS lname,
e.salary * 12 AS annual_salary
FROM employees e;
-- 没有别名
SELECT employees.department_id, departments.department_name
FROM employees
JOIN departments ON employees.department_id = departments.department_id;
-- 使用别名(更简洁)
SELECT e.department_id, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id;
-- 查询员工及其经理信息(必须使用别名)
SELECT
e.employee_id,
e.first_name AS employee_name,
m.first_name AS manager_name
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.employee_id;
-- 子查询作为表必须使用别名
SELECT dept_avg.dept_id, dept_avg.avg_salary
FROM (
SELECT
department_id AS dept_id,
AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
) AS dept_avg
WHERE dept_avg.avg_salary > 5000;
SELECT
product_name,
quantity,
unit_price,
quantity * unit_price AS total_price,
(quantity * unit_price) * 0.1 AS tax_amount
FROM order_details;
SELECT
department_id,
COUNT(*) AS employee_count,
AVG(salary) AS avg_salary,
MAX(salary) AS max_salary,
MIN(salary) AS min_salary
FROM employees
GROUP BY department_id;
-- 字符串处理
SELECT
first_name,
last_name,
UPPER(first_name) AS upper_first,
LOWER(last_name) AS lower_last,
CONCAT(first_name, ' ', last_name) AS full_name
FROM employees;
-- 日期处理
SELECT
order_date,
DATE_FORMAT(order_date, '%Y-%m') AS order_month,
YEAR(order_date) AS order_year
FROM orders;
SELECT
o.order_id,
o.order_date,
c.customer_name,
e.first_name AS sales_rep,
SUM(od.quantity * od.unit_price) AS order_total
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
JOIN employees e ON o.employee_id = e.employee_id
JOIN order_details od ON o.order_id = od.order_id
GROUP BY o.order_id, o.order_date, c.customer_name, e.first_name;
WITH department_stats AS (
SELECT
department_id,
COUNT(*) AS emp_count,
AVG(salary) AS avg_sal
FROM employees
GROUP BY department_id
),
high_salary_depts AS (
SELECT *
FROM department_stats
WHERE avg_sal > 8000
)
SELECT
d.department_name,
hs.emp_count,
hs.avg_sal
FROM high_salary_depts hs
JOIN departments d ON hs.department_id = d.department_id;
SELECT
department_id,
employee_id,
salary,
AVG(salary) OVER (PARTITION BY department_id) AS dept_avg_salary,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS salary_rank
FROM employees;
-- 错误:WHERE中不能使用列别名
SELECT salary * 12 AS annual_salary
FROM employees
WHERE annual_salary > 60000; -- 错误!
-- 正确:使用HAVING或子查询
SELECT salary * 12 AS annual_salary
FROM employees
WHERE salary * 12 > 60000; -- 方式1:使用原表达式
-- 或使用子查询
SELECT * FROM (
SELECT salary * 12 AS annual_salary
FROM employees
) AS emp_salaries
WHERE annual_salary > 60000; -- 方式2:子查询中可用
-- GROUP BY中可以使用列别名(某些数据库支持,但不推荐)
SELECT
YEAR(order_date) AS order_year,
COUNT(*) AS order_count
FROM orders
GROUP BY YEAR(order_date); -- 推荐:使用原表达式
-- ORDER BY中可以使用别名
SELECT
first_name,
last_name,
salary * 12 AS annual_salary
FROM employees
ORDER BY annual_salary DESC; -- 正确
-- 避免使用关键字作为别名
SELECT name AS select FROM table; -- 不好
-- 避免使用重复别名
SELECT
e.name AS emp_name,
m.name AS emp_name -- 错误:重复别名
FROM employees e
JOIN managers m ON e.manager_id = m.id;
命名规范:
使用时机:
性能考虑:
数据库兼容性:
这样的别名使用能让SQL查询更清晰、易维护且减少错误。