V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
movq
V2EX  ›  程序员

mysql 里面为什么有时候子查询需要 alias,有时候则不需要呢?

  •  
  •   movq · 2022-10-01 20:33:13 +08:00 · 1292 次点击
    这是一个创建于 818 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我给这个题提交了一个解答 https://leetcode.cn/problems/employees-with-missing-information/

    这是我的代码:

    with eid as (select employee_id
                 from Employees),
         sid as (select employee_id
                 from Salaries)
    select employee_id
    from (select e.employee_id as employee_id
           from eid e
           where e.employee_id not in
                 (select * from sid)
          union
          select s.employee_id as employee_id
           from sid s
           where s.employee_id not in 
           		(select * from eid)
           ) t
    order by employee_id;
    

    可以发现,not in (select * from sid)not in (select * from eid)这两个子查询都没有加 alias ,但可以通过,如果加了反而不通过

    from (select e.employee_id as employee_id
           from eid e
           where e.employee_id not in
                 (select * from sid)
          union
          select s.employee_id as employee_id
           from sid s
           where s.employee_id not in 
           		(select * from eid)
           ) t
    

    这个子查询则需要加别名(我的命名是 t )

    为什么会这样呢?

    4 条回复    2022-10-01 22:23:04 +08:00
    liprais
        1
    liprais  
       2022-10-01 20:46:54 +08:00 via iPhone
    有没有可能有些你觉得是子查询的,其实是 derive table 呢
    movq
        2
    movq  
    OP
       2022-10-01 20:55:12 +08:00
    @liprais 所以是不是 from 后面是 derived table ,需要 alias ,但是 where clause 里面的是 subquery 不是 derived table ,所以不需要 alias ?
    liprais
        3
    liprais  
       2022-10-01 20:55:49 +08:00
    @movq
    FYFX
        4
    FYFX  
       2022-10-01 22:23:04 +08:00
    你这个是 Subquery as Scalar Operand https://dev.mysql.com/doc/refman/8.0/en/scalar-subqueries.html,
    然后你再看一下 derived table 的 https://dev.mysql.com/doc/refman/8.0/en/derived-tables.html
    > The [AS] tbl_name clause is mandatory because every table in a FROM clause must have a name. Any columns in the derived table must have unique names.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2828 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 06:19 · PVG 14:19 · LAX 22:19 · JFK 01:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.