代码之家  ›  专栏  ›  技术社区  ›  nonopolarity

mysql/sql的“using”的简写可以不用说“inner join”吗?

  •  1
  • nonopolarity  · 技术社区  · 14 年前

    以下两个语句将使用gifts.giftid=sentgights.giftid加入:

    mysql> select * from gifts, sentgifts using (giftID);
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'using
     (giftID)' at line 1
    

    第二个是:

    mysql> select * from gifts INNER JOIN sentgifts using (giftID);
    +--------+------------+----------------+---------------------+--------+------------+--------+------+---------------------+
    | giftID | name       | filename       | effectiveTime       | sentID | whenSent   | fromID | toID | trytryWhen          |
    +--------+------------+----------------+---------------------+--------+------------+--------+------+---------------------+
    |      2 | teddy bear | bear.jpg       | 2010-04-24 04:36:03 |      4 | 2010-04-24 |   NULL |  111 | 2010-04-24 03:10:42 |
    |      6 | beer       | beer_glass.png | 2010-04-24 05:18:12 |      5 | 2010-03-03 |     11 |   22 | 2010-03-03 00:00:00 |
    |      6 | beer       | beer_glass.png | 2010-04-24 05:18:12 |      6 | 2010-04-24 |     11 |  222 | 2010-04-24 03:54:49 |
    |      6 | beer       | beer_glass.png | 2010-04-24 05:18:12 |      7 | 2010-04-24 |      1 |    2 | 2010-04-24 03:58:45 |
    +--------+------------+----------------+---------------------+--------+------------+--------+------+---------------------+
    4 rows in set (0.00 sec)
    

    第一句话也可以用“使用”速记吗?似乎在使用时,必须指定“内部联接”一词…但第一个语句实际上是一个内部连接?

    更新: 如果做不到,有原因吗?第一句话其实很清楚该怎么做…有什么理由禁止它吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   João Silva    14 年前

    它不能。你必须使用 JOIN 要联接的表之间的关键字,以便 USING 工作。

    以下是相关的语法,来自mysql manual :

    join_table:
        table_reference [INNER | CROSS] JOIN table_factor [join_condition]
      | table_reference STRAIGHT_JOIN table_factor
      | table_reference STRAIGHT_JOIN table_factor ON conditional_expr
      | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_condition
      | table_reference NATURAL [{LEFT|RIGHT} [OUTER]] JOIN table_factor
    
    join_condition:
        ON conditional_expr
      | USING (column_list)
    

    此外,还不清楚您试图使用的第一个语法完成什么。它可以是外部连接,也可以是内部连接。您可以争辩说,当不存在时,解释器应该将其视为一个内部连接,但这会令人困惑。此外,它将是一个新的,非标准的语法,这绝对是一个不,不,imho。

        2
  •  0
  •   Mike Keller    14 年前

    使用条件只是为了防止您这样键入它。

    SELECT * FROM GIFTS INNER JOIN SENTGIFTS ON GIFTS.giftID = SENTGIFTS.giftID
    

    所以它可以防止你在条件下打出来。您仍然需要指定它是一个内部连接。

    对于您的编辑,它不起作用的原因是您没有指定要执行的联接类型。你在做内接吗?左连接?外部连接?服务器的sql解释器不能假定您正在使用哪一个。