SQL.别名

摘要

本文以实际使用为例,介绍SQL语法中别名的使用约束

目录

  1. SQL.别名
    1. 1 介绍
    2. 2 示例
    3. 3 复杂场景

1 介绍

什么是别名:

别名语法:

表名 | 列名 | 表名.列名 [AS] 别名

2 示例

0 建表

CREATE TABLE t1 (
    c1 INT,
    c2 INT,
    c3 INT
);

INSERT INTO t1 VALUES (1, 1, 1), (2, 2, 2);

1 [列] 别名:

SELECT
    c1 AS col1
FROM
    t1;

2 [表] 别名:

SELECT
    c1
FROM
    t1 AS tbl1;

3 [表.列] 别名:

SELECT
    t1.c1 tbl1_col1
FROM
    t1;

4 [表别名.列] 别名:

SELECT
    tbl1.c1 tbl1_col1
FROM
    t1 tbl1;

-- error
SELECT
    t1.c1 tbl1_col1
FROM
    t1 tbl1;

5 [表别名.列别名]

-- error
SELECT
    c1 col1,
    tbl1.col1
FROM
    t1 tbl1;

-- error
SELECT
    tbl1.c1 tbl1_col1,
    tbl1.tbl1_col1
FROM
    t1 tbl1;

6 [别名] 别名

-- error
SELECT
    tbl1.c1 tbl1_col1,
    tbl1_col1 copy_col1
FROM
    t1 tbl1;

7 总结

  • 别名处理顺序:先处理FROM子句,再处理TARGET子句
  • 别名嵌套:可在别名上取别名

3 复杂场景

0 建表

DROP TABLE t1;

CREATE TABLE t1 (
    c1 INT,
    c2 INT,
    c3 INT
);
CREATE TABLE t2 (
    c1 INT,
    c2 INT,
    c4 INT
);

INSERT INTO t1 VALUES (1, 1, 1), (2, 2, 2);
INSERT INTO t2 VALUES (2, 2, 2), (3, 3, 3);

1 多表JOIN

SELECT
    *
FROM
    t1 JOIN t2
        ON c3 = c4       -- succeed
        -- ON c1 = c1;  -- error
        -- ON c1 = c2;  -- error
        -- ON c1 = c4;  -- error
;

SELECT
    -- c1       -- error
    c3,
    -- t1.c1    -- error
    tbl1.c1,
    t2.c1,
    tbl1.c1 tbl1_c1,
    t2.c1 tbl2_c1,
    t2.c1
FROM
    t1 tbl1 JOIN t2
        -- ON t1.c1 = t2.c1 -- error
        ON tbl1.c1 = t2.c1
;

2 多表JOIN,ORDER BY

    SELECT
        c3,
        c4 col4,

        tbl1.c1,
        t2.c1,
        tbl1.c1 tbl1_c1,
        t2.c1 tbl2_c1,
        t2.c1
    FROM
        t1 tbl1 JOIN t2
            ON tbl1.c1 = t2.c1
    ORDER BY
        c3,
        col4,

        tbl1.c1,
        t2.c1,
        tbl1_c1,
        tbl2_c1,
        t2.c1

        -- c1 -- error
        -- t1.c1 -- error

        -- t2.col4 -- error
        -- tbl1.col4 -- error
;

3 多表JOIN,GROUP BY

SELECT
    tbl1.c1 tbl1_c1
FROM
    t1 tbl1 JOIN t2
        ON tbl1.c1 = t2.c1
GROUP BY
    tbl1.c1
    -- tbl1_c1 --succeed
ORDER BY
    tbl1.c1,
    tbl1_c1
;

SELECT
    tbl1.c2 tbl1_c2,
    tbl1.c2
FROM
    t1 tbl1 JOIN t2
        ON tbl1.c1 = t2.c1
GROUP BY
    -- tbl1.c2 -- succeed
    tbl1_c2
ORDER BY
    tbl1.c2,
    tbl1_c2
;

4 语法解析
解析结果:
方式二

5 总结

  • 表别名强约束,列别名弱约束
  • 多表查询时,列名无冲突时,可直接使用列名
  • 别名处理顺序:FROM (alias) -> TARGET -> JOIN -> GROUP BY -> ORDER BY
  • ORDER BY中别名约束,与TARGET中约束一致