Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

DBMS mana yang mengizinkan pesanan berdasarkan atribut, yang tidak ada dalam klausa pilih?

Kueri Anda adalah sintaks yang benar-benar legal, Anda dapat memesan berdasarkan kolom yang tidak ada di pilih.

Jika Anda memerlukan spesifikasi lengkap tentang pemesanan legal, dalam SQL Standard 2003 ia memiliki daftar panjang pernyataan tentang apa yang harus dan tidak boleh berisi pesanan, (Yayasan 02, halaman 415, bagian 7.13 , sub bagian 28). Ini mengonfirmasi bahwa kueri Anda adalah sintaksis legal.

Saya pikir kebingungan Anda mungkin timbul karena memilih, dan/atau mengurutkan berdasarkan kolom yang tidak ada dalam grup oleh, atau mengurutkan berdasarkan kolom yang tidak dipilih saat menggunakan berbeda.

Keduanya memiliki masalah mendasar yang sama, dan MySQL adalah satu-satunya untuk pengetahuan saya yang memungkinkan keduanya.

Masalahnya adalah ini, bahwa ketika menggunakan grup dengan atau berbeda, kolom apa pun yang tidak terdapat di keduanya tidak diperlukan, jadi tidak masalah jika mereka memiliki beberapa nilai berbeda di seluruh baris karena tidak pernah diperlukan. Bayangkan kumpulan data sederhana ini:

ID  | Column1 | Column2  |
----|---------+----------|
1   |    A    |    X     |
2   |    A    |    Z     |
3   |    B    |    Y     |

Jika Anda menulis:

SELECT  DISTINCT Column1
FROM    T;

Anda akan mendapatkan

 Column1 
---------
     A   
     B   

Jika Anda kemudian menambahkan ORDER BY Column2 , mana dari dua kolom2 yang akan Anda gunakan untuk mengurutkan A, X atau Z? Tidak deterministik tentang bagaimana memilih nilai untuk kolom2.

Hal yang sama berlaku untuk memilih kolom yang tidak termasuk dalam grup oleh. Untuk menyederhanakan, bayangkan dua baris pertama dari tabel sebelumnya:

ID  | Column1 | Column2  |
----|---------+----------|
1   |    A    |    X     |
2   |    A    |    Z     |

Di MySQL Anda dapat menulis

SELECT  ID, Column1, Column2
FROM    T
GROUP BY Column1;

Ini sebenarnya melanggar Standar SQL, tetapi berfungsi di MySQL, namun masalahnya adalah non-deterministik, hasilnya:

ID  | Column1 | Column2  |
----|---------+----------|
1   |    A    |    X     |

Tidak lebih atau kurang benar dari

ID  | Column1 | Column2  |  
----|---------+----------|
2   |    A    |    Y     |

Jadi yang Anda katakan adalah beri saya satu baris untuk setiap nilai Column1 yang berbeda , yang memenuhi kedua set hasil, jadi bagaimana Anda tahu mana yang akan Anda dapatkan? Tidak, tampaknya kesalahpahaman yang cukup populer bahwa Anda dapat menambahkan dan ORDER BY klausa untuk memengaruhi hasil, jadi misalnya kueri berikut:

SELECT  ID, Column1, Column2
FROM    T
GROUP BY Column1
ORDER BY ID DESC;

Akan memastikan bahwa Anda mendapatkan hasil berikut:

ID  | Column1 | Column2  |  
----|---------+----------|
2   |    A    |    Y     |

karena ORDER BY ID DESC , namun ini tidak benar (seperti yang ditunjukkan di sini ).

Dokumen MySQL status:

Jadi meskipun Anda memiliki pesanan dengan ini tidak berlaku sampai setelah satu baris per grup telah dipilih, dan satu baris ini non-deterministik.

SQL-Standard memungkinkan kolom dalam daftar pilih yang tidak terdapat dalam GROUP BY atau fungsi agregat, namun kolom ini harus secara fungsional bergantung pada kolom di GROUP BY. Dari SQL-2003-Standard (5WD-02-Foundation-2003-09 - halaman 346) - http ://www.wiscorp.com/sql_2003_standard.zip

Misalnya, ID dalam tabel sampel adalah KUNCI UTAMA, jadi kita tahu itu unik dalam tabel, jadi kueri berikut sesuai dengan standar SQL dan akan berjalan di MySQL dan gagal di banyak DBMS saat ini (Pada saat penulisan Postgresql adalah DBMS terdekat yang saya tahu untuk menerapkan standar dengan benar - Contoh di sini ):

SELECT  ID, Column1, Column2
FROM    T
GROUP BY ID;

Karena ID unik untuk setiap baris, hanya boleh ada satu nilai Column1 untuk setiap ID, satu nilai Column2 tidak ada ambiguitas tentang apa yang harus dikembalikan untuk setiap baris.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. kesalahan node-mysql:sambungkan ECONNREFUSED

  2. Menggunakan rekursi untuk membangun navigasi

  3. generator mybatis Pola nama kolom tidak boleh NULL atau kosong

  4. Pilih MySQL untuk pembaruan - itu tidak mengunci baris target. Bagaimana cara memastikannya?

  5. Apakah ada alat untuk menghasilkan DDL database lengkap untuk SQL Server? Bagaimana dengan Postgres dan MySQL?