Apa urutan eksekusi klausa Group By, Having, dan Where di SQL Server?

92

Saya hanya bingung dengan urutan eksekusi kueri SQL saat kami menggunakan GROUP BY dan HAVING dengan klausa WHERE. Mana yang dieksekusi lebih dulu? Apa urutannya?

Jonathan Leffler
sumber

Jawaban:

186

dalam urutan:

FROM & JOIN s tentukan & filter baris
DI MANA lebih banyak filter pada baris
GROUP BY menggabungkan baris tersebut ke dalam grup
HAVING filter groups
ORDER BY mengatur baris / grup yang tersisa
LIMIT filter pada baris / grup yang tersisa

KM.
sumber
apakah ada referensi untuk ini ??
Geshan
3
@ Geshan, lihat keSET SHOWPLAN_ALL ON
KM.
Hai, saya punya satu pertanyaan. Akankah pernyataan kasus ketika kondisi mengesampingkan kondisi di mana?
MAX
2
Bagaimana dengan klausa pilih. Apakah itu di Terakhir?
MAX
Jawaban singkat dan ringkas! Terima kasih!
Abhishek Ghosh
14

Berikut urutan lengkap untuk sql server:

1.  FROM
2.  ON
3.  JOIN
4.  WHERE
5.  GROUP BY
6.  WITH CUBE or WITH ROLLUP
7.  HAVING
8.  SELECT
9.  DISTINCT
10. ORDER BY
11. TOP

Maka dari daftar di atas, Anda dapat dengan mudah memahami urutan eksekusi di GROUP BY, HAVING and WHEREantaranya:

1.  WHERE
2.  GROUP BY
3.  HAVING

Dapatkan informasi lebih lanjut tentang itu dari Microsoft

Md. Suman Kabir
sumber
SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @valHere ON datang setelah join, dan pilih come first, ada penjelasannya?
noob
Ini hanyalah sintaks untuk menulis pernyataan SQL. Urutan yang saya sebutkan adalah urutan sebenarnya yang mengevaluasi mesin SQL. Itu berarti jika sintaks kueri Anda benar, maka mesin mengevaluasi FROMterlebih dahulu, lalu ONdan seterusnya.
Md. Suman Kabir
1
@ShailajaGuptaKapoor Anda dapat membaca blog inis.x2line.com/al/archive/2007/06/30/3187.aspx
Md. Suman Kabir
Jika WHERE muncul sebelum SELECT, mengapa ini mengembalikan baris? pilih jumlah (1) dari foo di mana 1 = 0
Tony B
8

DI MANA pertama, lalu Anda MENGELOMPOKKAN hasil kueri, dan yang terakhir tetapi tidak kalah pentingnya HAVING-klausa diambil untuk menyaring hasil yang dikelompokkan. Ini adalah urutan "logis", saya tidak tahu bagaimana ini diterapkan secara teknis di mesin.

Matthias Meid
sumber
2
Layak ditambahkan bahwa pengoptimal dapat memindahkan klausul dari HAVING ke WHERE jika tidak bergantung pada agregat. Ini tidak akan mempengaruhi hasil yang ditampilkan.
Damien_The_Unbeliever
2

Saya pikir ini diimplementasikan di mesin seperti yang dikatakan Matthias: DI MANA, KELOMPOKKAN OLEH, HAVING

Mencoba mencari referensi online yang mencantumkan seluruh urutan (yaitu "PILIH" langsung ke bawah), tetapi saya tidak dapat menemukannya. Itu dirinci dalam buku "Inside Microsoft SQL Server 2005" yang saya baca belum lama ini, oleh Solid Quality Learning

Edit: Menemukan tautan: http://blogs.x2line.com/al/archive/2007/06/30/3187.aspx

AdaTheDev
sumber
Penjelasan yang sangat bagus yang Anda tautkan ke :-).
sleske
1
Link sudah mati. Jika Anda bisa memperbaikinya, itu akan sangat bagus :)
Akash KC
2

Di Oracle 12c, Anda dapat menjalankan kode keduanya dalam urutan di bawah ini:

Where
Group By
Having

Atau

Where 
Having
Group by
Jim Chen
sumber
1

Pikirkan tentang apa yang perlu Anda lakukan jika Anda ingin menerapkan:

  • DI MANA : Kebutuhannya untuk menjalankan operasi JOIN.
  • KELOMPOKKAN OLEH : Anda menentukan Grup dengan "mengelompokkan" hasil pada gabungan, kemudian harus setelah operasi GABUNG, setelah penggunaan WHERE.
  • HAVING : HAVING adalah untuk memfilter seperti yang dikatakan ekspresi GROUP BY. Kemudian, itu dieksekusi setelah GROUP BY.

Urutannya adalah WHERE, GROUP BY dan HAVING.

FerranB
sumber
Apa yang Anda jelaskan di sini brilian. Ini menghilangkan keraguan saya tentang HAVING. Jadi untuk meringkas - GROUP BY & HAVING berfungsi sama dengan SELECT & WHERE. HAVING clause selalu berjalan pada data tabel COMPLETE yang mengambil kondisi GROUP BY pada gambar dan TIDAK PADA data GROUPED.
Naveen Kumar
1

Di bawah Order

  1. DARI & GABUNG
  2. DIMANA
  3. GRUP OLEH
  4. HAVING
  5. PILIH
  6. DIPESAN OLEH
  7. MEMBATASI
GimmicksWorld
sumber
0

Memiliki Klausul dapat muncul sebelum / sebelum kelompok dengan klausa.

Contoh: pilih * FROM test_std; ROLL_NO SNAME DOB TEACH


     1 John       27-AUG-18 Wills     
     2 Knit       27-AUG-18 Prestion  
     3 Perl       27-AUG-18 Wills     
     4 Ohrm       27-AUG-18 Woods     
     5 Smith      27-AUG-18 Charmy    
     6 Jony       27-AUG-18 Wills     
       Warner     20-NOV-18 Wills     
       Marsh      12-NOV-18 Langer    
       FINCH      18-OCT-18 Langer    

9 baris dipilih.

pilih mengajar, hitung ( ) hitung dari test_std memiliki hitung ( )> 1 kelompok oleh GURU;

MENGAJAR JUMLAH


Langer 2 Wills 4

manoj remala
sumber
0

Ini adalah SQL Order of execution dari sebuah Query,

masukkan deskripsi gambar di sini

Anda dapat memeriksa urutan eksekusi dengan contoh-contoh dari artikel ini .

Bagi Anda pertanyaan di bawah baris mungkin bisa membantu dan langsung didapat dari artikel ini .

  1. GROUP BY -> Baris yang tersisa setelah batasan WHERE diterapkan kemudian dikelompokkan berdasarkan nilai-nilai umum di kolom yang ditentukan dalam klausa GROUP BY. Sebagai hasil dari pengelompokan, hanya akan ada baris sebanyak nilai unik di kolom itu. Secara implisit, ini berarti Anda hanya perlu menggunakan ini ketika Anda memiliki fungsi agregat dalam kueri Anda.
  1. HAVING -> Jika query memiliki klausa GROUP BY, maka batasan dalam klausa HAVING kemudian diterapkan ke baris yang dikelompokkan, buang baris yang dikelompokkan yang tidak memenuhi batasan. Seperti klausa WHERE, alias juga tidak dapat diakses dari langkah ini di sebagian besar database.

Referensi:-

Kushan Gunasekera
sumber
-2

PILIH
DARI
GABUNG
DI MANA
GRUP DENGAN
MEMILIKI
ORDER OLEH

OcTella
sumber
13
Ini sebenarnya salah. Menurut Pelatih Bersertifikat MS dan materi pelatihan resmi, Pesan Oleh adalah setelah Pilih. Agak logis ketika Anda memikirkannya. Bodoh sekali jika memesan tabel virtual yang belum Anda ambil dan tempelkan. :)
simme