Pengantar SQL
Ada sejumlah bahasa kueri database yang digunakan, baik secara
komersial maupun eksperimental. Di bab ini, serta di Bab 4 dan 5, kita
mempelajari bahasa kueri yang paling banyak digunakan, SQL .
Meskipun kami merujuk ke bahasa SQL sebagai "bahasa kueri", ia
dapat melakukan lebih dari sekadar kueri database. Ia dapat
mendefinisikan struktur data, memodifikasi data dalam database, dan
menentukan batasan keamanan.
Kami tidak bermaksud untuk memberikan panduan pengguna
lengkap untuk SQL . Sebaliknya, kami menyajikan konstruksi dan konsep
dasar SQL . Penerapan SQL individual mungkin berbeda dalam detailnya,
atau mungkin hanya mendukung sebagian dari bahasa lengkap.
Dalam bab ini, kami menyajikan survei tentang DML dasar dan fitur
DDL SQL . Fitur yang dijelaskan di sini telah menjadi bagian dari SQL
standar karena SQL-92 .
Di Bab 4, kami menyediakan cakupan yang lebih rinci dari bahasa
kueri SQL , termasuk (a) berbagai ekspresi gabungan; (b) tampilan; (c)
transaksi; (d) kendala integritas; (e) sistem tipe; dan (f) otorisasi.
Di Bab 5, kami membahas fitur-fitur lanjutan dari bahasa SQL , termasuk
(a) mekanisme untuk memungkinkan mengakses SQL dari bahasa
pemrograman; (b) fungsi dan prosedur SQL ; (c) pemicu; (d) pertanyaan
rekursif; (e) fitur agregasi lanjutan; dan (f) beberapa fitur yang dirancang
untuk analisis data, yang diperkenalkan di SQL: 1999 , dan versi SQL
berikutnya . Kemudian, di Bab 22, kami menguraikan ekstensi
berorientasi objek ke SQL , yang diperkenalkan di SQL: 1999 .
Meskipun sebagian besar implementasi SQL mendukung fitur standar
yang kami jelaskan di sini, Anda harus menyadari bahwa ada perbedaan
antara implementasi. Sebagian besar implementasi mendukung beberapa
fitur tidak standar, sementara menghilangkan dukungan untuk beberapa
fitur yang lebih canggih. Jika Anda menemukan bahwa beberapa fitur
bahasa yang dijelaskan di sini tidak berfungsi pada sistem database yang
Anda gunakan, bacalah manual pengguna untuk sistem database Anda
untuk menemukan fitur apa yang didukungnya.
Relasi yang dibuat di atas mempunyai tiga atribut yaitu nama dept yang
merupakan string karakter dengan panjang maksimal 20, building yang
merupakan string karakter dengan panjang maksimal 15, dan budget
berupa bilangan dengan total 12 digit, 2 diantaranya adalah setelah koma
desimal. Perintah create table juga menetapkan bahwa atribut nama
dept adalah kunci utama dari hubungan departemen .
Bentuk umum dari perintah buat tabel adalah:
buat tabel r
( A1D1,
A2D2,
...,
AnDn,
integritas-batasan 1
,
...,
integritas-kendala k
);
Rincian lebih lanjut tentang batasan kunci asing , serta batasan integritas
lainnya yang mungkin disertakan oleh perintah buat tabel , akan
diberikan nanti, di Bagian 4.4.
SQL mencegah pembaruan apa pun ke database yang melanggar
batasan integritas. Misalnya, jika tupel yang baru disisipkan atau
dimodifikasi dalam suatu relasi memiliki nilai null untuk atribut
kunci-primer apa pun , atau jika tupel tersebut memiliki nilai yang sama
pada atribut kunci-primer seperti halnya tupel lain dalam relasi, SQL
menandai kesalahan dan mencegah pembaruan. Demikian pula,
penyisipan tupel kursus dengan nilai nama dept yang tidak muncul dalam
relasi departemen akan melanggar batasan kunci asing pada kursus , dan
SQL mencegah penyisipan seperti itu terjadi.
Relasi yang baru dibuat awalnya kosong. Kita bisa menggunakan
perintah insert untuk memuat data ke dalam relasi. Misalnya, jika kami
ingin memasukkan fakta bahwa ada seorang instruktur bernama Smith
di departemen Biologi dengan instruktur id 10211 dan gaji $ 66.000, kami
menulis:
masukkan ke instruktur
nilai-nilai (10211, 'Smith', 'Biology', 66000);
akan menghapus semua tupel dari relasi siswa . Bentuk lain dari perintah
delete memungkinkan tupel tertentu untuk dihapus; perintah hapus akan
dibahas lebih rinci nanti, di Bagian 3.9.1.
Untuk menghapus relasi dari database SQL , kami menggunakan
perintah drop table . Perintah drop table menghapus semua informasi
tentang relasi yang dijatuhkan dari database. Perintah
drop tabel r ;
hapus dari r ;
dimana r adalah nama dari relasi yang ada, A adalah nama atribut yang
akan ditambahkan, dan D adalah tipe dari atribut yang ditambahkan.
Kita dapat melepaskan atribut dari suatu relasi dengan perintah
dimana r adalah nama relasi yang ada, dan A adalah nama atribut dari
relasi tersebut. Banyak sistem database tidak mendukung penghapusan
atribut, meskipun mereka akan mengizinkan seluruh tabel untuk
dihapus.
nama
Srinivasan
Wu
Mozart
Einstein
El Said
Emas
Katz
Cali fi eri
Singh
Crick
Brandt
Kim
pilih nama
dari
instruktur ;
Hasilnya adalah relasi yang terdiri dari satu atribut dengan nama
heading . Jika relasi instruktur seperti yang ditunjukkan pada Gambar
2.1, maka relasi yang dihasilkan dari query sebelumnya ditunjukkan
pada Gambar 3.2.
Sekarang pertimbangkan kueri lain, "Temukan nama departemen
dari semua instruktur," yang dapat ditulis sebagai:
pilih nama
dept dari
instruktur ;
Karena lebih dari satu instruktur dapat menjadi bagian dari suatu
departemen, nama departemen dapat muncul lebih dari sekali dalam
hubungan instruktur . Hasil dari query di atas adalah relasi yang memuat
nama-nama departemen, seperti terlihat pada Gambar 3.3.
Dalam definisi matematis formal dari model relasional, relasi adalah
himpunan. Jadi, duplikat tupel tidak akan pernah muncul dalam relasi.
Dalam praktiknya, penghapusan duplikat memakan waktu. Oleh karena
itu, SQL memungkinkan duplikasi dalam relasi serta dalam hasil ekspresi
SQL . Jadi, kueri SQL sebelumnya mencantumkan setiap nama departemen
satu kali untuk setiap tupel yang muncul dalam relasi instruktur .
pilih nama
nama dept
Comp. Sci.
Keuangan
Musik
Fisika
Sejarah
Fisika
Comp. Sci.
Sejarah
Keuangan
Biologi
Comp. Sci.
Elec. Eng.
jika kita ingin duplikat dihapus. Hasil dari query di atas akan memuat
setiap nama departemen paling banyak satu kali.
SQL memungkinkan kita menggunakan kata kunci all untuk
menentukan secara eksplisit bahwa duplikat tidak dihapus:
pilih semua
nama dept dari
instruktur ;
nama
Katz
Brandt
Gambar 3.4 Hasil “ Temukan nama semua instruktur di departemen Ilmu Komputer
yang memiliki gaji lebih dari $ 70.000. ”
pilih nama
dari
instruktur
dimana nama dept = 'Comp. Sci. ' dan gaji > 70000;
Jika relasi instruktur seperti yang ditunjukkan pada Gambar 2.1, maka
relasi yang dihasilkan dari query sebelumnya ditunjukkan pada Gambar
3.4.
SQL memungkinkan penggunaan penghubung logis dan , atau , dan
bukan di klausa where . Operand dari koneksi logika dapat berupa
ekspresi yang melibatkan operator perbandingan < , < = , > , > = , = , dan <>
. SQL memungkinkan kita menggunakan operator perbandingan untuk
membandingkan string dan ekspresi aritmatika, serta tipe khusus, seperti
tipe tanggal.
Kita akan mengeksplorasi fitur lain di mana klausa menjadi predikat nanti
dalam bab ini.
3.3 Struktur Dasar Kueri SQL 67
nama dept nama bangunan
Gambar 3.5 Hasil “ Ambil nama semua instruktur, bersama dengan departemen mereka
nama dan nama gedung departemen. ”
departemen . dept name ) untuk memperjelas atribut mana yang kita
maksud. Sebaliknya, nama atribut dan bangunan hanya muncul di salah
satu relasi, dan oleh karena itu tidak perlu diawali dengan nama relasi.
Konvensi penamaan ini mengharuskan relasi yang ada dalam klausa
from memiliki nama yang berbeda. Persyaratan ini menyebabkan
masalah dalam beberapa kasus, seperti ketika informasi dari dua tupel
berbeda dalam relasi yang sama perlu digabungkan. Di Bagian 3.4.1, kita
melihat bagaimana menghindari masalah ini dengan menggunakan
operasi ganti nama.
• The pilih klausa digunakan untuk daftar atribut yang diinginkan dalam hasil
query.
• The dari klausa adalah daftar hubungan untuk diakses dalam
evaluasi query.
• The mana klausa adalah predikat yang melibatkan atribut relasi di
dari klausa.
Kueri SQL tipikal memiliki formulir
pilih A 1 , A 2 ,. . . , A
n dari r 1 , r 2 ,. . . , r
m dimana P ;
Relasi hasil memiliki semua atribut dari semua relasi di klausa from .
Karena nama atribut yang sama mungkin muncul di kedua r i dan r j ,
seperti yang kita lihat sebelumnya, kita mengawali nama relasi dari
mana atribut itu berasal, sebelum nama atribut.
Sebagai contoh, skema relasi untuk produk Cartesian hubungan
structor in dan mengajarkan adalah:
Dengan skema ini, kita bisa membedakan instruktur . ID dari para guru .
ID . Untuk atribut yang hanya muncul di salah satu dari dua skema, kita
biasanya akan menghilangkan prefiks nama-relasi . Penyederhanaan ini
tidak menyebabkan ambiguitas. Kemudian kita dapat menulis skema
relasi sebagai:
3.3 Struktur Dasar Kueri SQL
inst . Indo nama
dept nama
gaji
mengajar . Indo tentu saja Indo
detik Indo se
10101 Srinivasan Fisika 95000 10101 CS -101 1
Ja
10101 Srinivasan Fisika 95000 10101 CS -315 1
M
10101 Srinivasan Fisika 95000 10101 CS -347 1
Ja
10101 Srinivasan Fisika 95000 10101 FIN -201 1
M
10101 Srinivasan Fisika 95000 15151 MU -199 1
M
10101 Srinivasan Fisika 95000 22222 PHY -101 1
Ja
... ... ... ... ... ...
... ...
... ... ... ... ... ...
... ...
12121 Wu Fisika 95000 10101 CS -101 1
Ja
12121 Wu Fisika 95000 10101 CS -315 1
M
12121 Wu Fisika 95000 10101 CS -347 1
Ja
12121 Wu Fisika 95000 10101 FIN -201 1
M
12121 Wu Fisika 95000 15151 MU -199 1
M
12121 Wu Fisika 95000 22222 PHY -101 1
Ja
... ... ... ... ... ...
... ...
... ... ... ... ... ...
... ...
15151 Mozart Fisika 95000 10101 CS -101 1
Ja
15151 Mozart Fisika 95000 10101 CS -315 1
M
15151 Mozart Fisika 95000 10101 CS -347 1
Ja
15151 Mozart Fisika 95000 10101 FIN -201 1
M
15151 Mozart Fisika 95000 15151 MU -199 1
M
15151 Mozart Fisika 95000 22222 PHY -101 1
Ja
... ... ... ... ... ...
... ...
... ... ... ... ... ...
... ...
22222 Einstein Fisika 95000 10101 CS -101 1
Ja
22222 Einstein Fisika 95000 10101 CS -315 1
M
22222 Einstein Fisika 95000 10101 CS -347 1
Ja
22222 Einstein Fisika 95000 10101 FIN -201 1
M
22222 Einstein Fisika 95000 15151 MU -199 1
M
22222 Einstein Fisika 95000 22222 PHY -101 1
Ja
... ... ... ... ... ...
... ...
... ... ... ... ... ...
... ...
Gambar 3.6 Produk Cartesian dari hubungan instruktur dengan hubungan mengajar .
Sebaliknya, predikat di klausa where digunakan untuk membatasi
kombinasi yang dibuat oleh produk Cartesian menjadi kombinasi yang
bermakna untuk jawaban yang diinginkan. Kami mengharapkan kueri
yang melibatkan instruktur dan para pengajar untuk menggabungkan
tupel t tertentu di instruktur dengan hanya tupel di dalam pengajaran
yang merujuk ke instruktur yang sama yang dirujuk t . Artinya, kita
berharap hanya untuk pertandingan mengajarkan tupel dengan
instruktur tupel yang memiliki yang sama ID nilai. Query SQL berikut
memastikan kondisi ini, dan mengeluarkan nama instruktur dan
pengenal kursus dari tupel yang cocok tersebut.
Perhatikan bahwa karena atribut nama dept hanya muncul dalam relasi
instruktur , kita bisa saja menggunakan nama dept saja , bukan instruktur
. nama dept dalam query di atas.
Secara umum pengertian query SQL dapat dipahami sebagai berikut:
1. Hasilkan produk Cartesian dari relasi yang tercantum dalam klausa from
2. Terapkan predikat yang ditentukan dalam klausa where pada hasil
Langkah 1.
3. Untuk setiap tupel dalam hasil Langkah 2, keluarkan atribut (atau
hasil ekspresi) yang ditentukan dalam klausa pemilihan .
pilih A 1 , A 2 ,. . . , A n
dari r 1 gabungan alami r 2 gabungan alami . . .
gabungan alami r m dimana P ;
dari E 1 , E 2 ,. . . , E n
nama , id kursus
Nama atribut dalam hasil berasal dari nama atribut dalam relasi di
klausa from .
Akan tetapi, kita tidak dapat selalu mendapatkan nama dengan cara
ini, karena beberapa alasan: Pertama, dua relasi dalam klausa from
mungkin memiliki atribut dengan nama yang sama, dalam hal ini nama
atribut digandakan dalam hasil. Kedua, jika kita menggunakan ekspresi
aritmatika dalam klausa pemilihan , atribut resultan tidak memiliki
nama. Ketiga, meskipun nama atribut dapat diturunkan dari relasi dasar
seperti pada contoh sebelumnya, kita mungkin ingin mengubah nama
t ib t d l h il Ol h k it SQL di k t k
The sebagai klausul dapat muncul baik di pilih dan dari klausa. 4
Sebagai contoh, jika kita ingin nama atribut nama diganti dengan
nama nama instruktur , kita dapat menulis ulang query sebelumnya
sebagai:
Pola peka huruf besar / kecil; artinya, karakter huruf besar tidak cocok
dengan karakter huruf kecil, atau sebaliknya. Untuk mengilustrasikan
pencocokan pola, kami mempertimbangkan contoh berikut:
• 'Intro%' cocok dengan string apa pun yang diawali dengan "Intro".
• '% Comp%' cocok dengan sembarang string yang berisi "Comp"
sebagai substring, misalnya, 'Intro. ke Ilmu Komputer ', dan' Biologi
Komputasi '.
• '' cocok dengan sembarang string yang terdiri dari tiga karakter.
• '%' cocok dengan string apapun yang setidaknya terdiri dari tiga karakter.
Untuk pola yang menyertakan karakter pola khusus (yaitu,% dan), SQL
memungkinkan spesifikasi karakter escape. Karakter escape digunakan
tepat sebelum karakter pola khusus untuk menunjukkan bahwa karakter
pola khusus diperlakukan seperti karakter normal. Kami mendefinisikan
karakter escape untuk perbandingan serupa menggunakan kata kunci
escape . Sebagai ilustrasi, pertimbangkan pola berikut, yang
menggunakan garis miring terbalik ( \ ) sebagai karakter escape:
• seperti 'ab \ % cd%' escape ' \ ' cocok dengan semua string yang diawali
dengan "ab% cd".
• seperti 'ab \\ cd%' escape ' \ ' cocok dengan semua string yang diawali
dengan "ab \ cd".
pilih instruktur . *
dari instruktur ,
mengajarkan
dimana instruktur . ID = mengajar . ID ;
pilih *
dari instruktur
memesan dengan desc gaji , nama asc ;
pilih nama
dari
instruktur
dimana gaji antara 90000 dan 100000;
dari pada:
pilih nama
dari
instruktur
dimana gaji < = 100000 dan gaji > = 90000;
Gambar 3.9 The c1 relasi, daftar kursus yang diajarkan pada musim gugur 2009.
benar jika a 1 < = b 1 dan a 2 < = b 2 ; demikian pula, kedua tupel itu sama
jika semua atributnya sama. Dengan demikian, kueri SQL sebelumnya
dapat ditulis ulang sebagai berikut: 5
• Kumpulan dari semua mata kuliah yang diajarkan pada semester Musim
Gugur 2009:
pilih kursus
id dari
bagian
dimana semester = 'Musim Gugur' dan tahun = 2009;
• Kumpulan dari semua mata pelajaran yang diajarkan pada semester Musim
Semi 2010:
pilih kursus
id dari
bagian
dimana semester = 'Musim Semi' dan tahun = 2010;
Dalam pembahasan kita selanjutnya, kita akan mengacu pada relasi yang
diperoleh sebagai hasil dari query sebelumnya sebagai c1 dan c2 ,
masing-masing, dan menunjukkan hasil saat query ini dijalankan pada
relasi bagian dari Gambar 2.6 pada Gambar 3.9 dan 3.10. Perhatikan
kursus id
CS -101
CS -315
CS -319
CS -319
FIN -201
HIS -351
MU -199
Gambar 3.10 The c2 relasi, daftar kursus yang diajarkan pada musim semi 2010.
( pilih kursus
id dari
bagian
dimana semester = 'Musim Gugur'
dan tahun = 2009) serikat
( pilih kursus
id dari
bagian
dimana semester = 'Musim Semi' dan tahun = 2010);
( pilih kursus
id dari
bagian
dimana semester = 'Musim Gugur'
dan tahun = 2009) serikat semua
( pilih kursus
id dari
bagian
dimana semester = 'Musim Semi' dan tahun = 2010);
Jumlah tupel duplikat dalam hasil sama dengan jumlah total duplikat
yang muncul di c1 dan c2 . Jadi, dalam kueri di atas, masing-masing
CS -319 dan CS -101 akan dicantumkan dua kali. Sebagai contoh lebih
lanjut, jika kasus 4 bagian dari ECE -101 diajarkan pada semester Musim
Gugur 2009 dan 2 bagian dari ECE -101
kursus id
CS -101
CS -315
CS -319
CS -347
FIN -201
HIS -351
MU -199
PHY -101
diajarkan pada semester musim gugur 2010, maka akan ada 6 tupel
dengan hasil ECE -101 .
3.5.2 Operasi Intersect
Untuk menemukan rangkaian semua mata kuliah yang diajarkan pada
Musim Gugur 2009 serta pada Musim Semi 2010 kami menulis:
( pilih kursus
id dari
bagian
dimana semester = 'Musim Gugur'
dan tahun = 2009) berpotongan
( pilih kursus
id dari
bagian
dimana semester = 'Musim Semi' dan tahun = 2010);
Relasi hasil, ditunjukkan pada Gambar 3.12, hanya berisi satu tupel
dengan CS -101. The berpotongan operasi secara otomatis menghilangkan
duplikasi. Misalnya, jika 4 bagian dari ECE -101 diajarkan pada semester
Musim Gugur 2009 dan 2 bagian dari ECE -101 diajarkan pada semester
Musim Semi 2010, maka hanya akan ada 1 tupel dengan ECE -101 di hasil.
Jika kita ingin mempertahankan semua duplikat, kita harus menulis
intersect all di tempat intersect :
kursus id
CS -101
( pilih kursus
id dari
bagian
dimana semester = 'Musim Gugur'
dan tahun = 2009) berpotongan
semua
( pilih kursus
id dari
bagian
dimana semester = 'Musim Semi' dan tahun = 2010);
Jumlah duplikat tupel yang muncul di hasil sama dengan jumlah minimal
duplikat di c1 dan c2 . Misalnya, jika 4 bagian dari ECE -101 diajarkan
pada semester Musim Gugur 2009 dan 2 bagian dari ECE -101 diajarkan
pada semester Musim Semi 2010, maka akan ada 2 tupel dengan ECE -101
pada hasilnya.
( pilih kursus
id dari
bagian
dimana semester = 'Musim Gugur'
dan tahun = 2009) kecuali
( pilih kursus
id dari
bagian
dimana semester = 'Musim Semi' dan tahun = 2010);
Hasil dari query ini ditunjukkan pada Gambar 3.13. Perhatikan bahwa ini
persis relasi c1 dari Gambar 3.9 kecuali bahwa tupel untuk CS -101 tidak
muncul. The kecuali operasi 7 output semua tupel dari fi-nya pertama
masukan yang tidak terjadi pada input kedua; yaitu, ia melakukan
perbedaan yang ditetapkan. Operasi tersebut secara otomatis
menghilangkan duplikat pada input sebelum melakukan perbedaan yang
ditetapkan. Misalnya, jika 4 bagian dari ECE -101 diajarkan pada semester
Musim Gugur 2009 dan 2 bagian dari ECE -101 diajarkan pada semester
Musim Semi 2010, hasil dari operasi kecuali tidak akan memiliki salinan
ECE -101.
Jika kita ingin menyimpan duplikat, kita harus menulis kecuali semua di
tempat kecuali :
( pilih kursus
id dari
bagian
di t 'M i G '
kursus id
CS -347
PHY -101
Jumlah salinan duplikat tupel dalam hasil sama dengan jumlah salinan
duplikat di c1 dikurangi jumlah salinan duplikat di c2 , asalkan selisihnya
positif. Jadi, jika 4 bagian dari ECE -101 diajarkan pada semester Musim
Gugur 2009 dan 2 bagian dari ECE -101 diajarkan pada Musim Semi 2010,
maka ada 2 tupel dengan ECE -101 sebagai hasilnya. Namun, jika ada dua
atau lebih sedikit bagian dari ECE -101 pada semester Musim Gugur 2009,
dan dua bagian dari ECE -101 pada semester Musim Semi 2010, tidak ada
tupel dengan ECE -101 pada hasilnya.
• dan : Hasil yang benar dan tidak diketahui adalah tidak diketahui ,
salah dan tidak diketahui adalah palsu , sedangkan yang tidak
diketahui dan tidak diketahui adalah tidak diketahui .
• atau : Hasil yang benar atau tidak diketahui adalah benar , palsu atau
tidak diketahui adalah tidak diketahui , sementara tidak diketahui atau
tidak diketahui adalah tidak diketahui .
• tidak : Hasil tidak diketahui adalah tidak diketahui .
Predikat bukan nol berhasil jika nilai yang diterapkan tidak null.
Beberapa implementasi SQL juga memungkinkan kita untuk menguji
apakah hasil perbandingan tidak diketahui, bukan benar atau salah,
dengan menggunakan klausa tidak diketahui.
dan tidak diketahui .
Ketika sebuah query menggunakan klausa berbeda pilih , duplikat
tupel harus dihilangkan. Untuk tujuan ini, ketika membandingkan nilai
atribut yang sesuai dari dua tupel, nilai-nilai tersebut dianggap identik
jika keduanya bukan nol dan nilainya sama, atau keduanya nol. Jadi, dua
salinan tupel, seperti { ('A', null), ('A', null) } , dianggap identik, meskipun
beberapa atribut memiliki nilai null. Menggunakan klausa yang berbeda
kemudian hanya menyimpan satu salinan dari tupel identik tersebut.
Perhatikan bahwa perlakuan null di atas berbeda dari cara perlakuan
null di predikat, di mana perbandingan "null = null" akan menampilkan
tidak diketahui, bukan benar.
Pendekatan di atas memperlakukan tupel sebagai identik jika mereka
memiliki nilai yang sama untuk semua atribut, bahkan jika beberapa
nilainya adalah null, juga digunakan untuk himpunan operasi union,
intersection dan exception.
• Rata-rata: rata-rata
• Minimum: min
• Maksimum: maks
• Total: jumlah
• Hitung: hitung
pilih rata-rata (
gaji ) dari
instruktur
dimana nama dept = 'Comp. Sci. ';
Hasil dari query ini adalah relasi dengan atribut tunggal, yang berisi satu
tupel dengan nilai numerik yang sesuai dengan gaji rata-rata instruktur
di jurusan Ilmu Komputer. Sistem database dapat memberikan nama
yang sewenang-wenang untuk atribut relasi hasil yang dihasilkan oleh
agregasi; Namun, kita bisa memberikan nama yang bermakna untuk
atribut dengan menggunakan sebagai klausul sebagai berikut:
pilih jumlah ( ID
berbeda ) dari guru
dimana semester = 'Musim Semi' dan tahun = 2010;
Gambar 3.14 Tupel relasi instruktur , yang dikelompokkan berdasarkan atribut nama dept .
pilih rata-rata
( gaji ) dari
3.7 Fungsi Agregat 87
dept nama rata-rata gaji
Biologi 72000
Comp. Sci. 77333
Elec. Eng. 80000
Keuangan 85000
Sejarah 61000
Musik 40000
Fisika 91000
Gambar 3.15 Relasi hasil untuk query " Temukan gaji rata-rata di setiap departemen " .
Gambar 3.16 Relasi hasil untuk kueri “ Temukan jumlah instruktur di masing-masing
departemen yang mengajar mata kuliah pada semester Musim Semi 2010. ”
Gambar 3.17 Hasil relasi untuk query “ Temukan gaji rata-rata instruktur di dalamnya
departemen di mana gaji rata-rata lebih dari $ 42.000. ”
pilih jumlah (
gaji ) dari
instruktur ;
pilih jumlah ( ID
berbeda ) dari
pengambilan
dimana ( id kursus , id detik , semester , tahun ) di ( pilih id kursus , id
detik , semester , tahun dari
guru
dimana mengajar . ID = 10101);
3.8.2 Mengatur Perbandingan
Sebagai contoh kemampuan subkueri bertingkat untuk membandingkan
set, pertimbangkan kueri "Temukan nama semua instruktur yang gajinya
lebih besar dari setidaknya satu instruktur di departemen Biologi". Di
Bagian 3.4.1, kami menulis kueri ini sebagai berikut:
pilih nama
dari
instruktur
dimana gaji > sebagian ( pilih
gaji dari
instruktur
dimana nama dept = 'Biologi');
Subkueri:
( pilih gaji
dari
instruktur
dimana nama dept = 'Biologi')
pilih nama
dari
instruktur
dimana gaji > semua ( pilih
gaji dari
instruktur
dimana nama dept = 'Biologi');
Seperti halnya untuk beberapa , SQL juga memungkinkan < semua , < =
semua , > = semua , = semua , dan <> semua perbandingan. Sebagai
latihan, pastikan bahwa <> semua identik dengan tidak , sedangkan =
semua adalah tidak sama dengan di .
Sebagai contoh lain dari perbandingan kumpulan, pertimbangkan
kueri "Temukan departemen yang memiliki gaji rata-rata tertinggi." Kita
mulai dengan menulis kueri untuk menemukan semua gaji rata rata dan
3.8 Subkueri Bersarang 93
departemen yang gaji rata-rata lebih besar dari atau sama dengan semua
gaji rata-rata:
pilih kursus id
dari bagian
sebagai S
dimana semester = 'Fall' dan tahun =
2009 dan ada ( pilih *
dari bagian sebagai T
di mana semester = 'Musim Semi' dan
tahun = 2010 dan S . Tentu saja id =
T . kursus id );
( pilih id
kursus dari
kursus
dimana nama dept = 'Biologi')
( Pilih T . Tentu
saja id dari
mengambil
sebagai T di
mana S . ID = T .
ID )
nds fi semua kursus yang mahasiswa S . ID telah diambil. Dengan
demikian, seleksi luar mengambil setiap siswa dan menguji apakah
himpunan semua mata kuliah yang telah diambil siswa berisi himpunan
semua mata kuliah yang ditawarkan di departemen Biologi.
pilih T . kursus
id dari kursus
sebagai T
mana yang unik ( pilih R
pilih T . kursus
id dari kursus
sebagai T
di mana 1 < = ( pilih count ( R .
Tentu saja id ) dari
bagian sebagai R
di mana T . Tentu saja id = R .
Tentu saja id dan R .
tahun = 2009);
Kita bisa menguji keberadaan tupel duplikat di subkueri dengan
menggunakan konstruksi not unique . Untuk mengilustrasikan
konstruksi ini, pertimbangkan kueri "Temukan semua kursus yang
ditawarkan setidaknya dua kali pada tahun 2009" sebagai berikut:
pilih T . kursus
id dari kursus
sebagai T
di mana tidak unik ( pilih R .
Tentu saja id
dari bagian
sebagai R
di mana T . Tentu saja id = R .
Tentu saja id dan R .
tahun = 2009);
Secara formal, pengujian unik pada suatu relasi didefinisikan gagal
jika dan hanya jika relasi tersebut berisi dua tupel t 1 dan t 2 sehingga t 1 =
t 2 . Karena pengujian t 1 = t 2 gagal jika salah satu field dari t 1 atau t 2
adalah null, maka unique menjadi benar bahkan jika ada beberapa
salinan dari sebuah tupel, selama setidaknya salah satu atribut dari tupel
adalah nol.
Relasi hasil subquery diberi nama dept avg , dengan atribut nama dept
dan gaji rata - rata .
Subkueri bersarang di klausa from didukung oleh sebagian besar,
tetapi tidak semua implementasi SQL . Namun, beberapa implementasi
SQL , terutama Oracle, tidak mendukung penggantian nama relasi hasil di
klausa from .
Sebagai contoh lain, misalkan kita ingin menemukan gaji maksimum
di semua departemen dari total gaji di setiap departemen. The memiliki
klausul tidak membantu kami dalam tugas ini, tapi kami bisa menulis
query ini dengan mudah dengan menggunakan subquery dalam dari
klausa, sebagai berikut:
dengan anggaran
maks ( nilai )
sebagai ( pilih
maks ( anggaran )
dari departemen )
pilih anggaran
dari departemen , anggaran maks
dimana departemen . anggaran = nilai anggaran maks ;
Kita dapat, tentu saja, membuat kueri yang setara tanpa klausa with ,
tetapi itu akan menjadi lebih rumit dan lebih sulit untuk dipahami. Anda
3.9.1 Penghapusan
Permintaan penghapusan diekspresikan dengan cara yang sama seperti
kueri. Kami hanya dapat menghapus seluruh tupel; kita tidak dapat
menghapus nilai hanya pada atribut tertentu. SQL mengekspresikan
penghapusan dengan
hapus dari
r dimana P
;
telah diuji, gaji rata-rata dapat berubah, dan hasil akhir dari
penghapusan akan bergantung pada urutan pemrosesan tupel!
3.9.2 Penyisipan
Untuk menyisipkan data ke dalam relasi, kita menentukan tupel yang
akan disisipkan atau menulis kueri yang hasilnya adalah sekumpulan
tupel yang akan disisipkan. Jelas, nilai atribut untuk tupel yang
dimasukkan haruslah anggota dari domain atribut yang sesuai. Demikian
pula, tupel yang dimasukkan harus memiliki jumlah atribut yang benar.
Pernyataan insert paling sederhana adalah permintaan untuk
memasukkan satu tupel. Misalkan kita ingin memasukkan fakta bahwa
ada mata kuliah CS-437 di jurusan Ilmu Komputer dengan judul “Sistem
Database”, dan 4 SKS. Kami menulis:
Dalam contoh ini, nilai ditentukan dalam urutan di mana atribut terkait
dicantumkan dalam skema relasi. Demi keuntungan pengguna yang
mungkin tidak ingat urutan atribut, SQL memungkinkan atribut
ditentukan sebagai bagian dari pernyataan sisipan . Misalnya,
pernyataan insert SQL berikut identik fungsinya dengan yang
sebelumnya:
masukkan ke instruktur
pilih ID , nama , nama dept ,
18000 dari mahasiswa
di mana nama dept = 'Musik' dan kred total > 144;
masukkan ke
dalam
pemilihan
siswa *
dari siswa ;
mungkin menyisipkan jumlah tupel yang tak terbatas, jika kendala kunci
primer pada siswa tidak ada. Tanpa batasan kunci utama, permintaan
akan memasukkan tupel pertama dalam siswa lagi, membuat salinan
tupel kedua. Karena salinan kedua ini adalah bagian dari siswa sekarang,
pernyataan pilih dapat menemukannya, dan salinan ketiga akan
dimasukkan ke dalam siswa . The pilih pernyataan mungkin kemudian
mendapati salinan ketiga ini dan memasukkan salinan keempat, dan
seterusnya, selamanya. Mengevaluasi pernyataan pilih sepenuhnya
sebelum melakukan penyisipan menghindari masalah seperti itu. Jadi,
pernyataan insert di atas hanya akan menduplikasi setiap tupel dalam
relasi siswa , jika relasi tersebut tidak memiliki batasan kunci primer.
Diskusi kita tentang pernyataan insert hanya mempertimbangkan
contoh di mana nilai diberikan untuk setiap atribut dalam tupel yang
disisipkan. Dimungkinkan untuk tupel yang disisipkan diberi nilai hanya
pada beberapa atribut skema. Atribut yang tersisa diberi nilai null yang
dilambangkan dengan null . Pertimbangkan permintaannya:
pilih mahasiswa
dari mahasiswa
mana tot
kredibilitas > 45;
Karena nilai total cred siswa "3003" tidak diketahui, kami tidak dapat
menentukan apakah lebih besar dari 45.
Sebagian besar produk database relasional memiliki utilitas "pemuat
massal" khusus untuk memasukkan sekumpulan besar tupel ke dalam
suatu relasi. Utilitas ini memungkinkan data untuk dibaca dari file teks
yang diformat, dan dapat dieksekusi lebih cepat daripada urutan yang
setara dari pernyataan insert.
3.9.3 Pembaruan
Dalam situasi tertentu, kita mungkin ingin mengubah nilai dalam tupel
tanpa mengubah semua nilai dalam tupel. Untuk tujuan ini, pernyataan
pembaruan dapat digunakan. Seperti yang kami bisa untuk
perbarui instruktur
mengatur gaji = gaji * 1,05;
perbarui instruktur
mengatur gaji = gaji *
1,05 dimana gaji <
70000;
Secara umum, klausa where dari pernyataan pembaruan dapat berisi
konstruksi apa pun yang legal dalam klausa where dari pernyataan pilih
(termasuk pemilihan bersarang ). Seperti halnya penyisipan dan
penghapusan , pemilihan bersarang dalam pernyataan pembaruan
dapat merujuk pada relasi yang sedang diperbarui. Seperti sebelumnya,
SQL pertama kali menguji semua tupel dalam relasinya untuk melihat
apakah mereka harus diperbarui, dan melakukan pembaruan setelahnya.
Misalnya, kita bisa menulis permintaan “Berikan kenaikan gaji 5 persen
kepada instruktur yang gajinya di bawah rata-rata” sebagai berikut:
perbarui instruktur
atur gaji = gaji * 1.05
dimana gaji < ( pilih avg ( gaji
) dari
instruktur );
perbarui instruktur
atur gaji = gaji * 1,03
dimana gaji > 100000;
perbarui instruktur
menetapkan gaji =
gaji * 1,05 dimana gaji
< = 100000;
Perhatikan bahwa urutan dua pernyataan pembaruan itu penting. Jika
kami mengubah urutan kedua pernyataan tersebut, seorang instruktur
dengan gaji di bawah $ 100 000 akan menerima kenaikan lebih dari 8
perbarui instruktur
mengatur gaji = kasus
bila gaji < = 100000 maka gaji * 1,05
lainnya gaji * 1,03
akhir
Bentuk umum dari pernyataan kasus tersebut adalah sebagai berikut.
kasus
Bila pred 1 maka
hasil 1 bila pred 2
maka hasil 2
...
bila pred n maka
hasil n lain hasil 0
akhir
3.10 Ringkasan
• SQL menangani kueri pada relasi yang berisi nilai null dengan
menambahkan nilai kebenaran "tidak diketahui" ke nilai kebenaran
biasa dari benar dan salah.
• SQL mendukung agregasi, termasuk kemampuan untuk membagi
relasi menjadi beberapa grup, menerapkan agregasi secara terpisah
pada setiap grup. SQL juga mendukung operasi set pada grup.
• SQL mendukung subkueri bersarang di mana , dan dari klausa kueri
luar. Ini juga mendukung subkueri skalar, di mana pun ekspresi yang
mengembalikan nilai diizinkan.
• SQL menyediakan konstruksi untuk memperbarui, menyisipkan, dan
menghapus informasi.
Tinjau Persyaratan
Latihan Latihan
3.1 Tuliskan kueri berikut dalam SQL , menggunakan skema
universitas. (Kami menyarankan Anda benar-benar menjalankan
kueri ini di database, menggunakan data sampel yang kami
sediakan di situs Web buku, db-book.com . Instruksi untuk
menyiapkan database, dan memuat data sampel, tersedia di situs
Web di atas.)
3.2 Misalkan Anda diberi nilai poin hubungan ( kelas , poin ), yang
memberikan
konversi dari nilai surat dalam mengambil kaitannya dengan skor
numerik; misalnya nilai "A" dapat ditentukan untuk sesuai dengan 4
poin, "A - " untuk 3,7 poin, "B +" untuk 3.3 poin, "B" untuk 3 poin,
dan seterusnya. Nilai poin yang diperoleh siswa untuk penawaran
kursus (bagian) didefinisikan sebagai jumlah kredit untuk kursus
dikalikan dengan poin numerik untuk nilai yang diterima siswa.
Diberikan relasi di atas, dan skema universitas kami, tulis setiap
kueri berikut dalam SQL . Anda dapat berasumsi untuk
kesederhanaan yang ada mengambil tupel memiliki nol nilai untuk
kelas .
Sebuah. Temukan total poin kelas yang diperoleh siswa dengan
ID 12345, di semua mata pelajaran yang diambil oleh siswa.
b. Temukan nilai-nilai rata - rata ( IPK ) untuk siswa di atas,
yaitu, nilai-poin total dibagi dengan total kredit untuk kursus
terkait.
pilih pa yang
berbeda 1 dari
p , r 1, r 2
dimana pa 1 = r 1. a 1 atau pa 1 = r 2. a 1
Latihan
3.11 Tuliskan pertanyaan berikut dalam SQL , menggunakan skema universitas.
Sebuah. Temukan nama semua siswa yang telah mengambil
setidaknya satu Comp. Sci. kursus; pastikan tidak ada nama
duplikat dalam hasil.
b. Temukan ID dan nama semua siswa yang belum mengambil
penawaran kursus apa pun sebelum Musim Semi 2009.
c. Untuk setiap departemen, temukan gaji maksimum instruktur
di departemen itu. Anda dapat berasumsi bahwa setiap
departemen memiliki setidaknya satu instruktur.
d. Temukan yang terendah, di semua departemen, dari gaji
maksimum per departemen yang dihitung oleh kueri
sebelumnya.
Latihan 109
Alat 111
Alat
Sejumlah sistem database relasional tersedia secara komersial, termasuk
IBM DB2 , IBM Informix, Oracle, Sybase, dan Microsoft SQL S erver. Selain
itu, beberapa sistem database dapat diunduh dan digunakan secara
gratis, termasuk P ostgre SQL , M y SQL (gratis kecuali untuk jenis
penggunaan komersial tertentu), dan edisi Oracle Express.
Catatan Bibliografi
Versi asli dari SQL , disebut Sekuel 2, dijelaskan oleh Chamberlin et al.
[1976]. Sekuel 2 diturunkan dari bahasa Square (Boyce et al. [1975] dan
Chamberlin dan Boyce [1974]). American National Standard SQL-86
dijelaskan di ANSI [1986]. The IBM Aplikasi Sistem Arsitektur definisi dari
SQL didefinisikan oleh IBM [1987]. Standar resmi untuk SQL-89 dan SQL-92
tersedia sebagai ANSI [1989] dan ANSI [1992], masing-masing.
Deskripsi buku teks dari bahasa SQL-92 termasuk Date dan Darwen
[1997], Melton dan Simon [1993], dan Cannan dan Otten [1993]. Date dan
Darwen [1997] dan Date [1993a] memasukkan kritik terhadap SQL-92 dari
perspektif bahasa pemrograman .
Buku teks tentang SQL: 1999 termasuk Melton dan Simon [2001] dan
Melton [2002]. Eisenberg dan Melton [1999] memberikan gambaran
umum tentang SQL: 1999 . Donahoo dan Speegle [2005] mencakup SQL dari
perspektif pengembang. Eisenberg dkk. [2004] memberikan gambaran
umum tentang SQL: 2003 .
Standar SQL: 1999 , SQL: 2003 , SQL : 2006 dan SQL : 2008 diterbitkan
sebagai kumpulan dokumen standar ISO / IEC , yang dijelaskan lebih rinci
di Bagian 24.4. Dokumen standar padat dengan informasi dan sulit
dibaca, dan digunakan terutama untuk pelaksana sistem database.
Dokumen standar tersedia dari situs web http://webstore.ansi.org , tetapi
hanya untuk pembelian.
Banyak produk database mendukung fitur SQL di luar yang ditentukan
dalam standar, dan mungkin tidak mendukung beberapa fitur standar.
Informasi lebih lanjut tentang fitur ini dapat ditemukan di manual
pengguna SQL masing-masing produk.
Pemrosesan kueri SQL , termasuk algoritme dan masalah kinerja,
dibahas di Bab 12 dan 13. Referensi bibliografi tentang masalah ini
muncul di bab-bab tersebut.