Saturday, November 13, 2010

SQL: Queries

Pada pertemuan ke-lima ini kami membahas mengenai SQL: QUERIES

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

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.



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.



Contoh dari Evaluasi konsep
SELECT S.sname FROM     Sailors S, Reserves R WHERE S.sid=R.sid AND R.bid=103



Contoh Query SQL Dasar
Sebuah 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 Reserves.bid=103;



 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 di
klausa SELECT? Apakah menambahkan DISTINCT
ini 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 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.



UNION, INTERSECT dan EXCEPT
Cari sid's pelaut yang telah memesan perahu merah atau 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’ 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’


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?)




 
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’)



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’

 
 
INTERSECT: Dapat digunakan untuk
menghitung persimpangan
dari dua unioncompatible
set tuple.

Termasuk dalam SQL/92
standar, tetapi beberapa
sistem tidak mendukung itu.

Kontras simetri dari UNION dan INTERSECT
query dengan banyak cara
versi lain berbeda.






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.



Nested Queries Dengan Korelasi
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, 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.



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.rating

  FROM Sailors S2

  WHERE S2.sname=‘Horatio’)



Rewriting INTERSECT Queries Using IN
Cari 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 disediakan baik merah dan hijau perahu, hanya ganti S.sid oleh S.sname dalam klausa SELECT. (Bagaimana INTERSECT query?)


 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);



Cari nama dan umur pelaut tertua (s)




 
Query pertama adalah ilegal!
(Kita akan melihat ke dalam
alasan sedikit kemudian, ketika
kita membahas GROUP BY.)
Permintaan ketiga adalah
setara dengan yang kedua
query, dan diperbolehkan dalam
standar SQL/92,
tetapi tidak didukung di
beberapa sistem.
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 (!):
 
 
 
 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) 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.)
 
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.
 
 Semoga ilmu yang sedikit ini bermanfaat. Amiieee......n ^_^

No comments:

Post a Comment