Bir MySQL sorgusuna '*' ekleme neden bir sözdizimi hatasına neden oluyor?

Bu neden bir sözdizimi hatasına neden oluyor (MySQL 5)?

mysql> select f, blegg.* from blegg limit 1;
+------+------+------+------+
| f    | f    | g    | h    |
+------+------+------+------+
|   17 |   17 |    2 |   17 |
+------+------+------+------+
1 row in set (0.00 sec)

mysql> select f, * from blegg limit 1; -- * is unqualified
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 '* 
from blegg limit 1' at line 1

I've looked through the manual but didn't really find anything. Why does select , * ... fail where select , <table>.* ... and select * ... and select *, ... succeed?

4
Nedenini açıklayamıyorum. Ama ben Oracle'ın aynı şeyi yaptığını biliyorum.
katma yazar John Weber, kaynak

3 cevap

MySQL kılavuzu, tüm bunları açık bir şekilde SELECT bölümünden ortaya koyuyor. sözdizimi :

  • A select list consisting only of a single unqualified * can be used as shorthand to select all columns from all tables:

    SELECT * FROM t1 INNER JOIN t2 ...
    
  • tbl_name.* can be used as a qualified shorthand to select all columns from the named table:

    SELECT t1.*, t2.* FROM t1 INNER JOIN t2 ...
    
  • Use of an unqualified * with other items in the select list may produce a parse error. To avoid this problem, use a qualified tbl_name.* reference

    SELECT AVG(score), t1.* FROM t1 ...
    

Belgeler, * öğesinin kendiliğinden yalnızca seçim listesinde tek olan özel durumda geçerli olduğunu belirtiyor gibi görünüyor. Bununla birlikte, yalnızca başka öğelerle may bir ayrıştırma hatası üretmeyen bir niteliksiz * kullanıldığını söylemektedir.

MySQL'in ötesinde, SQL-92 standardı (eski, ancak linkable) şöyle diyor:

7.9  

         Format

          ::=
              SELECT [  ]  ::=
                
              |  }... ]

          can either be  by itself or a "normal" select list.

7
katma
seçin *, sayın (*) ... başarılı olur.
katma yazar Matt Fenwick, kaynak
@Matt select * olarak doğru değil, blegg çalışacaktır
katma yazar Steve Claridge, kaynak

Muhtemelen aynı alanı iki kez seçiyorsunuz. Aşağıdaki sorguda

select name, * from <...>

* , name 'i içerecek, böylece name ' i ikinci kez açıkça belirtiyorsunuz.

Aşağıdakiler geçerli olduğundan, bu inandırıcı bir argüman değildir:

select name, name from <...>

ve aşağıdaki gibidir

select name, users.* from users

her ikisi de aynı alanı birden çok kez seçecektir.

Daha büyük olasılıkla MySQL'in bir sözdizimi sınırlamasıdır.

2
katma
hayır, bu o değil: saymayı seçin (*), * blegg'den de başarısız olur
katma yazar Matt Fenwick, kaynak
Bu harika bir cevap değil, bir yorum için çok uzun/karmaşıktı. Birisi daha somut bir açıklama sağladığında/mutlu olursa silinecektir.
katma yazar meagar, kaynak
Ancak, ilk çalışma örneği, aynı şeyi yapar (ve çıktıda iki kez f içerir).
katma yazar John Flatness, kaynak

fakat

select *, f from blegg 

iyi çalışır.

Muhtemelen bir niteliksiz * seçimde ilk ifade olarak görünmelidir?

1
katma