SQL: Queries

20
SQL: Queries Chapter 5

description

SQL: Queries. Chapter 5. Contoh. Sebelum menunjukkan contoh query dengan difinisi tabel sebagai berikut : sailor1( sid integer,sname text,rating integer,age double) boat(bid integer,bname text,color text) reserve ( sid integer,bid integer,hari date). Dasar dari SQL Query. - PowerPoint PPT Presentation

Transcript of SQL: Queries

Page 1: SQL:   Queries

SQL: Queries

Chapter 5

Page 2: SQL:   Queries

Contoh• Sebelum menunjukkan contoh query dengan difinisi

tabel sebagai berikut :– sailor1(sid integer,sname text,rating integer,age double)– boat(bid integer,bname text,color text)– reserve (sid integer,bid integer,hari date)

sailor1sid snama rating umur

22 dustin 7 45

29 brutus 1 33

31 lubber 8 55.5

32 andy 8 25.5

58 rusty 10 35

64 horatio 7 35

71 zorba 10 16

74 horatio 9 35

85 art 3 25.5

95 bob 3 63.5

reservesid bid hari

22 101 10/10/1998

58 103 9/8/1998

boatbid bname color

101 interlake blue

102 interlake yellow

103 clipper green

104 marine red

RESERVEsid bid hari

22 101 10/10/1998

64 101 9/5/1998

22 102 10/10/1998

31 102 11/10/1998

64 102 9/8/1998

22 103 10/8/1998

31 103 11/6/1998

58 103 11/12/1993

74 103 9/8/1998

22 104 10/7/1998

Page 3: SQL:   Queries

Dasar dari SQL Query

• Relation-list yaitu daftar nama dari tabel relasi.• Target-list yaitu daftar dari atribut dari tabel relasi• Qualification yaitu digunakan untuk mendaftarkan

kriteria-kriteria pencarian yang dikombinasikan dengan AND, OR dan NOT.

• Distinct yaitu perintah optional mengindikasikan bahwa data tidak diperbolehkan sama.

SELECT [DISTINCT] target-listFROM relation-listWHERE qualification

Page 4: SQL:   Queries

Strategi Evaluasi Konseptual

• Semantik dari sebuah query SQL didefinisikan dalam hal berikut strategi evaluasi konseptual:– Hitunglah produk-silang hubungan relasi tabel.– Buang tupel (record) yang dihasilkan jika mereka gagal

kualifikasi.– Hapus atribut yang tidak dalam daftar target. – Jika DISTINCT dispesifikasikan, menghilangkan duplikasi baris.

• Strategi ini mungkin adalah cara paling efisien untuk menghitung query! Sebuah optimizer akan menemukan lebih banyak strategi yang efisien untuk menghitung jawaban yang sama.

Page 5: SQL:   Queries

Contoh dari Evaluasi konsep

• SELECT S.sname FROM Sailors S, Reserves R WHERE S.sid=R.sid AND R.bid=103

s.sid snama rating umur r.sid bid hari

22 dustin 7 45 22 101 10/10/1998

22 dustin 7 45 58 103 11/12/1993

29 brutus 1 33 22 101 10/10/1998

29 brutus 1 33 58 103 11/12/1993

31 lubber 8 55.5 22 101 10/10/1998

31 lubber 8 55.5 58 103 11/12/1993

32 andy 8 25.5 22 101 10/10/1998

32 andy 8 25.5 58 103 11/12/1993

58 rusty 10 35 22 101 10/10/1998

58 rusty 10 35 58 103 11/12/1993

64 horatio 7 35 22 101 10/10/1998

64 horatio 7 35 58 103 11/12/1993

71 zorba 10 16 22 101 10/10/1998

71 zorba 10 16 58 103 11/12/1993

74 horatio 9 35 22 101 10/10/1998

74 horatio 9 35 58 103 11/12/1993

85 art 3 25.5 22 101 10/10/1998

85 art 3 25.5 58 103 11/12/1993

95 bob 3 63.5 22 101 10/10/1998

95 bob 3 63.5 58 103 11/12/1993

Page 6: SQL:   Queries

Contoh Query SQL DasarSebuah catatan tentang Variabel Range

• Benar-benar dibutuhkan hanya jika hubungan yang sama muncul dua kali dalam klausa FROM. Permintaan sebelumnya juga dapat ditulis sebagai :– SELECT sname FROM Sailors S, Reserves R WHERE

S.sid=R.sid AND R.bid=103;atau

– SELECT sname FROM Sailors, Reserves WHERE Sailors.sid=Reserves.sid AND R.bid=103;

Page 7: SQL:   Queries

Cari Pelaut yang memesan minimal 1 kapal

SELECT S.sid FROM Sailors S, Reserves R WHERE S.sid=R.sid

• Apakah menambahkan DISTINCT untuk query ini membuat perbedaan?

• Apa pengaruh penggantian S.sid oleh S.sname diklausa SELECT? Apakah menambahkan DISTINCTini varian dari query yang membuat perbedaan?

Page 8: SQL:   Queries

Ekspresi dan Strings

• Menggambarkan penggunaan ekspresi aritmatika dan string pencocokan pola: – Temukan tiga (dari usia pelaut dan dua field ditentukan oleh

ekspresi aritmatika) bagi para pelaut yang namanya dimulai dan diakhiri dengan B dan mengandung setidaknya tiga karakter.

• ‘AS’ dan ‘=‘ adalah dua cara untuk nama field pada hasil.• SEPERTI digunakan untuk pencocokan string. `_ 'Adalah

singkatan untuk satu karakter dan `% 'singkatan sewenang-wenang 0 atau lebih karakter.

SELECT S.age, age1=S.age-5, 2*S.age AS age2FROM Sailors SWHERE S.sname LIKE ‘B_%B’

Page 9: SQL:   Queries

UNION, INTERSECT dan EXCEPTCari sid's pelaut yang telah memesan perahu merah atau hijau

• UNION: Dapat digunakan untuk menghitung gabungan dari dua serikat-set tuple (yang sendiri hasil SQL query).

• Jika kita mengganti OR menjadi AND di versi pertama, apa yang kita dapatkan?

• Juga tersedia: KECUALI(Apa yang kita dapatkan jika kita mengganti UNION oleh EXCEPT?)

SELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bidAND (B.color=‘red’ OR B.color=‘green’)

SELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bidAND B.color=‘red’UNIONSELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bidAND B.color=‘green’

Page 10: SQL:   Queries

Cari sid's pelaut yang telah memesan perahu merah dan hijau

• INTERSECT: Dapat digunakan untukmenghitung persimpangandari dua unioncompatibleset tuple.

• Termasuk dalam SQL/92standar, tetapi beberapasistem tidak mendukung itu.

• Kontras simetri dari UNION dan INTERSECTquery dengan banyak caraversi lain berbeda.

SELECT S.sidFROM Sailors S, Boats B1, Reserves R1,Boats B2, Reserves R2WHERE S.sid=R1.sid AND R1.bid=B1.bidAND S.sid=R2.sid AND R2.bid=B2.bidAND (B1.color=‘red’ AND B2.color=‘green’)

SELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bidAND B.color=‘red’INTERSECTSELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bidAND B.color=‘green’

Page 11: SQL:   Queries

Nested Queries

• Cari nama pelaut yang telah memesan perahu # 103:SELECT S.sname FROM Sailors S WHERE S.sid IN (SELECT R.sid FROM Reserves R WHERE R.bid=103)

• Sebuah fitur yang sangat kuat SQL: klausa WHERE sendiri bisa mengandung query SQL! (Sebenarnya, subquery bisa muncul di klausa FROM dan klausa HAVING)

• Untuk mencari pelaut yang sudah tidak memesan perahu # 103, gunakan NOT IN.

Page 12: SQL:   Queries

Nested Queries Dengan Korelasi• Cari nama pelaut yang telah memesan perahu # 103:

SELECT S.snameFROM Sailors SWHERE EXISTS (SELECT * FROM Reserves R WHERE R.bid=103 AND S.sid=R.sid)

• EXISTS adalah operator perbandingan set lain, seperti halnya IN.• Jika UNIQUE digunakan, dan * digantikan oleh R.bid, menemukan pelaut

dengan paling banyak satu reservasi untuk perahu # 103.(UNIQUE memeriksa duplikasi tuple; * menandakan semua atribut. Mengapa kita harus mengganti * oleh R.bid?)

• Mengapa mengilustrasikan secara umum, subquery harus menghitung ulang untuk setiap tuple Pelaut.

Page 13: SQL:   Queries

More on Set-Comparison Operators

• kita telah melihat IN, EXISTS dan UNIQUE. Bisa juga gunakan NOT IN, NOT EXISTS dan NOT UNIQUE.

• Juga tersedia: op ANY, op ALL, op IN, >,<,=,≤,≥,≠ • Cari pelaut yang rating lebih besar dari beberapa

pelaut disebut Horatio:

SELECT *FROM Sailors S WHERE S.rating > ANY (SELECT S2.ratingFROM Sailors S2WHERE S2.sname=‘Horatio’)

Page 14: SQL:   Queries

Rewriting INTERSECT Queries Using INCari sid's pelaut yang telah disediakan baik perahu merah dan hijau:

• Demikian pula, EXCEPT query ditulis ulang menggunakan NOT IN.

• Untuk menemukan nama (tidak sid's) dari Pelaut yang telah disediakan baik merah dan hijau perahu, hanya ganti S.sid oleh S.sname dalam klausa SELECT. (Bagaimana INTERSECT query?)

SELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’AND S.sid IN (SELECT S2.sid FROM Sailors S2, Boats B2, Reserves R2 WHERE S2.sid=R2.sid AND R2.bid=B2.bid AND B2.color=‘green’)

Page 15: SQL:   Queries

Aggregate Operators• SQL memungkinkan penggunaan ekspresi aritmatika

1. SELECT COUNT (*) FROM Sailors S;2. SELECT AVG (S.age) FROM Sailors S WHERE S.rating=10;3. SELECT COUNT (DISTINCT S.rating) FROM Sailors S WHERE S.sname=‘Bob’;4. SELECT AVG ( DISTINCT S.age) FROM Sailors S WHERE S.rating=10;5. SELECT S.sname FROM Sailors S WHERE S.rating= (SELECT MAX(S2.rating)

FROM Sailors S2);

COUNT (*)COUNT ( [DISTINCT] A)SUM ( [DISTINCT] A)AVG ( [DISTINCT] A)MAX (A)MIN (A)

Page 16: SQL:   Queries

Cari nama dan umur pelaut tertua (s)

• Query pertama adalah ilegal!(Kita akan melihat ke dalam alasan sedikit kemudian, ketikakita membahas GROUP BY.)

• Permintaan ketiga adalahsetara dengan yang keduaquery, dan diperbolehkan dalam standar SQL/92,tetapi tidak didukung dibeberapa sistem.

SELECT S.sname, MAX (S.age)FROM Sailors S

SELECT S.sname, S.ageFROM Sailors SWHERE S.age = (SELECT MAX (S2.age) FROM Sailors S2)

SELECT S.sname, S.ageFROM Sailors SWHERE (SELECT MAX (S2.age) FROM Sailors S2) = S.age

Page 17: SQL:   Queries

GROUP BY and HAVING• Sejauh ini, kita telah menerapkan operasi agregat pada seluruh

baris (yang memenuhi syarat) dalam relasi. Kadang-kadang, kita ingin menerapkan operasi agregat pada masing-masing kelompok grup pada baris relasi.

• Pertimbangkan: Temukan usia termuda untuk masing-masing pelaut sesuai dengan tingkat rating.– Secara umum, kita tidak tahu berapa banyak rating level yang ada,

dan nilai rating apa untuk tingkat ini!– Misalkan kita tahu bahwa nilai rating dari 1 sampai 10;

kita dapat menulis 10 pertanyaan yang terlihat seperti ini (!):

For i = 1, 2, ... , 10:SELECT MIN (S.age)FROM Sailors SWHERE S.rating = i

Page 18: SQL:   Queries

Query dengan GROUP BY dan HAVING

• Target-list berisi (1) nama atribut (2) istilah dengan operasi agregat (misalnya, MIN (S.age)).– Daftar atribut (1) harus pula muncul pada grouping-list.

Alasannya, bahwa setiap baris pada query hasil sesuai dengan satu group, dan atribut ini harus memiliki nilai tunggal per kelompok. (A kelompok adalah satu set baris yang memiliki nilai sama untuk semua atribut dalam pengelompokan-list.)

SELECT [DISTINCT] target-listFROM relation-listWHERE qualificationGROUP BY grouping-listHAVING group-qualification

Page 19: SQL:   Queries

Evaluasi Konseptual• Produk-silang hubungan-list dihitung, tuple kualifikasi yang

gagal dibuang, (tidak perlu ) field akan dihapus, dan sisanya tupel dipartisi dalam kelompok-kelompok dengan nilai atribut dalam grouping-list.

• group-qualification kemudian diterapkan untuk menghilangkan beberapa kelompok. Ekspresi dalam group-qualification harus memiliki nilai tunggal per kelompok!– Akibatnya, sebuah atribut dalam group-qualification yang bukan

argumen dari sebuah op agregat juga muncul dalam kelompok-daftar.(SQL tidak mengeksploitasi semantik kunci utama di sini!)

• Satu jawaban tuple dihasilkan per kualifikasi grup.

Page 20: SQL:   Queries

SELESEI