为啥在 MySQL 查询中每个值前面都使用字母?

Posted

技术标签:

【中文标题】为啥在 MySQL 查询中每个值前面都使用字母?【英文标题】:Why use letters in front of each value in MySQL query?为什么在 MySQL 查询中每个值前面都使用字母? 【发布时间】:2015-05-12 11:02:08 【问题描述】:

为什么我要像这样在查询中的每个值前面使用字母? 在数据库中,这些值中的每一个都没有前面的字母。

    SELECT c.client_id, c.client_name, c.contactperson, c.internal_comment, 
    IF NULL(r.region, 'Alle byer') as region, c.phone, c.email,
    uu.fullname as changed_by, 
    (select count(p.project_id) 
        from projects p 
        where p.client_id = c.client_id and (p.is_deleted != 1 or p.is_deleted is null)
    ) as numProjects 
    FROM clients c LEFT JOIN users uu ON c.db_changed_by = uu.id 
    LEFT JOIN regions r ON c.region_id = r.region_id 
    WHERE (c.is_deleted != 1 or c.is_deleted is null)

我已经尝试查找它,但我无法在任何地方找到它。

【问题讨论】:

这封信。表示法是指表的别名... 阅读mysqltutorial.org/mysql-alias 为了避免我会阅读 mysql 文档的疑惑;) 阅读此***.com/questions/198196/when-to-use-sql-table-alias 【参考方案1】:

当在 SQL 中您需要使用多个表进行查询时,您可以这样做:

SELECT person.name, vehicle.id FROM person, vehicle;

或者你可以把它做得更小,像这样放

SELECT p.name, v.id FROM person p, vehicle v;

只是为了减少查询长度,对你有用

【讨论】:

你确定 - Its only for reduce the query lenght? 较小表示您使用 ALIAS 接受的答案不准确。您应该考虑检查以下答案。【参考方案2】:

“前面的字母”是指c.uu. 等列上的限定符。它们指示列的来源表。从某种意义上说,它们是列定义的一部分。

这是您的查询:

SELECT c.client_id, c.client_name, c.contactperson, c.internal_comment,
       IF NULL(r.region, 'Alle byer') as region, c.phone, c.email,
       uu.fullname as changed_by,
       (select count(p.project_id)
        from projects p
        where p.client_id = c.client_id and (p.is_deleted != 1 or p.is_deleted is null)
       ) as numProjects
FROM clients c LEFT JOIN
     users uu
     ON c.db_changed_by = uu.id LEFT JOIN
     regions r
     ON c.region_id = r.region_id
WHERE (c.is_deleted != 1 or c.is_deleted is null)

在某些情况下,这些是必需的。考虑on 子句:

 ON c.region_id = r.region_id

如果你把它们排除在外,你有:

ON region_id = region_id

SQL 编译器无法解释这一点,因为它不知道region_id 的来源。是来自clients 还是regions?如果你在select 中使用它,你会遇到同样的问题——因为left join 会有所不同。在相关子查询中也是如此。

一般来说,限定列名是一种很好的做法,原因如下:

查询是明确的。 您(和其他人)很容易知道列的来源。 如果您修改查询并添加新表/子查询,则不必担心命名冲突。 如果修改基础表以具有与其他表共享的新列名,则查询仍将编译。

【讨论】:

【参考方案3】:

假设您正在访问 2 个表并且都具有相同的列名称,例如“Id”,在查询中,如果第一个表具有别名“a”和第二个,则可以使用 a.Id == d.Id 之类的字母轻松识别这些列表'b'。否则很难确定哪个列属于哪个表,尤其是当您有公共表列时。

【讨论】:

以上是关于为啥在 MySQL 查询中每个值前面都使用字母?的主要内容,如果未能解决你的问题,请参考以下文章

937. 重新排列日志文件(Python)

mysql 为啥小表放前面查询时间 比大表放前面查询时间长?

mysql 为啥总是推荐使用联合索引而不是单值索引

mysql 正则表达式 查询匹配 某个词

MySQL 复合查询

MySQL 复合查询