【问题标题】:English terminology MySQL queries英文术语 MySQL 查询
【发布时间】:2015-10-20 08:58:00
【问题描述】:

我需要一些关于查询部分的“术语”方面的帮助。但不仅查询 PARTS,任何“查询相关的修辞格”也会很有帮助,我对它们非常感兴趣。而不仅仅是SELECTs(如下例所示)、INSERTs、UPDATEs 和其他查询。

例如:

SELECT t1.f1, t1.f2, t2.f1 AS f1a, (t2.f2 * 10) AS f2a
FROM talbe1 AS t1
INNER JOIN table2 AS t2 ON (t1.f4 <> t2.f4)
WHERE t1.f3 > t2.f3
LIMIT 100, 9999

我知道:

1) t1, t2 - “表别名”,这里没有错吗?

2) f1a - “字段别名”,f2a - idk...“表达式别名”可能吗?它们之间有区别吗?有没有集体命名?

3) 100 - “偏移”

我不知道怎么打电话:

1) 在SELECTFROM 之间:t1.f1, t1.f2, t2.f1 AS f1a, (t2.f2 * 10) AS f2a

2) t1.f3 &gt; t2.f3“where 子句”? “健康)状况”?哪个更好?其他变种?

3)(t1.f4 &lt;&gt; t2.f4)“加入条件”?

如果有超过 1 个加入也有兴趣,我可以通过“顺序”或“深度”以某种方式调用它们吗?如果我可以通过“深度”做到这一点,那么RIGHT JOIN 会如何?

您的示例中的任何其他有趣的“事物命名”都会非常有帮助。像 SELF-JOIN 一样,可能是其他一些有特殊要求的连接,任何你能记住的有趣的东西。

【问题讨论】:

  • 正如@francis-usher 在their answer 中建议的那样,阅读官方文档(在dev.mysql.com/doc/refman/5.7/en/select.html 找到它)是获取术语的最佳方式。别再担心你的英语了。
  • @axiac 那几乎不是我的英语。问题有很多版本:)
  • 确实,经过一些社区的努力,它才形成了这个形状。之前没有注意到这一点;-)
  • @M0riis 我尝试仅在 OP 不努力时将问题标记为他们的语言。如果 OP 付出努力(像你一样),我可能会建议进行编辑,但永远不会标记,投反对票等。我希望网络上的其他居民采取相应的行动:)

标签: mysql terminology


【解决方案1】:

您可能对the official MySQL syntax 对此事的看法感兴趣。在我看来,当你试图描述像编程语言术语这样数学的东西时,你永远不能过于正式。

1.

t1.f1 被称为 select_expr,在英语中 fudge 发音为“选择表达式”。请注意:

每个select_expr 表示您要检索的列。

所以另一种不太正式的英文称呼方式可能是“column”。

2.

语法似乎区分了 clausecondition,其中该子句包括关键字 WHERE 本身,但条件只是普通的旧 SQL里面的表达式。

WHERE 子句(如果给定)指示选择行必须满足的一个或多个条件。 where_condition 是一个表达式,对于要选择的每一行,其计算结果都为真。

还有

WHERE 表达式中,您可以使用 MySQL 支持的任何函数和运算符,聚合(汇总)函数除外。请参阅第 9.5 节,“表达式语法”

3.

来自不同的syntax documentation page

对于SELECT 语句的table_references 部分,MySQL 支持以下JOIN 语法

所以关于SELECT 来自哪些表的整个部分被称为“表引用”。从这里我们可以深入研究与您上面的示例匹配的生产的语法:

join_table: table_reference [INNER | CROSS] JOIN table_factor [join_condition]

这意味着您所指的部分包含在“连接条件”中。然而,与上面的WHERE 子句一样,连接条件也包含ON 关键字。实际的表达式(t1.f4 &lt;&gt; t2.f4) 同样是一个普通的conditional_expr 或“条件表达式”,就像上面WHERE 子句中的那个。

此文档页面中的一些更多详细信息产生了宝贵的见解:

与 ON 一起使用的conditional_expr 是可以在 WHERE 子句中使用的任何形式的条件表达式。通常,您应该使用 ON 子句来指定如何连接表的条件,并使用 WHERE 子句来限制结果集中需要哪些行。

因此,您可以通过将WHERE 条件称为“行限制表达式”并将JOIN 条件称为“连接条件表达式”,以一种有用且有意义的方式非正式地区分它们。

【讨论】:

  • 我也学到了很多!在我今天查之前,我对这些东西一无所知。感谢您提出一个好问题。
  • 对不起..但是wtf。这个答案的主人是另一个人。 “Francais Uther”就在这附近。而且我说的不仅仅是昵称,这完全是另一个帐户,根据声誉、答案计数、徽章等。发生了什么?
  • 照明!!!开始!!!不,JK,因为我在工作中无法访问我的个人 gmail,所以我创建了那个帐户。现在我合并了我的 2 个帐户,这样我就可以在工作中或在家中通过电子邮件访问它们。感谢您的赏金顺便说一句!
  • 好吧)我不知道帐户合并的可能性)对不起,谢谢
【解决方案2】:

SQL 非常正式,而且结构非常好。 任何查询(无论SELECTINSERT 等)都包含语句。对于SELECT-queries,我建议从FROM-clause 开始阅读。在其他人从DELETE/INSERT/UPDATEclauses(第一行)开始。这些子句显示正在操纵哪些数据集。在这些子句中,您可以在括号中看到一个表或一个列表或多个表或JOIN-表达式(在FROM)或子查询。表列表也意味着连接,但稍后会解释。例如

... FROM tab1 t1  
... FROM tab1 t1, tab2 t2
... FROM tab1 JOIN tab2 ON ( ... )
... FROM (select * from tab3 ...) t
DELETE tab4 ...  /* doesn't delete the table, but its records*/
INSERT INTO tab5 ...
UPDATE tab6 t6 ...
UPDATE (select * from tab3 ... ) ...

这些是显示要处理的表的中心子句。

在子句中,每个表或子查询都可以使用别名来引用。别名将替换查询的所有其他部分中的表名。在上述示例中,t1t2t6t 是别名。大多数 DBMS 不需要在别名前使用 AS 一词,而且许多 DBMS 不允许这样做。如果存在别名,则只能使用此别名。

所有查询(INSERT 除外)都可以包含 WHERE 子句。此子句限制受影响的行数。它包含一个条件。可以给出一个比较的单个简单条件(例如last_name="Ellison")或另外使用逻辑运算符的复杂条件:ANDORNOT。条件的不同部分可以用括号分组。

WHERE t1.last_name="Ellison" AND t1.first_name="Clark"
WHERE usr.id=profile.usr_id AND
     (usr.state="active" OR usr.role="contributor")

其他子句特定于查询。 SELECT-clauses 包含一个表达式列表并给出 projection — 为已处理的记录集生成一组新列。任何表达式都可以包含使用可选词 AS 添加的列别名

ORDER BY-clauses 控制结果记录(或结果集)的顺序。它仅适用于SELECT-query。 ORDER BY 必须是最后一个子句。

GROUP BY-clauses 和HAVING-clauses 用于将某些记录归为一个并过滤分组后的结果。分组将多条记录(在一个或多个字段中具有相同值)替换为一条记录。这些子句适用于SELECT-query。

SELECT 查询可以是(方括号表示可选部分):

SELECT expressions
FROM tables or join expressions
[WHERE simple or complex condition]
[GROUP BY expressions
 [HAVING simple or complex condition]]
[ORDER BY expressions]

其他更简单:

DELETE table
[WHERE simple or complex condition]

UPDATE table
SET field=expression, field=expression, ...
[WHERE simple or complex condition]

INSERT INTO table[(fields...)]
VALUES (expressions...)

或其他形式

INSERT INTO table[(fields...)]
SELECT...   /* normal select-query */

关于JOIN

JOIN 是关系代数运算的实现。当加入一个表的某些记录时,它会将其与另一个表的记录连接起来并形成更广泛的记录。 INNER JOIN(精确连接)仅将此操作应用于匹配连接条件的记录对。

... users INNER JOIN roles ON (roles.id=user.role_id) ...

LEFT OUTER JOIN 还会将第一个表中不匹配的记录添加到结果集中。 RIGHT JOIN 反之亦然。

-- two identical joins using different join operators
... users LEFT OUTER JOIN roles ON (roles.id=user.role_id)...
... roles RIGHT OUTER JOIN users ON (roles.id=user.role_id)... 

FULL OUTER JOIN 两者都做,它给出了INNER JOIN 加上左表中不匹配的记录加上右表中不匹配的记录的结果。

单词INNEROUTER 是可选的。您可以省略它们,不会有任何变化。

【讨论】:

  • 它增加了更多的“形式”。你帮了很多忙
【解决方案3】:

问:1) 都在SELECTFROM 之间: t1.f1, t1.f2, t2.f1 AS f1a, (t2.f2 * 10) AS f2a

A:我将其称为“选择列表”。这就是返回的表达式列表。列表中的每个表达式都是结果集中的一列。 (表达式可以像列名一样简单,也可以更多地涉及函数的返回或比较操作。

问:2) t1.f3 > t2.f3 “where 子句”? “健康)状况”?哪个更好?其他变体?

答:为了返回一行而必须满足的这些条件的通用术语是“谓词”。谓词是WHERE 子句或ON 子句中的条件,必须满足这些条件才能返回行。

问:3) (t1.f4 t2.f4) “加入条件”?

A:同样,这是一个谓词。这恰好出现在 ON 子句中,而不是 WHERE 子句中。术语“连接条件”也是合适的。但就该数据库如何解析和执行语句而言,它只是另一个谓词。

规范做法是将“连接条件”包含在ON 子句中,并将其他条件包含在 WHERE 子句中。

【讨论】:

    【解决方案4】:

    1) 2) 我会使用别名来显示它们所指的内容。例如,select ... from my_first_table mft inner join user_rights ur where ...。 但如果你没有更好的选择,“t1, t2, ...”也可以。

    3) 是的


    1) 选择子句或字段

    2) where 子句

    3)“加入条件”是对的

    【讨论】:

    • 感谢您的回复。我认为在示例中t1 表明它指的是table1,2 也是:)
    【解决方案5】:

    我会说,您似乎已经很好地理解了大多数术语,而且我相信您的大部分措辞都会被理解。查看正式文档似乎也是一个好主意。

    以下是我对您的问题的看法,首先让我们回答您似乎认识的人:

    1. “表别名”很好
    2. “字段别名”或“表达式别名”都不错。一个常见的答案可能是“列别名”,因为这些语句定义了结果的列
    3. “偏移”(或者可能是“行偏移”)很好

    你不太确定的那些:

    1. SELECTFROM 之间,我会使用“选择表达式”或“列表达式”或“列定义”
    2. 我倾向于使用“where 表达式”
    3. “连接条件”或“连接表达式”对我来说同样清楚

    当提到不同的连接时,我会通过唯一的“内连接”或“左连接”来区分它们,或者如果您有多个连接,则使用“table1 上的连接”之类的东西。 “自连接”当然是指使用不同别名引用自身的连接,但如果您还有许多其他连接,则可能会变得混乱。

    一般来说,只要您的意图和解决方案被理解,大多数人都会理解并忽略措辞中的小错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      相关资源
      最近更新 更多