SQL Language
SQL Language
112
Bab
Pada bab ini akan dipelajari: Tujuan Dan Arti penting the Structured Query Language (SQL). Sejarah dan pengembangan SQL. Bagaimana untuk menulis perintah pada SQL. Bagaimana cara mendapat kembali data dari database yang menggunakan statetement SELECT. Bagaimana untuk membangun statement SQL itu: Gunakan WHERE ketentuan untuk mendapat kembali baris yang mencukupi berbagai kondisi-kondisi; sort query results using ORDER BY; use the aggregate functions of SQL; group data using GROUP BY; use subqueries; join tables together; perform set operations (UNION, INTERSECT, EXCEPT). Bagaimana untuk untuk melaksanakan pembaharuan database yang menggunakan INSERT, UPDATE, and DELETE. Di bab 3 dan 4 menggambarkan data model relasional dan bahasa relasional dalam beberapa perincian. Bahasa tertentu telah muncul dari pengembangan model relasional adalah Structured Query Language, atau yang biasanya disebut SQL, Di tahun-tahun terakhir, SQL telah menjadi standard bahasa database relasional. Di tahun 1986, suatu standard untuk SQL telah didefinisikan oleh the American National Standards Institute (ANSI), yang sesudah itu telah diadopsi pada tahun 1987 sebagai standard international oleh International Organization for Standardization (ISO. 1987). Lebih dari seratus Sistem Manajemen Database sekarang mendukung SQL, menjalankan berbagai platform hardware dari PCs hingga mainframes. Oleh karenanya sekarang SQL penting, dari buku ini mempersembahkan tiga bab untuk menguji bahasa secara detil, menyediakan suatu perawatan menyeluruh untuk kedua-duanya para pemakai yang non teknis dan teknis yang mencakup para programmer, para profesional database, dan para manajer. Dalam bab ini sebagian besar berkonsentrasi pada definisi ISO bahasa SQL, Bagaimanapun, berhubung dengan kompleksitas tentang standard ini, tidak mencoba untuk meliputi semua bagian-bagian dari bahasa itu. Di dalam bab ini, difokuskan pada statemen manipulasi bahasa data.
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
113
Idealnya, suatu bahasa database sebaiknya mengijinkan seorang pemakai untuk: menciptakan struktur relasi dan database; melaksanakan tugas manajemen data dasar. seperti penyisipan, modifikasi, dan penghapusan (delete) data dari relasi; melaksanakan kedua-duanya yang sederhana dan query yang kompleks. Suatu bahasa database harus melaksanakan tugas ini dengan pemakai minimal berusaha, dan sintaksis dan struktur perintahnya harus secara relatif mudah untuk dipelajari. Akhirnya, bahasa adalah yang harus mudah dibawa, itu harus menyesuaikan diri pada beberapa standard yang dikenal sedemikian rupa sehingga dapat menggunakan sintaksis dan struktur perintah yang sama ketika kita pindah dari satu DBMS ke yang lainnya. SQL dimaksudkan untuk mencukupi kebutuhan ini. SQL adalah suatu contoh suatu bahasa berorientasi transformasi (transformoriented language), atau suatu bahasa didesain untuk menggunakan relasi untuk mentransformasi masukan ke dalam keluaran yang diperlukan. Sebagai bahasa, ISO SQL standard mempunyai dua komponen utama:
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
114
suatu Bahasa Definisi Data (Data definition language /DDL) untuk melukiskan struktur database dan mengendalikan akses untuk data; Bahasa Manipulasi Data (Datamanipulation language /DML) untuk/karena mendapatkan kembali dan membaharui data. Sampai SQL3, SQL hanya berisi definisional ini dan perintah manipulasi; tidak berisi aliran perintah kendali, seperti IF ...THEN.ELSE, GO TO, or DO ...WHILE. Ini seharusnya adalah telah diterapkan penggunaannya suatu programming atau jobcontrol bahasa atau secara interaktif oleh keputusan pemakai. Oleh karena dengan ini ketiadaan kelengkapan komputasi, SQL dapat digunakan dua cara. Cara yang pertama adalah untuk menggunakan SQL secara interaktif dengan memasukan statemen pada suatu terminal. Cara yang kedua adalah untuk melekatkan statemen SQL di dalam prosedur melekatkan mengenai suatu bahasa, ketika mendiskusikan bab 21 yang memikat hati, Kita juga mendiskusikan SQL3, apakah yang dirumuskan tahun 1999, di dalam bab 27. SQL adalah suatu bahasa yang mudah untuk dipelajari: Ini merupakan suatu bahasa non prosedur: anda menetapkan informasi apa yang anda perlukan, dibanding/bukannya bagaimana cara mendapat/kan itu. Dengan kata lain, SQL tidak memerlukan anda untuk menetapkan metode akses data, Seperti kebanyakan bahasa modern, SQL sangat utama format bebas, yang berarti bahwa bagian-bagian dari statemen tidaklah harus dengan semacam penempatan pada layar tertentu. Struktur Perintah terdiri dari kata-kata bahasa Inggris baku seperti CREATE TABLE, INSERT, SELECT. Untuk latihan : - CREATE TABLE Staff (staffNo VACHAR(5), IName VARCHAR(15), salary DECIMAL(7,2); - INSERT INTO Staff VALUES (SGI6,Brown, 8300); - SELECT staffNo, lName, salary - FROM Staff - WHERE salary> 10000; SQL dapat digunakan oleh jajaran para pemakai yang mencakup Database Administrators (DBA), personil manajemen pengembang aplikasi dan banyak tipe lain pemakai akhir. Suatu standard internasional sekarang ada untuk bahasa SQL yang membuatnya kedua-duanya formal dan de-facto bahasa standar untuk mendefinisikankan dan memanipulasi database relasional (ISO 1992, 1999a),
Bab Lima
115
sequently diubah dengan SQL untuk alasan yang sah (Chamberlin and Boyce, 1974; Chamberlin et al, 1976). pengucapan kata-kata adalah S-Q-L . IBM memproduksi suatu prototype DBMS dasar dalam SEQUEL/2, disebut system R (Astrahan et al, 1976). Hari ini, banyak orang masih melafalkan SQL sebagai SeeQuel, meskipun demikian pengucapan kata-kata pejabat adalahS-Q-L . Tujuan prototipe ini adalah untuk memvalidasi kelayakan relasional, model. Di samping sukses lainnya, salah satu dari hasil yang paling utama telah dihubungkan dengan proyek ini adalah pengembangan SQL. Bagaimanapun. akar SQL adalah di dalam SQUARE bahasa (Menetapkan Query Sebagai Ungkapan Relasional), Yang predates Sistem R dirancang. SQUARE telah dirancang sebagai bahasa riset untuk menerapkan relasional algebra dengan kalimat Inggris (Boyce et al, 1975). Di tahun 1970 ang lalu, system database Oracle telah diproduksi dengan apa yang kini disebut Oracle Corporation, dan mungkin lebih dulu diimplementasikan yang komersil suatu DBMS relational dasar dalam SQL. INGRES yang diikuti segera setelah itu, dengan suatu bahasa query disebut QUEL, yang mana walaupun lebih 'terstruktur' dibanding SQL adalah lebih sedikit yang suka bahasa Inggris. Kapan SQL dimunculkan seperti bahasa standar database untuk sistem relasional. INGRES telah dikonversi untuk suatu SQL-based DBMS.IBM memproduksi komersil lebih dulu, disebut SQL/DS, untuk lingkungan DOS/YSE dan VM/CMS pada tahun 1981 dan 1982, berturut-turut, dan sub sequently sebagai DB2 untuk lingkungan MVS tahun 1983. Pada tahun 1982, the American National Standards Institute bekerja pada suatu Bahasa Database Relasional (Relational Database Language /RDL) dasar dalam suatu konsep tulisan dari IBM. ISO ber-join dalam pekerjaan ini pada tahun 1983, dan bersama mereka mendefinisikan standard untuk SQL. (nama RDL telah jatuh pada tahun 1984, jadilah berbalik ke suatu format yang lebih disukai yang eksisting diimplementasikan SQL) Awal Standard ISO diterbitkan tahun 1987 yang menarik sebuah derajad kritik yang bisa dipertanggung jawabkan. Janji, suatu peneliti berpengaruh di dalam area ini mengklaim hal-hal penting itu seperti integritas yang mempunyai petunjuk perintah dan relasional tertentu operator telah dihilangkan. Ia juga menunjukkan bahwa bahasa sangat berlebih lebihan; dengan kata lain, ada cara lebih dari satu untuk menulis query yang sama (tahun, 1986, 1987a, 1990). Sebagian besar kritik adalah sah, dan telah dikenali oleh standard; sebelumnya badan standard telah menerbitkan. Itu telah diputuskan, jadi bagaimanapun bahwa itu lebih penting bagi pelepasan suatu standard sejak dulu mungkin untuk menetapkan suatu basis bersama dari bahasa yang mana dan implementasi bisa kembangkan dibanding untuk menunggu sampai semua corak yang dirasakan orang-orang kini harus bisa digambarkan dan disetujui. Pada tahun 1989, ISO menerbitkan suatu addendum yang mendefinisikan Corak Peningkatan Integritas Integrity Enhancement Feature (ISO. 1989). Pada tahun 1992, revisi besar yang pertama untuk standar ISO yang terjadi, kadangkadang dikenal sebagai SQL2 atau SQL-92 (ISO. 1992). Walaupun beberapa corak standard telah didefinisikan untuk yang pertama kali, banyak dari ini yang telah diterapkan, pada sebagian atau dalam format serupa, di dalam satu atau lebih banyak orang mengimplementasikan SQL. Itu bukanlah sampai 1999 bahwa pelepasan/release standard yang berikutnya telah disusun, biasanya dikenal sebagai SQL3 (ISO, 1999a). Pelepasan/Release ini berisi corak tambahan untuk mendukung manajemen data object-oriented, yang diuji pada Bagian 27.4. Fitur bahwa yang disediakan di atas standard oleh vendor disebut perluasan. Sebagai contoh, standard menetapkan enam jenis data yang berbeda untuk data di /opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
116
dalam suatu SQL database. Banyak implementasi melengkapi daftar ini dengan berbagai perluasan. Masing-Masing implementasi SQL disebut suatu dialek. Tidak ada berbagai dua dialek persisnya mirip, dan sekarang ini tidak ada dialek yang persisnya memenuhi standard ISO. Lebih dari itu, sebagai penjual database memperkenalkan kemampuan baru, mereka yang sedang mengembangkan SQL berbagai dialek mereka dan bergeraknya bahkan lebih lanjut terpisah. Bagaimanapun, inti yang terpusat bahasa SQL adalah mempertunjukkan tanda semakin menjadi distandardisasikan ISO Walaupun SQL konsep asli semula IBM, arti pentingnya segera mendorong penjual lain untuk menciptakan implementasi mereka sendiri. Hari ini ada secara harafiah beratus-ratus SQL berdasarkan produk yang tersedia, dengan produksi baru diperkenalkan secara teratur.
5.1.4 Terminology
Standard ISO SQL tidak menggunakan terminologi relasi formal, atribut, dan tuples, sebagai gantinya menggunakan istilah tabel, kolom, dan baris. Di dalam presentasi SQL kita kebanyakan menggunakan terminologi ISO. Perlu juga dicatat bahwa SQL tidak melekat dengan kaku 10 definisi dari model internasional yang diuraikan dalam Bab 3. Sebagai contoh, SQL mengijinkan tabel diproduksi seperti hasil statemen /opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
117
SELECT dengan berisi salinan baris, itu memaksakan suatu pemesanan pada kolom, dan mengijinkan pemakai untuk memesan baris suatu tabel.
Bab Lima
118
For example: {a | b } (,c) berarti, baik a maupun b mengikuti nol atau lebih pengulangan c yang dipisahkan oleh tanda koma, Dalam praktek, statemen DDL digunakan untuk menciptakan struktur database (itu adalah, tabel) dan mekanisme akses (itulah apa masing-masing pemakai menurut hukum dapat mengakses), dan kemudian statemen DML digunakan untuk mendiami dan query tabel . Bagaimanapun, di dalam bab ini menghadirkan DML sebelum statemen DDL untuk mencerminkan pentingnya statemen DML kepada pemakai yang umum. Statemen DDL yang utama didiskusikan di dalam bab yang berikutnya.
(branchNo, street, city, postcode) (StaffNo, fName, IName, position, sex, DOB, salary, branchNo) (prooertvNo, street, city, postcode, type, rcoms, rent, ownerNo, staff No, branchNo) (clientNo, fName, IName. telNo.. prefType, maxRent) (ownerNo, fName, IName, address, telNo) (clientNo, propertyNo, viewDate. comment)
Sebelumnya mendiskusikan SQL statemen DML, itu adalah diperlukan untuk memahami dari konsep harafiah (benar-benar). Harafiah adalah tetap yang digunakan statemen SQL. Ada format yang berbeda dari harafiah untuk tiap-tiap jenis data yang didukung oleh SQL (lihat Bagian 6.1.1). Bagaimanapun, untuk kesederhanaan, dapat dibedakan antara harafiah adalah disertakan tanda kutip tunggal dan. yang bukan. /opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
119
Semua nilai data non-numerik harus disertai tanda kutip tunggal; semua data nilai non-numerik tidak harus disertai tanda kutip tunggal. Sebagai contoh. bisa digunakan harafiah untuk memasukkan/ menyisipkan data ke dalam suatu tabel:
INSERT INTO
PropertyForRent (propertyNo, street, city, postcode, type, rooms, rent, ownerNo, staff No, branchNo) VALUES (PAI4, 16 Holhead, Aberdeen, AB? 5SU, House, 6, 650.00, CO46, SA9, BOO?);
Nilai di dalam kolom kamar (rooms) adalah suatu bilangan bulat harafiah dan nilai di dalam kolom sewa (rent) adalah suatu nomor sistim desimal harafiah; mereka tidaklah terlampir tanda kutip tunggal. Semua kolom lain adalah karakter string dan terlampir tanda kutip tunggal.
[DISTINCT / ALL] {* I [columnExpression [AS newName]] [,..]} TableName [alias] [,..] condition] Column list] [HAVING condition] Column list]
columnExpression menampllkan suatu nama kolom atau suatu ungkapan, TableName adalah nama dari suatu tabel database ada atau view bahwa mempunyai untuk akses, dan alias adalah suatu singkatan opsional untuk TableName. Urutan memproses suatu statement SELECT adalah : FROM WHERE GROUP BY HAVING SELECT ORDER BY Menetapkan tabel atau tabel itu untuk digunakan Menyaring baris yang tunduk kepada beberapa kondisi Membentuk kelompok baris dengan kolom yang sama nilainya Menyaring kelompok yang tunduk kepada beberapa kondisi Menetapkan kolom yang adalah untuk nampak keluaran Menetapkan order/ pesanan keluaran
Order yang menentukan di dalam statemen SELECT tidak bisa diubah. Satu-Satunya dua ketentuan wajib dua hal pertama itu: : SELECT and FROM : sisanya adalah opsional. SELECT operasi tertutup: hasil suatu query adalah pada suatu tabel lain (lihat Bagian 4.1). Ada banyak variasi dari statemen ini, ketika sekarang diilustrasikannya. Mendapatkan kembali semua baris (Retrive all row) /opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
120
Daftar detil penuh dari semua staff. Karena tidak ada pembatasan penetapan query ini, WHERE ketentuan adalah tak perlu dan semua kolom yang diperlukan. Kita tulis query ini sebagai berikut:
SELECT staff No, fName, lName, position, sex, DOB, salary, branchNo FROM Staff:
Karena banyak SQL perolehan kembalinya memerlukan seluruh kolom suatu tabel, ada suatu cara yang cepat menyatakan 'semua kolom' di dalam SQL, dengan menggunakan suatu tanda bintang (asterisk) (*) sebagai pengganti kolom terbut. Statemen yang berikut adalah suatu padanan dan cara yang lebih pendek menyatakan query ini:
SELECT * FROM Staff: The result table in either case is shown in Table 5.1.
Tabel 5.1 Tabel Hasil untuk Contoh 5.1.
StaffNo
SL21 S037 SG14 SA9 SG5 SL41
FName Iname
John Arm David Mary Susan Julie White Beech Ford Howe Brand Lee
Position
Manager Assistant Supervisor Assistant Manager Assistant M F M F F F
Sex
DOB
1-Oct-45 10-Nov-60 24-Mar-58 19-Feb-70 3-Jun-40 13-Jun-65
salary
30000.00 12000.00 18000.00 9000.00 24000.00 9000.00
Contoh 5.2 Retrieve specific columns, all Arrows Produce a list of salaries for all staff, showing only the staff number, the first and last
Names, and the salary details. SELECT staff No, fName, IName, salary FROM Staff;
Di dalam contoh ini adalah suatu tabel baru diciptakan dari Staff yang hanya berisi kolom yang ditunjuk staffNo, fName, lName, dan salary, di dalam order yang ditetapkan. Hasil dari operasi ini ditunjukkan tabel 5.2. Catat bahwa, kecuali jika ditetapkan, baris di dalam hasil tabel tidak mungkin disortir. Beberapa DBMSs /opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
121
melakukan sort;jenis tabel hasil berdasar pada satu atau lebih kolom (sebagai contoh Microsoft Access akan sort;jenis tabel hasil ini berdasar pada kunci utama (primary key) staffNo). Kita menguraikan bagaimana cara sort baris suatu tabel hasil di dalam bagian yang berikutnya. Tabel 5.2 Tabel hasil untuk contoh 5.2.
StaffNo
SL21 SG37 SG14 SA9 SG5 SL41
fName
John Ann David Mary Susan Julie
IName
White Beech Ford Howe Brand Lee
salary
30000.00 12000.00 18000.00 9000.00 24000.00 9000.00
Contoh 5.3 Menggunakan DISTINCT Daftar nomor properti dari semua properti yang telah diamati. List the property numbers of all properties that have been viewed.
Table 5.3(a) Result table for Example 5.3 with duplicates. propertyNo PA14 PG4 PG4 PA14 PG36
Table 5.3(b) Result table for Example 5.3 with duplicates eliminated. propertyNo PA14 PG4 PG36
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
122
Contoh 5.4 Calculated fields Hasilkan daftar gaji bulanan untuk semua staff, memperlihatkan nomor staff , nama lengkap dan nama panggilan, jumlah seluruhnya, dan detil gaji. Produce a list of monthly salaries for all staff, showing the staff number, the first and last names, and the salary details.
StaffNo
SL21 SG37 SG14 SA9 SG5 SL41
fName
John Ann David Mary Susan Julie
lName
White Beech Ford Howe Brand Lee
coI4
2500.00 1000.00 1500.00 750.00 2000.00 750.00
(untuk latihan coI4); Beberapa boleh meninggalkan nama kolom yang kosong atau menggunakan ungkapan masuk ke dalam SELECT list. Standard ISO mengijinkan kolom untuk dinamai dengan menggunakan suatu AS ketentuan. Di dalam contoh yang sebelumnya, kita sudah bisa sudah menulis :
Bab Lima
123
Dalam contoh ini kepala kolom hasil tabel akan monthlySalary melainkkan coI4. Baris pilihan (WHERE clause) Di atas contoh menunjukkan penggunaan statemen SELECT untuk mendapatkan kembali semua baris dari suatu tabel. Bagaimanapun, kita sering harus membatasi baris yang didapat kembali. Ini dapat dicapai dengan ketentuan WHERE, yang terdiri dari kata kunci WHERE yang diikuti oleh suatu kondisi pencarian yang menetapkan baris itu untuk didapat kembali. Lima kondisi-kondisi pencarian basis dasar (atau sebutan yang menggunakan terminology ISO) sebagai berikut: Comparison (perbandingan) Membandingkan nilai satu ungkapan kepada nilai dari ungkapan lain.Compare the value of one expression
List all-staff with a salary greater than 10,000. SELECT staff No, fName, IName, position, salary FROM Staff WHERE salary > 10000;
Di sini, tabel adalah Staff dan predikat adalah gaji > 1000. Selection menciptakan suatu tabel baru berisi hanya baris Staff dengan suatu gaji lebih besar dari 10,000. Hasil dari operasi ini ditunjukkan pada tabel 5.5.
Di dalam SQL, perbandingan sederhana yang berikut operator adalah tersedia: /opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
124
Sama dengan tidaklah sepadan dengan (standar ISO) Lebih kecil Lebih besar Bukan sama untuk (beberapa yang diijinkan dalam berbagai dialek) Lebih kecil atau sama dengan Lebih besar atau sama dengan
Predikat yang lebih rumit dapat dihasilkan menggunakan operator logika AND, OR dan NOT, More complex predicates can be generated using the logical operators AND, OR, and NOT, dengan tanda kurung ( jika diperlukan atau diinginkan) untuk menunjukkan order evaluasi. Aturan untuk mengevaluasi suatu ungkapan bersyarat adalah: suatu ungkapan dievaluasi sebelah kiri untuk. Sebelah kanan (expression is evaluated left to. right;) subexpressions di dalam tanda-kurung dievaluasi dulu ; NOTs adalah dievaluasi sebelumnya ANDs dan ORs; ANDs adalah dievaluasi sebelimnya ORs. Penggunaan tanda kurung selalu direkomendasikan dalam rangka memindahkan apa saja yang mungkin rancua.
Contoh 5.6 Perbandingan Campuran mencari kondisi Daftar alamat seluruh seluruh kamtor cabang di London atau Glasgov. List the addresses of all branch offices in London or Glasgow.
branchNo
B005 B003 B002
Street
22 Der Rd 163 Main St 56 Clover Dr
City
London Glasgow London
Postcode
SW14EH G1119QX NW106EU
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
125
Contoh 5.7 Range (cakupan) kondisi mencari (search) (BETWEEN/NOT BETWEEN) Daftar seluruh staff dengan gaji antara 20,000 and 30,000. List all staff with a salary between 20,000 and 30,000.
SELECT StaffNo, fName, lName, position, salary FROM Staff WHERE salary BETWEEN 20000 AND 30000;
BETWEEN termasuk pengujian titik akhir pada range (cakupan), juga apapun anggota staff dengan gaji 20,000 atau 30,000 akan tercakup dihasilnya. Tabel hasil diperlihatkan dalam Tabel 5.7. Table 5.7 Tabel hasil Contoh 5.7.
StaffNo
SL21 SG5
fName
John Susan
Iname
White Brand
position
Manager Manager
Salary
30000.00 24000.00
Ada juga suatu versi yang ditiadakan range (cakupan) pengujian (NOT BETWEEN) itu diperiksa untuk nilai yang diluar range (cakupan).. BETWEEN test tidak menambahkan kebanyakan kekuatan SQL yang ekspresif, sebab dapat dinyatakan baik sama dengan menggunakan dua test perbandingan. Kita sudah bisa menyatakan query di atas sebagai berikut :
SELECT staffNo, fName, IName, position, salary FROM Staff WHERE salary >= 20000 AND salary < = 30000;
Bagaimanapun, BETWEEN test adalah suatu cara yang lebih sederhana untuk menyatakan suatu kondisi pencarian ketika mempertimbangkan range (cakupan) nilainilai.
Contoh 5.8 Set membership search condition (IN/NOT IN) Daftar seluruh manajer dan supervisor List all managers and supervisors.
SELECT staffNo, fName, IName, position FROM Staff WHERE position IN (Manager, Supervisor);
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
126
Keanggotaan yang di-set menguji (IN) menguji apakah nilai data matching daftar nilai-nilai, dalam hal ini juga Manager atau Supervisor. Tabel Hasil ditunjukkan pada Tabel 5.8. Ada suatu ditiadakan versi (NOT IN) bahwa dapat digunakan untuk melihat kemungkinan nilai-nilai data yang tidak palsu dalam suatu daftar spesifik nilai-nilai. Seperti BETWEEN, the IN test kebanyakan tidak menambahkan tenaga SQL yang ekspresif. Kita sudah bisa menyatakan di atas query sebagai berikut: Tabel 5.8 Tabel hhasil untuk Contoh 5.8.
StaffNo
SL21 SG14 SG5
Fname
John David Susan
lName
White Ford Brand
position
Manager Supervisor Manager
SELECT staffNo, fName, IName, position FROM Staff WHERE position = Manager" OR position = Supervisor;
Bagaimanapun, IN test menyediakan suatu cara yang efisien yang menyatakan kondisi pencarian, terutama sekali jika di-set berisi nilai-nilai banyak.
Contoh 5.9 Pattern match search condition (LIKE/NOT LIKE) Temukan semua pemilik dengan string 'Glasgow' di dalam alamat mereka. Find all owners with the string Glasgow in their address. Karena query ini, kita harus mencari-cari untuk Glasgow muncul di suatu tempat di dalam kolom alamat table PrivateOwner. SQL mempunyai dua pola teladan khusus yang mempertemukan simbol : % karacter persen menampilkan manapun urutan nol atau lebih karakter ( wildcard), _ karakter garis bawah (underscore) apapun karakter tunggal.
Semua lain karakter di dalam pola menampilkan diri mereka. Sebagai contoh: address LIKE H% berarti karakter yang pertama harus H, hanyalah sisanya string apapun dapat. address LIKE H_ _ _ berarti bahwa harus ada persisnya empat karakter di dalam string, yang pertama di mana harus suatu H. address LIKE %e berarti apapun urutan panjangnya karakter sedikitnya I. dengan karakter yang terakhir adalah suatu e.
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
127
address LIKE %Glasgow% berarti urutan karakter tentang segala panjangnya berisi Glasgow. address NOT LIKE H% berarti karakter yang pertama tidak bisa jadilah suatu H.
Jika pencarian string dapat meliputi pattern-matching karakter dirinya sendiri, kita dapat menggunakan suatu karakter yang lepas untuk menampilkan pattern-matching karakter. Untuk latihan, untuk melihat kemungkinan 15%, kita dapat menggunakan predikat (predicate) :
Ownero
CO87 CO40 CO93
fName
Carol Tina Tony
lName
Farrel Murphy Shaw
position
6 Achray St. Glasgow G32DX 63 Well St, Glasgow G42 12 park PI, Glasgow G4 0QR
telNo
0141-357-7419 0141-943-1728 0171-225-7025
SELECT ownerNo, fName, IName, address, telNo FROM PrivateOwner WHERE address LIKE %Glasgow%;
Contoh 5.10 NULL kondisi pebarian (IS NULL IS NOT NULL) Daftar detil dari semua viewings pada properti PG4 di mana suatu komentar belum disediakan: List the details of all viewings on property PG4 where a comment has not been supplied: Dari Viewing tabel gambar 3.3, kita dapat lihat bahwa ada dua pengamatan untuk properti PG4: satu dengan suatu komentar, lain tanpa suatu komentar. Di dalam contoh sederhana ini, anda boleh berpikir bahwa baris yang belakangan bisa diakses dengan penggunaan salah satu dari kondisi-kondisi pencarian:
(propertyNo = ; PG4 AND comment = ) or, (propertyNo = PG4 AND comment < > too remote)
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
128
Bagaimanapun, kondisi-kondisi ini tidak akan bekerja. Suatu komentar batal (null) dipertimbangkan untuk mempunyai suatu nilai yang tak dikenal, maka kita tidak bisa menguji apakah itu adalah sama atau tidak sepadan dengan string lain. Jika kita mencoba untuk melaksanakan SELECT statemen yang menggunakan yang manapun kondisi-kondisi campuran ini, kita akan mendapatkan suatu tabel hasil kosong. Sebagai gantinya, kita harus menguji untuk yang batal (nul) dengan tegas menggunakan kata kunci yang khusus IS NULL:
SELECT clientNo, viewDate FROM Viewing WHERE propertyNo = PG4 AND comment IS NULL;
Tabel hasil yang ditunjukkan tabel 5,10. Versi yang ditiadakan (IS NOT NULL) dapat digunakan untuk test nilai-nilai yang tidaklah batal (null). Tabel 5.10 Tabel hasil untuk Contoh 5.10.
clientNo CR56
viewDate 26-May-01
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
129
Contoh 5.11 Kolom tunggal ordering Hasilkan daftar gaji untuk semua staff, yang diatur turun order gaji. Produce a list of salaries for all staff, arranged in descending order of salary.
SELECT staffNo, fName, IName, salary FROM Staff ORDER BY salary DESC;
Contoh ini adalah yang sangat serupa dengan Contoh 5.2. Perbedaan dalam hal ini adalah bahwa keluaran yang diharapkan untuk diatur turun order gaji. Ini adalah dicapai dengan menambahkan ORDER BY ketentuan kepada akhir statemen SELECT, menetapkan gaji sebagai kolom untuk disortir, dan DESC untuk mengindisikan bahwa order itu diharapkan untuk turun. Dalam hal ini, kita mendapatkan tabel hasil yang ditunjukkan pada Tabel 5.11. Catat bahwa kita sudah bisa menyatakan ORDER BY ketentuan sebagai : ORDER BY 4 DESC, dengan 4 yang berkenaan dengan kolom yang keempat menyebut SELECT daftar, yakni gaji.
StaffNo
SL21 SG37 SG14 SG5 SA9 SL41
fName
John Ann David Susan Mary Julie
lName
White Beech Ford Brand Howe Lee
Salary
30000.00 12000.00 18000.00 24000.00 9000.00 9000.00
Junlah kolom adalah suatu yang corak diprotes standar ISO dan harus tidak digunakan, Itu adalah mungkin untuk meliputi unsur lebih dari satu di dalam ORDER BY ketentuan. Kunci Sort yang utama menentukan aturan umum tabel hasil. Di dalam Contoh 5.11, kunci sort yang utama adalah gaji. Jika nilai-nilai kunci sort yang utama adalah unik, tidak ada kebutuhan untuk kunci tambahan mengendalikan sort. Bagaimanapun, jika nilai-nilai kunci sort yang utama tidaklah unik, mungkin ada berbagai baris dengan tabel hasil dengan nilai yang sama untuk sort yang utama. Dalam hal ini, mungkin saja diinginkan untuk memesan baris dengan nilai yang sama untuk kunci sort yang utama oleh beberapa sort tambahan. Jika suatu elemen detik/second nampak ORDER BY ketentuan, itu disebut suatu kunci sort (pelajaran) pelengkap.
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
130
Contoh 5.12 Multiple column ordering Hasilkan suatu daftar property disingkat diatur disusun menurut tipe properti. Produce an abbreviated list of properties arranged in order of property type.
PropertyNo
PL94 PG4 PG36 PG16 PA14 PG21
type
Flat Flat Flat Flat House House
rooms
4 3 3 4 6 5
Rent
400 350 375 450 650 600
Ada empat flat di dalam daftar ini. Ketika kita tidak menetapkan sort kecil apapun, sistem menyusun baris ini di dalam order manapun itu memilih. Untuk menyusun properti disusun menurut sewa, kita menetapkan suatu orderkecil, sebagai berikut:
SELECT propertyNo, type, rooms, rent FROM PropertyForRent ORDER BY type, rent DESC;
Sekarang, hasilnya adalah diperintah pertama oleh tipe properti, di dalam kenaikan secara alfabet memesan (ASC disebut default yang menentukan), dan di dalam tipe properti, di dalam order sewa yang turun. Dalam hal ini, kita mendapatkan tabel hasil itu yang ditunjukkan pada Tabel 5.12(b). Table 5.12(b) Tabel Hasil untuk Contoh 5.12 with two sort keys.
PropertyNo
PL94 PG4 PG36 PG16 PA14 PG21
type
Flat Flat Flat Flat House House
rooms
4 3 3 4 6 5
Rent
400 350 375 450 650 600
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
131
Standard ISO menetapkan null itu adalah suatu kolom atau ungkapan dengan mensortir ORDER BY harus diperlakukan sebagai yang baik kurang dari semua nilainilai tidak batal maupun lebih besar dari semua nilai-nilai non-null. Pilihan yang ditinggalkan untuk pelaksana DBMS.
banyaknya nilai-nilai di dalam suatu kolom ditetapkan; penjumlahan nilai-nilai di dalam suatu kolom ditetapkan; rata-rata nilai-nilai di dalam suatu kolom ditetapkan; nilai yang paling kecil di dalam suatu kolom ditetapkan; nilai yang paling besar di dalam suatu kolom ditetapkan.
Fungsi ini beroperasi pada kolom yang tunggal suatu tabel dan kembalikan nilai tunggal. COUNT, MIN, dan MAX diaplikasikan untuk kedua-duanya field numeric dan non-numerik, tapi SUM dan AVG hanya diperbolehkan digunakan pada gield numeric. Terlepas dari COUNT (*) setiap fungsi menghapuskan pertama null dan beroperasi hanya pada yang sisanya nilai non-null, COUNT (*) adalah suatu penggunaan yang khusus COUNT, yang mana counts semua baris suatu tabel, dengan mengabaikan apakah batal atau duplikasi nilai-nilai terjadi. Jika kita ingin menghapuskan duplikasi sebelum fungsi diterapkan, kita menggunakan kata kunci DISTINCT sebelum kolom menyebut fungsi. Standar ISO mengijinkan kata kunci ALL untuk ditetapkan jika kita tidak ingin menghapuskan duplikasi, walaupun ALL diasumsikan jika tidak ada apapun yang ditetapkan. DISTINCT tidak punya efek dengan MIN dan MAX berfungsi. Bagaimanapun, mungkin berpengaruh atas hasil SUM atau AVG, maka pertimbangan harus diberikan kepada apakah duplikasi harus dimasukkan atau dikeluarkan perhitungan [itu]. Sebagai tambahan, DISTINC dapat ditetapkan hanya sekali dalam query. Adalah penting untuk dicatat bahwa suatu fungsi kumpulan dapat digunakan hanya di dalam SELECT daftar dan di dalam HAVING ketentuan (lihat Bagian 5.3.4). Itu adalah salah untuk digunakannya di tempat lain. Jika SELECT daftar meliputi suatu fungsi kumpulan dan tidak ada GROUP BY ketentuan yang digunakan untuk data kelompok bersama-sama (lihat Bagian 5.3.41. kemudian tidak ada item di dalam SELECT daftar dapat meliputi acuan manapun bagi suatu kolom kecuali jika yang kolom adalah argumentasi bagi suatu kumpulan berfungsi. Sebagai contoh. query yang berikut adalah tidak sah:
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
132
Contoh 5.13 Use of COUNT(*) Berapa banyak berharga property lebih dari 350 per bulan untuk disewa? How many properties cost more than 350 per month to rent?
My count 2
Contoh 5.14 Menggunakan COUNT(DISTINCT) Berapa banyak kekayaan berbeda telah dipandang pada bulan Mei 2001? How many different properties were viewed in May 2001?
SELECT COUNT(DISTINCT propertyNo) AS my count FROM Viewing WHERE viewDate BETWEEN 1-May-01 AND 31-May-01;
Lagi, membatasi query bagi yang mengamati yang terjadi pada bulan Mei 2001 dicapai menggunakan WHERE ketentuan. Total jumlah yang mengamati memuaskan kondisi ini kemudian bisa ditemukan dengan menerapkan COUNT fungsi kumpulan. Bagaimanapun, seperti properti yang sama mungkin adalah dipandang banyak sekali, kita harus menggunakan Kata kunci yang DISTINCT untuk menghapuskan duplikasi properti. Tabel Hasil ditunjukkan pada Tabel 5.14. Tabel 5.14 Tabel Hasil intuk Contoh 5.14.
My count 2
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
133
Contoh 5.15 Use of COUNT and SUM Temukan total jumlah Para manajer dan penjumlahan dari gaji mereka. Find the total number of Managers and the sum of their salaries.
SELECT COUNT(staffNo) AS my count, SUM(salary) AS my sum FROM Staff WHERE position = Manager;
Batasi query itu ke Para manajer dicapai menggunakan WHERE ketentuan. Banyaknya Para manajer dan penjumlahan dari gaji mereka dapat ditemukan dengan menerapkan COUNT dan SUM fungsi yang berturut-turut pada di-set yang terbatas ini . Tabel Hasil ditunjukkan pada Tabel 5.15. Tabel 5.15 Tabel Hasil untuk Contoh 5.15.
My count
2
My sum
54000.00
Contoh 5.16 Menggunakan MIN, MAX, AVG Temukan minimum, maximum, dan rata-rata gaji staff.
my min 9000.00
my max 30000.00
my avg 17000.00
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
134
5.3.4
Di atas query ringkasan adalah serupa kepada total pada dasarnya suatu laporan. Mereka memadatkan semua data yang terperinci di dalam laporan ke dalam baris ringkasan data tunggal. Bagaimanapun, itu adalah sering berguna bagi yang mempunyai subtotal di dalam laporan. Kita dapat menggunakan GROUP BY ketentuan SELECT statemen untuk melakukan ini. Suatu query yang meliputi GROUP BY itu mengelompokkan query, sebab menggolongkan data itu dari SELECT table-tabel dan menghasilkan baris ringkasan tunggal untuk masing-masing kelompok. Kolom nama GROUPBY ketentuan disebut itu digolongkan kolom. ISO standard memerlukan itu SELECTketentuan dan GROUP BY ketentuan untuk lekat terintegrasi. Kapan GROUP BY digunakan, masing-masing item di dalam SELECT daftar harus bernilai tunggal setiap menggolongkan. Lebih lanjut, SELECT ketentuan boleh hanya berisi: column names (nama-nama kolom) ; aggregate functions (kumpulan fungsi); constants; (tetap); an expression involving combinations of the above (suatu ungkapan yang menyertakan kombinasi di atas).
Semua kolom menyebut SELECT daftar harus nampak ketentuan GROUP BY kecuali jika nama digunakan hanya di dalam suatu kumpulan yang berfungsi. Kontroversi tidaklah benar: mungkin ada kolom menyebut GROUP BY ketentuannya yang tidak nampak SELECT mendaftar. Ketika WHERE ketentuan digunakan di GROUP BY, ketentuan WHERE diterapkan dulu, kemudian kelompok dibentuk dari baris yang sisanya mencukupi kondisi pencarian itu. Standar ISO mempertimbangkan dua batal (null) untuk yang sama tujuan ketentuan GROUP BY. Jika dua baris mempunyai batal (null) yang sama menggolongkan kolom dan nilai-nilai yang serupa di semua yang tidak batal (null) menggolongkan kolom, mereka dikombinasikan ke dalam kelompok yang sama.
Contoh 5.17 Menggunakan GROUP BY Find the number of staff working in each branch and the sum of their salaries.
SELECT branchNo, COUNT(staffNo) AS my count, SUM (salary) AS my sum FROM Staff GROUP BY branchNo ORDER BY branchNo:
Itu bukanlah diperlukan untuk meliputi staff nama kolom tidak ada dan gaji di dalam daftar GROUP BY sebab mereka nampak hanya di dalam daftar SELECT di dalam kumpulan fungsi. Pada sisi lain, branchNo tidaklah dihubungkan dengan suatu kumpulan fungsi dan demikian harus nampak daftar GROUP BY. Tabel Hasil ditunjukkan Tabel 5.17. /opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
135
BranchNo
B003 B005 B007
my count
3 2 1
my sum
54000.00 39000.00 9000.00
Secara konseptual, SQL melaksanakan query [itu] sebagai berikut (1) SQL membagi staff ke dalam kelompok menurut nomor-nomor cabang mereka masingmasing . Di dalam masing-masing kelompok. semua staff mengenal baik samacabang . Di dalam contoh ini, kita mendapatkan tiga kelompok:
(2) branchNo
B003 B003 B003 B005 B005 B007
staffNo
Salary
COUNT(staffNo)
SUM(salary)
3 2 1
3 2 1
(3)
(4)
Karena masing-masing kelompok, SQL menghitung banyaknya anggota staff dan mengkalkulasi penjumlahan nilai-nilai di dalam kolom gaji untuk mendapatkan total gaji mereka. SQL menghasilkan ringkasan baris tunggal hasil query untuk masing-masing kelompok. Akhirnya, hasil disortir dalam urutan menaik nomor, branchNo.
Standar SQL mengijinkan SELECT daftar untuk berisi query menerima (lihat Bagian 5.3.5). Oleh karena itu, kita dapat juga menyatakan atas query sebagai :
SELECT branchNo, (SELECT COUNT(staffNo) AS my count FROM Staff s WHERE s.branchNo = b.branchNo). (SELECT SUM(salary) AS my sum FROM Staff s WHERE s.branchNo = b.branchNo} FROM Branch b ORDER BY branchNo;
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
136
Dengan versi query ini . bagaimanapun, dua nilai-nilai kumpulan diproduksi untuk masing-masing kantor cabang di dalam Cabang, dalam beberapa hal mungkin dengan nilai nol.
Pembatasan pengelompokan (ketentuan HAVING) HAVING ketentuan dirancang untuk menggunakan dengan GROUPBY ketentuan untuk membatasi kelompok yang terlihat pada tabel hasil yang akhir. Walaupun sintaksis serupa, HAVING dan WHERE melayani tujuan yang berbeda. WHERE ketentuan menyaring baris individu yang memasuki tabel hasil yang akhir, sedangkan HAVING menyaring kelompok yang memasuki tabel hasil yang akhir. Standar ISO memerlukan bahwa nama kolom menggunakan HAVING ketentuan harus pula nampak GROUP BY daftar atau dimasukkan di dalam suatu kumpulan fungsi. Dalam praktek, kondisi pencarian di dalam HAVING ketentuan selalu meliputi sedikitnya satu fungsi kumpulan, jika tidak pencarian kondisi bisa dipindah ke WHERE ketentuan yang tidak d diberlakukan bagi baris individu. ( Ingat bahwa kumpulan fungsi tidak bisa digunakan WHERE ketentuan.) HAVING ketentuan bukanlah suatu bagian dari perlu SQL - manapun query yang yang dinyatakan menggunakan HAVING ketentuan dapat selalu ditulis ulang tanpa HAVING ketentuan.
Contoh 5.18 Menggunakan HAVING Karena masing-masing kantor cabang dengan anggota lebih dari satu staff temukan banyaknya staff yang bekerja pada setiap cabang dan penjumlahan gaji mereka For each branch office with more than one member of staff find the number of staff working in each branch and the sum of their salaries.
SELECT branchNo, COUNT(staffNo) AS my count, SUM (salary) AS my sum FROM Staff GROUP BY branchNo HAVING COUNT(staffNo) > 1 ORDER BY branchNo;
Ini adalah serupa dengan contoh yang sebelumnya dengan pembatasan tambahan yang kita ingin pertimbangkan hanya kelompok itu (itu adalah, cabang) dengan mengorganisir anggota lebih dari satu. Pembatasan ini berlaku bagi kelompok itu dan demikian HAVING ketentuan digunakan. Tabel Hasil ditunjukkan pada Tabel 5.18. Tabel 5.18 Tabel Hasil untuk contoh 5.18.
BranchNo
my count
my sum
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
137
B003 B005
3 2
54000.00 39000.00
5.3.5 Subqueries
Di dalam bagian ini kita menguji penggunaan suatu SELECT statemen lengkap yang ditempelkan di dalam SELECT statemen lain. Hasil dari [yang] bagian dalam ini, SELECT statemen (atau subselect) digunakan statemen yang luar untuk membantu menentukan indeks hasil yang akhir. Suatu subselect dapat digunakan WHERE dan HAVING ketentuan dari suatu SELECT statemen luar, di mana itu disebut suatu subquery atau sekumpulan query. Subselect boleh juga terlihat di dalam INSERT, UPDATE. Dan DELETE statemen (lihat Selection 5.3.10). Ada tiga jenis subquery: A scalar subquery mengembalikan kolom tunggal dan baris tunggal; itu adalah, nilai tunggal. Pada prinsipnya, suatu skalar subquery dapat digunakan kapan saja nilai tunggal diperlukan. Contoh 5.13 dan 5.14 adalah skalar subqueries. A row subquery mengembalikan berbagai kolom, tetapi lagi hanya baris tunggal. Suatu baris subquery dapat digunakan kapan saja suatu pembangun nilai baris diperlukan, secara khas di dalam predikat. Contoh 5.15 adalah suatu baris subquery. A table subquery mengembalikan satu atau lebih kolom dan berbagai baris. Suatu tabel subquery dapat digunakan kapan saja suatu tabel diperlukan, sebagai contoh, sebagai suatu operand untuk predikat IN.
Contoh 5.19 Penggunaan suatu subquery dengan persamaan Daftar staff siapa yang bekerja cabang pada ' 163 Main St '. List the staff who work in the branch at 163 Main St.
SELECT staff No, fName, IName, position FROM Staff WHERE branchNo = (SELECT branchNo FROM Branch WHERE street = 163 Main St);
Statemen SELECT yang bagian dalam (Select branchNo FROMbranch...) temukan nomor cabang yang sesuai dengan cabang dengan nama jalan ' 163 Main St' (akan ada hanya satu . seperti nomor cabang, ini juga adalah contoh suatu skalar subquery). setelah memperoleh nomor cabang ini, SELECT statemen yang luar kemudian mendapat kembali detil dari semua staff siapa yang bekerja pada cabang ini. Dengan kata lain, SELECT bagian dalam mengembali[kan suatu tabel hasil yang berisi nilai tunggal '8003', sesuai dengan cabang pada ' 163 Main St'. dan SELECT yang luar menjadi :
Bab Lima
138
Table 5.19
StaffNo
SG37 SG14 SG5
fName
Ann David Susan
lName
Beech Ford Brand
Position
Assistant Supervisor Manager
Kita dapat berpikir tentang subquery sebagai memproduksi suatu tabel temporer dengan hasil yang dapat diakses dan digunakan oleh statemen yang luar. Suatu subquery dapat digunakan dengan seketika mengikuti suatu operator relasional (=, <, >, <=. > =. < di dalam suatu WHERE ketentuan, atau HAVING ketentuan. Subquery dirinya sendiri selalu terlampir tanda kurung. Contoh 5.20 Menggunakan suatu subquery dengan an aggregate fungsi Daftar semua staff gaji siapa adalah lebih besar dari rata-rata gaji, dan menunjukkan seberapa banyak gaji mereka adalah lebih besar dari rata-rata. List all staff whose salary is greater than the average salary, and show by how much their salary is greater than the average.
SELECT staffNo, fName, IName, position. Salary- (SELECT AVG(salary) FROM Staff) AS salDiff FROM Staff WHERE salary > (SELECT AVG(salary) ,FROM Staff);
Pertama, catatan yang kita tidak bisa tulis ' WHERE salary > AVG (salary), sebab kumpulan fungsi tidak bisa digunakan WHERE ketentuan. Sebagai gantinya, kita menggunakan suatu subquery untuk temukan itu rata-rata gaji, dan kemudian menggunakan SELECT statemen yang luar untuk temukan staff itu dengan suatu gaji lebih besar dari ini rata-rata. Dengan kata lain, subquery kembali[kan rata-rata gaji sebagai 17.000. Catat juga penggunaan skalar subquery di dalam SELECT mendaftar, untuk menentukan perbedaan dari rata-rata gaji. Query yang luar dikurangi kemudian untuk:
SELECT staff No, fName, lName, position, salary 17000 AS salDiff FROM Staff WHERE salary > 17000;
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
139
StaffNo
SG37 SG14 SG5
Fname
Ann David Susan
IName
Beech Ford Brand
position
Assistant Supervisor Manager
salDiff
13000.00 1000.00 7000.00
Aturan yang berikut berlaku bagi subqueries: (1) (2) (3) Ketentuan ORDER BY tidak boleh digunakan dalam suatu subquery (walaupun mungkin saja digunakan statemen SELECT yang paling jauh). Subquery SELECT Daftar harus terdiri dari ungkapan atau nama kolom tunggal, kecuali subqueries itu menggunakan kata kunci EXISTS (lihat Bagian 5.3.8). Dengan default, kolom menyebut dalam suatu subquery mengacu pada tabel menyebut di dalam suatu ketentuan FROM subquery. Itu adalah mungkin untuk mengacu pada suatu tabel di dalam FROM ketentuan dari suatu query luar dengan persyaratan nama kolom ( lihat di bawah).. Ketika suatu subquery adalah satu 01' dua operand melibatkan dalam suatu perbandingan, subquery harus terlihat pada sisi tangan kanan perbandingan. Sebagai contoh, akan bersifat salah untuk menyatakan contoh yang terakhir sebagai berikut :
(4)
SELECT staff No, fName, IName, position, salary FROM Staff WHERE (SELECT AVG(salary) FROM Staff) < salary;
sebab subquery terlihat pada sisi tangan kiri perbandingan dengan gaji, Contoh 5.21 Kumpulan subqueries: menggunakan IN Daftar propertu yang ditangani oleh staff siapa yang bekerja pada cabang '163 Main St'. List the properties that are handled by staff who work in the branch at 163 Main St.
SELECT propertyNo, street, city, postcode, type, rooms, rent FROM PropertyForRent WHERE staffNo IN (SELECT staffNo
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
140
FROM Staff WHERE branchNo = (SELECT branchNo FROM Branch WHERE street = 163 Main St));
Pekerjaan dari query yang paling dalam keluar, query yang pertama memilih banyaknya cabang pada '163 Main St', Query yang kedua kemudian memilih staff itu siapa yang bekerja pada nomor cabang ini. Dalam hal ini, mungkin ada lebih dari satu seperti baris menemukan, dan demikian kita tidak bisa menggunakan kondisi persamaan (=) di dalam query yang paling jauh, Sebagai gantinya, kita menggunakan IN kata kunci, Query yang paling jauh kemudian mendapat kembali detil properti yang diatur oleh masing-masing anggota staff mengenali pertengahan query. Tabel Hasil yang ditunjukkan pada Tabel 5.21. Tabel 5.21 Tabel Hasil untuk Contoh 5.21.
PropertyNo
PG16 PG36 PG21
street
5 Novar Dr 2 Manor Rd 18 Dale Rd
City
Galsgow Glasgow Glasgow
postcode
G12 9AX G32 4QX G12
type
Flat Flat House
rooms
4 3 5
rent
450 375 600
Contoh 5.22 Menggunakan ANY/SOME Temukan semua staff gaji siapa adalah lebih besar dari gaji sedikitnya satu anggota staff pada cabang 8003, Find all staff whose salary is larger than the salary of at least one member of staff at branch 8003,
Bab Lima
141
WHERE salary> SOME (SELECT salary FROM Staff WHERE branchNo = B003);
Sedangkan query ini dapat dinyatakan penggunaannya suatu subquery temukan gaji minimum staff pada branch BO03, dan kemudian suatu query luar yang menemukan, semua staff gaji siapa adalah yang lebih besar dari nomor ini (lihat Contoh 5.20), suatu pendekatan alternatif menggunakan SOME/ANY kata kunci. Query bagian dalam menghasilkan yang di-set {12000, 18000, 24000} dan query luar yang memilih staff itu pada lingkungan gaji siapa yang lebih besar dari nilai-nilai yang manapun di dalam ini di-set (itu adalah lebih besar dari nilai yang minimum, 12000). Alternatif Metoda ini boleh nampak lebih alami dibanding menemukan gaji yang minimum di dalam suatu subquery. Di dalam kasus yang manapun , tabel hasil ditunjukkan pada Tabel 5.22. Tabel 5.22 Tabel Hasil untuk Contoh 5.22.
StaffNo
SL21 SG14 SG5
Fname
John David Susan
lName
White Ford Brand
position
Assistant Supervisor Manager
Salary
30000.00 18000.00 24000.00
Contoh 5.23 Menggunakan ALL Temukan semua staff gaji siapa pada cabang 8003. adalah lebih besar dari gaji dari tiap anggota staff
Find all staff whose salary is larger than the salary of every member of staff at branch B003.
SELECT staff No, fName, Iname, position, salary FROM Staff WHERE salary > ALL (SELECT salary FROM Staff WHERE branchNo = B003);
Ini adalah yang sangat serupa sampai contoh terakhir. Lagi, kita bisa menggunakan suatu subquery untuk menemukan gaji maksimum yang diorganisir pada branch B003 dan kemudian menggunakan suatu query luar untuk menemukan semua staff gaji siapa yang ebih besar dari nomor ini. Bagaimanapun, di dalam contoh ini kita menggunakan kanta kunci ALL. Tabel Hasil ditunjukkan tabel 5.23. Tabel 5.23 Tabel Hasil untuk Contoh 5.23.
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
142
StaffNo
SL21
fName
John
lName
White
position
Assistant
Salary
30000.00
SELECT c.clientNo, fName, IName, propertyNo, comment FROM Client c, Viewing v WHERE c.clientNo = v.clientNo;
Kita ingin display detil dari kedua-duanya Tabel Klien dan tabel pengamatan (Client table and the Viewing table), dan demikian kita harus menggunakan suatu gabungan. SELECT ketentuan daftar kolom itu untuk diperlihatkan. Catat bahwa ia adalah diperlukan untuk memenuhi persyaratan nomor klien, clientNo, di dalam SELECT daftar: clientNo bisa datang dari table yang manapun, dan kita harus menandai ada /opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
143
satu. (Kita bisa dengan sama baiknya sudah memilih kolom clientNo tabel Viewing.) Kecakapan dicapai dengan awalan kolom menyebut dengan nama tabel yang sesuai (atau alias nya). Dalam hal ini. kita sudah menggunakan c sebagai alias untuk Tabel Klien. Untuk memperoleh baris yang diperlukan, kita meliputi baris dari tabel keduaduanya yang mempunyai nilai-nilai yang serupa di dalam kolom clientNo. Menggunakan kondisi pencarian (c.clientNo= v.clientNo). Kita sebut dua kolom ini mempertemukan kolom untuk dua tabel. Ini adalah setara dengan aljabar relasional Equijoin operasi membahas yang dibahas pada Bagian 4.1.3. Tabel Hasil ditunjukkan tabel 5.24.
Tabel 5.24
ClientNo
CR56 CR56 CR56 CR62 CR76
fName
Aline Aline Aline Mary John
IName
Stewart Stewart Stewart Tregear Kay
PropertyNo
PG36 PA14 PG4 PA14 PG4
Comment
Query multi-table yang paling umum melibatkan dua tabel yang mempunyai suatu one-to-many ( 1:*) (atau suatu parent/child) hubungan (lihat Bagian 11.6.2). Query yang sebelumnya yang menyertakan klien (client) dan mengamati (viewing) adalah suatu contoh dari query seperti itu. Masing-masing mengamati (anak) mempunyai suatu klien dihubungkan (orangtua), dan masing-masing klien (orangtua) dapat mempunyai banyak orang yang dihubungkan bersaingan sayap-sayap (anak-anak). Sepasang baris yang menghasilkan hasil query adalah parent/child kombinasi baris. Di dalam Bagian 3.2.5 kita uraikan bagaimana kunci utama dan kunci asing menciptakan hubungan parent/child di dalam suatu database relasional: tabel yang berisi kunci utama adalah tabel orangtua dan tabel yang berisi kunci asing adalah tabel anak. Untuk menggunakan hubungan parent/child di dalam suatu, SQL query, kita menetapkan suatu kondisi pencarian yang membandingkan kunci utama dan kunci asing. Di dalam Contoh 5.24, kita membandingkannya kunci utama di(dalam Tabel Klien, C.Clientno, dengan kunci asing di dalam Viewing table, v.clientNo. Standard SQL menyediakan jalan alternatif yang berikut untuk menetapkan gabungan ini:
FROM Client c JOIN Viewing v ON c.clientNo = v.clientNo FROM Client JOIN Viewing USlNG, clientNo FROM Client NATURAL JOIN Viewing
Pada setiap kasus, FROM ketentuan menggantikan FROM dan WHERE ketentuan yang asli. Bagaimanapun, alternatif yang pertama menghasilkan suatu table dengan dua /opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
144
kolom clientNo serupa; yang sisanya dua adalah hasil suatu tabel dengan clientNo kolom tunggal.
Contoh 5.25 Sorting a join Karena masing-masing kantor cabang, mendaftar angka-angka dan nama staff siapa yang mengatur properti dan properti yang mereka atur, For each brAnch office, list the numbers and names of staff who manage properties and the properties that they manage,
SELECT s.branchNo, s.staffNo, fName, lName, propertyNo FROM Staff s, PropertyForRent p WHERE s.staffNo = p.staffNo ORDER BY s.branchNo, s.staffNo, propertyNo;
Untuk membuat hasil yang lebih menarik, kita sudah order keluaran yang menggunakan nomor cabang sebagai sort yang utama kunci dan nomor staff dan nomor properti sebagai kunci kecil. Tabel Hasilnya seperti ditunjukkan pada Tabel 5.25. Tabel 5.25 Tabel hasil untuk Contoh 5.25.
BranchNo
B003 B003 B003 B005 B007
StaffNo
SG14 SG37 SG37 SL41 SA9
fName
David Ann Ann Julie Mary
IName
Ford Beech Beech Lee Howe
propertyNo
PG16 PG21 PG36 PL94 PA14
Contoh
Karena masing-masing cabang, mendaftar angka-angka dan nama staff siapa yang mengatur propreti mencakup kota besar terletak dimana cabang dan properti staff mengatur. For each branch, list the numbers and names of staff who manage properties. including the city in which the branch is located and the properties that the staff manage.
SELECT b.branchNo, b.city, s.staffNo, fName, IName, propertyNo FROM Branch b, Staff s, PropertyForRent p WHERE b.branchNo = s.branchNo AND s.staffNo = p.staffNo ORDER BY b.branchNo, s.staffNo, propertyNo;
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
145
Tabel Hasil memerlukan kolom dari tiga tabel: Branch, Staff, dan PropertyForRent, maka suatu gabungan harus digunakan. Branch dan staff Detil dihubungkan menggunakan kondisi (b.branchNo= s.branchNo), untuk menghubungkan cabang masing-masing kepada staff, siapa] yang bekerja di sana. Staff Dan Propertyforrent Detil dihubungkan menggunakan kondisi (s.staffNo=p.staffNo), untuk menghubungkan staff kepada property yang mereka atur. Tabel Hasil ditunjukkan pada Tabel 5.26. Tabel 5.26 Hasil table untuk Contoh 5.26.
BranchNo
B003 B003 B003 B005 B007
City
Glasgow Glasgow Glasgow London Aberdeen
StaffNo
SG14 SG37 SG37 SL41 SA9
fName
David Ann Ann Julie Mary
IName
Ford Beech Beech Lee Howe
propertyNo
PG16 PG21 PG36 PL94 PA14
Note, again, that the SQL standard provide; alternative: formulation; for the FROM and WHERE clauses, for example: FROM (Branch b JOIN Staff s USING branchNo) AS bs JOIN PropertyForRent p USING staffNo
Contoh 5.27 Multiple grouping columns Temukan banyaknya properti yang ditangani oleh masing-masing anggota staff. Find the number of properties handled by each staff member.
SELECT s,branchNo, s.staffNo,COUNT(*) AS my count FROM Staff s, PropertyForRenl p WHERE s.staffNo = p.staffNo GROUP BY s.branchNo, s.staffNo ORDER BY s.branchNo. s.staffNo;
Untuk daftar angka-angka yang diperlukan, kita yang pertama-tama harus menemukan staff yang benar-benar mengatur properti. Ini dapat ditemukan dengan sambungan Staff dan Propertyforrent pada Tabel staffNo kolom, menggunakan FROM/WHERE anak ketentuan. Berikutnya, kita harus membentuk kelompok terdiri dari nomor cabang dan nomor staff, menggunakan GROUP BY ketentuan. Yang akhirnya, kita sort keluaran yang menggunakan ORDER BY ketentuan itu. Tabel Hasil yang ditunjukkan pada tabel 5.27(a). Table 5.27(a) Tabel hasil untuk Contoh 5.27.
StaffNo
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
146
BranchNo
B003 B003 B005 B007 Computing a join Suatu gabungan adalah suatu subset suatu kombinasi yang umum yaitu dua tabel yang dikenal sebagai produk Cartesian (lihat Bagian 4.1.2). Produk Cartesian dua tabel adalah tabel lain terdiri dari semua pasangan yang mungkin baris dari tabel keduanya. Kolom tabel produk adalah semua kolom tabel yang pertama yang diikuti oleh semua kolom tabel yang kedua . Jika kita menetapkan suatu query two-table tanpa ketentuan WHERE, SQL itu menghasilkan produk Cartesian dua tabel sebagai query yang menghasilkan. Sesungguhnya, standar ISO menyediakan suatu format SELECT statemen yang khusus untuk Cartesian product: SG14 SG37 SL41 SA9 1 2 1 1
SELECT FROM
Pertimbangkan lagi Contoh 5.24, di mana kita menggabungkan client dan Viewing penggunaan tabel mempertemukan kolom, clientNo. Gunakan data dari gambar 3.3, Cartesian product dua tabel ini akan berisi 20 baris ( 4 client* 5 viewing = 20 baris). Itu adalah setara dengan query yang menggunakan Contoh 5.24, tanpa ketentuan WHERE. Prosedur untuk membangitkan hasil SELECT dengan suatu gabungan sebagai berikut: (1) (2) Format Cartesian product tabel nama ketentuan FROM. Jika ada ketentuan WHERE, menerapkan Kondisi Pencarian masing-masing 10 baris Tabel Produk, menahan baris yang mencukupi kondisi itu. Dalam kaitan dengan Aljabar Relasional, Operasi ini menghasilkan suatu pembatasan Cartesian product. Karena masing-masing baris sisanya, menentukan nilai dari tiap item di dalam daftar SELECT untuk menghasilkan baris tunggal di dalam tabel hasil. Jika SELECT DISTINCT telah ditetapkan, menghapuskan duplikasi baris manapun dari tabel hasil, Di dalam Aljabar Relasional, Langkah-Langkah 3 dan 4 adalah padanan 10 suatu pembatasan projection di atas kolom menyebutkan daftar SELECT. Jika ada suatu ketentuan ORDER BY, sort tabel hasil sebagai yang diperlukan.
(3) (4)
(5)
Outer joins Operasi Gabungan berkombinasi data dari dua tabel dengan format sepasang dari baris terkait di mana mempertemukan kolom pada setiap tabel mempunyai nilai yang sama. Jika satu baris suatu tabel adalah tiada bandingnya, baris dihilangkan dari tabel /opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
147
hasil. Ini telah menjadi kasus untuk gabungan yang kita uji di atas, standar ISO menyediakan yang lain satuan operator gabungan yang disebut gabungan luar (lihat Bagian 4.1.3). Gabungan luar mempertahankan baris yang tidak mencukupi kondisi gabungan. Untuk memahami Operator Gabungan luar, mempertimbangkan yang berikut dua Cabang disederhanakan dan Tabel Propertyforrent, Yang kita dikenal sebagai Branch1 dan PropertyForRent1, yang berturut-turut:
Branch1
PropertyForRent1
BranchNo
B003 B004 B002
bCity
Glasgow Bristol London
propertyNo
PA14 PL94 PG4
PCity
Aberden London Glasgow
The (Inner) join of these two tables: SELECT b.*, p.* FROM Branch1 b. PropertyForRent1 p WHERE b.bCity = p,pCity; produces the result table shown in Table 5.27(b),
Table 5.27(b) Result table for inner join of Branch 1 and PropertyForRent1 tables,
branchNo
B003 B002
bCity
Glasgow London
propertyNo
PG4 PL94
PCity
Glasgow London
Tabel Hasil mempunyai dua baris di mana kota besar adalah sama. Khususnya, catat bahwa tidak ada baris yang sesuai dengan kantor cabang itu di dalam Bristol dan di sana adalah tidak ada baris yang bersesuaian properti di Aberdeen. Jika kita ingin meliputi baris yang tiada bandingnya di dalam tabel hasil, dapat menggunakan suatu Gabungan luar (Outer join). Ada tiga tipe Gabungan luar (Outer join): Kiri (Left), Kanan (Righ) dan Gabungan luar Penuh(Full Outer join). Kita menggambarkan kemampuan mereka di dalam contoh sebagai berikut:.
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
148
Contoh 5.28 Left Outer join Daftar properti dan kantor cabang yang adalah di dalam (kota besar sama bersama dengan manapun cabang dipertemukan). List the branch offices and properties that are in ( same city along with any matched branches).
The Left Outer join of these two tables:
SELECT b.*, p.* FROM Branch1 b LEFT JOIN PropertyForRent1 p ON b.bCity = p,pCity;
Produksi tabel hasil itu ditunjukkan pada Tabel 5.28. Di dalam contoh ini Gabungan luar (Outer join) yang kiri (Left) meliputihanya baris yang mempunyai kota besar yang sama, tetapi juga baris itu yang pertama tabel (kiri/Left) adalah yang tiada bandingnya dengan baris dari yang kedua table (kanan/ right). Kolom dari tabel yang kedua diisi dengan NULLs Table 5.28 Tabel Hasil untuk Contoh 5.28.
branchNo
B003 B004 B002
BCity
Glasgow Bristol London
propertyNo
PG4 NULL PL94
PCity
Glasgow NULL London
Contoh 5.29 Right Outer join Daftar kantor cabang dan propeti itu adalah di dalam kota besar yang sama bersama dengan manapun properti tiada bandingnya. List the branch offices and propeties that are in the same city along with any unmatched properties. The Right Outer join of these two table:
SELECT b.*, p.* FROM Branch1 b RIGHT JOIN PropertyForRent1 p ON b.bCity = p.pCity;
Produksi tabel hasil yang ditunjukkan pada Tabel 5.29. Di dalam contoh ini Gabungan luar kiri(Right Outer join) meliputi tidak hanya baris yang h:\\'C kota besar yang sama, tetapi juga baris itu yang kedua table (kiri/right) yang adalah tiada bandingnya dengan baris dari yang pertama (kanan/left) tabel. Sehingga dari kolom pertama tabel adalah dengan NULLs.
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
149
Table 5.29
branchNo
bCity
propertyNo
PA14 PG4 PL94
PCity
Aberdeen Glasgow London
NULL NULL B003 Glasgow B002 London Contoh 5.30 Full Outer join
Daftar kantor cabang dan properties itu adalah di dalam kota besar yang sama bersama dengan manapun properti atau cabang tiada bandingnya. List the branch offices and properties that are in the same city along with any unmatched branches or properties. The Full Outer join of these two tables:
SELECT b.*, p.* FROM Branch1 b FULL JOIN PropertyForRent1 p ON b.bCity = p.pCity;
Produksi table hasil diperlihatkan dalam Tabel 5.30. Di dalam kasus ini , Gabungan luar Penuh (Full Outer join) meliputi tidak hanya baris yang mempunyai kota besar yang sama, tetapi juga baris adalah tiada bandingnya kedua-duanya tabel. Kolom yang tiada bandingnya diisi dengan NULL Table 5.30 Tabel hasil ubtuk Contoh 5.30.
branchNo
NULL B003 B004 B002
BCity
NULL Glasgow Bristol London
propertyNo
PA14 PG4 NULL PL94
PCity
Aberdeen Glasgow NULL London
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
150
kesederhanaan itu adalah umum untuk subqueries yang mengikuti salah satu dari kata kunci ini untuk format:
Temukan semua staff siapa yang bekerja di suatu kantor cabang London Find all staff who work in a London branch office
SELECT staffNo, IName, IName, position FROM staffs WHERE EXISTS (SELECT * FROM Branch b WHERE s.branchNo = b.branchNo AND city = London);
Query ini bisa dikatakan dengan cara lain seperti 'Temukan semua staff . seperti yang di sana ada suatu Baris Cabang yang berisi nomor cabang mereka, branchNo, dan kota besar cabang sepadan dengan London. Test untuk pemasukan adalah keberadaan seperti baris. Jika itu ada, subquery mengevaluasi untuk benar. Tabel Hasil ditunjukkan pada tabel 5.31. Table 5.31 Tabel Hasil untuk Contoh 5.31.
staffNo
SL21 SL41
Fname
John Julie
lName
White Lee
Position
Manager Assstant
Catat bahwa yang pertama bagian dari kondisi pencarian s.branchNo= b.branchNo adalah diperlukan untuk memastikan bahwa kita mempertimbangkan baris cabang yang benar untuk masing-masing anggota terorganisir. Jika kita menghilangkan query bagian dari ini, kita akan mendapatkan semua baris daftar staff ke luar sebab subquery (SELECT * FROM Branch WHERE city = ' London') jadi akan selalu benar dan query akan dikurangi menjadi:
SELECT staffNo, fName, fName, position FROM Staff WHERE true; which is equivalent to: SELECT staffNo, fName, lName, position FROM Staff;
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
151
Kita dapat juga sudah menulis query ini yang menggunakan konstruksi gabungan (join construct):
SELECT staff No, fName, IName, position FROM Staff s, Branch b WHERE s.branchNo = b.branchNo AND city = London;
R S
RS
(a) Ubion (b) Intersection Gambar 5.1, Union, Intersection dan Diference set option
(c) Diference
Operasi yang di-set digambarkan pada Gambar 5.1. Ada pembatasan pada [atas] tabel yang dapat dikombinasikan penggunaan operasi yang di-set, yang paling utama menjadi yang keduanya tabel harus union-compatible; itu adalah, mereka mempunyai struktur yang sama. Ini menyiratkan bahwa kedua tabel harus berisi yang sama jumlah kolom, dan bahwa mereka bersesuaian kolom mempunyai jenis data yang sama" dan panjangnya. Itu adalah tanggung jawab pemakai untuk memastikan bahwa data dinilai sesuai kolom datang dari domain yang sama. Sebagai contoh, jadi tidak akan masuk akal untuk mengkombinasikan suatu kolom yang berisi umur mengorganisir dengan banyaknya kamar di dalam suatu properti, sungguhpun keduaduanya kolom mungkin punya jenis data yang sama: sebagai contoh, SMALLINT. /opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
152
Ke tiga operator di-set di dalam standar ISO disebut UNION, INTERSECT, dan EXECEPT. Format ketentuan operator yang di-set pada setiap kasus adalah:
Instruct a list of all cities where there is either a branch office or a property. (SELECT city or (SELECT * FROM Branch FROM Branch WHERE city IS NOT NULL) WHERE city IS NOT NULL) UNION UNION CORRESPONDING BY city (SELECT, city (SELECT * FROM PropertyForRent FROM PropertyForRent WHERE city IS NOT NULL) WHERE city IS NOT NULL);
Query ini dieksekusi dengan memproduksi suatu tabel hasil dari query yang pertama dan suatu tabel hasil dari query yang kedua , dan kemudian menggabungkan tabel kedua-duanya ke dalam table hasil tunggal terdiri atas semua baris dari kedua-duanya menghasilkan tabel dengan memindahkan duplikasi baris, Tabel Hasil yang akhir ditunjukkan pada Tabel 5.32. Tabel 5.32 Tabel hasil untuk Contoh 5.32.
City
London Glasgow Aberdeen Bristol
Contoh 5.33 Menggunakan INTERSECT Konstruksi daftar semua kota besar jika ada kedua-duanya suatu kantor cabang dan suatu properti. Construct a list of all cities where there is both a branch office and a property.
(SELECT city
or
(SELECT *
Bab Lima
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
153
Query ini dieksekusi dengan memproduksi suatu tabel hasil dari query yang pertama dan suatu table hasil dari query yang kedua , dan kemudian menciptakan tabel hasil tunggal terdiri dari baris adalah yang umum bagi kedua-duanya tabel hasil. Tabel Hasil yang akhir ditunjukkan pada Tabel 5.33. Kita bisa menulis kembali query ini tanpa operator INTERSECT operator, sebagai contoh: SELECT DISTINCT b.city or SELECT DISTINCT city FROM Branch b, PropertyForRent c FROM Branch b WHERE b.city = p.city: WHERE EXISTS (SELECT FROM PropertyForRent p WHERE b.city = p.city); Kemampuan untuk menulis suatu query di dalam beberapa format menggambarkan salah satu dari kerugian-kerugian dari bahasa SQL. Tabel 5.33 Tabel Hasil untuk Contoh 5.33. padanan
City
Aberdeen Glasgow London
Contoh 5.34 Menggunakan EXCEPT Konstruksi daftar semua kota besar jika ada suatu kantor cabang tetapi tidak ada property. Construct a list of all cities where there is a branch office but no properties.
City
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
154
Bristol Query ini dieksekusi dengan memproduksi suatu tabel hasil yang dibentuk query yang pertama dan suatu tabel hasil dari query yang kedua dan kemudian menciptakan tabel hasil tunggal terdiri dari baris yang tidak nampak tabel hasil yang pertama tetapi di dalam yang kedua satu. Tabel Hasil yang akhir ditunjukkan pada Tabel 5.34. Kita bisa menulis kembali query ini tanpa operatorEXCEPT sebagai contoh: We could rewrite this query without the EXCEPT operator for example:
SELECT DISTINCT city or FROM Branch WHERE city NOT IN (SELECT city FROM PropertyForRent);
SELECT DISTINCT city FROM Branch b WHERE NOT EXISTS (SELECT * FROM PropertyForRent p WHERE b.city = PCity);
TableName mungkin juga adalah baik suatu tabel dasar maupun suatu pandangan mempebaharui tabel (lihat Bagian 6.4). dan columnList menampilkan daftar satu atau lebih nama kolom yang dipisahkan oleh tanda koma. Columnlist adalah opsional; jika dihilangkan, SQL mengasumsikan daftar semua kolom di dalam order CREATE TABLE asli mereka. Jika ditetapkan, kemudian kokolm manapun yang dihilangkan dari daftar harus mempunyai dideklarasikan Kolom NULL ketika tabel telah diciptakan. kecuali jika pilihan DEFAULT telah digunakan ketika menciptakan kolom (lihat Bagian 6,3,2), Datavaluelist harus memenuhi columnList sebagai berikut: banyaknya materi pada setiap daftar harus yang sama; harus ada suatu kesuaian langsung di dalam posisi materi di dalam daftar keduanya, sedemikian sehingga item yang pertama di dalam dataValueList berlaku /opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
155
bagi item yang pertama di dalam columnList, item yang kedua di dalam dataValueList berlaku bagi item yang kedua di dalam columnList, dan seterusnya; data jenis item masing-masing di (dalam) dataValueList harus kompatibel dengan data jenis bersesuaian kolom,
Contoh 5.35 INSERT. . . VALUES Insert suatu baris baru ke dalam Tabel Staff yang menyediakan data untuk semua kolom, Insert a new row into the Staff table supplying data for all columns,
INSERT INTO Staff VALUES (SGI6, Alan, Bro\vn, Assistant, M, DATE 1957-0525,8300, BO03);
Ketika kita sedang menyisipkan (inserting) data ke dalam kolom masing-masing di dalam order tabel telah diciptakan, tidak usah menetapkan suatu daftar kolom, Catat bahwa karakter yang harafiah seperti ' Alan' harus terlampir tanda kutip tunggal,
Contoh 5.36 INSERT menggunakan defaults Insert suatu baris baru ke dalam table Staff yang menyediakan data untuk semua kolom yang wajib: staffNo, fName, lName, position, salary, and branchNo.
Ketika kita sedang menyisipkan data hanya ke dalam kolom tertentu, kita harus menetapkan nama kolom yang kita sedang siisipkan data ke dalamnya. Order untuk nama kolom tidaklah penting, tetapi itu jadilah lebih normal untuk menetapkannya di dalam order mereka yang terlihat tabel. Kita dapat juga menyatakan statement INSERTsebagai berikut:
INSERT INTO Staff VALUES (S044, Anne, John, Assistant, NULL, NULL, 8100, BO03);
Dalam hal ini, kita sudah dengan tegas menetapkan bahwa jenis kelamin kolom dan DOB harus di-set NULL Format statemen INSERT yang kedua mengijinkan berbagai baris untuk dicopy dari satu atau lebih ke lain tabel, dan mempunyai format yang berikut :
Bab Lima
156
TableName dan columnList sebagai digambarkan sebelumnya ketika menyisipkan (inserting) baris tunggal. Ketentuan SELECT dapat apapun statemen SELEC sah. Baris menyisipkan (inserting) ke dalam tabel yang dinamai adalah serupa kepada tabel hasil yang diproduksi oleh subselect. Pembatasan yang sama yang berlaku bagi format INSERT statemen juga diterapkan di sini. Contoh 5.37 INSERT...SELECT Asumsi bahwa ada suatu tabel StaffPropCount itu berisi nama staf dan nomor property mereka memanaj : StaffPropCount(staffNo, fName, IName, propCount) Populasi StaffPropCount tabel yang menggunakan detil dari Staff dan table Propertyforrent. Populate the StaffPropCount table using details from the Staff and PropertyForRent tables.
INSERT INTO StaffPropCount (SELECT s.staffNo, fName, IName, COUNT(*) FROM Staff s, PropertyForRent p WHERE s.staffNo = p.staffNo GROUP BY s.staffNo, fName, IName) UNION (SELECT staffNo, fName, lName, 0 FROM Staff WHERE staffNo NOT IN (SELECT DISTINCT staffNo FROM PropertyForRent);
Contoh ini adalah kompleks sebab kita ingin menghitung banyaknya property itu yang dimananaj staff.. Jika kita menghilangkan yang kedua bagian dari UNION, kemudian kita mendapatkan hanya daftar staff itu siapa yang sekarang ini memanaj sedikitnya satu properti; dengan kata lain, kita mengeluarkan staff itu siapa yang sekarang ini tidak memanaj manapun properti. Oleh karena itu, untuk meliputi staff siapa yang tidak memanaj property manapun, kita perlu menggunakan statemen UNION dan meliputi suatu detik SELECT statemen untuk menambahkan dalam . yang sedemikian staff, menggunakan suatu 0 nilai untuk menujukan count. Staffpropcount Tabel sekarang akan jadi seperti yang ditunjukkan pada Tabel 5.35. Catat bahwa berbagai dialek beberapa SQL tidak akan mengijinkan penggunaan operator UNION di dalam suatu subselect untuk suatu INSERT. Tabel 5.35 Tabel hasil untuk Contoh 5.37.
staffNo
SL21
FName
John
lName
White
propCount
0
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
157
2 1 1 0 1
Modifikasi data dalam database (UPDATE) Statemen UPDATE mengijinkan indeks dari baris ada di dalam suatu table dinamai untuk diubah. Format perintah adalah:
Contoh 5.38 UPDATE all rows Berikan semua staff suatu peningkatan upah 3% Give all staff a 3% pay increase.
Contoh 5.39 UPDATE specific rows Berikan semua manajer suatu peningkatan upah 5%. Give all Managers a 5% pay increase
Bab Lima
158
The WHERE clause finds the rows that contain data for Managers and the update salary = salary* 1.05 is applied only to these particular rows.
Contoh 5.40 UPDATE multiple columns Promosi David Ford (staffNo = SG14) untuk Manajer dan perubahan gajinya untuk 18.000 Promote David Ford (staffNo = SG14) to Manager and change his salary to 18.000.
Contoh 5.42 DELETE all rows Hapus semua baris dari tabel pengamatan. Delete all rows from the Viewing table. /opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
159
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
160
hanya baris tunggal. Suatu baris subquery dapat kapan saja suatu konstruksi baris nilai diperlukan, secara khas di dalam predikat. Tabel subquery yang dikembalikan atau lebih kolom dan berbagai baris. Suatu tabel subquery dapat digunakan kapan saja suatu tabel diperlukan, sebagai contoh, sebagai suatu operand untuk predikat IN. Jika kolom tabel hasil datang dari tabel lebih dari satu. suatu gabungan harus digunakan, dengan penetapan tabel lebih dari satu di dalam FROM ketentuan dan secara khas mencakup WHERE ketentuan untuk menetapkan join column. Stabdar ISO mengijinkan Gabungan luar (Outer joins) untuk digambarkan. Itu juga mengijinkan operasi yang di-set dari Unio, Intesection dan Difference untuk digunakan dengan perintah UNION, INTERSECT dan EXCEPT. Seperti halnya SELECT, SQL DML meliputi statemen INSERT untuk menyisipkan (insert) baris data tunggal ke dalam suatu tabel yang dinamai atau untuk menyisipkan suatu jumlah arbitrary baris dari tabel lain yang menggunakan suatu subselect; statemen UPDATE untuk memperbaharui satu atau lebih nilai-nilai di dalam suatu kolom atau kolom ditetapkan suatu nama tabel; statemen DELETE untuk menghapus satu atau lebih baris dari suatu nama tabel.
Review Questions
5.1 Apakah yang merupakan kedua komponen utama SQL dan fungsi apa yang mereka lakukan melayani? 5.2 Apakah yang merupakan keuntungan dan kerugian-kerugian SQL? 5.3 Jelaskan fungsi dari tiap ketentuan di dalam SELECT statement. Apa pembatasan yang dibebankan atas ketentuan ini? 5.4 Apa yang pembatasan berlaku bagi penggunaan fungsi aggregate di dalam SELECT statemen? Bagaimana cara null mempengaruhi aggregate itu berfungsi" 5.5 Jelaskan bagaimana GROUP BY ketentuan bekerjanya. Apa yang merupakan perbedaan antara WHERE dan HAVING ketentuan? 5.6 Apa yang merupakan perbedaan antara suatu subquery dan suatu aggregate? Di bawah keadaan anda tidak akan mampu menggunakan suatu subquery?
Exercises
Untuk Latihan 5.7- 5.28, menggunakan Schema Hotel menggambarkan di awal Latihan pada akhir Bab 3. Query sederhana 5.7 Daftar detil penuh dari semua hotel. 5.8 Daftar detil penuh dari semua hotel di London. 5.9 Daftar alamat dan nama dari semua para tamu tinggal di London, berurutan menurut abjad yang dipesan sesuai nama. 5.10 Daftar semua ganda atau ruang keluarga dengan suatu harga di bawah 40.00 per malam, dalam urutan menaik menghargai. 5.11 Daftar pembukuan di mana tidak ada dateTo telah ditetapkan. /opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
161
Kumpulan Fungsi 5.12 Berapa banyak hotel ada di sana? 5.13 Apa yang merupakan rata-rata harga suatu ruang? 5.14 Apa yang merupakan total pendapatan per malam dari semua kamar untuk dua orang? 5.15 Berapa banyak para tamu berbeda sudah buat pembukuan untuk Agustus? Subqueries dan join 5.16 Daftar harga dan jenis semua ruang di Grosvenor Hotel. 5.17 Daftar semua para tamu sekarang ini tinggal di Grosvenor Hotel. 5.18 Daftar detil dari semua yang tinggal di Grosvenor Hotel, mencakup nama tamu tinggal di dalam kamar, jika kamar didiami. 5.19 Apa yang merupakan total pendapatan dari pembukuan untuk Grosvenor Hotel hari ini? 5.20 Daftar kamar yang sekarang ini tak terpakai di Grosvenor Hotel. 5.21 Apa yang merupakan pendapatan yang hilang dari ruang tak terpakai di Grosvenor Hotel? Pengelompokan (Aggregate) 5.22 Daftar banyaknya kamar pada setiap hotel. 5.23 Daftar banyaknya kamar pada setiap hotel di London. 5.24 Apa yang merupakan rata-rata jumlah pembukuan untuk masing-masing hotel di bulan Agustus? 5.25 Apa yang merupakan tipe kamar yang paling umum dilihat untuk masingmasing hotel di London? 5.26 Apa yang merupakan pendapatan yang hilang dari kamar tak terpakai pada hotel masing-masing hari ini? Tabel populasi (Populating table) 5.27 Menyisipkan baris ke dalam masing-masing tabel ini. 5.28 Perbaharui harga semua kamar dengan 5% Umum (General) 5.29 Selidiki SQL dialek pada apapun DBMS itu anda sekarang ini menggunakannya. Tentukan pemenuhan sistem dengan DML statemen ISO standard. Selidiki kemampuan tentang segala pendukung perluasan DBMS. Adakah pendukung berfungsi? 5.30 Tampilkan bahwa suatu query yang menggunakan ketentuan HAVING mempunyai suatu perumusan padanan tanpa suatu ketentuan HAVING. 5.31 Tampilkan SQL itu relationally lengkap.
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima
162
Grouping 5.32 List the 5.33 List the 5.34 What is 5.35 What is 5.36 What is
number of rooms in each hotel. number of rooms in each hotel in London. the average number of bookings for each hotel in August? the most commonly looked room type for each hotel in London ? the lost income from unoccupied rooms at each hotel today?
Populating tables 5.37 Insert rows into each of these tables. 5.38 Update the price of all rooms by 5% General 5.39 Investigate the SQL dialect on any DBMS that you are currently using. Determine the systems compliance with the DML statements of the ISO standard. Investigate the functionality of any extensions the DBMS supports. Are there any functions not supported? 5.40 Show that a query using the HAVING clause has an equivalent formulation without a HAVING clause. 5.41 Show that SQL is relationally complete.
/opt/scribd/conversion/tmp/scratch2493/77360210.doc\30/11/1 120:30
Bab Lima