200 likes | 460 Views
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.
E N D
SQL: Queries Chapter 5
Contoh • Sebelummenunjukkancontoh query dengandifinisitabelsebagaiberikut : • sailor1(sidinteger,snametext,ratinginteger,age double) • boat(bid integer,bnametext,color text) • reserve (sidinteger,bidinteger,hari date)
DasardariSQL Query SELECT [DISTINCT] target-list FROM relation-list WHERE qualification • Relation-list yaitudaftarnamadaritabelrelasi. • Target-list yaitudaftardariatributdaritabelrelasi • Qualification yaitudigunakanuntukmendaftarkankriteria-kriteriapencarian yang dikombinasikandengan AND, OR dan NOT. • Distinct yaituperintah optional mengindikasikanbahwa data tidakdiperbolehkansama.
StrategiEvaluasi Konseptual • Semantik dari sebuah query SQL didefinisikan dalamhalberikut strategi evaluasi konseptual: • Hitunglah produk-silang hubunganrelasitabel. • 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 untukmenghitung query! Sebuah optimizer akan menemukan lebih banyakstrategi yang efisien untuk menghitung jawaban yang sama.
ContohdariEvaluasikonsep • SELECT S.sname FROM Sailors S, Reserves R WHERE S.sid=R.sid AND R.bid=103
Contoh Query SQL DasarSebuah catatan tentang Variabel Range • Benar-benar dibutuhkan hanya jika hubungan yangsamamuncul 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;
CariPelaut yang memesan minimal 1 kapal SELECT S.sid FROM Sailors S, Reserves R WHERE S.sid=R.sid • Apakahmenambahkan DISTINCT untuk query inimembuatperbedaan? • Apa pengaruh penggantian S.sid oleh S.sname diklausa SELECT? Apakah menambahkan DISTINCTini varian dari query yang membuat perbedaan?
Ekspresi dan Strings SELECT S.age, age1=S.age-5, 2*S.age AS age2 FROM Sailors S WHERE S.sname LIKE ‘B_%B’ • Menggambarkan penggunaan ekspresi aritmatika dan stringpencocokan pola: • Temukan tiga (dari usia pelaut dandua field ditentukan oleh ekspresiaritmatika) bagi para pelaut yang namanyadimulai 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 untuksatu karakter dan `% 'singkatan sewenang-wenang 0 atau lebihkarakter.
UNION, INTERSECT dan EXCEPTCari sid's pelaut yang telah memesanperahu merah atau hijau • UNION: Dapat digunakan untukmenghitung gabungandaridua serikat-settuple (yangsendiri hasilSQL query). • Jika kita mengganti ORmenjadiAND diversi pertama, apa yangkita dapatkan? • Juga tersedia: KECUALI(Apa yang kita dapatkan jika kitamengganti UNION oleh EXCEPT?) SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND (B.color=‘red’ OR B.color=‘green’) SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’ UNION SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘green’
Cari sid's pelaut yang telah memesan perahu merah dan hijau SELECT S.sid FROM Sailors S, Boats B1, Reserves R1, Boats B2, Reserves R2 WHERE S.sid=R1.sid AND R1.bid=B1.bid AND S.sid=R2.sid AND R2.bid=B2.bid AND (B1.color=‘red’ AND B2.color=‘green’) • 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.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’ INTERSECT SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘green’
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 WHEREsendiri bisamengandung query SQL! (Sebenarnya, subquerybisamunculdiklausaFROM dan klausa HAVING) • Untuk mencari pelaut yang sudah tidak memesanperahu # 103, gunakan NOT IN.
Nested Queries DenganKorelasi • Cari nama pelaut yang telah memesan perahu # 103: SELECT S.sname FROM Sailors S WHERE EXISTS (SELECT * FROM Reserves R WHERE R.bid=103 AND S.sid=R.sid) • EXISTS adalah operator perbandingan set lain, sepertihalnyaIN. • Jika UNIQUE digunakan, dan * digantikan oleh R.bid, menemukanpelaut dengan paling banyak satu reservasi untuk perahu # 103.(UNIQUE memeriksa duplikasi tuple; * menandakansemuaatribut. Mengapa kita harus mengganti * oleh R.bid?) • Mengapa mengilustrasikan secara umum, subquery harus menghitung ulanguntuk setiap tuple Pelaut.
More on Set-Comparison Operators • kita telah melihat IN, EXISTS dan UNIQUE. Bisa jugagunakan NOTIN, NOT EXISTS dan NOT UNIQUE. • Juga tersedia: op ANY, op ALL, op IN, >,<,=,≤,≥,≠ • Cari pelaut yang rating lebih besar dari beberapapelaut disebut Horatio: SELECT *FROM Sailors S WHERE S.rating > ANY (SELECT S2.rating FROM Sailors S2 WHERE S2.sname=‘Horatio’)
Rewriting INTERSECT Queries Using INCari sid's pelaut yang telah disediakan baik perahu merah dan hijau: SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE 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’) • Demikian pula, EXCEPT query ditulis ulang menggunakan NOT IN. • Untuk menemukan nama (tidak sid's) dari Pelaut yang telah disediakanbaik merah dan hijau perahu, hanya ganti S.sid oleh S.snamedalam klausa SELECT. (Bagaimana INTERSECT query?)
Aggregate Operators • SQL memungkinkanpenggunaanekspresiaritmatika • COUNT (*) • COUNT ( [DISTINCT] A) • SUM ( [DISTINCT] A) • AVG ( [DISTINCT] A) • MAX (A) • MIN (A) • SELECT COUNT (*) FROM Sailors S; • SELECT AVG (S.age) FROM Sailors S WHERE S.rating=10; • SELECT COUNT (DISTINCT S.rating) FROM Sailors S WHERE S.sname=‘Bob’; • SELECT AVG ( DISTINCT S.age) FROM Sailors S WHERE S.rating=10; • SELECT S.sname FROM Sailors S WHERE S.rating= (SELECT MAX(S2.rating) FROM Sailors S2);
Cari nama dan umur pelaut tertua (s) • Query pertama adalahilegal!(Kita akan melihat ke dalamalasan sedikit kemudian, ketikakita membahas GROUP BY.) • Permintaan ketiga adalahsetara dengan yang keduaquery, dan diperbolehkan dalamstandar SQL/92,tetapi tidak didukung dibeberapa sistem. SELECT S.sname, MAX (S.age) FROM Sailors S SELECT S.sname, S.age FROM Sailors S WHERE S.age = (SELECT MAX (S2.age) FROM Sailors S2) SELECT S.sname, S.age FROM Sailors S WHERE (SELECT MAX (S2.age) FROM Sailors S2) = S.age
GROUP BY and HAVING • Sejauh ini, kita telah menerapkan operasiagregatpadaseluruhbaris (yang memenuhisyarat) dalamrelasi. Kadang-kadang, kita ingin menerapkanoperasiagregatpada masing-masing kelompok gruppadabarisrelasi. • Pertimbangkan: Temukan usia termuda untuk masing-masing pelautsesuaidengantingkat rating. • Secara umum, kita tidak tahu berapa banyak rating level yang ada, dan nilai rating apauntuk tingkat ini! • Misalkan kita tahu bahwa nilai rating dari 1 sampai 10;kita dapat menulis 10 pertanyaan yang terlihat seperti ini (!): SELECT MIN (S.age) FROM Sailors S WHERE S.rating = i For i = 1, 2, ... , 10:
Query dengan GROUP BY dan HAVING SELECT [DISTINCT] target-list FROM relation-list WHERE qualification GROUP BY grouping-list HAVING group-qualification • Target-list berisi (1) nama atribut (2) istilahdenganoperasi agregat (misalnya, MIN (S.age)). • Daftar atribut (1) harus pula munculpada grouping-list.Alasannya, bahwasetiapbarispada query hasilsesuaidengansatu group, danatribut ini harus memiliki nilai tunggal per kelompok. (Akelompok adalah satu set baris yang memiliki nilai sama untuk semuaatribut dalam pengelompokan-list.)
Evaluasi Konseptual • Produk-silang hubungan-list dihitung, tuplekualifikasi yang gagal dibuang, (tidak perlu ) field akan dihapus, dan sisanya tupel dipartisidalam 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 bukanargumen dari sebuah op agregat juga muncul dalam kelompok-daftar.(SQL tidak mengeksploitasi semantik kunci utama di sini!) • Satu jawaban tuple dihasilkan per kualifikasi grup.