使用别名(Aliases)

在 SQL 查询中,可以通过 AS 为表达式、列或表分配别名,以下是具体使用场景和注意事项:


1. 为表达式或列分配别名

  • 使用 AS 可以为表达式或列分配别名,别名会作为结果集中的列名。
  • 别名可以与 ORDER BYHAVING 子句配合使用,但不能在 WHERE 子句中使用。

示例:

SELECT 
    CONCAT(last_name, ' ', first_name) AS full_name, -- 将拼接后的结果命名为 full_name
    nickname AS nick                               -- 为 nickname 列分配别名 nick
FROM
    mytable 
ORDER BY
    full_name;                                     -- 按别名 full_name 排序

2. 为表分配别名

  • 表名可以通过 AS 分配简短的别名,简化引用。
  • 也可以省略 AS 直接分配别名。

示例:

SELECT
    COUNT(B.Booking_ID),   -- 统计 B 表中的 Booking_ID
    U.User_Location        -- 获取 U 表的 User_Location
FROM
    Users U                -- 为 Users 表分配别名 U
LEFT OUTER JOIN
    Bookings AS B          -- 为 Bookings 表分配别名 B
ON 
    U.User_ID = B.Rep_ID AND
    B.Project_ID = '10'    -- 筛选条件
GROUP BY
    U.User_Location;       -- 按 User_Location 分组

3. 自连接中的别名

  • 在使用自连接时,别名至关重要,可以为表的不同实例分配不同的别名,便于区分。

示例: 假设 people 表中每个人都有 nameparent 字段,可以通过别名将表分别表示为父母和子女的角色。

SELECT
    p.name                                   AS parent,  -- 父母姓名
    c.name                                   AS child,   -- 子女姓名
    MIN((TO_DAYS(NOW()) - TO_DAYS(c.dob)) / 365) AS minage -- 子女的最小年龄
FROM
    people AS p                              -- 为父母分配别名 p
LEFT JOIN
    people AS c                              -- 为子女分配别名 c
ON
    p.name = c.parent                        -- 父母与子女的关系
WHERE
    c.name IS NOT NULL                       -- 子女姓名不为空
GROUP BY
    parent                                   -- 按父母分组
HAVING
    minage > 50                              -- 筛选子女年龄大于 50 的父母
ORDER BY
    p.dob;                                   -- 按父母的出生日期排序

注意事项

  1. AS 是可选的
    可以直接写别名而无需使用 AS,例如:

    SELECT nickname nick FROM mytable;
    
  2. 别名限制

    • 别名不能在 WHERE 子句中直接使用,因为 WHERESELECT 之前执行。
    • ORDER BYGROUP BYHAVING 中可以直接使用别名。
  3. 用途

    • 别名能提高查询的可读性。
    • 必须使用别名来区分自连接中的表。

通过别名,复杂查询可以变得更加简洁和易读,同时便于操作和理解结果。

Last modified: Friday, 17 January 2025, 7:23 PM