Tujuan

di topik Hari ini klausa – bukan jenis yang mendistribusikan menyajikan selama liburan, tapi yang Anda gunakan dengan perintah SELECT. Pada akhir hari Anda akan memahami dan dapat menggunakan klausa berikut:

  • WHERE
  • DENGAN STARTING
  • ORDER BY
  • GROUP BY
  • HAVING

Untuk mendapatkan merasakan di mana fungsi ini cocok, memeriksa sintaks umum untuk perintah SELECT:

Sintaks:
 SELECT [berbeda | ALL] (* | [(skema.] (Tabel | view | snapshot) .* | expr) [[AS] c_alias] [, ([skema.] (Tabel | view | snapshot) .* | expr ) [[AS] c_alias]] ...  DARI) [(skema.] Tabel | melihat | snapshot) [@ dblink] [t_alias] [, skema [(.] Tabel | melihat | snapshot) [@ dblink] [t_alias]] ... [WHERE kondisi] [GROUP BY expr [,] expr ...  [HAVING kondisi]] [(UNI | UNI SEMUA | INTERSECT | MINUS) perintah SELECT] [ORDER BY (expr | posisi) [ASC | DESC] [, (expr | posisi) [ASC | DESC]] ...]

CATATAN: Dalam pengalaman saya dengan SQL, standar ANSI benar-benar lebih dari ANSI “saran.” Sintaks sebelumnya biasanya akan bekerja dengan mesin SQL, namun Anda dapat menemukan beberapa variasi sedikit.

CATATAN: Anda belum harus berhadapan dengan diagram sintaks rumit. Karena banyak orang menemukan diagram sintaks lebih membingungkan daripada menerangi ketika belajar sesuatu yang baru, buku ini telah menggunakan contoh-contoh sederhana untuk mengilustrasikan poin tertentu. Namun, kita sekarang pada titik di mana sebuah diagram sintaks dapat membantu mengikat konsep-konsep materi baru dikenal hari ini.


Jangan khawatir tentang sintaks yang tepat – itu bervariasi sedikit dari implementasi untuk pelaksanaan pula. Sebaliknya, berfokus pada hubungan. Di bagian atas pernyataan ini adalah SELECT,yang telah digunakan berkali-kali dalam beberapa hari terakhir. SELECT diikuti oleh DARI, yang harus muncul dengan setiap pernyataan SELECT Anda ketik. (Anda belajar kegunaan baru untuk besok DARI WHERE.), GROUP BY, HAVING, ORDER BY dan semua mengikuti. (The klausa lain dalam diagram – UNION, UNION ALL, INTERSECT, dan MINUS – tertutup di Hari 3, “Ekspresi, Kondisi, dan Operator.”) Setiap klausul memainkan peran penting dalam memilih dan memanipulasi data.


CATATAN: Kami telah menggunakan dua implementasi dari SQL untuk mempersiapkan’s contoh hari ini. Satu implementasi memiliki SQL> prompt dan nomor baris (Personal Oracle7), dan yang lainnya (Borland ISQL) tidak. Anda juga akan melihat bahwa menampilkan output sedikit berbeda, tergantung pada pelaksanaannya.

The WHERE Klausul

Menggunakan hanya SELECT dan FROM, Anda dibatasi untuk kembali setiap baris dalam sebuah tabel. Contohnya, dengan menggunakan dua kata kunci di meja cek, Anda mendapatkan semua tujuh baris:

INPUT:
  SQL> SELECT * 
   2 dari pemeriksaan;
OUTPUT:
  JUMLAH PERIKSA Penerima Pembayaran # KOMENTAR 
  -------- -------------------- -------- -------------- ---- 
         1 Ma Bell 150 Apakah anak kali 
         2 Membaca RR 245,34 Kereta ke Chicago 
         3 Ma Bell 200,32 Telepon Seluler 
         4 Lokal Utilitas Gas 98 
         5 Joes $ Dent 150 Groceries basi 
        16 Kas 25 Wild Night Out 
        17 Joans Gas Gas 25,1 
 
  7 baris yang dipilih. 

Dengan WHERE dalam kosakata Anda, Anda dapat lebih selektif. Untuk menemukan semua cek yang Anda tulis dengan yang bernilai lebih dari 100 dolar, tulis ini:

INPUT:
  SQL> SELECT * 
    2 dari pemeriksaan 
    3 WHERE JUMLAH> 100; 

Klausa WHERE mengembalikan empat kasus dalam tabel yang memenuhi kondisi yang diperlukan:

OUTPUT:
  JUMLAH PERIKSA Penerima Pembayaran # KOMENTAR 
  -------- -------------------- -------- -------------- ---- 
         1 Ma Bell 150 Apakah anak kali 
         2 Membaca RR 245,34 Kereta ke Chicago 
         3 Ma Bell 200,32 Telepon Seluler 
         5 Joes $ Dent 150 Groceries basi 

MANA juga dapat memecahkan teka-teki populer lainnya. Dengan tabel berikut nama dan lokasi, Anda dapat meminta pertanyaan populer, mana Waldo?

INPUT:
  SQL> SELECT * 
   2 DARI PUZZLE;
OUTPUT:
  NAMA LOKASI 
  -------------- -------------- 
  TYLER Backyard 
  DAPUR UTAMA 
  RUANG HIDUP SPEEDY 
  WALDO GARASI 
  Cung UTILITAS Closet 
  ARNOLD TV RUANG 
 
  6 baris yang dipilih. 
INPUT:
  SQL> SELECT LOKASI SEBAGAI "WHERE'S WALDO?" 
    2 DARI PUZZLE 
   3 WHERE NAME 'WALDO =';
OUTPUT:
  WHERE'S WALDO? 
  -------------- 
  GARASI 

Maaf, kami tidak bisa menahan diri. Kami berjanji tidak ada permintaan yang lebih dangkal. (Kami menyelamatkan orang-orang untuk itu SQL humor kamar mandi semua buku lama ingin.) Namun demikian, pertanyaan ini menunjukkan bahwa kolom yang digunakan dalam kondisi laporan WHERE tidak harus disebutkan di klausa SELECT. Dalam contoh ini Anda memilih kolom lokasi tetapi digunakan WHERE pada nama, yang sempurna hukum. Juga perhatikan SA pada baris SELECT. SA operator tugas opsional, menempatkan alias WHERE'S WALDO.? Untuk LOKASI Anda mungkin tidak pernah melihat AS lagi, karena melibatkan mengetik ekstra. Dalam sebagian besar implementasi dari SQL Anda dapat mengetik

INPUT:
  SQL> SELECT LOKASI "WHERE'S WALDO?" 
   2 DARI PUZZLE 
   3 WHERE NAME 'WALDO ='; 

dan mendapatkan hasil yang sama dengan permintaan sebelumnya tanpa menggunakan SA:

OUTPUT:
  WHERE'S WALDO? 
  -------------- 
  GARASI 

Setelah SELECT dan FROM, WHERE adalah yang ketiga yang paling sering digunakan istilah SQL.

The DENGAN STARTING Klausul

MEMULAI DENGAN merupakan tambahan untuk klausa WHERE yang bekerja sama persis seperti SEPERTI (<exp>%). Bandingkan hasil query berikut:

INPUT:
  SELECT penerima pembayaran, AMOUNT, KOMENTAR 
  DARI Cek 
  SEPERTI MANA Penerima Pembayaran ('% Ca');
OUTPUT:
  Penerima Pembayaran JUMLAH KOMENTAR 
  ==================== =============== ============== 
  Kas Wild Night Out 25 
  Kas 60 Perjalanan ke Boston 
  Kas 34 Perjalanan ke Dayton 

dengan hasil dari query ini:

INPUT:
 SELECT penerima pembayaran, AMOUNT, KOMENTAR DARI Cek WHERE DENGAN STARTING penerima pembayaran ('Ca');
OUTPUT:
  Penerima Pembayaran JUMLAH KOMENTAR 
  ==================== =============== ============== 
  Kas Wild Night Out 25 
  Kas 60 Perjalanan ke Boston 
  Kas 34 Perjalanan ke Dayton 

Hasilnya identik. Anda bahkan dapat menggunakannya bersama-sama, seperti yang ditunjukkan di sini:

INPUT:
  SELECT penerima pembayaran, AMOUNT, KOMENTAR 
  Dari pemeriksaan 
  MANA MEMULAI DENGAN Penerima Pembayaran ('Ca') 
  ATAU 
  KOMENTAR G% 'SEPERTI';
OUTPUT:
  Penerima Pembayaran JUMLAH KOMENTAR 
  ==================== =============== =============== 
  98 Lokal Utilitas Gas 
  Joes $ Dent 150 Groceries basi 
  Kas Wild Night Out 25 
  Joans Gas Gas 25,1 
  Kas 60 Perjalanan ke Boston 
  Kas 34 Perjalanan ke Dayton 
  Joans Gas Gas 15,75 

PERINGATAN: MEMULAI DENGAN adalah fitur umum dari banyak implementasi dari SQL. Periksa pelaksanaan sebelum Anda tumbuh menyukainya.

Order dari Chaos: The ORDER BY Ayat

Dari waktu ke waktu Anda akan ingin menampilkan hasil query Anda dalam beberapa jenis urutan. Seperti yang Anda tahu, bagaimanapun, SELECT DARI memberi Anda daftar, dan kecuali Anda telah mendefinisikan kunci primer (lihat Hari ke-10, “Membuat Tampilan dan Indeks”), pertanyaan Anda keluar sesuai urutan baris yang dimasukkan. Pertimbangkan up cek meja ditingkatkan:

INPUT:
  SQL> SELECT * FROM Cek;
OUTPUT:
  JUMLAH PERIKSA Penerima Pembayaran # KOMENTAR 
  -------- -------------------- -------- -------------- ---- 
         1 Ma Bell 150 Apakah anak kali 
         2 Membaca RR 245,34 Kereta ke Chicago 
         3 Ma Bell 200,32 Telepon Seluler 
         4 Lokal Utilitas Gas 98 
         5 Joes $ Dent 150 Groceries basi 
        16 Kas 25 Wild Night Out 
        17 Joans Gas Gas 25,1 
         9 Abes Cleaners 24,35 X-Tra Pati        
        20 Abes Cleaners 10,5 Semua Kering Bersih 
         8 Kas 60 Perjalanan ke Boston 
        21 Kas 34 Trip to Dayton 
  11 baris yang dipilih. 
ANALISIS:

Kau harus percaya padaku untuk yang satu ini, tapi urutan output adalah urutan yang sama persis seperti urutan data yang dimasukkan. Setelah Anda membaca Hari 8, “Memanipulasi Data,” dan tahu cara menggunakan INSERT untuk membuat tabel, Anda dapat menguji bagaimana data disusun menurut standar Anda sendiri.

Klausa ORDER BY memberi Anda cara memesan hasil Anda. Misalnya, untuk memesan sebelumnya oleh pencatatan nomor cek, Anda akan menggunakan klausa ORDER BY berikut:

INPUT:
  SQL> SELECT * 
    2 dari pemeriksaan 
    3 ORDER BY PERIKSA #;
OUTPUT:
  JUMLAH PERIKSA Penerima Pembayaran # KOMENTAR 
  -------- -------------------- -------- -------------- ---- 
         1 Ma Bell 150 Apakah anak kali 
         2 Membaca RR 245,34 Kereta ke Chicago 
         3 Ma Bell 200,32 Telepon Seluler 
         4 Lokal Utilitas Gas 98 
         5 Joes $ Dent 150 Groceries basi 
         8 Kas 60 Perjalanan ke Boston 
         9 Abes Cleaners 24,35 X-Tra Pati 
        16 Kas 25 Wild Night Out 
        17 Joans Gas Gas 25,1 
        20 Abes Cleaners 10,5 Semua Kering Bersih 
        21 Kas 34 Trip to Dayton 
 
  11 baris yang dipilih. 

Sekarang data yang memerintahkan yang Anda inginkan, bukan cara yang dimasukkan;. Sebagai contoh berikut menunjukkan, ORDER membutuhkan OLEH OLEH tidak opsional.

INPUT / OUTPUT:
  SQL SELECT *> FROM Cek ORDER PERIKSA #; 

  SELECT * FROM # PERIKSA Cek ORDER 
                             * 
  ERROR pada baris 1: 
  ORA-00924: Kata kunci hilang BY 

Bagaimana jika Anda ingin daftar data dalam urutan terbalik, dengan jumlah tertinggi atau huruf pertama? Anda beruntung! Permintaan berikut menghasilkan daftar penerima pembayaran yang bintang s pada akhir abjad:

INPUT / OUTPUT:
  SQL> SELECT * 
  2 dari pemeriksaan 
  3 ORDER BY DESC penerima pembayaran; 

    JUMLAH PERIKSA Penerima Pembayaran # KOMENTAR 
  -------- -------------------- -------- -------------- ---- 
         2 Membaca RR 245,34 Kereta ke Chicago 
         1 Ma Bell 150 Apakah anak kali 
         200,32 3 Ma Bell Telepon Seluler 
         4 Lokal Utilitas Gas 98 
         5 Joes $ Dent 150 Groceries basi 
        17 Joans Gas Gas 25,1 
        16 Kas 25 Wild Night Out 
         8 Kas 60 Perjalanan ke Boston 
        21 Kas 34 Trip to Dayton 
         9 Abes Cleaners 24,35 X-Tra Pati 
        20 Abes Cleaners 10,5 Semua Kering Bersih 

  11 baris yang dipilih. 
ANALISIS:

The DESC pada akhir perintah ORDER BY klausa daftar dalam urutan bukan default (menaik) pesanan. Yang jarang digunakan, ASC kata kunci opsional muncul dalam pernyataan berikut:

INPUT:
  SQL> SELECT Penerima Pembayaran, JUMLAH 
    2 dari pemeriksaan 
   3 PERIKSA # ORDER BY ASC;
OUTPUT:
  JUMLAH Penerima Pembayaran 
  -------------------- --------- 
  Ma Bell 150 
  Membaca RR 245,34 
  200,32 Ma Bell 
  Utilitas Lokal 98 
  Joes basi $ Dent 150 
  60 Kas 
  Abes Cleaners 24,35 
  25 Kas 
  Joans Gas 25,1 
  Abes 10,5 Cleaners 
  34 Kas 

  11 baris yang dipilih. 
ANALISIS:

Urutan dalam daftar ini adalah identik dengan memesan dari daftar di awal bagian (tanpa asc) karena ASC adalah default. Query ini juga menunjukkan bahwa ekspresi yang digunakan setelah klausa ORDER BY tidak harus berada di pernyataan SELECT. Meskipun Anda hanya memilih penerima pembayaran dan JUMLAH, Anda masih dapat memesan daftar oleh PERIKSA #.

Anda juga dapat menggunakan ORDER BY pada lebih dari satu lapangan. Untuk memesan cek oleh penerima pembayaran dan KOMENTAR, Anda akan query sebagai berikut:

INPUT:
  SQL> SELECT * 
    2 dari pemeriksaan 
    3 ORDER BY penerima pembayaran, KOMENTAR;
OUTPUT:
  JUMLAH PERIKSA Penerima Pembayaran # KOMENTAR 
  -------- -------------------- -------- -------------- ---- 
        20 Abes Cleaners 10,5 Semua Kering Bersih 
         9 Abes Cleaners 24,35 X-Tra Pati 
         8 Kas 60 Perjalanan ke Boston 
        21 Kas 34 Trip to Dayton 
        16 Kas 25 Wild Night Out 
        17 Joans Gas Gas 25,1 
         5 Joes $ Dent 150 Groceries basi 
         98 4 Lokal Utilitas Gas 
         3 Ma Bell 200,32 Telepon Seluler 
         1 Ma Bell 150 Apakah anak kali 
         2 Membaca RR 245,34 Kereta ke Chicago 
ANALISIS:

Perhatikan entri untuk Kas di kolom penerima pembayaran. Dalam DENGAN ORDER sebelumnya, PERIKSA yang #berada di dalam, urutan 16 21 8. Menambahkan KOMENTAR lapangan ke klausaORDER BY meletakkan entri dalam urutan abjad menurut KOMENTAR. Apakah urutan beberapa kolom pada klausa ORDER BY membuat perbedaan? Coba permintaan yang sama lagi, tapi sebaliknyapenerima pembayaran dan KOMENTAR:

INPUT:
  SQL> SELECT * 
    2 dari pemeriksaan 
   3 ORDER BY KOMENTAR, penerima pembayaran;
OUTPUT:
  JUMLAH PERIKSA Penerima Pembayaran # KOMENTAR 
  -------- -------------------- -------- -------------- ------ 
        20 Abes Cleaners 10,5 Semua Kering Bersih 
         3 Ma Bell 200,32 Telepon Seluler 
        17 Joans Gas Gas 25,1 
         4 Lokal Utilitas Gas 98 
         5 Joes $ Dent 150 Groceries basi 
         1 Ma Bell 150 Apakah anak kali 
         2 Membaca RR 245,34 Kereta ke Chicago 
         8 Kas 60 Perjalanan ke Boston 
        21 Kas 34 Trip to Dayton 
        16 Kas 25 Wild Night Out 
         9 Abes Cleaners 24,35 X-Tra Pati 

  11 baris yang dipilih. 
ANALISIS:

Seperti yang mungkin Anda duga, hasilnya sama sekali berbeda. Berikut adalah cara daftar satu kolom dalam urutan abjad dan daftar kolom kedua dalam urutan abjad terbalik:

INPUT / OUTPUT:
 SQL SELECT *> 2 dari pemeriksaan 3 ORDER BY ASC penerima pembayaran, KOMENTAR DESC; PERIKSA # JUMLAH penerima pembayaran KOMENTAR -------- -------------------- - ------- ------------------ 9 Abes Cleaners 24,35 Pati X-Tra 20 Abes Cleaners 10,5 Semua Bersih Kering 16 Kas 25 Wild Night Out 21 Kas 34 Trip untuk Dayton 8 Kas 60 Perjalanan ke Boston 17 Joans Gas Gas 5 Joes 25,1 basi $ Dent 150 Groceries 4 Lokal Utilitas Gas 98 1 Ma Bell 150 Apakah anak waktu berikutnya 3 Ma Bell Telepon Seluler 200,32 2 Reading RR 245,34 Kereta ke Chicago 11 baris yang dipilih.
ANALISIS:

Dalam contoh ini adalah penerima pembayaran diurutkan menurut abjad, dan KOMENTAR muncul dalam urutan. Perhatikan bagaimana komentar dalam tiga cek dengan penerima pembayaran Kas diurut.


TIP: Jika Anda tahu bahwa kolom yang Anda ingin memesan hasil Anda dengan merupakan kolom pertama dalam tabel, kemudian Anda dapat mengetik ORDER BY 1 di tempat mengeja nama kolom. Lihat contoh berikut.

INPUT / OUTPUT:
  SQL> SELECT * 
   2 dari pemeriksaan 
    3 ORDER BY 1; 

    JUMLAH PERIKSA Penerima Pembayaran # KOMENTAR 
  -------- -------------------- -------- -------------- ---- 
         1 Ma Bell 150 Apakah anak kali 
         2 Membaca RR 245,34 Kereta ke Chicago 
         3 Ma Bell 200,32 Telepon Seluler 
         4 Lokal Utilitas Gas 98 
         5 Joes $ Dent 150 Groceries basi 
         8 Kas 60 Perjalanan ke Boston 
         9 Abes Cleaners 24,35 X-Tra Pati 
        16 Kas 25 Wild Night Out 
        17 Joans Gas Gas 25,1 
        20 Abes Cleaners 10,5 Semua Dry Clean 
        21 Kas 34 Trip to Dayton 

  11 baris yang dipilih. 
ANALISIS:

Hasil ini identik dengan hasil yang dihasilkan oleh pernyataan SELECT yang Anda gunakan sebelumnya hari ini:

  SELECT * FROM ORDER cek melalui PERIKSA #; 

The GROUP BY Klausa

Pada Hari 3 Anda belajar bagaimana menggunakan fungsi agregat (COUNT, SUM, AVG, MIN, dan MAX). Jika Anda ingin menemukan jumlah total uang yang dikeluarkan dari cek meja berubah sedikit, Anda akan ketik:

INPUT:
  SELECT * 
  Dari pemeriksaan; 

Berikut ini tabel diubah:

OUTPUT:
  JUMLAH KOMENTAR CHECKNUM Penerima Pembayaran 
  ======== =========== =============== ================ ====== 

         1 Ma Bell 150 Apakah anak kali 
         2 Membaca RR 245,34 Kereta ke Chicago 
         3 Ma Bell 200,33 Telepon Seluler 
         4 Lokal Utilitas Gas 98 
         5 Joes $ Dent 150 Groceries basi 
        16 Kas 25 Wild Night Out 
        17 Joans Gas Gas 25,1 
         9 Abes Cleaners 24,35 X-Tra Pati 
        20 Abes Cleaners 10,5 Semua Kering Bersih 
         8 Kas 60 Perjalanan ke Boston 
        21 Kas 34 Trip to Dayton 
        30 Lokal Utilitas 87,5 Air 
        31 Lokal Utilitas Sewer 34 
        25 Joans Gas Gas 15,75 

Kemudian Anda akan ketik:

INPUT / OUTPUT:
  SELECT SUM (JUMLAH) 
  Dari pemeriksaan; 

              SUM 
  =============== 

          1.159,87 
ANALISIS:

pernyataan ini mengembalikan jumlah kolom JUMLAH. Bagaimana jika Anda ingin mengetahui berapa banyak Anda telah menghabiskan waktu pada masing-masing penerima pembayaran? SQL membantu Anda dengan klausa GROUP BY. Untuk mengetahui siapa Anda telah membayar dan berapa banyak, permintaan Anda akan seperti ini:

INPUT / OUTPUT:
  SELECT penerima pembayaran, SUM (JUMLAH) 
  Dari pemeriksaan 
  GROUP BY Penerima Pembayaran; 

  Penerima Pembayaran SUM 
  ==================== =============== 

  Abes Cleaners 34.849998 
  Kas 119 
  Gas Joans 40.849998 
  Joes basi $ Dent 150 
  Lokal Utilitas 219,5 
  Ma Bell 350,33002 
  Membaca RR 245,34 
ANALISIS:

Klausa SELECT memiliki pilihan kolom normal, penerima, diikuti dengan agregat fungsi SUM (JUMLAH). Jika Anda telah mencoba query ini dengan hanya cek dari yang berikut, inilah yang akan Anda lihat:

INPUT / OUTPUT:
  SELECT penerima pembayaran, SUM (JUMLAH) 
  Dari pemeriksaan; 

  Dynamic SQL Error 
  -SQL error code = -104 
  -Kolom referensi tidak valid 
ANALISIS:

SQL mengeluh tentang kombinasi kolom normal dan fungsi agregat. Kondisi ini mengharuskan BY klausa GROUP BY. GROUP menjalankan fungsi agregat yang dijelaskan dalam laporan SELECTuntuk setiap pengelompokan kolom yang mengikuti klausa GROUP BY. Memeriksa kembali 14 baris tabel ketika query dengan SELECT DARI * cek. Permintaan di meja yang sama, SELECT penerima pembayaran, SUM (JUMLAH) FROM GROUP BY penerima pembayaran cek, mengambil 14 baris dalam tabel dan membuat tujuh kelompok, mengembalikan SUM pengelompokan masing-masing.

Misalnya, Anda ingin tahu berapa banyak yang Anda berikan kepada siapa dengan cek banyak caranya. Dapatkah Anda menggunakan lebih dari satu fungsi agregat?

INPUT / OUTPUT:
 SELECT penerima pembayaran, SUM (AMOUNT), COUNT (penerima pembayaran) dari pemeriksaan GROUP BY penerima pembayaran; COUNT SUM ==================== ========= Penerima Pembayaran ====== =========== Abes Cleaners 34.849998 2 Kas 119 3 Joans Gas 40,849998 2 Joes $ basi Dent 150 1 Utilitas Lokal 219,5 3 Ma Bell 350,33002 2 Reading RR 1 245,34
ANALISIS:

SQL ini semakin berguna! Dalam contoh sebelumnya, anda mampu melakukan fungsi kelompok pada kelompok-kelompok yang unik dengan menggunakan klausa GROUP BY. Juga perhatikan bahwa hasil diperintahkan oleh penerima pembayaran OLEH. KELOMPOK juga bertindak seperti klausa ORDER BY. Apa yang akan terjadi jika Anda mencoba ke grup oleh lebih dari satu kolom?Coba ini:

INPUT / OUTPUT:
  SELECT penerima pembayaran, SUM (JUMLAH), COUNT (Penerima Pembayaran) 
  Dari pemeriksaan 
  GROUP BY penerima pembayaran, KOMENTAR; 

  Penerima Pembayaran COUNT SUM 
  ==================== =============== =========== 

  Abes Cleaners 10,5 1 
  Abes Cleaners 24,35 1 
  Kas 60 1 
  Kas 34 1 
  Kas 25 1 
  Gas Joans 40.849998 2 
  Joes basi $ Dent 150 1 
  Utilitas Lokal 98 1 
  Utilitas Lokal 34 1 
  Utilitas Lokal 87,5 1 
  200,33 1 Ma Bell 
  Ma Bell 150 1 
  Membaca RR 1 245,34 
ANALISIS:

Outputnya sudah dari 7 kelompok dari 14 baris menjadi 13 kelompok. Apa yang berbeda tentang pengelompokan satu dengan lebih dari satu cek terkait dengannya? Lihat entri untuk Joans Gas:

INPUT / OUTPUT:
  SELECT Penerima Pembayaran, KOMENTAR 
  DARI Cek 
  MANA Penerima Pembayaran Joans Gas '='; 

  Penerima Pembayaran KOMENTAR 
  ==================== ==================== 

  Joans Gas 
  Joans Gas 
ANALISIS:

Anda lihat bahwa kombinasi penerima dan menciptakan entitas KOMENTAR identik, yang SQL kelompok bersama menjadi satu baris dengan klausa GROUP BY. Deretan lain menghasilkan kombinasi unik dari penerima dan KOMENTAR dan ditugaskan unik kelompok mereka sendiri.

Contoh berikut ini menemukan jumlah terbesar dan terkecil, dikelompokkan berdasarkan KOMENTAR:

INPUT / OUTPUT:
  SELECT MIN (JUMLAH), MAX (JUMLAH) 
  Dari pemeriksaan 
  KOMENTAR GROUP BY; 

              MIN MAX 
  =============== =============== 

           245,34 245,34 
             10,5 10,5 
           200,33 200,33 
            15,75 98 
              150 150 
              150 150 
               34 34 
               60 60 
               34 34 
             87,5 87,5 
               25 25 
            24,35 24,35 

Berikut ini apa yang akan terjadi jika Anda mencoba untuk memasukkan dalam laporan pilih kolom yang memiliki beberapa nilai yang berbeda dalam kelompok yang dibentuk oleh GROUP BY:

INPUT / OUTPUT:
  SELECT penerima pembayaran, MAX (JUMLAH), MIN (JUMLAH) 
  Dari pemeriksaan 
  KOMENTAR GROUP BY; 

  Dynamic SQL Error 
  -SQL error code = -104 
  -Kolom referensi tidak valid 
ANALISIS:

Query ini mencoba untuk cek kelompok oleh KETERANGAN. Ketika pertanyaan menemukan dua catatan dengan KETERANGAN yang sama tetapi s penerima pembayaran yang berbeda, seperti baris yang telah GAS sebagai KETERANGAN tetapi memiliki s penerima pembayaran dari LOKAL Utilitas dan JOANS GAS, itu melempar kesalahan.

Peraturannya adalah, Jangan gunakan SELECT pada kolom yang memiliki beberapa nilai untuk kolom klausa GROUP BY. sebaliknya tidak benar. Anda dapat menggunakan GROUP BY pada kolom tidak disebutkan dalam pernyataan SELECT. Sebagai contoh:

INPUT / OUTPUT:
  SELECT penerima pembayaran, COUNT (JUMLAH) 
  Dari pemeriksaan 
  GROUP BY penerima pembayaran, AMOUNT; 

  COUNT Penerima Pembayaran 
  ==================== =========== 

  Abes Cleaners 1 
  Abes Cleaners 1 
  Kas 1 
  Kas 1 
  Kas 1 
  Joans Gas 1 
  Joans Gas 1 
  Joes basi $ Dent 1 
  Lokal Utilitas 1 
  Lokal Utilitas 1 
  Lokal Utilitas 1 
  Ma Bell 1 
  Ma Bell 1 
  Membaca RR 1 
ANALISIS:

Permintaan konyol ini menunjukkan berapa banyak yang telah anda tulis cek untuk jumlah yang sama dengan penerima yang sama. tujuan sesungguhnya adalah untuk menunjukkan bahwa Anda dapat menggunakan AMOUNT pada klausa GROUP BY, meskipun tidak disebutkan di klausa SELECT. JUMLAH Cobalah keluar dari klausa GROUP BY dan masuk ke klausa SELECT, seperti ini:

INPUT / OUTPUT:
  SELECT penerima pembayaran, AMOUNT, COUNT (JUMLAH) 
  Dari pemeriksaan 
  GROUP BY Penerima Pembayaran; 

  Dynamic SQL Error 
  -SQL error code = -104 
  -Kolom referensi tidak valid 
ANALISIS:

SQL tidak dapat menjalankan query, yang masuk akal jika anda memainkan bagian dari SQL sejenak. Katakanlah Anda harus kelompok baris berikut:

INPUT / OUTPUT:
  SELECT penerima pembayaran, AMOUNT, KOMENTAR 
  Dari pemeriksaan 
  MANA Penerima Pembayaran 'Kas ='; 

  Penerima Pembayaran JUMLAH KOMENTAR 
  ==================== =============== =============== 

  Kas Wild Night Out 25 
  Kas 60 Perjalanan ke Boston 
  Kas 34 Perjalanan ke Dayton 

Jika pengguna meminta Anda untuk output semua tiga kolom dan kelompok oleh penerima pembayaran saja, di mana akan Anda letakkan komentar unik? Ingat Anda hanya memiliki satu baris per kelompok bila Anda menggunakan GROUP BY. SQL tidak dapat melakukan dua hal sekaligus, sehingga mengeluh: Kesalahan # 31: Tidak dapat melakukan dua hal sekaligus.

Klausul HAVING

Bagaimana Anda memenuhi syarat data yang digunakan dalam Anda klausa GROUP BY? Gunakan meja ORGCHART dan coba ini:

INPUT:
  ORGCHART SELECT * FROM;
OUTPUT:
  NAMA GAJI TIM SICKLEAVE ANNUALLEAVE 
  =============== ======== =========== =========== ===== ====== 

  34.000,00 PENELITIAN Adams 34 12 
  Wilkes PEMASARAN 31.000,00 40 9 
  36.000,00 PEMASARAN Stokes 20 19 
  Meza 40.000,00 KOLEKSI 30 27 
  45.000,00 PENELITIAN Merrick 20 17 
  42.000,00 PEMASARAN Richardson 25 18 
  Fury 35.000,00 KOLEKSI 22 14 
  37.500,00 PR PRECOURT 24 24 

Jika Anda ingin kelompok output ke divisi dan menunjukkan gaji rata-rata di setiap divisi, Anda akan ketik:

INPUT / OUTPUT:
 TIM SELECT, AVG (GAJI) DARI GROUP BY ORGCHART TIM; AVG =============== =========== KOLEKSI TIM PEMASARAN 37.500,00 36.333,33 37.500,00 PR PENELITIAN 39.500,00

Pernyataan berikut query ini memenuhi syarat untuk kembali hanya departemen dengan gaji rata-rata di bawah 38.000:

INPUT / OUTPUT:
  PILIH TIM, AVG (GAJI) 
  FROM ORGCHART 
  MANA AVG (GAJI) <38.000 
  GROUP BY TIM; 

  Dynamic SQL Error 
  -SQL error code = -104 

  -Agregat referensi tidak valid 
ANALISIS:

Error ini terjadi karena WHERE tidak bekerja dengan fungsi agregat. Untuk membuat ini bekerja query, Anda perlu sesuatu yang baru: klausa HAVING. Jika Anda mengetik permintaan berikut, Anda mendapatkan apa yang Anda minta:

INPUT / OUTPUT:
  PILIH TIM, AVG (GAJI) 
  DARI ORGCHART 
  GROUP BY TIM 
  HAVING AVG (GAJI) <38000; 
 
  TIM AVG 
  =============== =========== 

  KOLEKSI 37.500,00 
  PEMASARAN 36.333,33 
  PR 37.500,00 
ANALISIS:

MEMILIKI memungkinkan Anda untuk menggunakan fungsi agregat dalam sebuah pernyataan perbandingan, menyediakan untuk fungsi-fungsi agregat apa MANA menyediakan untuk baris individu. Apakah HAVING bekerja dengan ekspresi nonaggregate? Coba ini:

INPUT / OUTPUT:
 PILIH TIM, AVG (GAJI) DARI TIM GROUP BY HAVING ORGCHART GAJI <38000; TIM AVG =============== =========== PR 37.500,00
ANALISIS:

Mengapa hal ini hasil yang berbeda dari permintaan terakhir? HAVING AVG (GAJI) <38000 klausa dievaluasi setiap pengelompokan dan kembali hanya dengan gaji rata-rata di bawah 38.000,apa yang Anda harapkan,. MEMILIKI GAJI <38000, di sisi lain memiliki hasil yang berbeda. Mengambil peran mesin SQL lagi. Jika pengguna meminta Anda untuk mengevaluasi dan kembali kelompok divisi mana GAJI <38.000, Anda akan memeriksa tiap kelompok dan menolak orang-orang di mana GAJI individu lebih besar dari 38.000. Pada setiap divisi kecuali PR, Anda akan menemukan setidaknya satu gaji lebih besar dari 38.000 di:

INPUT / OUTPUT:
  SELECT NAMA, TIM, GAJI 
  DARI ORGCHART 
  ORDER BY TIM; 

  NAMA TIM GAJI 
  =============== =============== =========== 

  KOLEKSI Fury 35.000,00 
  Meza KOLEKSI 40.000,00 
  Wilkes PEMASARAN 31.000,00 
  Stokes PEMASARAN 36.000,00 
  Richardson PEMASARAN 42.000,00 
  PR PRECOURT 37.500,00 
  Adams PENELITIAN 34.000,00 
  Merrick PENELITIAN 45.000,00 
ANALISIS:

Oleh karena itu, Anda akan menolak semua kelompok lain kecuali PR. Apa Anda benar-benar bertanya itu Pilih semua kelompok di mana individu tidak membuat lebih dari 38.000.Jangan kau benci kalau komputer tidak persis apa yang Anda kirim ke?


PERINGATAN: Beberapa implementasi dari SQL kembali kesalahan jika Anda menggunakan apapun selain fungsi agregat di dalam klausa HAVING. Jangan bertaruh peternakan menggunakan contoh sebelumnya sampai Anda mengecek pelaksanaan SQL tertentu yang Anda gunakan.

Dapatkah Anda menggunakan lebih dari satu kondisi di klausa HAVING Anda? Coba ini:

INPUT:
  PILIH TIM, AVG (SICKLEAVE), AVG (ANNUALLEAVE) 
  DARI ORGCHART 
  GROUP BY TIM 
  HAVING AVG (SICKLEAVE)> 25 DAN 
  AVG (ANNUALLEAVE) <20; 
ANALISIS:

Tabel berikut ini dikelompokkan oleh TIM. Ini menunjukkan semua tim dengan rata-rata SICKLEAVE di atas 25 hari dan rata-rata di bawah 20 hari ANNUALLEAVE.

OUTPUT:
  TIM AVG AVG 
  =============== =========== =========== 

  PEMASARAN 28 15 
  PENELITIAN 27 15 

Anda juga dapat menggunakan fungsi agregat pada klausa HAVING yang tidak dalam pernyataan SELECT. Sebagai contoh:

INPUT / OUTPUT:
  PILIH TIM, AVG (SICKLEAVE), AVG (ANNUALLEAVE) 
  DARI ORGCHART 
  GROUP BY TIM 
  HAVING COUNT (TIM)> 1; 

  TIM AVG AVG 
  =============== =========== =========== 

  KOLEKSI 26 21 
  PEMASARAN 28 15 
  PENELITIAN 27 15 
ANALISIS:

query ini mengembalikan jumlah TIM s dengan anggota lebih dari satu klausa. COUNT (TIM) tidak digunakan dalam SELECT laporan tapi masih berfungsi seperti yang diharapkan dalam HAVINGtersebut.

Operator lain logis semua pekerjaan baik di dalam klausa HAVING. Pertimbangkan ini:

INPUT / OUTPUT:
  PILIH TIM, MIN (GAJI), MAX (GAJI) 
  DARI ORGCHART 
  GROUP BY TIM 
  HAVING AVG (GAJI)> 37000 
  ATAU 
  MIN (GAJI)> 32000; 

  TIM MIN MAX 
  =============== =========== =========== 

  KOLEKSI 35.000,00 40.000,00 
  PR 37.500,00 37.500,00 
  PENELITIAN 34.000,00 45.000,00 

Operator DI juga bekerja di sebuah klausa HAVING, seperti yang ditunjukkan di sini:

INPUT / OUTPUT:
  PILIH TIM, AVG (GAJI) 
  DARI ORGCHART 
  GROUP BY TIM 
  MEMILIKI TIM DALAM ('PR', 'Hasil Riset'); 

  TIM AVG 
  =============== =========== 

  PR 37.500,00 
  PENELITIAN 39.500,00 

Menggabungkan Klausul

Tidak ada dalam ruang hampa, jadi bagian ini membawa Anda komposit melalui beberapa contoh yang menunjukkan cara kombinasi klausa tampil bersama.

Contoh 5.1

Cari semua cek yang ditulis untuk Kas dan Gas di meja pemeriksaan dan menyuruh mereka oleh KOMENTAR.

INPUT:
  SELECT Penerima Pembayaran, KOMENTAR 
  Dari pemeriksaan 
  MANA Penerima Pembayaran 'Kas =' 
  ATAU KOMENTAR LIKE'Ga% ' 
  ORDER BY KOMENTAR;
OUTPUT:
  Penerima Pembayaran KOMENTAR 
  ==================== ==================== 

  Joans Gas 
  Joans Gas 
  Lokal Utilitas Gas 
  Kas Perjalanan ke Boston 
  Kas Perjalanan ke Dayton 
  Kas Wild Night Out 
ANALISIS:

Perhatikan penggunaan SEPERTI untuk menemukan KOMENTAR yang dimulai dengan Ga. Dengan menggunakan OR, data dikembalikan jika klausa WHERE bertemu salah satu dari dua kondisi.

Bagaimana jika Anda meminta informasi yang sama dan kelompok dengan penerima pembayaran? Permintaan akan terlihat seperti ini:

INPUT:
  SELECT Penerima Pembayaran, KOMENTAR 
  Dari pemeriksaan 
  MANA Penerima Pembayaran 'Kas =' 
  ATAU KOMENTAR LIKE'Ga% ' 
  GROUP BY Penerima Pembayaran 
  ORDER BY KOMENTAR; 
ANALISIS:

Query ini tidak akan bekerja karena mesin SQL tidak akan tahu apa yang harus dilakukan dengan ucapan. Ingatlah bahwa kolom apa pun yang Anda masukkan ke dalam klausa SELECT juga harus di klausa GROUP BY – kecuali jika Anda tidak menentukan setiap kolom dalam klausa SELECT.

Contoh 5.2

Menggunakan tabel ORGCHART, menemukan gaji setiap orang dengan kurang dari 25 hari cuti sakit. Orde hasil oleh NAMA.

INPUT:
  SELECT NAMA, GAJI 
  DARI ORGCHART 
  WHERE <SICKLEAVE 25 
  ORDER BY NAMA;
OUTPUT:
  NAMA GAJI 
  =============== =========== 
  Fury 35.000,00 
  Merrick 45.000,00 
  PRECOURT 37.500,00 
  Stokes 36.000,00 
ANALISIS:

Query ini sangat mudah dan memungkinkan Anda untuk menggunakan baru-menemukan kemampuan Anda dengan WHERE dan ORDER BY.

Contoh 5.3

Sekali lagi, menggunakan ORGCHART, layar TIM, AVG (GAJI), AVG (SICKLEAVE), dan AVG (ANNUALLEAVE) pada masing-masing tim:

INPUT:
  PILIH TIM, 
  AVG (GAJI), 
  AVG (SICKLEAVE), 
  AVG (ANNUALLEAVE) 
  DARI ORGCHART 
  GROUP BY TIM;
OUTPUT:
  TIM AVG AVG AVG 
  =============== =========== =========== =========== 
  37.500,00 KOLEKSI 26 21 
  36.333,33 PEMASARAN 28 15 
  PR 37.500,00 24 24 
  PENELITIAN 39.500,00 26 15 

Sebuah variasi yang menarik pada query berikut ini. Lihat jika Anda dapat mengetahui apa yang terjadi:

INPUT / OUTPUT:
  PILIH TIM, 
  AVG (GAJI), 
  AVG (SICKLEAVE), 
  AVG (ANNUALLEAVE) 
  DARI ORGCHART 
  GROUP BY TIM 
  ORDER BY NAMA; 

  TIM AVG AVG AVG 
  =============== =========== =========== =========== 
  PENELITIAN 39.500,00 27 15 
  37.500,00 KOLEKSI 26 21 
  PR 37.500,00 24 24 
 
 
  36.333,33 PEMASARAN 28 15 

Sebuah permintaan sederhana menggunakan ORDER BY mungkin menawarkan petunjuk:

INPUT / OUTPUT:
  SELECT NAMA, TIM 
  DARI ORGCHART 
  ORDER BY NAMA, TIM; 

  NAMA TIM 
  =============== =========== 
  Adams PENELITIAN 
  Fury KOLEKSI 
  Merrick PENELITIAN 
  Meza KOLEKSI 
  PRECOURT PR 
  Richardson PEMASARAN 
  Stokes PEMASARAN 
  Wilkes PEMASARAN 
ANALISIS:

Ketika mesin SQL sempat untuk memesan hasil query, itu digunakan kolom NAMA (ingat, itu adalah yang sah untuk menggunakan kolom tidak ditentukan dalam pernyataan SELECT), diabaikanTIM entri ganda, dan muncul dengan urutan PENELITIANKOLEKSI, PR, dan TIM PEMASARAN. Termasuk dalam klausa ORDER BY tidak diperlukan, karena Anda memiliki nilai unik di kolom NAMA.Anda bisa mendapatkan hasil yang sama dengan mengetikkan pernyataan ini:

INPUT / OUTPUT:
  SELECT NAMA, TIM 
  DARI ORGCHART 
  ORDER BY NAMA; 

  NAMA TIM 
  ============ =============== 
  Adams PENELITIAN 
  Fury KOLEKSI 
  Merrick PENELITIAN 
  Meza KOLEKSI 
  PRECOURT PR 
  Richardson PEMASARAN 
  Stokes PEMASARAN 
  Wilkes PEMASARAN 

Ketika Anda melihat variasi, jangan lupa Anda juga dapat membalik urutan:

INPUT / OUTPUT:
  SELECT NAMA, TIM 
  DARI ORGCHART 
  ORDER BY NAMA DESC; 

  NAMA TIM 
  ============ =============== 
  Wilkes PEMASARAN 
  Stokes PEMASARAN 
RICHARDSON      MARKETING
PRECOURT        PR
MEZA            COLLECTIONS
MERRICK         RESEARCH
FURY            COLLECTIONS
ADAMS           RESEARCH

Contoh 5.4: The Big Finale

Apakah mungkin untuk menggunakan semua yang harus Anda pelajari dalam satu query?Memang, tetapi hasilnya akan berbelit-belit karena dalam banyak cara Anda bekerja dengan apel dan jeruk – atau agregat dan nonaggregates. Misalnya, WHERE dan ORDER BY biasanya ditemukan dalam permintaan yang bertindak atas baris tunggal, seperti ini:

INPUT / OUTPUT:
  SELECT * 
FROM ORGCHART
ORDER BY NAME DESC;
 
 NAME            TEAM          SALARY   SICKLEAVE ANNUALLEAVE
=============== ======== =========== =========== ===========
WILKES          MARKETING   31000.00          40           9
STOKES          MARKETING   36000.00          20          19
RICHARDSON      MARKETING   42000.00          25          18
PRECOURT        PR          37500.00          24          24
MEZA            COLLECTIONS 40000.00          30          27
MERRICK         RESEARCH    45000.00          20          17
FURY            COLLECTIONS 35000.00          22          14
ADAMS           RESEARCH    34000.00          34          12

GROUP BY and HAVING are normally seen in the company of aggregates:

INPUT / OUTPUT:
 SELECT PAYEE,
SUM(AMOUNT) TOTAL,
COUNT(PAYEE) NUMBER_WRITTEN
FROM CHECKS
GROUP BY PAYEE
HAVING SUM(AMOUNT) > 50;

PAYEE                          TOTAL NUMBER_WRITTEN
==================== =============== ==============
Cash                             119              3
Joes Stale $ Dent                150              1
Local Utilities                219.5              3
Ma Bell                    350.33002              2
Reading RR                  245.34              1

Anda telah melihat bahwa menggabungkan kedua kelompok klausa dapat memberikan hasil yang tak terduga, termasuk yang berikut:

INPUT:
 SELECT PAYEE,
SUM(AMOUNT) TOTAL,
COUNT(PAYEE) NUMBER_WRITTEN
FROM CHECKS
WHERE AMOUNT >= 100
GROUP BY PAYEE
HAVING SUM(AMOUNT) > 50;
OUTPUT:
 PAYEE                          TOTAL NUMBER_WRITTEN
==================== =============== ==============
Joes Stale $ Dent                150              1
Ma Bell                    350.33002              2
Reading RR                  245.34              1

Compare these two result sets and examine the raw data:

INPUT / OUTPUT:
 SELECT PAYEE, AMOUNT
FROM CHECKS
ORDER BY PAYEE;

PAYEE                         AMOUNT
==================== ===============
Abes Cleaners                   10.5
Abes Cleaners                  24.35
Cash                              25
Cash                              34
Cash                              60
Joans Gas                      15.75
Joans Gas                       25.1
Joes Stale $ Dent                150
Local Utilities                   34
Local Utilities                 87.5
Local Utilities                   98
Ma Bell                          150
Ma Bell                       200.33
Reading RR                  245.34
ANALISIS:

Anda lihat bagaimana klausa WHERE disaring keluar semua cek kurang dari 100 dolar sebelum DENGAN GROUP dilakukan pada query. Kami tidak mencoba untuk memberitahu Anda tidak campuran kelompok-kelompok ini – Anda mungkin memiliki persyaratan bahwa konstruksi semacam ini akan bertemu. Namun, Anda tidak harus santai campuran fungsi agregat dan nonaggregate. Contoh sebelumnya telah tabel dengan hanya beberapa baris. (Jika tidak, Anda akan membutuhkan gerobak untuk membawa buku ini) Dalam dunia nyata Anda akan bekerja dengan beribu-ribu (atau miliaran dan miliaran) baris, dan perubahan halus yang disebabkan oleh pencampuran klausa ini mungkin tidak begitu jelas..

Ringkasan

Hari ini Anda pelajari semua klausa yang Anda butuhkan untuk memanfaatkan kekuatan perintah SELECT. Ingat untuk berhati-hati apa yang Anda minta karena Anda mungkin akan mendapatkannya. pendidikan dasar SQL Anda selesai. Anda sudah tahu cukup untuk bekerja secara efektif dengan tabel tunggal. Besok (Hari ke-6, “Bergabung Tabel”), Anda akan memiliki kesempatan untuk bekerja dengan tabel ganda.

Sumber ; http://www.webbasedprogramming.com