Anda di halaman 1dari 49

BAB 3

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.

3.1 Gambaran Umum Bahasa Kueri SQL


IBM mengembangkan versi asli dari SQL , yang awalnya disebut Sekuel,
sebagai bagian dari proyek System R di awal tahun 1970-an. Bahasa
Sekuel telah berkembang sejak saat itu, dan namanya telah berubah
menjadi SQL (Structured Query Language). Banyak produk sekarang
mendukung bahasa SQL . SQL telah jelas menempatkan dirinya sebagai
yang bahasa database relasional standar.
Pada tahun 1986, American National Standards Institute ( ANSI ) dan
Organisasi Internasional untuk Standardisasi ( ISO ) menerbitkan standar
SQL , yang disebut SQL-86 . ANSI menerbitkan standar yang diperluas untuk
SQL , SQL-89 , pada tahun 1989. Versi standar berikutnya adalah standar
SQL-92 , diikuti oleh SQL: 1999 , SQL: 2003 , SQL : 2006, dan yang terbaru SQL :
2008. Catatan bibliografi memberikan referensi untuk standar ini.

Bahasa SQL memiliki beberapa bagian:

• Bahasa definisi data ( DDL ). The SQL DDL memberikan perintah


untuk de fi n ing hubungan skema, menghapus hubungan, dan
memodifikasi skema relasi.
• Bahasa manipulasi data ( DML ). The SQL DML menyediakan
kemampuan untuk informasi query dari database dan insert tupel ke
dalam, tupel menghapus dari, dan memodifikasi tupel dalam
database.

58 Bab 3 Pengantar SQL

• Integritas . The SQL DDL termasuk perintah untuk menentukan


integritas keterbatasan- keterbatasan bahwa data yang disimpan
dalam database harus memenuhi. Pembaruan yang melanggar
batasan integritas tidak diizinkan.
• Lihat definisi . The SQL DDL termasuk perintah untuk ning pandangan de fi.
• Pengendalian transaksi . SQL menyertakan perintah untuk
menentukan awal dan akhir transaksi.
• SQL tertanam dan SQL dinamis . SQL tersemat dan dinamis
mendefinisikan bagaimana pernyataan SQL dapat disematkan dalam
bahasa pemrograman tujuan umum , seperti C, C ++, dan Java.
• Otorisasi . The SQL DDL termasuk perintah untuk menentukan hak
akses ke hubungan dan pandangan.

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.

3.2 Definisi Data SQL


Himpunan relasi dalam database harus dispesifikasikan ke sistem dengan
menggunakan bahasa definisi data ( DDL ). The SQL DDL memungkinkan
spesi fi kasi tidak hanya satu set hubungan, tetapi juga informasi tentang
setiap hubungan, termasuk:

• Skema untuk setiap relasi.


• Jenis nilai yang terkait dengan setiap atribut.

3.2 Definisi Data SQL 59

• Informasi keamanan dan otorisasi untuk setiap relasi.


• Struktur penyimpanan fisik dari setiap relasi pada disk.
Di sini kita membahas definisi skema dasar dan tipe dasar; kami
menunda pembahasan tentang fitur SQL DDL lainnya ke Bab 4 dan 5.

3.2.1 Jenis Dasar


The SQL standar mendukung berbagai built-in jenis, termasuk:

• char ( n ): String karakter dengan panjang tetap dengan panjang n


yang ditentukan pengguna . Bentuk lengkap, karakter , dapat
digunakan sebagai gantinya.
• varchar ( n ): String karakter dengan
panjang variabel dengan panjang maksimum n yang
ditentukan pengguna . Bentuk penuh, karakter bervariasi , adalah
setara.
• int : Integer (himpunan bagian terbatas dari integer yang bergantung
pada mesin). Bentuk lengkapnya, integer , setara.
• smallint : Sebuah integer kecil ( subset yang bergantung pada mesin dari tipe
integer).
• numerik ( p , d ): Bilangan tetap dengan presisi yang
ditentukan pengguna . Angka terdiri dari angka p (plus tanda), dan d
dari angka p ada di sebelah kanan koma desimal. Jadi, numerik (3,1)
memungkinkan 44 . 5 disimpan persis, tetapi tidak 444 . 5 atau 0 . 32
dapat disimpan tepat di field jenis ini.
• nyata, presisi ganda : Bilangan floating-point dan
presisi ganda precision oating-point dengan presisi yang
bergantung pada mesin.
• fl oat ( n ): A oating-point number, dengan ketelitian minimal n digit.
Jenis tambahan tercakup dalam Bagian 4.5.
Setiap jenis dapat menyertakan nilai khusus yang disebut nilai null .
Nilai null menunjukkan nilai yang tidak ada yang mungkin ada tetapi
tidak diketahui atau mungkin tidak ada sama sekali. Dalam kasus
tertentu, kami mungkin ingin melarang nilai null untuk dimasukkan,
seperti yang akan kita lihat sebentar lagi.

The Char tipe data toko fi xed string panjang. Pertimbangkan,


misalnya, atribut A tipe char (10). Jika kita menyimpan string "Avi" dalam
atribut ini, 7 spasi ditambahkan ke string tersebut untuk menjadikannya
10 karakter. Sebaliknya, jika atribut B berjenis varchar (10), dan kita
menyimpan "Avi" di atribut B , tidak ada spasi yang akan ditambahkan.
Saat membandingkan dua nilai bertipe char , jika panjangnya berbeda,
spasi tambahan secara otomatis ditambahkan ke nilai yang lebih pendek
untuk membuatnya berukuran sama, sebelum dibandingkan.
Saat membandingkan tipe char dengan tipe varchar seseorang

60 Bab 3 Pengantar SQL

SQL juga menyediakan tipe nvarchar untuk menyimpan data


multibahasa menggunakan representasi Unicode. Namun, banyak
database mengizinkan Unicode (dalam representasi UTF-8 ) untuk
disimpan bahkan dalam tipe varchar .

3.2.2 Definisi Skema Dasar


Kami mendefinisikan relasi SQL dengan menggunakan perintah create
table . Perintah berikut membuat departemen relasi di database.

buat departemen tabel (


nama dept varchar
(20), bangunan
varchar (15),
anggaran numerik
(12,2), kunci utama (
nama dept ));

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

dimana r adalah nama relasi, masing - masing A i adalah nama atribut


dalam skema relasi r , dan D i adalah domain atribut A i ; yaitu, D i
menentukan tipe atribut A i bersama dengan batasan opsional yang
membatasi himpunan nilai yang diizinkan untuk A i .

Titik koma yang ditampilkan di akhir pernyataan buat tabel , serta di


akhir pernyataan SQL lainnya di bagian selanjutnya dalam bab ini,
bersifat opsional dalam banyak implementasi SQL .
SQL mendukung sejumlah batasan integritas yang berbeda. Di bagian
ini, kami hanya membahas beberapa di antaranya:

• kunci primer ( A j 1 , A j 2 ,.., A j m ): Spesifikasi kunci-primer


mengatakan bahwa atribut A j A j A j membentuk kunci

3.2 Definisi Data SQL 61

spesi fi kasi bersifat opsional, biasanya merupakan ide bagus untuk


menetapkan kunci primer untuk setiap relasi.
• foreign key ( A k 1 , A k 2 ,..., A k n ) referensi s : Spesifikasi foreign key
mengatakan bahwa nilai atribut ( A k 1 , A k 2 ,.., A k n ) untuk setiap tupel
dalam relasi harus sesuai dengan nilai atribut kunci primer dari
beberapa tupel dalam relasi s .
Gambar 3.1 menyajikan definisi SQL DDL parsial dari database
universitas yang kita gunakan dalam teks. Definisi tabel kursus
memiliki deklarasi " departemen referensi kunci asing ( nama dept )
". Deklarasi kunci asing ini menetapkan bahwa untuk setiap tupel
kursus, nama departemen yang ditentukan dalam tupel harus ada
dalam atribut kunci primer ( nama dept ) dari relasi departemen .
Tanpa batasan ini, dimungkinkan untuk kursus menentukan nama
departemen yang tidak ada. Gambar 3.1 juga menunjukkan batasan
kunci asing pada bagian tabel , instruktur dan pengajar .
• not null : Batasan not null pada atribut menentukan bahwa nilai null
tidak diperbolehkan untuk atribut itu; dengan kata lain, batasan
mengecualikan nilai null dari domain atribut itu. Misalnya, pada
Gambar 3.1, batasan not null pada atribut name dari relasi instruktur
memastikan bahwa nama instruktur tidak boleh null.

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

Nilai ditentukan dalam urutan di mana atribut terkait dicantumkan


dalam skema relasi. Perintah sisipkan memiliki sejumlah fitur yang
berguna, dan akan dibahas lebih rinci nanti, di Bagian 3.9.2.
Kita dapat menggunakan delete perintah untuk menghapus tupel dari relasi.
Perintah

62 Bab 3 Pengantar SQL

buat departemen meja


( dept     nama varchar (20),
bangunan varchar (15),
anggaran numerik (12,2),
kunci utama ( dept   nama ));

membuat meja kursus


( tentu saja  Indo varchar (7),
judul varchar (50),
dept   nama varchar (20),
kredit numerik (2,0),
kunci utama ( kursus id ),
departemen referensi kunci asing ( nama dept ) );

buat instruktur meja


( ID varchar (5),
nama varchar (20) bukan null ,
dept   namavarchar (20),
gaji numerik (8,2),
kunci utama ( ID ),
departemen referensi kunci asing ( nama dept ) );

buat bagian tabel


( tentu saja  Indo varchar (8),
detik   Indo varchar (8),
semester varchar (6),
tahun numerik (4,0),
bangunan varchar (15),
kamar     jumlah varchar (7),
waktu   slot   Indovarchar (4),
kunci utama ( tentu saja id , sec id ,
semester , tahun ), kunci asing ( tentu
saja id ) referensi saja );

membuat tabel mengajar


( ID varchar (5),
tentu saja   Indovarchar (8),
detik   Indo varchar (8),
semester varchar (6),
tahun numerik (4,0),
kunci utama ( ID , id mata kuliah , id detik , semester , tahun ),
bagian referensi kunci asing ( id kursus , id detik ,
semester , tahun ) , instruktur referensi kunci asing ( ID
) );
Gambar 3.1 definisi data SQL untuk bagian dari database universitas.

3.3 Struktur Dasar Kueri SQL 63

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 ;

adalah tindakan yang lebih drastis daripada

hapus dari r ;

Yang terakhir mempertahankan relasi r , tetapi menghapus semua tupel


di r . Yang pertama menghapus tidak hanya semua tupel dari r , tetapi
juga skema untuk r . Setelah r dijatuhkan, tidak ada tupel yang dapat
disisipkan ke dalam r kecuali dibuat ulang dengan perintah create table .
Kami menggunakan perintah alter table untuk menambahkan
atribut ke relasi yang ada. Semua tupel dalam relasinya diberi null
sebagai nilai untuk atribut baru. Bentuk dari perintah alter table adalah

mengubah tabel r menambahkan AD ;

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

mengubah tabel r drop A ;

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.

3.3 Struktur Dasar Kueri SQL


Struktur dasar kueri SQL terdiri dari tiga klausa: pilih , dari , dan di mana
. Queri mengambil sebagai masukannya relasi yang terdaftar dalam
klausa from , beroperasi padanya sebagaimana ditentukan di klausa
where dan pilih , dan kemudian menghasilkan relasi sebagai hasilnya.
Kami memperkenalkan sintaks SQL melalui contoh-contoh, dan
menjelaskan struktur umum kueri SQL nanti.

3.3.1 Pertanyaan tentang Hubungan Tunggal


Mari kita pertimbangkan pertanyaan sederhana menggunakan contoh
universitas kita "Temukan nama semua instruktur " Nama instruktur

64 Bab 3 Pengantar SQL

nama
Srinivasan
Wu
Mozart
Einstein
El Said
Emas
Katz
Cali fi eri
Singh
Crick
Brandt
Kim

Gambar 3.2 Hasil “ pilih nama dari instruktur ” .

letakkan relasi tersebut di dalam klausa from . Nama instruktur muncul


di atribut name , jadi kami meletakkannya di klausa pilih .

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 .

Dalam kasus di mana kami ingin memaksa penghapusan duplikat,


kami memasukkan kata kunci berbeda setelah memilih . Kita bisa
menulis ulang query sebelumnya sebagai:

pilih nama

3.3 Struktur Dasar Kueri SQL 65

nama dept
Comp. Sci.
Keuangan
Musik
Fisika
Sejarah
Fisika
Comp. Sci.
Sejarah
Keuangan
Biologi
Comp. Sci.
Elec. Eng.

Gambar 3.3 Hasil “ pilih nama dept dari instruktur ” .

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 ;

Karena retensi duplikat adalah defaultnya, kami tidak akan


menggunakan semua dalam contoh kami. Untuk memastikan
penghapusan duplikat dalam hasil kueri contoh kami, kami akan
menggunakan perbedaan kapan pun diperlukan.
The pilih klausa dapat juga mengandung ekspresi aritmatika yang
melibatkan erators op- + , - , * , dan / beroperasi pada konstanta atau
atribut dari tuple. Misalnya, kueri:

pilih ID , nama , nama dept , gaji *


1.1 dari instruktur ;

mengembalikan relasi yang sama dengan relasi instruktur , kecuali


atribut gaji dikalikan dengan 1.1. Ini menunjukkan apa yang akan terjadi
jika kita memberikan kenaikan 10% untuk setiap instruktur; perhatikan,
bagaimanapun, bahwa itu tidak mengakibatkan perubahan apa pun pada
hubungan instruktur .
SQL juga menyediakan tipe data khusus, seperti berbagai bentuk tipe
tanggal , dan memungkinkan beberapa fungsi aritmatika untuk
beroperasi pada tipe ini. Kami membahas ini lebih lanjut di Bagian 4.5.1.
The mana klausul memungkinkan kita untuk memilih hanya mereka
baris dalam hubungan hasil dari klausul yang memuaskan sebuah
dispesifikasikan predikat. Pertimbangkan kueri "Temukan nama semua
instruktur di departemen Ilmu Komputer yang memiliki gaji lebih dari $
70 000 " Kueri ini dapat ditulis dalam SQL sebagai:

66 Bab 3 Pengantar SQL

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.2 Pertanyaan tentang Beberapa Relasi


Sejauh ini kueri contoh kami berada pada satu relasi. Pertanyaan sering
kali perlu mengakses informasi dari beberapa relasi. Kami sekarang
mempelajari cara menulis kueri semacam itu.
Sebagai contoh, misalkan kita ingin menjawab pertanyaan “Ambil
nama semua instruktur, bersama dengan nama departemen dan nama
gedung departemen mereka.”

Melihat skema instruktur relasi , kita menyadari bahwa kita bisa


mendapatkan nama departemen dari nama dept atribut , tetapi nama
gedung departemen ada di gedung atribut departemen relasi . Untuk
menjawab query tersebut, setiap tupel dalam relasi instruktur harus
dicocokkan dengan tupel pada relasi departemen yang nilai nama deptnya
sesuai dengan nilai nama dept dari tupel instruktur .

Dalam SQL , untuk menjawab pertanyaan di atas, kami membuat


daftar relasi yang perlu diakses di klausa from , dan menentukan kondisi
yang cocok di klausa where . Kueri di atas dapat ditulis dalam SQL sebagai

pilih nama , instruktur . nama dept ,


bangunan dari instruktur ,
departemen
dimana instruktur . nama dept = departemen . nama dept ;

 
3.3 Struktur Dasar Kueri SQL 67

            
nama dept   nama bangunan  
 
 
 
 
    
       

Srinivasan Comp. Sci. Taylor    


Wu Keuangan Pelukis    
Mozart Musik Packard    
Einstein Fisika Watson    
El Said Sejarah Pelukis    
Emas Fisika Watson    
Katz Comp. Sci. Taylor    
Cali fi eri Sejarah Pelukis    
Singh Keuangan Pelukis    
Crick Biologi Watson    
Brandt Comp. Sci. Taylor    
Kim Elec. Eng. Taylor    

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.

Kami sekarang mempertimbangkan kasus umum kueri SQL yang


melibatkan banyak relasi. Seperti yang telah kita lihat sebelumnya, kueri
SQL bisa berisi tiga tipe klausa, klausa pemilihan , klausa dari , dan
klausa where . Peran masing-masing klausa adalah sebagai berikut:

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

Setiap A i mewakili sebuah atribut dan setiap r i adalah sebuah relasi P

68 Bab 3 Pengantar SQL

Meskipun klausa harus ditulis dalam urutan pilih , dari , di mana ,


cara termudah untuk memahami operasi yang ditentukan oleh kueri
adalah dengan mempertimbangkan klausa dalam urutan operasional:
pertama dari , lalu di mana , dan kemudian pilih . 1
The dari klausa dengan sendirinya mendefinisikan produk Cartesian
dari hubungan yang tercantum dalam klausa. Ini didefinisikan secara
formal dalam istilah teori himpunan, tetapi mungkin paling baik
dipahami sebagai proses iteratif yang menghasilkan tupel untuk
hubungan hasil dari klausa from .

untuk setiap tupel t 1 dalam relasi r 1


untuk setiap tupel t 2 dalam relasi r 2
...
untuk setiap tupel t m dalam relasi r m
Gabungkan t 1 , t 2 ,. . . , t m menjadi satu
tupel t Tambahkan t ke dalam relasi
hasil

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:

( Instruktur . ID , instruktur . Nama , instruktur . Nama dept ,


instruktur . Gaji mengajar . ID , mengajarkan . Tentu saja id ,
mengajarkan . Sec id , mengajarkan . Semester , mengajarkan . Tahun
)

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:

( Instruktur . ID , nama , nama dept , gaji


mengajar . ID , tentu saja id , sec id ,
semester , tahun )

Untuk mengilustrasikan, pertimbangkan hubungan instruktur pada


Gambar 2.1 dan hubungan mengajar pada Gambar 2.7. Produk Cartesian
mereka ditunjukkan pada Gambar 3.6, yang hanya mencakup sebagian
dari tupel yang membentuk hasil produk Cartesian. 2 Produk Cartesian
dengan sendirinya menggabungkan tupel dari instruktur dan pengajaran
yang tidak terkait satu sama lain. Setiap tupel dalam instruktur
digabungkan dengan setiap tupel dalam pengajaran , bahkan tupel yang
merujuk ke instruktur yang berbeda. Hasilnya bisa menjadi relasi yang

          
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.

70 Bab 3 Pengantar SQL

pilih nama , id kursus dari


instruktur , mengajar di
mana instruktur . ID =
mengajar . ID ;
Perhatikan bahwa kueri di atas hanya menghasilkan instruktur yang
telah mengajar beberapa kursus. Instruktur yang belum mengajar kursus
apa pun bukanlah keluaran; jika kita ingin mengeluarkan tupel seperti
itu, kita bisa menggunakan operasi yang disebut gabungan luar , yang
dijelaskan di Bagian 4.1.2.
Jika hubungan instruktur seperti yang ditunjukkan pada Gambar 2.1
dan hubungan mengajar seperti yang ditunjukkan pada Gambar 2.7,
maka hubungan yang dihasilkan dari query sebelumnya ditunjukkan
pada Gambar 3.7. Perhatikan bahwa instruktur Gold, Califier, dan Singh,
yang belum pernah mengajar kursus apa pun, tidak muncul dalam hasil
di atas.
Jika kami hanya ingin menemukan nama instruktur dan pengenal
kursus untuk instruktur di departemen Ilmu Komputer, kami dapat
menambahkan predikat tambahan ke klausa where , seperti yang
ditunjukkan di bawah ini.

pilih nama , tentu


saja id dari
instruktur ,
mengajarkan
dimana instruktur . ID = mengajar . ID dan instruktur . dept name = 'Comp.
Sci. ';

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:

nama tentu saja   Indo


      
   
Srinivasan CS -101
Srinivasan CS -315
Srinivasan CS -347
Wu FIN -201
Mozart MU -199
Einstein PHY -101
El Said HIS -351
Katz CS -101
Katz CS -319
Crick BIO -101
Crick BIO -301
Brandt CS -190
Brandt CS -190

3.3 Struktur Dasar Kueri SQL 71

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 .

Urutan langkah-langkah di atas membantu memperjelas hasil dari kueri


SQL , bukan bagaimana seharusnya dieksekusi. Implementasi SQL yang
sebenarnya tidak akan mengeksekusi kueri dengan cara ini; melainkan
akan mengoptimalkan evaluasi dengan menghasilkan (sejauh mungkin)
hanya elemen dari produk Cartesian yang memenuhi predikat klausa
where . Kami mempelajari teknik implementasi seperti itu nanti, di Bab
12 dan 13.

Saat menulis query, Anda harus berhati-hati untuk memasukkan


kondisi klausa where yang sesuai . Jika Anda menghilangkan kondisi
klausa where dalam kueri SQL sebelumnya , ini akan menghasilkan
produk Cartesian, yang bisa menjadi relasi yang sangat besar. Untuk
contoh relasi instruktur pada Gambar 2.1 dan contoh tersebut
mengajarkan relasi pada Gambar 2.7, hasil kali Cartesian mereka
memiliki 12 ∗ 13 = 156 tupel - lebih dari yang dapat kita tunjukkan dalam
teks! Untuk memperburuk keadaan, misalkan kita memiliki jumlah
instruktur yang lebih realistis daripada yang kita tunjukkan dalam
contoh relasi kita dalam gambar, katakanlah 200 instruktur. Mari kita
asumsikan setiap instruktur mengajarkan 3 kursus, jadi kami memiliki
600 tupel dalam hubungan mengajar . Kemudian proses iteratif di atas
menghasilkan 200 ∗ 600 = 120.000 tupel dalam hasil.

3.3.3 Gabungan Alami


Dalam contoh kueri kami yang menggabungkan informasi dari instruktur
dan tabel mengajar , kondisi yang cocok membutuhkan instruktur . ID
agar sama dengan mengajar . ID . Ini adalah satu-satunya atribut dalam
dua relasi yang memiliki nama yang sama. Sebenarnya ini adalah kasus
yang umum; Artinya, kondisi pencocokan di klausa from paling sering
mengharuskan semua atribut dengan nama yang cocok disamakan.
Untuk mempermudah kehidupan pemrogram SQL untuk kasus umum
ini, SQL mendukung operasi yang disebut gabungan alami , yang kami
jelaskan di bawah ini. Sebenarnya SQL mendukung beberapa cara lain di
mana informasi dari dua atau lebih relasi dapat digabungkan . Kita telah
melihat bagaimana produk Cartesian bersama dengan predikat klausa
where dapat digunakan untuk menggabungkan informasi dari beberapa
relasi. Cara lain untuk menggabungkan informasi dari beberapa relasi
dibahas di Bagian 4.1.

The bergabung alami operasi beroperasi pada dua relasi dan


menghasilkan hubungan sebagai hasilnya. Berbeda dengan produk
C t i d i d l i b k ti t l d i l i

72 Bab 3 Pengantar SQL


Indo nama dept   nama gaji tentu saja   Indo detik  Indo semester ta
                        
                 
10101 Srinivasan Comp. Sci. 65000 CS -101 1  Jatuh 20
10101 Srinivasan Comp. Sci. 65000 CS -315 1  Musim semi 20
10101 Srinivasan Comp. Sci. 65000 CS -347 1  Jatuh 20
12121 Wu Keuangan 90000 FIN -201 1  Musim semi 20
15151 Mozart Musik 40000 MU -199 1  Musim semi 20
22222 Einstein Fisika 95000 PHY -101 1  Jatuh 20
32343 El Said Sejarah 60000 HIS -351 1  Musim semi 20
45565 Katz Comp. Sci. 75000 CS -101 1  Musim semi 20
45565 Katz Comp. Sci. 75000 CS -319 1  Musim semi 20
76766 Crick Biologi 72000 BIO -101 1  Musim panas 20
76766 Crick Biologi 72000 BIO -301 1  Musim panas 20
83821 Brandt Comp. Sci. 92000 CS -190 1  Musim semi 20
83821 Brandt Comp. Sci. 92000 CS -190 2  Musim semi 20
83821 Brandt Comp. Sci. 92000 CS -319 2  Musim semi 20
98345 Kim Elec. Eng. 80000 EE -181 1  Musim semi 20

Gambar 3.8 Gabungan alami hubungan instruktur dengan hubungan mengajar .

Relasi hasil, yang ditunjukkan pada Gambar 3.8, hanya memiliki 13


tupel, yang memberikan informasi tentang seorang instruktur dan kursus
yang sebenarnya diajarkan oleh instruktur tersebut. Perhatikan bahwa
kami tidak mengulangi atribut yang muncul di skema kedua relasi;
melainkan hanya muncul sekali. Perhatikan juga urutan atribut yang
terdaftar: pertama atribut umum untuk skema kedua relasi, kedua
atribut unik untuk skema relasi pertama, dan terakhir, atribut unik untuk
skema relasi kedua.
Pertimbangkan pertanyaan "Untuk semua instruktur di universitas
yang telah mengajar beberapa kursus, temukan nama mereka dan ID
kursus dari semua kursus yang mereka ajarkan", yang kami tulis
sebelumnya sebagai:

pilih nama , id kursus dari


instruktur , mengajar di
mana instruktur . ID =
mengajar . ID ;
Kueri ini dapat ditulis lebih ringkas menggunakan operasi
natural-join di SQL sebagai:

pilih nama , id kursus


dari instruktur natural join teaching ;

Kedua kueri di atas menghasilkan hasil yang sama.


Seperti yang kita lihat sebelumnya, hasil dari operasi gabungan alami
adalah sebuah relasi. Mengkonsep tually, ekspresi “ instruktur bergabung
alami mengajarkan ” di dari klausa diganti

3.3 Struktur Dasar Kueri SQL 73

oleh hubungan yang diperoleh dengan mengevaluasi gabungan alami. 3


The mana dan pilih klausa kemudian dievaluasi pada hubungan ini,
seperti yang kita lihat sebelumnya dalam Bagian 3.3.2.
Sebuah dari klausul dalam SQL permintaan dapat memiliki beberapa
hubungan digabungkan dengan menggunakan bergabung alami, seperti
yang ditunjukkan di sini:

pilih A 1 , A 2 ,. . . , A n
dari r 1 gabungan alami r 2 gabungan alami . . .
gabungan alami r m dimana P ;

Secara umum, klausa from bisa dalam bentuk

dari E 1 , E 2 ,. . . , E n

di mana setiap E i dapat berupa relasi tunggal atau ekspresi yang


melibatkan gabungan natural. Misalnya, kita ingin menjawab pertanyaan
“Cantumkan nama instruktur beserta judul mata pelajaran yang mereka
ajarkan”. Kueri dapat ditulis dalam SQL sebagai berikut:

pilih nama , judul


Dari instruktur natural join teaching
, kursus dimana mengajar . kursus id
= kursus . id kursus ;
Gabungan alami instruktur dan pengajar pertama kali dihitung, seperti
yang kita lihat sebelumnya, dan produk Cartesian dari hasil ini dengan
kursus dihitung, dari mana klausa di mana hanya mengekstrak tupel di
mana pengidentifikasi kursus dari hasil gabungan cocok dengan
pengidentifikasi kursus dari yang tentu saja hubungan. Perhatikan yang
mengajarkan . course id dalam klausa where merujuk pada field id dari
hasil natural join, karena field ini pada gilirannya berasal dari relasi
teaching .
Sebaliknya, kueri SQL berikut tidak menghitung hasil yang sama:

pilih nama , judul


dari instruktur natural join mengajarkan kursus natural join ;

Untuk melihat mengapa, catatan bahwa alam bergabung dari instruktur


dan mengajarkan mengandung atribut ( ID , nama , nama dept , gaji , tentu
saja id , sec id ), sedangkan kursus hubungan mengandung atribut ( tentu
saja id , judul , nama dept , kredit ). Akibatnya, gabungan natural dari
keduanya akan mensyaratkan bahwa nilai atribut nama dept dari dua
masukan harus sama, selain itu nilai id kursus harus sama. Kueri ini
kemudian akan menghilangkan semua pasangan (nama instruktur, judul
kursus) tempat instruktur mengajar kursus di departemen selain
departemen instruktur itu sendiri. Kueri sebelumnya, di sisi lain,
mengeluarkan pasangan seperti itu dengan benar.

74 Bab 3 Pengantar SQL

Untuk memberikan manfaat natural join sambil menghindari bahaya


penyamaan atribut secara keliru, SQL menyediakan bentuk konstruksi
natural join yang memungkinkan Anda menentukan kolom mana yang
harus disamakan. Fitur ini diilustrasikan oleh kueri berikut:

pilih nama , judul


dari ( instruktur natural join teaching ) mengikuti kursus menggunakan
( course id );

Operasi bergabung . . . menggunakan membutuhkan daftar nama


atribut yang akan ditentukan. Kedua masukan harus memiliki atribut
dengan nama yang ditentukan. Pertimbangkan operasi r 1 bergabung
dengan r 2 menggunakan ( A 1 , A 2 ). Operasi ini mirip dengan r 1 natural
join r 2 , kecuali a
sepasang tupel t 1 dari r 1 dan t 2 dari r 2 cocok jika t 1 . A 1 = t 2 . A 1 dan t 1 .
A 2 = t 2 . A 2 ; bahkan jika r 1 dan r 2 keduanya memiliki atribut bernama A
3 , tidak diperlukan t 1 . A 3 = t 2 . A 3 .
Jadi, dalam kueri SQL sebelumnya , izin konstruksi gabungan
mengajar . nama dept dan kursus . nama dept berbeda, dan kueri SQL
memberikan jawaban yang benar.

3.4 Operasi Dasar Tambahan


Ada sejumlah operasi dasar tambahan yang didukung di SQL .

3.4.1 Operasi Ganti Nama


Perhatikan kembali query yang kita gunakan sebelumnya:

pilih nama , id kursus dari


instruktur , mengajar di
mana instruktur . ID =
mengajar . ID ;
Hasil dari query ini adalah relasi dengan atribut berikut:

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

3.4 Operasi Dasar Tambahan 75

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:

pilih nama sebagai nama


instruktur , tentu saja id dari
instruktur , mengajarkan
dimana instruktur . ID = mengajar . ID ;

The sebagai klausul ini sangat berguna dalam penggantian nama


hubungan. Salah satu alasan untuk mengganti nama relasi adalah
mengganti nama relasi yang panjang dengan versi yang dipersingkat
yang lebih nyaman digunakan di tempat lain dalam kueri. Sebagai
ilustrasi, kami menulis ulang kueri "Untuk semua instruktur di
universitas yang telah mengajar suatu mata pelajaran, temukan nama
mereka dan ID kursus dari semua mata pelajaran yang mereka ajarkan".

pilih T . nama , S . kursus id


dari instruktur sebagai T ,
mengajarkan seperti S di
mana T . ID = S . ID ;
Alasan lain untuk mengganti nama relasi adalah kasus di mana kita
ingin membandingkan tupel dalam relasi yang sama. Kami kemudian
perlu mengambil produk Cartesian dari suatu relasi dengan dirinya
sendiri dan, tanpa mengganti nama, menjadi tidak mungkin untuk
membedakan satu tupel dari yang lain. Misalkan kita ingin menulis kueri
"Temukan nama semua instruktur yang gajinya lebih besar dari
setidaknya satu instruktur di departemen Biologi". Kita bisa menulis
ekspresi SQL :

pilih T berbeda . nama


dari instruktur sebagai T , instruktur sebagai S
dimana T. gaji > S. gaji dan S.dept name = 'Biologi';

Perhatikan bahwa kami tidak dapat menggunakan notasi instruktur. Gaji


, karena tidak jelas referensi instruktur mana yang dimaksudkan.
Dalam query di atas, T dan S dapat dianggap sebagai salinan dari
instruktur relasi , tetapi lebih tepatnya, mereka dinyatakan sebagai alias,
yaitu sebagai nama alternatif, untuk instruktur relasi . Pengidentifikasi,
seperti T dan S , yang digunakan untuk mengganti nama relasi disebut
sebagai nama korelasi dalam standar SQL , tetapi juga biasa disebut
sebagai alias tabel , atau variabel korelasi , atau variabel tupel .
Perhatikan bahwa cara yang lebih baik untuk menyusun kueri
sebelumnya dalam bahasa Inggris adalah "Temukan nama semua
instruktur yang berpenghasilan lebih dari instruktur dengan bayaran
terendah di departemen Biologi". Kata-kata asli kita lebih cocok dengan
SQL yang kita tulis, tetapi kata-kata yang terakhir lebih intuitif, dan
sebenarnya bisa diekspresikan langsung dalam SQL seperti yang akan kita

76 Bab 3 Pengantar SQL

3.4.2 Operasi String


SQL menentukan string dengan mengapitnya dalam tanda kutip tunggal,
misalnya, 'Komputer'. Karakter kutipan tunggal yang merupakan bagian
dari string dapat ditentukan dengan menggunakan dua karakter kutipan
tunggal; misalnya, string "Ini benar" dapat ditentukan dengan "Benar".
Standar SQL menentukan bahwa operasi persamaan pada string peka
huruf besar / kecil; sebagai hasilnya ekspresi "'comp. sci. ' = 'Komp. Sci.
'”Bernilai false. Namun, beberapa sistem database, seperti M y SQL dan
SQL Server, tidak membedakan huruf besar dari huruf kecil saat
mencocokkan string; sebagai hasilnya "'comp. sci. '
= 'Komp. Sci. '”Akan dievaluasi menjadi true pada database ini. Perilaku
default ini, bagaimanapun, dapat diubah, baik pada level database atau
pada level atribut tertentu.

SQL juga mengizinkan berbagai fungsi pada string karakter, seperti


menggabungkan (menggunakan ""), mengekstraksi substring,
menemukan panjang string, mengubah string menjadi huruf besar
(menggunakan fungsi upper ( s ) di mana s adalah string) dan huruf kecil
(menggunakan fungsi lower ( s )), menghilangkan spasi di ujung string
(menggunakan trim ( s )) dan seterusnya. Ada variasi pada rangkaian
fungsi string yang didukung oleh berbagai sistem database. Lihat manual
sistem database Anda untuk detail lebih lanjut tentang fungsi string yang
didukungnya.
Pencocokan pola dapat dilakukan pada string, menggunakan operator
like . Kami menggambarkan pola dengan menggunakan dua karakter
khusus:

• Persen (%): Karakter% cocok dengan substring apapun.


• Garis bawah (): Karakter cocok dengan karakter apapun.

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.

SQL mengekspresikan pola dengan menggunakan operator perbandingan


sejenis . Pertimbangkan kueri "Temukan nama semua departemen yang
nama gedungnya menyertakan substring 'Watson'." Kueri ini dapat ditulis
sebagai:

3.4 Operasi Dasar Tambahan 77

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

SQL memungkinkan kita untuk mencari ketidakcocokan daripada


kecocokan dengan menggunakan operator perbandingan tidak suka .
Beberapa database menyediakan varian operasi serupa yang tidak
membedakan huruf kecil dan huruf besar.
SQL: 1999 juga menawarkan operasi serupa , yang menyediakan
pencocokan pola yang lebih kuat daripada operasi serupa ; sintaks untuk
menentukan pola mirip dengan yang digunakan dalam ekspresi reguler
Unix.
3.4.3 Spesifikasi Atribut dalam Klausa Pilihan
Simbol asterisk "*" dapat digunakan di klausa pemilihan untuk
menunjukkan "semua atribut". Jadi, penggunaan instruktur . * Di klausa
pemilihan dari kueri:

pilih instruktur . *
dari instruktur ,
mengajarkan
dimana instruktur . ID = mengajar . ID ;

menunjukkan bahwa semua atribut instruktur harus dipilih. Sebuah


klausa pemilihan dari bentuk pilih * menunjukkan bahwa semua atribut
dari hubungan hasil dari klausa from dipilih.

3.4.4 Memesan Tampilan Tuple


SQL menawarkan pengguna beberapa kontrol atas urutan tupel dalam
suatu relasi ditampilkan. The order by klausa menyebabkan tupel dalam
hasil query untuk muncul dalam rangka diurutkan. Untuk membuat
daftar dalam urutan abjad semua instruktur di departemen Fisika, kami
menulis:
pilih nama
dari
instruktur
di mana nama dept =
'Fisika' urutan

78 Bab 3 Pengantar SQL

instruktur memiliki gaji yang sama, kami memesannya dalam urutan


naik berdasarkan nama. Kami mengungkapkan kueri ini dalam SQL
sebagai berikut:

pilih *
dari instruktur
memesan dengan desc gaji , nama asc ;

3.4.5 Dimana Klausul Predikat


SQL menyertakan operator perbandingan antara untuk
menyederhanakan klausa mana yang menentukan bahwa suatu nilai
kurang dari atau sama dengan beberapa nilai dan lebih besar dari atau
sama dengan beberapa nilai lainnya. Jika kita ingin menemukan nama
instruktur dengan gaji antara $ 90.000 dan $ 100.000, kita dapat
menggunakan perbandingan antara untuk menulis:

pilih nama
dari
instruktur
dimana gaji antara 90000 dan 100000;

dari pada:

pilih nama
dari
instruktur
dimana gaji < = 100000 dan gaji > = 90000;

Demikian pula, kita dapat menggunakan operator perbandingan antara .


Kita dapat memperluas pertanyaan sebelumnya yang menemukan
nama instruktur bersama dengan pengenal kursus, yang telah kita lihat
sebelumnya, dan mempertimbangkan kasus yang lebih rumit di mana
kita juga mensyaratkan bahwa instruktur berasal dari departemen
Biologi: “Temukan nama instruktur dan kursus yang mereka ajarkan
untuk semua instruktur di departemen Biologi yang telah mengajar
beberapa kursus. " Untuk menulis query ini, kita dapat memodifikasi
query SQL yang kita lihat sebelumnya, dengan menambahkan kondisi
ekstra di klausa where . Kami menunjukkan di bawah ini bentuk
modifikasi dari kueri SQL yang tidak menggunakan gabungan alami.

pilih nama , tentu


saja id dari
instruktur ,
mengajarkan

3.5 Mengatur Operasi 79


kursus id
CS -101
CS -347
PHY -101

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

pilih nama , tentu


saja id dari
instruktur ,
mengajarkan
di mana ( instruktur . ID , nama departemen ) = ( mengajar . ID ,
'Biologi');

3.5 Mengatur Operasi


The SQL operasi union , berpotongan , dan kecuali beroperasi pada
hubungan dan cor- respon terhadap matematika set-teori operasi ∪ , ∩ ,
dan - . Kami sekarang akan membuat kueri yang melibatkan serikat ,
berpotongan , dan kecuali operasi selama dua set.

• 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

80 Bab 3 Pengantar SQL

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.

3.5.1 Operasi Serikat Pekerja


Untuk menemukan rangkaian semua kursus yang diajarkan baik pada
Musim
6
Gugur 2009 atau Musim Semi 2010, atau keduanya, kami menulis:

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

The serikat operasi secara otomatis menghilangkan duplikasi, tidak


seperti pilih klausa. Jadi, menggunakan relasi bagian pada Gambar 2.6, di
mana dua bagian CS -319 ditawarkan pada Musim Semi 2010, dan satu
bagian dari CS -101 ditawarkan pada Musim Gugur 2009 serta pada
semester Musim Gugur 2010, CS -101 dan CS -319 muncul hanya sekali
dalam hasil, ditunjukkan pada Gambar 3.11.
Jika kita ingin menyimpan semua duplikat, kita harus menulis union di tempat union :

( 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

3.5 Mengatur Operasi 81

kursus id
CS -101
CS -315
CS -319
CS -347
FIN -201
HIS -351
MU -199
PHY -101

Gambar 3.11 Hasil relasi untuk c1 union c2 .

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

Gambar 3.12 Relasi hasil untuk c1 perpotongan c2 .

82 Bab 3 Pengantar SQL

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

3.5.3 Operasi Pengecualian


Untuk menemukan semua mata kuliah yang diajarkan pada semester
Musim Gugur 2009 tetapi tidak pada semester Musim Semi 2010, kami
menulis:

( 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 '

3.6 Nilai Nihil 83

kursus id
CS -347
PHY -101

Gambar 3.13 Relasi hasil untuk c1 kecuali c2 .

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.

3.6 Nilai Nihil

Nilai nol menghadirkan masalah khusus dalam operasi relasional,


termasuk operasi aritmatika, operasi perbandingan, dan operasi
himpunan.
Hasil dari ekspresi aritmatika (yang melibatkan, misalnya + , - , ∗ , atau
/ ) adalah nol jika salah satu nilai masukan adalah nol. Misalnya, jika
kueri memiliki ekspresi r . A + 5, dan r . A adalah null untuk tupel
tertentu, maka hasil ekspresi juga harus null untuk tupel tersebut.
Perbandingan yang melibatkan nol lebih merupakan masalah.
Misalnya, pertimbangkan perbandingan "1 < null ". Salah jika
mengatakan ini benar karena kita tidak tahu apa yang diwakili oleh nilai
nol. Tetapi juga salah untuk mengklaim ungkapan ini salah; jika kita
melakukannya, " tidak (1 < null )" akan dievaluasi menjadi benar, yang
tidak masuk akal. Oleh karena itu SQL memperlakukan sebagai tidak
diketahui hasil dari setiap perbandingan yang melibatkan nilai null
(selain predikat adalah null dan bukan null , yang akan dijelaskan nanti
di bagian ini). Ini menciptakan nilai logika ketiga selain benar dan salah .
Karena predikat dalam klausa where dapat melibatkan operasi
Boolean seperti dan , atau , dan bukan pada hasil perbandingan, definisi
operasi Boolean diperluas untuk menangani nilai yang tidak diketahui .

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

84 Bab 3 Pengantar SQL

Jika predikat klausa where mengevaluasi ke salah atau tidak


diketahui untuk sebuah tupel, tupel itu tidak ditambahkan ke hasil.
SQL menggunakan kata kunci khusus null dalam predikat untuk
menguji nilai null. Jadi, untuk menemukan semua instruktur yang
muncul dalam hubungan instruktur dengan nilai nol untuk gaji , kami
menulis:

pilih nama dari


instruktur dimana
gajinya nol ;

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.

3.7 Fungsi Agregat


Fungsi agregat adalah fungsi yang mengambil kumpulan (satu set atau
multiset) nilai sebagai input dan mengembalikan satu nilai. SQL
penawaran fi sudah built-in fungsi agregat:

• Rata-rata: rata-rata
• Minimum: min
• Maksimum: maks
• Total: jumlah
• Hitung: hitung

Input untuk menjumlahkan dan rata rata harus berupa kumpulan

3.7 Fungsi Agregat 85

3.7.1 Agregasi Dasar


Pertimbangkan kueri "Temukan gaji rata-rata instruktur di departemen
Ilmu Komputer". Kami menulis kueri ini sebagai berikut:

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 rata-rata ( gaji )


sebagai gaji rata - rata dari
instruktur
dimana nama dept = 'Comp. Sci. ';

Dalam hubungan instruktur pada Gambar 2.1, gaji di departemen


Ilmu Komputer adalah $ 75.000, $ 65.000, dan $ 92.000. Saldo rata-rata
adalah $ 232.000 / 3
= $ 77.333,33.
Mempertahankan duplikat penting dalam menghitung rata-rata.
Misalkan departemen Ilmu Komputer menambahkan instruktur keempat
yang gajinya kebetulan $ 75.000. Jika duplikat dihilangkan, kami akan
mendapatkan jawaban yang salah ($ 232.000 / 4 = $ 58.000) daripada
jawaban yang benar sebesar $ 76.750.
Ada kasus di mana kita harus menghilangkan duplikat sebelum
menghitung fungsi agregat. Jika kami ingin menghilangkan duplikat,
kami menggunakan kata kunci yang berbeda dalam ekspresi gabungan.
Sebuah contoh muncul dalam kueri "Temukan jumlah total instruktur
yang mengajar kursus di semester Musim Semi 2010." Dalam kasus ini,
instruktur hanya menghitung sekali, terlepas dari jumlah bagian kursus
yang diajarkan instruktur. Informasi yang diperlukan terkandung dalam
relasi yang diajarkan , dan kami menulis kueri ini sebagai berikut:

pilih jumlah ( ID
berbeda ) dari guru
dimana semester = 'Musim Semi' dan tahun = 2010;

Karena kata kunci berbeda dengan ID sebelumnya , bahkan jika seorang


instruktur mengajar lebih dari satu kursus, dia hanya dihitung sekali
dalam hasil.
Kami menggunakan fungsi agregat count sering untuk menghitung
jumlah tupel dalam relasi. Notasi untuk fungsi ini dalam SQL adalah
count (*). Jadi, untuk menemukan jumlah tupel dalam relasi kursus ,
kami menulis
86 Bab 3 Pengantar SQL

Indo nama dept   nama gaji


          
       
76766 Crick Biologi 72000
45565 Katz Comp. Sci. 75000
10101 Srinivasan Comp. Sci. 65000
83821 Brandt Comp. Sci. 92000
98345 Kim Elec. Eng. 80000
12121 Wu Keuangan 90000
76543 Singh Keuangan 80000
32343 El Said Sejarah 60000
58583 Cali fi eri Sejarah 62000
15151 Mozart Musik 40000
33456 Emas Fisika 87000
22222 Einstein Fisika 95000

Gambar 3.14 Tupel relasi instruktur , yang dikelompokkan berdasarkan atribut nama dept .

SQL tidak mengizinkan penggunaan differensial with count (*).


Adalah legal untuk menggunakan differensial dengan max dan min ,
meskipun hasilnya tidak berubah. Kita dapat menggunakan kata kunci
semua di tempat yang berbeda untuk menentukan retensi duplikat,
tetapi, karena semua adalah default, tidak perlu melakukannya.

3.7.2 Agregasi dengan Pengelompokan


Ada keadaan dimana kita ingin menerapkan fungsi agregat tidak hanya
pada satu set tupel, tetapi juga pada sekelompok set tupel; kami
menentukan keinginan ini dalam SQL menggunakan grup dengan klausa.
Atribut atau atribut yang diberikan dalam kelompok menurut klausa
digunakan untuk membentuk kelompok. Tupel dengan nilai yang sama
pada semua atribut dalam grup menurut klausa ditempatkan dalam satu
grup.
Sebagai ilustrasi, pertimbangkan kueri "Temukan gaji rata-rata di
setiap departemen". Kami menulis kueri ini sebagai berikut:

pilih nama dept , avg ( gaji ) sebagai


gaji rata - rata dari instruktur
kelompok dengan nama dept ;

Gambar 3.14 menunjukkan tupel dalam relasi instruktur yang


dikelompokkan berdasarkan atribut nama dept , yang merupakan
langkah pertama dalam menghitung hasil query. Agregat yang ditentukan
dihitung untuk setiap grup, dan hasil kueri ditunjukkan pada Gambar
3.15.

Sebaliknya, pertimbangkan kueri "Temukan gaji rata-rata semua


instruktur". Kami menulis kueri ini sebagai berikut:

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

Dalam hal ini grup berdasarkan klausa telah dihilangkan, sehingga


seluruh relasi diperlakukan sebagai grup tunggal.
Sebagai contoh lain dari agregasi pada grup tupel, pertimbangkan
kueri "Temukan jumlah instruktur di setiap departemen yang mengajar
kursus di semester Musim Semi 2010." Informasi tentang instruktur mana
yang mengajar bagian kursus di semester mana tersedia dalam hubungan
mengajar . Namun informasi ini harus disertai dengan informasi dari
relasi instruktur untuk mendapatkan nama jurusan masing-masing
instruktur. Jadi, kami menulis kueri ini sebagai berikut:

pilih nama dept , hitung ( ID berbeda )


sebagai jumlah instr dari instruktur natural
join mengajar
dimana semester = 'Spring' dan year =
2010 group berdasarkan nama dept ;

Hasilnya ditunjukkan pada Gambar 3.16.


Saat kueri SQL menggunakan pengelompokan, penting untuk
memastikan bahwa satu-satunya atribut yang muncul dalam pernyataan
pemilihan tanpa digabungkan adalah yang ada di grup menurut klausa.
Dengan kata lain, atribut apa pun yang tidak ada di grup menurut klausa
harus muncul hanya di dalam fungsi agregat jika muncul di klausa
pemilihan , jika tidak, kueri dianggap keliru. Misalnya, kueri berikut
keliru karena ID tidak muncul di grup menurut klausa, namun muncul di
klausa pemilihan tanpa digabungkan:

dept   nama instr  menghitung


        
Comp. Sci. 3
Keuangan 1
Sejarah 1
Musik 1

Gambar 3.16 Relasi hasil untuk kueri “ Temukan jumlah instruktur di masing-masing
departemen yang mengajar mata kuliah pada semester Musim Semi 2010. ”

88 Bab 3 Pengantar SQL

/ * kueri yang salah * /


pilih nama dept , ID , avg (
gaji ) dari instruktur
kelompok dengan nama dept ;

Setiap instruktur dalam grup tertentu (didefinisikan oleh nama dept )


dapat memiliki ID yang berbeda , dan karena hanya satu tupel yang
dikeluarkan untuk setiap grup, tidak ada cara unik untuk memilih nilai ID
mana yang akan dikeluarkan. Akibatnya, kasus seperti itu tidak diizinkan
oleh SQL .

3.7.3 Klausul Memiliki


Terkadang, sangat berguna untuk menyatakan kondisi yang berlaku
untuk grup daripada tupel. Misalnya, kami mungkin tertarik hanya pada
departemen yang gaji instrukturnya rata-rata lebih dari $ 42.000. Kondisi
ini tidak berlaku untuk satu tupel; sebaliknya, ini berlaku untuk setiap
grup yang dibangun oleh grup dengan klausa. Untuk mengekspresikan
kueri seperti itu, kami menggunakan klausa having dari SQL . SQL
menerapkan predikat dalam klausa having setelah kelompok dibentuk,
sehingga fungsi agregat dapat digunakan. Kami mengungkapkan kueri ini
dalam SQL sebagai berikut:

pilih nama dept , avg ( gaji ) sebagai


gaji rata - rata dari instruktur
grup dengan nama dept
memiliki rata-rata ( gaji ) > 42000;

Hasilnya ditunjukkan pada Gambar 3.17.


Seperti kasus klausa pemilihan , atribut apa pun yang ada di klausa
having tanpa digabungkan harus muncul di grup dengan klausa, jika
tidak, kueri akan dianggap keliru.
Arti kueri yang berisi agregasi, dikelompokkan berdasarkan , atau
memiliki klausa ditentukan oleh urutan operasi berikut:

1. Seperti kasus queri tanpa agregasi, klausa from pertama kali


dievaluasi untuk mendapatkan relasi.

dept   nama rata-rata ( rata-rata   gaji )


      
   
Fisika 91000
Elec. Eng. 80000
Keuangan 85000
Comp. Sci. 77333
Biologi 72000
Sejarah 61000

Gambar 3.17 Hasil relasi untuk query “ Temukan gaji rata-rata instruktur di dalamnya
departemen di mana gaji rata-rata lebih dari $ 42.000. ”

3.7 Fungsi Agregat 89

2. Jika terdapat klausa where , maka predikat pada klausa where


diterapkan pada relasi hasil dari klausa from .
3. Tupel yang memenuhi predikat where kemudian ditempatkan ke
dalam kelompok berdasarkan klausa jika ada. Jika grup dengan
klausa tidak ada, seluruh himpunan tupel memenuhi predikat
tempat diperlakukan sebagai dalam satu grup.
4. The memiliki klausul, jika hadir, diterapkan untuk masing-masing
kelompok; kelompok yang tidak memenuhi predikat memiliki
klausa akan dihapus.
5. The pilih klausul menggunakan kelompok yang tersisa untuk
menghasilkan tupel dari hasil query, menerapkan fungsi agregat
untuk mendapatkan hasil tuple tunggal untuk setiap kelompok.

Untuk mengilustrasikan penggunaan klausa memiliki dan klausa


where dalam kueri yang sama, kami mempertimbangkan kueri "Untuk
setiap bagian kursus yang ditawarkan pada tahun 2009, temukan total
kredit rata-rata (total kred ) dari semua siswa yang terdaftar di bagian
tersebut, jika bagian memiliki setidaknya 2 siswa. ”

pilih saja id , semester , tahun , sec id , avg (


tot CRED ) dari mengambil alami
bergabung mahasiswa
dimana tahun = 2009
kelompok berdasarkan nomor
mata kuliah , semester , tahun ,
detik dengan hitungan ( ID ) > = 2;
Perhatikan bahwa semua informasi yang diperlukan untuk permintaan
sebelumnya tersedia dari hubungan mengambil dan mahasiswa , dan
bahwa meskipun menyinggung query untuk bagian, join dengan bagian
tidak diperlukan.

3.7.4 Agregasi dengan Nilai Null dan Boolean


Nilai nol, jika ada, mempersulit pemrosesan operator agregat. Misalnya,
asumsikan bahwa beberapa tupel dalam relasi instruktur memiliki nilai
nol untuk gaji . Pertimbangkan kueri berikut untuk total semua jumlah
gaji:

pilih jumlah (
gaji ) dari
instruktur ;

Nilai yang akan dijumlahkan dalam kueri sebelumnya menyertakan nilai


null, karena beberapa tupel memiliki nilai null untuk gaji . Daripada
mengatakan bahwa jumlah keseluruhan itu sendiri nol , standar SQL
mengatakan bahwa operator penjumlahan harus mengabaikan nilai nol

90 Bab 3 Pengantar SQL

mengembalikan nilai null saat diterapkan pada koleksi kosong. Pengaruh


nilai nol pada beberapa konstruksi SQL yang lebih rumit bisa jadi tidak
kentara.
Sebuah Boolean tipe data yang dapat mengambil nilai-nilai yang
benar , palsu , dan tidak diketahui , diperkenalkan pada SQL: 1999 .
Fungsi agregat some dan every , yang berarti persis seperti yang Anda
harapkan secara intuitif, dapat diterapkan pada kumpulan nilai Boolean.

3.8 Subkueri Bersarang


SQL menyediakan mekanisme untuk membuat subkueri bertingkat.
Subkueri adalah pilihan - dari - tempat ekspresi yang bertumpuk di
dalam kueri lain. Penggunaan umum sub-kueri adalah untuk melakukan
pengujian untuk keanggotaan set, membuat perbandingan set, dan
menentukan kardinalitas set, dengan menumpuk subkueri di klausa
where . Kami mempelajari penggunaan subkueri bersarang seperti itu di
klausa where di Bagian 3.8.1 hingga 3.8.4. Di Bagian 3.8.5, kami
mempelajari penumpukan subkueri di klausa from . Dalam Bagian 3.8.7,
kita melihat bagaimana kelas subkueri yang disebut subkueri skalar
dapat muncul di mana pun ekspresi yang mengembalikan nilai dapat
terjadi.
3.8.1 Mengatur Keanggotaan
SQL memungkinkan pengujian tupel untuk keanggotaan dalam suatu
relasi. The in connective test untuk set keanggotaan, di mana himpunan
adalah kumpulan nilai yang dihasilkan oleh klausa pilih . Tidak dalam
tes ikat karena tidak adanya keanggotaan set.
Sebagai ilustrasi, pertimbangkan kembali kueri “Temukan semua
mata kuliah yang diajarkan di semester Musim Gugur 2009 dan Musim
Semi 2010.” Sebelumnya, kami menulis kueri seperti itu dengan
memotong dua kumpulan: kumpulan kursus yang diajarkan di musim
gugur 2009 dan kumpulan kursus yang diajarkan di musim semi 2010.
Kami dapat mengambil pendekatan alternatif untuk menemukan semua
kursus yang diajarkan di musim gugur 2009 dan itu juga anggota dari set
kursus yang diajarkan pada musim semi 2010. Jelas, formulasi ini
menghasilkan hasil yang sama seperti sebelumnya, tapi itu mengarahkan
kita untuk menulis query kita menggunakan in connective SQL . Kami
mulai dengan menemukan semua kursus yang diajarkan pada Musim
Semi 2010, dan kami menulis subkueri
( pilih kursus
id dari
bagian
dimana semester = 'Musim Semi' dan tahun = 2010)
Kami kemudian perlu menemukan kursus yang diajarkan pada musim
gugur 2009 dan yang muncul dalam kumpulan kursus yang diperoleh di
subkueri. Kami melakukannya dengan menumpuk subkueri di klausa
where dari kueri luar. Kueri yang dihasilkan adalah

3.8 Subkueri Bersarang 91

Contoh ini menunjukkan bahwa dimungkinkan untuk menulis kueri


yang sama dengan beberapa cara di SQL . Fleksibilitas ini
menguntungkan, karena memungkinkan pengguna untuk memikirkan
kueri dengan cara yang tampaknya paling alami. Kita akan melihat
bahwa ada sejumlah besar redundansi dalam SQL .
Kami menggunakan not in construct dengan cara yang mirip dengan
in construct. Misalnya, untuk mengetahui semua mata kuliah yang
diajarkan pada semester Musim Gugur 2009 tetapi tidak pada semester
Musim Semi 2010, kita dapat menulis:

pilih id kursus yang


berbeda dari bagian
dimana semester = 'Musim Gugur' dan
tahun = 2009 dan nomor mata kuliah
tidak masuk ( pilih nomor mata kuliah
dari bagian
dimana semester = 'Musim Semi' dan tahun = 2010);

Operator in dan not in juga dapat digunakan pada set enumerasi.


Kueri berikut memilih nama instruktur yang namanya bukan "Mozart"
atau "Einstein".

pilih nama yang


berbeda dari
instruktur
di mana nama tidak ada ('Mozart', 'Einstein');

Dalam contoh sebelumnya, kami menguji keanggotaan dalam relasi


satu atribut . Dimungkinkan juga untuk menguji keanggotaan dalam
relasi arbitrer di SQL . Misalnya, kita dapat menulis query "menemukan
jumlah total siswa (berbeda) yang telah mengambil bagian kursus yang
diajarkan oleh instruktur dengan ID 110011" sebagai berikut:

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:

92 Bab 3 Pengantar SQL

SQL memang, bagaimanapun, menawarkan gaya alternatif untuk menulis


kueri sebelumnya. Frasa "lebih besar dari setidaknya satu" diwakili
dalam SQL oleh > beberapa . Konstruksi ini memungkinkan kita untuk
menulis ulang query dalam bentuk yang sangat mirip dengan formulasi
query kita dalam bahasa Inggris.

pilih nama
dari
instruktur
dimana gaji > sebagian ( pilih
gaji dari
instruktur
dimana nama dept = 'Biologi');

Subkueri:

( pilih gaji
dari
instruktur
dimana nama dept = 'Biologi')

menghasilkan himpunan semua nilai gaji semua instruktur di


departemen Biologi. The > beberapa perbandingan di mana klausul dari
luar pilih adalah benar jika gaji nilai tuple lebih besar dari setidaknya
satu anggota dari himpunan semua nilai gaji instruktur di Biologi.
SQL juga memungkinkan < beberapa , < = beberapa , > = beberapa , =
beberapa , dan <> beberapa perbandingan. Sebagai latihan, pastikan
bahwa = beberapa identik dengan di , sedangkan <> beberapa adalah
tidak sama dengan tidak . 8
Sekarang kami sedikit memodifikasi kueri kami. Mari kita cari nama
semua instruktur yang memiliki nilai gaji lebih besar daripada setiap
instruktur di departemen Biologi. Konstruksi > semua sesuai dengan
frasa "lebih besar dari semua". Menggunakan konstruksi ini, kami
menulis kueri sebagai berikut:

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 nama dept


dari grup
instruktur
dengan nama
dept
memiliki rata-rata ( gaji ) > = semua ( pilih
rata-rata ( gaji )
dari kelompok
instruktur
berdasarkan
nama dept );

3.8.3 Menguji Hubungan Kosong


SQL menyertakan fitur untuk menguji apakah subquery memiliki tupel
dalam hasilnya. The ada membangun kembali nilai benar jika argumen
subquery tidak kosong. Menggunakan konstruksi yang ada , kita dapat
menulis kueri "Temukan semua mata kuliah yang diajarkan di semester
Musim Gugur 2009 dan di semester Musim Semi 2010" dengan cara lain
lagi:

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

Kueri di atas juga menggambarkan fitur SQL di mana nama korelasi


dari kueri luar ( S dalam kueri di atas), dapat digunakan dalam subkueri
di klausa where . Subkueri yang menggunakan nama korelasi dari kueri
luar disebut subkueri berkorelasi .
Dalam kueri yang berisi subkueri, aturan pelingkupan berlaku untuk
nama korelasi. Dalam subkueri, menurut aturannya, adalah legal untuk
menggunakan hanya nama korelasi yang didefinisikan di subkueri itu
sendiri atau dalam kueri yang berisi subkueri. Jika nama korelasi
didefinisikan baik secara lokal dalam subkueri dan secara global dalam
kueri penampung, definisi lokal berlaku. Aturan ini analog dengan aturan
pelingkupan yang biasa digunakan untuk variabel dalam bahasa
pemrograman.
Kita dapat menguji tidak adanya tupel di subkueri dengan

94 Bab 3 Pengantar SQL

pilih S yang berbeda .


ID , S . nama dari siswa
sebagai S
jika tidak ada (( pilih kursus
id dari kursus
dimana dept name =
'Biology') kecuali
( Pilih T . Tentu
saja id dari
mengambil
sebagai T di
mana S . ID = T . ID
));
Di sini, subkueri:

( pilih id
kursus dari
kursus
dimana nama dept = 'Biologi')

menemukan semua kursus yang ditawarkan di departemen Biologi. Subkueri:

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

3.8.4 Menguji Ketiadaan Duplikat Tupel


SQL menyertakan fungsi boolean untuk menguji apakah subkueri
memiliki tupel duplikat dalam hasilnya. The unik membangun 9
mengembalikan nilai benar jika argumen subquery tidak mengandung
duplikat tupel. Dengan menggunakan konstruksi unik , kita dapat
menulis kueri "Temukan semua kursus yang ditawarkan paling banyak
sekali pada tahun 2009" sebagai berikut:

pilih T . kursus
id dari kursus
sebagai T
mana yang unik ( pilih R

3.8 Subkueri Bersarang 95

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.

3.8.5 Subkueri dalam Klausul Dari


SQL memungkinkan ekspresi subquery digunakan di klausa from .
Konsep kunci yang diterapkan di sini adalah bahwa setiap
pilih - dari - di mana ekspresi mengembalikan relasi sebagai hasil dan,
oleh karena itu, dapat disisipkan ke dalam pilihan - dari - di mana pun
relasi dapat muncul.
Pertimbangkan kueri "Temukan gaji instruktur rata-rata di
departemen yang gaji rata-rata lebih dari $ 42.000." Kami menulis kueri
ini di Bagian 3.7 dengan menggunakan klausa having . Sekarang kita
dapat menulis ulang query ini, tanpa menggunakan klausa having ,
dengan menggunakan subquery dalam klausa from , sebagai berikut:

pilih nama dept , gaji rata-rata


from ( pilih nama dept avg ( gaji )

96 Bab 3 Pengantar SQL

Perhatikan bahwa kita tidak perlu menggunakan klausa having ,


karena subquery di klausa from menghitung gaji rata-rata, dan predikat
yang sebelumnya ada di klausa having sekarang berada di klausa where
dari query luar.
Kami dapat memberikan hasil subquery hubungan nama, dan
mengubah nama atribut, menggunakan sebagai klausa, seperti yang
digambarkan di bawah ini.

pilih nama dept , gaji rata-rata


dari ( pilih nama dept , rata-
rata ( gaji ) dari
instruktur
kelompok dengan nama dept )
sebagai dept avg ( nama dept
, rata-rata gaji ) dimana rata-rata
gaji > 42000;

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:

pilih max ( total gaji )


from ( pilih nama dept ,
jumlah ( gaji ) dari
instruktur
kelompok menurut nama dept ) sebagai dept total ( nama dept ,
total gaji );

Kami mencatat bahwa subkueri bersarang di klausa from tidak dapat


menggunakan variabel korelasi dari relasi lain di klausa from . Namun,
SQL: 2003 memungkinkan subquery dalam klausa from yang diawali
dengan kata kunci lateral untuk mengakses atribut tabel atau subkueri
sebelumnya dalam klausa from . Misalnya, jika kita ingin mencetak nama
masing-masing instruktur, bersama dengan gaji mereka dan gaji rata-rata
di departemen mereka, kita dapat menulis query sebagai berikut:

pilih nama , gaji , gaji rata-rata


dari instruktur I1 , lateral ( pilih rata-rata ( gaji )
sebagai gaji rata - rata dari

3.8 Subkueri Bersarang 97

3.8.6 Dengan Klausul


The dengan klausul menyediakan cara mendefinisikan hubungan
sementara yang definisi fi de tersedia hanya untuk query di mana
dengan klausul terjadi. Pertimbangkan pertanyaan berikut, yang
menemukan departemen-departemen tersebut dengan anggaran
maksimum.

dengan anggaran
maks ( nilai )
sebagai ( pilih
maks ( anggaran )
dari departemen )
pilih anggaran
dari departemen , anggaran maks
dimana departemen . anggaran = nilai anggaran maks ;

The dengan klausul mendefinisikan yang sementara hubungan max


anggaran , yang digunakan dalam query segera setelah. The dengan
klausul, diperkenalkan di SQL: 1999 , didukung oleh banyak orang, tapi
tidak semua, sistem database.
Kita bisa saja menulis kueri di atas dengan menggunakan subkueri
bersarang baik di klausa from atau klausa where . Namun,
menggunakan subkueri bertingkat akan membuat kueri lebih sulit untuk
dibaca dan dipahami. The dengan klausul membuat logika permintaan
yang lebih jelas; itu juga memungkinkan definisi tampilan untuk
digunakan di banyak tempat dalam kueri.
Misalnya, kita ingin mencari semua departemen yang gaji totalnya
lebih besar dari rata-rata gaji total di semua departemen. Kita dapat
menulis query menggunakan klausa with sebagai berikut.
dengan jumlah dept ( nama
dept , nilai ) sebagai ( pilih
nama dept , jumlah ( gaji )
dari instruktur
kelompok dengan
nama dept ), dept total
avg ( nilai ) sebagai
( pilih avg (
nilai ) dari total
dept )
pilih nama dept
dari dept total , dept total avg
dimana dept total.value > = dept total avg.value ;

Kita dapat, tentu saja, membuat kueri yang setara tanpa klausa with ,
tetapi itu akan menjadi lebih rumit dan lebih sulit untuk dipahami. Anda

98 Bab 3 Pengantar SQL

dapat digunakan dalam klausa pemilihan seperti yang diilustrasikan


dalam contoh berikut yang mencantumkan semua departemen bersama
dengan jumlah instruktur di setiap departemen:

pilih nama dept , (


pilih
hitungan (*)
dari instruktur
dimana departemen . nama dept = instruktur .
dept name ) sebagai instruktur num
dari departemen ;

Subkueri dalam contoh di atas dijamin hanya mengembalikan satu nilai


karena memiliki agregat count (*) tanpa grup oleh . Contoh ini juga
menggambarkan penggunaan variabel korelasi, yaitu, atribut hubungan
dalam dari klausa dari permintaan luar, seperti departemen . nama dept
pada contoh di atas.
Subkueri skalar dapat muncul di pilih , di mana , dan memiliki
klausa. Sub-kueri skalar juga dapat didefinisikan tanpa agregat. Tidak
selalu mungkin untuk mengetahui pada waktu kompilasi jika subquery
dapat mengembalikan lebih dari satu tupel dalam hasilnya; jika hasilnya
memiliki lebih dari satu tupel ketika subkueri dijalankan, kesalahan
waktu berjalan terjadi.

Perhatikan bahwa secara teknis jenis hasil subkueri skalar masih


berupa relasi, meskipun berisi satu tupel. Namun, ketika subkueri skalar
digunakan dalam ekspresi yang mengharapkan nilai, SQL secara implisit
mengekstrak nilai dari atribut tunggal tupel tunggal dalam relasi, dan
mengembalikan nilai tersebut.

3.9 Modifikasi Basis Data


Kami telah membatasi perhatian kami sampai sekarang pada ekstraksi
informasi dari database. Sekarang, kami menunjukkan cara menambah,
menghapus, atau mengubah informasi dengan SQL .

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
;

dimana P mewakili predikat dan r mewakili relasi. The delete


pernyataan pertama fi NDS semua tupel t di r yang P ( t ) adalah benar,
dan kemudian menghapus mereka dari r . The mana klausul dapat

3.9 Modifikasi Basis Data 99

hapus dari instruktur ;

menghapus semua tupel dari relasi instruktur . The instruktur hubungan


itu sendiri masih ada, tapi kosong.
Berikut adalah contoh permintaan penghapusan SQL :

• Hapus semua tupel dalam hubungan instruktur yang berkaitan


dengan instruktur di departemen Keuangan.

hapus dari instruktur


dimana dept name =
'Finance';
• Hapus semua instruktur dengan gaji antara $ 13.000 dan $ 15.000.
hapus dari instruktur
dimana gaji antara 13000 dan 15000;

• Hapus semua tupel dalam relasi instruktur untuk instruktur yang


terkait dengan departemen yang terletak di gedung Watson.

hapus dari instruktur


dimana nama dept di ( pilih
nama dept
dari
departemen
dimana bangunan = 'Watson');

Permintaan penghapusan ini pertama kali menemukan semua


departemen yang terletak di Watson, dan kemudian menghapus
semua tupel instruktur yang berkaitan dengan departemen tersebut.

Perhatikan bahwa, meskipun kita dapat menghapus tupel hanya dari


satu relasi pada satu waktu, kita dapat mereferensikan sejumlah relasi
dalam select-from-where yang bersarang di klausa where dari suatu
delete . The delete permintaan dapat berisi bersarang pilih bahwa
referensi hubungan yang tupel harus dihapus. Misalkan kita ingin
menghapus record semua instruktur dengan gaji di bawah rata-rata di
universitas. Kami bisa menulis:

hapus dari instruktur


dimana gaji < ( pilih avg ( gaji
) dari
instruktur );

The delete pernyataan pertama menguji setiap tuple dalam hubungan


instruktur untuk memeriksa apakah gaji kurang dari rata-rata gaji
instruktur di sity univer-. Kemudian, semua tupel yang gagal dalam
100 Bab 3 Pengantar SQL

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:

masukkan ke dalam kursus


nilai-nilai (' CS-437 ', 'Sistem Database', 'Comp. Sci.', 4);

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 kursus ( kursus id , judul , nama dept ,


kredit ) nilai ( ' CS-437 ', 'Sistem Database',, 4
'Comp Sci..');

masukkan ke kursus ( judul , tentu saja id , kredit ,


nama dept ) nilai ( 'Sistem Database', ' CS-437 ', 4,
'Comp Sci..');

Secara lebih umum, kita mungkin ingin memasukkan tupel


berdasarkan hasil kueri. Misalkan kita ingin menjadikan setiap siswa di
departemen Musik yang telah memperoleh lebih dari 144 jam kredit,
menjadi instruktur di departemen Musik, dengan gaji $ 18.000. Kami
menulis:

masukkan ke instruktur
pilih ID , nama , nama dept ,
18000 dari mahasiswa
di mana nama dept = 'Musik' dan kred total > 144;

Alih-alih menentukan tupel seperti yang kita lakukan sebelumnya di


bagian ini, kita menggunakan pilihan untuk menentukan satu set tupel.
SQL mengevaluasi pernyataan pilih terlebih dahulu, memberikan satu set
tupel yang kemudian dimasukkan ke dalam relasi instruktur . Setiap tuple
memiliki ID , nama , nama dept (Musik), dan gaji $ 18.000.
i b i k i k l i ilih

3.9 Modifikasi Basis Data 101

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:

masukkan ke dalam siswa


nilai ('3003', 'Hijau', 'Keuangan', null );

Tupel yang dimasukkan oleh permintaan ini menetapkan bahwa siswa


dengan ID "3003" ada di departemen Keuangan, tetapi nilai total
kredibilitas siswa ini tidak diketahui. Pertimbangkan pertanyaannya:

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

102 Bab 3 Pengantar SQL

perbarui instruktur
mengatur gaji = gaji * 1,05;

Pernyataan pembaruan sebelumnya diterapkan sekali ke masing-masing


tupel dalam relasi instruktur .
Jika kenaikan gaji dibayarkan hanya kepada instruktur dengan gaji
kurang dari $ 70.000, kita dapat menulis:

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

Sekarang anggaplah semua instruktur dengan gaji lebih dari $ 100.000


menerima kenaikan 3 persen, sedangkan yang lainnya menerima
kenaikan 5 persen. Kita bisa menulis dua pernyataan pembaruan :

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

3.9 Modifikasi Basis Data 103

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

Operasi mengembalikan hasil i , di mana i adalah yang pertama dari pred


1 , pred 2 ,. . . , Pred n yang puas; jika tidak ada predikat yang terpenuhi,
operasi mengembalikan hasil 0 . Pernyataan kasus dapat digunakan di
setiap tempat di mana nilai diharapkan.
Subkueri skalar juga berguna dalam pernyataan pembaruan SQL , di
mana mereka bisa digunakan dalam klausa set . Pertimbangkan
pembaruan di mana kami menetapkan atribut total cred dari setiap tupel
siswa ke jumlah kredit kursus yang berhasil diselesaikan oleh siswa.
Kami berasumsi bahwa kursus berhasil diselesaikan jika siswa memiliki
nilai bukan 'F' atau nol. Untuk menentukan pembaruan ini, kita perlu
menggunakan subquery di klausa set , seperti yang ditunjukkan di bawah
ini:
perbarui set
siswa S tot
cred = (
pilih jumlah ( kredit )
dari mengambil alami
bergabung saja di mana S
. ID = mengambil . ID dan
mengambil . grade <>
'F' dan mengambil .
nilai tidak nol );
Amati bahwa subkueri menggunakan variabel korelasi S dari pernyataan
pembaruan . Jika seorang siswa tidak berhasil menyelesaikan kursus apa
pun, pernyataan pembaruan di atas akan menyetel nilai atribut tot cred
ke null. Untuk menyetel nilainya menjadi 0, kita bisa menggunakan
pernyataan update lain untuk mengganti nilai null dengan 0; alternatif
yang lebih baik adalah mengganti klausa " pilih jumlah ( kredit )" di
subkueri sebelumnya dengan klausa pilih berikut menggunakan ekspresi
kasus :

104 Bab 3 Pengantar SQL

3.10 Ringkasan

• SQL adalah bahasa query relasional yang paling berpengaruh yang


dipasarkan secara komersial. Bahasa SQL memiliki beberapa bagian:
◦ Bahasa definisi data ( DDL ), yang menyediakan perintah untuk
mendefinisikan skema relasi, menghapus relasi, dan memodifikasi
skema relasi.
◦ Bahasa manipulasi data ( DML ), yang mencakup bahasa kueri
dan perintah untuk memasukkan tupel ke dalamnya, menghapus
tupel dari, dan memodifikasi tupel dalam database.
• The SQL Data-definisi bahasa yang digunakan untuk membuat
hubungan dengan spesifik skema fi ed. Selain menentukan nama dan
jenis atribut relasi, SQL juga memungkinkan spesifikasi batasan
integritas seperti batasan kunci-primer dan batasan kunci asing .
• SQL menyertakan berbagai konstruksi bahasa untuk kueri di
database. Ini termasuk klausa pilih , dari , dan di mana , dan
dukungan untuk operasi gabungan alami.
• SQL juga menyediakan mekanisme untuk mengganti nama atribut
dan relasi, dan untuk mengurutkan hasil query dengan menyortir
atribut yang ditentukan.
• SQL mendukung operasi set dasar hubungan termasuk serikat ,
berpotongan , dan kecuali , yang bersesuaian dengan matematika
set-teori operasi ∪ , ∩ , dan - .

• 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

• Bahasa definisi data • Contoh relasi


• Bahasa manipulasi data • Kunci utama
• Skema database • Kunci asing
• Instance database
◦ Merujuk relasi

Latihan Latihan 105

• Nilai nol • Fungsi agregat


• Bahasa pertanyaan ◦ rata-rata, min, maks, jumlah,
• Struktur kueri SQL hitung
◦ pilih klausa ◦ dikelompokkan berdasarkan
◦ dari klausa ◦ memiliki
◦ dimana klausa • Subkueri bertingkat
• Operasi gabungan alami • Atur perbandingan
• sebagai klausul ◦ {<, < = ,>,> = } { beberapa, semua }
• memesan dengan klausa ◦ ada
• Nama korelasi (variabel
◦ unik
korelasi, variabel tupel)
• Atur operasi • klausa lateral
◦ serikat pekerja • dengan klausa
◦ berpotongan • Subkueri skalar
• Modifikasi database
◦ kecuali
◦ Penghapusan
• Nilai nol
◦ Penyisipan
◦ Nilai kebenaran "tidak
diketahui" ◦ Memperbarui

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

Sebuah. Temukan judul kursus di Comp. Sci. departemen yang


memiliki 3 SKS.
b. Temukan ID semua siswa yang diajar oleh instruktur bernama
Einstein; pastikan tidak ada duplikat dalam hasil.
c. Temukan gaji tertinggi dari semua instruktur.
d. Temukan semua instruktur dengan gaji tertinggi (mungkin
ada lebih dari satu dengan gaji yang sama).
e. Temukan pendaftaran setiap bagian yang ditawarkan pada Musim
Gugur 2009.
f. Temukan pendaftaran maksimum, di semua bagian, di Musim Gugur
2009.

106 Bab 3 Pengantar SQL

orang ( id pengemudi , nama


, alamat ) mobil ( SIM ,
model , tahun )
kecelakaan ( nomor laporan , tanggal , lokasi )
memiliki ( id pengemudi , lisensi )
berpartisipasi ( nomor laporan , SIM , ID pengemudi , jumlah kerusakan
)

Gambar 3.18 Database asuransi untuk Latihan 3.4 dan 3.14.

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.

c. Temukan ID dan nilai rata - rata setiap siswa.


3.3 Tulis sisipan, hapus, atau pembaruan berikut dalam SQL ,
menggunakan skema universitas.
Sebuah. Tingkatkan gaji setiap instruktur di Comp. Sci.
departemen sebesar 10%.
b. Hapus semua kursus yang belum pernah ditawarkan (yaitu,
tidak terjadi di bagian relasi).
c. Masukkan setiap siswa yang atribut total crednya lebih dari
100 sebagai instruktur di departemen yang sama, dengan gaji
$ 10.000.
3.4 Pertimbangkan database asuransi pada Gambar 3.18, di mana
kunci primer digarisbawahi. Buat kueri SQL berikut untuk
database relasional ini.

Sebuah. Temukan jumlah total orang yang memiliki mobil yang


terlibat dalam kecelakaan pada tahun 2009.
b. Tambahkan kecelakaan baru ke database; asumsikan nilai
Latihan Latihan 107

cabang ( nama cabang , kota cabang, aset )


pinjaman pelanggan ( nama pelanggan , jalan
pelanggan, kota pelanggan ) ( nomor pinjaman ,
nama cabang, jumlah )
peminjam ( nama pelanggan , nomor pinjaman )
rekening ( nomor rekening , nama cabang,
saldo ) penyimpan ( nama nasabah ,
nomor rekening )

Gambar 3.19 Database perbankan untuk Latihan 3.8 dan 3.15.

3.5 Misalkan kita memiliki tanda hubungan ( ID , skor ) dan kita


ingin memberikan nilai kepada siswa berdasarkan skor sebagai
berikut: nilai F jika skor <40, kelas C jika skor 40 ≤ skor <60, kelas B
jika skor 60 ≤ <80, dan nilai A jika skor ≤ 80 . Tulis kueri SQL untuk
melakukan hal berikut:
Sebuah. Perlihatkan nilai tiap siswa, berdasarkan relasi nilai .
b. Temukan jumlah siswa untuk setiap kelas.
3.6 The SQL seperti operator adalah kasus sensitif, tetapi lebih rendah () fungsi
pada string
dapat digunakan untuk melakukan pencocokan tidak peka huruf
besar / kecil. Untuk menunjukkan caranya, tulis kueri yang
menemukan departemen yang namanya berisi string "sci" sebagai
substring, terlepas dari kasusnya.
3.7 Pertimbangkan kueri SQL

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

Dalam kondisi apa kueri sebelumnya memilih nilai p . a 1 yang ada


di r 1 atau di r 2? Periksa dengan cermat kasus-kasus di mana salah
satu dari r 1 atau r 2 mungkin kosong.
3.8 Pertimbangkan database bank pada Gambar 3.19, di mana kunci
primernya digarisbawahi. Buat kueri SQL berikut untuk database
relasional ini.
Sebuah. Temukan semua nasabah bank yang memiliki rekening tetapi
tidak memiliki pinjaman.
b. Temukan nama semua pelanggan yang tinggal di jalan yang
sama dan di kota yang sama dengan "Smith".
c. Temukan nama semua cabang dengan pelanggan yang
memiliki rekening di bank dan yang tinggal di "Harrison".

3.9 Pertimbangkan database karyawan pada Gambar 3.20, di mana

108 Bab 3 Pengantar SQL

karyawan ( nama karyawan , jalan , kota )


pekerjaan ( nama karyawan , nama
perusahaan , gaji ) perusahaan ( nama
perusahaan , kota )
mengelola ( nama karyawan , nama manajer )
Gambar 3.20 Database karyawan untuk Latihan 3.9, 3.10, 3.16, 3.17, dan 3.20.

b. Temukan nama, alamat jalan, dan kota tempat tinggal semua


karyawan yang bekerja untuk "First Bank Corporation" dan
dapatkan lebih dari $ 10.000.
c. Temukan semua karyawan di database yang tidak bekerja
untuk "First Bank Corporation".
d. Temukan semua karyawan di database yang berpenghasilan
lebih dari setiap karyawan "Perusahaan Bank Kecil".
e. Asumsikan bahwa perusahaan mungkin berlokasi di
beberapa kota. Temukan semua perusahaan yang berlokasi di
setiap kota di mana "Perusahaan Bank Kecil" berada.
f. Temukan perusahaan yang memiliki karyawan paling banyak.
g. Temukan perusahaan yang karyawannya mendapatkan gaji
rata-rata lebih tinggi daripada gaji rata-rata di “First Bank
Corporation”.
3.10 Perhatikan database relasional pada Gambar 3.20. Berikan
ekspresi dalam SQL untuk setiap kueri berikut.
Sebuah. Ubah database sehingga "Jones" sekarang tinggal di "Newtown".
b. Memberi semua manajer "First Bank Corporation" kenaikan
10 persen kecuali gaji menjadi lebih besar dari $ 100.000;
dalam kasus seperti itu, berikan hanya kenaikan 3 persen.

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

3.12 Tuliskan pertanyaan berikut dalam SQL , menggunakan skema universitas.


Sebuah. Buat kursus baru "CS-001", berjudul "Seminar Mingguan",
dengan 0 kredit.
b. Buat bagian dari kursus ini di Musim Gugur 2009, dengan detik id 1.
c. Daftarkan setiap siswa di Comp. Sci. departemen di bagian
atas.

d. Hapus pendaftaran di bagian atas di mana nama siswa adalah


Chavez.
e. Hapus kursus CS-001. Apa yang akan terjadi jika Anda
menjalankan pernyataan hapus ini tanpa terlebih dahulu
menghapus penawaran (bagian) dari kursus ini.
f. Hapus semua mengambil tupel yang sesuai dengan bagian
mana pun dari kursus apa pun dengan kata "database"
sebagai bagian dari judul; abaikan huruf besar / kecil saat
mencocokkan kata dengan judulnya.
3.13 Tulis SQL DDL yang sesuai dengan skema pada Gambar 3.18. Buat
asumsi yang masuk akal tentang tipe data, dan pastikan untuk
mendeklarasikan kunci utama dan asing.
3.14 Perhatikan database asuransi pada Gambar 3.18, di mana kunci
primer digarisbawahi. Buat kueri SQL berikut untuk database
relasional ini.

Sebuah. Temukan jumlah kecelakaan di mana mobil-mobil


milik "John Smith" terlibat.
b. Perbarui jumlah kerusakan mobil dengan nomor lisensi
"AABB2000" dalam kecelakaan dengan nomor laporan
"AR2197" menjadi $ 3000.
3.15 Perhatikan database bank pada Gambar 3.19, di mana kunci
primernya digarisbawahi. Buat kueri SQL berikut untuk database
relasional ini.
Sebuah. Temukan semua pelanggan yang memiliki akun di
semua cabang yang terletak di "Brooklyn".
b. Cari tahu jumlah total semua jumlah pinjaman di bank.
c. Temukan nama semua cabang yang memiliki aset lebih besar
daripada yang dimiliki setidaknya satu cabang yang berlokasi
di "Brooklyn".
3.16 Perhatikan database karyawan pada Gambar 3.20, di mana kunci
utama digarisbawahi. Berikan ekspresi dalam SQL untuk setiap
kueri berikut.
Sebuah. Temukan nama semua karyawan yang bekerja untuk
"First Bank Corpora- tion"

110 Bab 3 Pengantar SQL

d. Temukan semua karyawan yang memperoleh gaji lebih dari


rata-rata semua karyawan di perusahaan mereka.
e. Temukan perusahaan yang memiliki gaji terkecil.
3.17 Perhatikan database relasional pada Gambar 3.20. Berikan
ekspresi dalam SQL untuk setiap kueri berikut.
Sebuah. Memberi semua karyawan "First Bank Corporation" kenaikan
10 persen.
b. Beri semua manajer "First Bank Corporation" kenaikan 10 persen.
c. Hapus semua tupel dalam karya kaitannya untuk karyawan
“Bank Kecil Corporation”.
3.18 Sebutkan dua alasan mengapa nilai null mungkin dimasukkan ke dalam
database.
3.19 Tunjukkan bahwa, dalam SQL , <> semua identik dengan tidak dalam .
3.20 Berikan definisi skema SQL untuk database karyawan pada
Gambar 3.20. Pilih domain yang sesuai untuk setiap atribut dan
kunci primer yang sesuai untuk setiap skema relasi.
3.21 Perhatikan database perpustakaan pada Gambar 3.21. Tuliskan kueri
berikut dalam
SQL .
Sebuah. Cetak nama anggota yang telah meminjam buku apa
pun yang diterbitkan oleh "McGraw-Hill".
b. Cetak nama anggota yang telah meminjam semua buku
terbitan "McGraw-Hill".
c. Untuk setiap penerbit, cetak nama anggota yang telah
meminjam lebih dari lima buku dari penerbit itu.
d. Cetak jumlah rata-rata buku yang dipinjam per anggota.
Perhatikan bahwa jika seorang anggota tidak meminjam buku
apa pun, maka anggota tersebut sama sekali tidak muncul
dalam hubungan pinjaman .

3.22 Tulis kembali klausa where

mana yang unik ( pilih judul dari kursus )

tanpa menggunakan konstruksi unik .

anggota ( tidak anggota ,


nama , umur ) buku ( isbn ,
judul , penulis , penerbit )
dipinjam ( nomor anggota ,
isbn , tanggal )

Alat 111

3.23 Pertimbangkan kueri:

pilih saja id , semester , tahun , sec id , avg (


tot CRED ) dari mengambil alami
bergabung mahasiswa
dimana tahun = 2009
kelompok berdasarkan nomor
mata kuliah , semester , tahun ,
detik dengan hitungan ( ID ) > = 2;
Jelaskan mengapa bagian penggabungan juga di klausa from tidak
akan mengubah hasil.
3.24 Pertimbangkan pertanyaannya:
dengan jumlah dept ( nama
dept , nilai ) sebagai ( pilih
nama dept , jumlah ( gaji )
dari instruktur
kelompok dengan
nama dept ), dept total
avg ( nilai ) sebagai
( pilih avg (
nilai ) dari total
dept )
pilih nama dept
dari dept total , dept total avg
dimana dept total.value > = dept total avg.value ;
Tulis ulang kueri ini tanpa menggunakan with construct.

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.

Kebanyakan sistem database menyediakan antarmuka baris perintah


untuk mengirimkan perintah SQL . Selain itu, sebagian besar database
juga menyediakan antarmuka pengguna grafis ( GUI ), yang
menyederhanakan tugas menjelajahi database, membuat dan
mengirimkan kueri, dan mengelola database. IDE komersial untuk SQL
yang bekerja di berbagai platform database, termasuk RAD Studio
Embarcadero dan Aqua Data Studio.

Untuk P ostgre SQL , alat pgAdmin menyediakan fungsionalitas GUI ,


sedangkan untuk M y SQL , phpMyAdmin menyediakan fungsionalitas GUI
N tB di k f t d b k j d j l h

112 Bab 3 Pengantar SQL

instruksi tentang cara mengatur dan mengakses beberapa sistem


database populer. The SQL konstruksi dibahas dalam bab ini merupakan
bagian dari SQL standar, namun beberapa fitur tertentu tidak didukung
oleh beberapa database. Situs Web mencantumkan ketidaksesuaian ini,
yang perlu Anda perhitungkan saat menjalankan kueri pada database
tersebut.

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.

Anda mungkin juga menyukai