artikel sql

34
Dasar SQL: DDL dan DML Pada bagian pertama dari tutorial ini, Anda telah melihat beberapa pernyataan SQL yang Anda butuhkan untuk mulai membangun database. Halaman ini memberikan review dari mereka dan menambahkan beberapa lagi yang Anda belum melihat belum. • SQL dibagi menjadi dua kategori utama: bahasa definisi data (DDL) dan bahasa manipulasi data (DML). Kedua kategori ini berisi laporan yang jauh lebih dari yang kita dapat hadir di sini, dan masing-masing pernyataan di bawah ini jauh lebih kompleks daripada yang kita tampilkan di pendahuluan ini. Jika Anda ingin menguasai materi ini, kami sangat menyarankan Anda mencari referensi untuk perangkat lunak database SQL Anda sendiri sebagai suplemen untuk halaman ini. Bahasa definisi data Laporan DDL digunakan untuk membangun dan memodifikasi struktur tabel Anda dan objek lain dalam database. Ketika Anda menjalankan sebuah pernyataan DDL, itu berlaku segera. • membuat laporan yang tidak tepat tabel: CREATE TABLE <table name> ( <attribute name 1> <data type 1>, ... <attribute name n> <data type n>); tipe data ini yang akan Anda gunakan paling sering adalah karakter string, yang mungkin disebut VARCHAR atau CHAR untuk variabel atau string panjang tetap; tipe numerik seperti NOMOR atau INTEGER, yang biasanya akan menentukan presisi dan DATE atau jenis terkait. Tipe sintaks Data variabel dari sistem ke sistem; satu-satunya cara untuk memastikan adalah untuk berkonsultasi dokumentasi untuk perangkat lunak Anda sendiri.

Upload: desaf

Post on 27-Jun-2015

122 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Artikel SQL

Dasar SQL: DDL dan DML

Pada bagian pertama dari tutorial ini, Anda telah melihat beberapa pernyataan SQL yang Anda butuhkan untuk mulai membangun database. Halaman ini memberikan review dari mereka dan menambahkan beberapa lagi yang Anda belum melihat belum.

• SQL dibagi menjadi dua kategori utama: bahasa definisi data (DDL) dan bahasa manipulasi data (DML). Kedua kategori ini berisi laporan yang jauh lebih dari yang kita dapat hadir di sini, dan masing-masing pernyataan di bawah ini jauh lebih kompleks daripada yang kita tampilkan di pendahuluan ini. Jika Anda ingin menguasai materi ini, kami sangat menyarankan Anda mencari referensi untuk perangkat lunak database SQL Anda sendiri sebagai suplemen untuk halaman ini.

Bahasa definisi data

Laporan DDL digunakan untuk membangun dan memodifikasi struktur tabel Anda dan objek lain dalam database. Ketika Anda menjalankan sebuah pernyataan DDL, itu berlaku segera.

• membuat laporan yang tidak tepat tabel:

CREATE TABLE <table name> ( <attribute name 1> <data type 1>, ... <attribute name n> <data type n>);

tipe data ini yang akan Anda gunakan paling sering adalah karakter string, yang mungkin disebut VARCHAR atau CHAR untuk variabel atau string panjang tetap; tipe numerik seperti NOMOR atau INTEGER, yang biasanya akan menentukan presisi dan DATE atau jenis terkait.

Tipe sintaks Data variabel dari sistem ke sistem; satu-satunya cara untuk memastikan adalah untuk berkonsultasi dokumentasi untuk perangkat lunak Anda sendiri.

• Pernyataan yang mengubah tabel dapat digunakan seperti yang kamu lihat untuk menentukan dasar dan asing kendala utama, serta untuk membuat modifikasi lain dengan struktur tabel. Kunci kendala juga dapat ditentukan dalam pernyataan CREATE TABLE.

ALTER TABLE <table name> ADD CONSTRAINT <constraint name> PRIMARY KEY (<attribute list>);

Anda bisa menentukan nama kendala. Biasakanlah untuk mengikuti konvensi dari tablename_pk (misalnya, Customers_pk), sehingga Anda dapat mengingat apa yang Anda lakukan nanti. Daftar atribut berisi satu atau lebih atribut yang formulir ini PK; jika lebih dari satu, nama dipisahkan oleh koma.

Page 2: Artikel SQL

• Kendala kunci asing adalah sedikit lebih rumit, karena kita harus menentukan atribut kedua FK di anak ini () meja, dan PK atribut yang mereka link ke dalam tabel induk.

ALTER TABLE <table name> ADD CONSTRAINT <constraint name> FOREIGN KEY (<attribute list>) REFERENCES <parent table name> (<attribute list>);

Nama kendala dalam childtable_parenttable_fk bentuk (misalnya, Orders_Customers_fk). Jika ada lebih dari satu atribut di FK, semuanya harus disertakan (dengan koma antara) di kedua daftar atribut FK dan REFERENSI (tabel induk) daftar atribut.

Anda perlu definisi kunci terpisah asing untuk setiap hubungan di mana tabel ini adalah anak.

• Jika Anda benar-benar hal-hal yang mengacaukan dan ingin mulai dari awal, Anda selalu dapat membuang objek apapun yang Anda buat dengan pernyataan drop. sintaks yang berbeda untuk tabel dan kendala.

DROP TABLE <table name>;

ALTER TABLE <table name> DROP CONSTRAINT <constraint name>;

Di sinilah kendala penamaan yang konsisten akan menolong, sehingga Anda hanya dapat mengingat FK PK atau nama daripada mengingat sintaks untuk mencari nama-nama di meja lain. Pernyataan DROP TABLE mendapat menyingkirkan kendala PK sendiri, tapi tidak akan bekerja sampai Anda secara terpisah drop apapun kendala FK tabel anak (atau) yang mengacu pada satu ini. Hal ini juga mendapat menghilangkan semua data yang terkandung di dalam tabel-dan bahkan tidak menanyakan anda apakah anda benar-benar ingin melakukan ini!• Semua informasi tentang obyek-obyek dalam skema Anda berisi, tidak mengherankan, dalam satu set tabel yang disebut kamus data. Ada ratusan tabel ini sebagian besar sistem database, tetapi semua itu akan memungkinkan Anda untuk melihat informasi tentang tabel sendiri, dalam banyak kasus dengan antarmuka grafis. Bagaimana Anda melakukan hal ini sepenuhnya tergantung pada sistem.

Bahasa manipulasi data

Laporan DML digunakan untuk bekerja dengan data dalam tabel. Ketika Anda tersambung ke database yang paling multi-user (baik dalam sebuah program klien atau sambungan dari script halaman Web), Anda sebenarnya bekerja dengan salinan pribadi dari meja Anda yang tidak dapat dilihat oleh orang lain sampai Anda selesai (atau memberitahu sistem bahwa Anda sudah selesai). Anda telah melihat pernyataan SELECT, melainkan dianggap sebagai bagian dari DML meskipun hanya retreives data bukan modifikasi.

• Pernyataan insert digunakan, jelas, untuk menambahkan baris baru ke sebuah tabel.

Page 3: Artikel SQL

INSERT INTO <table name> VALUES (<value 1>, ... <value n>);

Daftar koma-delimited nilai-nilai harus sesuai dengan struktur tabel persis jumlah atribut dan tipe data setiap atribut. Karakter jenis nilai-nilai selalu tertutup dalam tanda kutip tunggal, nilai-nilai angka tidak pernah dalam tanda kutip; nilai tanggal sering (tetapi tidak selalu) dalam format 'yyyy-mm-dd' (misalnya, '2006-11-30 ').

Ya, Anda akan memerlukan sebuah pernyataan INSERT terpisah untuk setiap baris.• Pernyataan update digunakan untuk mengubah nilai yang sudah ada di tabel.

UPDATE <table name> SET <attribute> = <expression> WHERE <condition>;

Ekspresi update dapat berupa sebuah konstanta, setiap nilai dihitung, atau bahkan hasil dari perintah SELECT yang mengembalikan satu baris dan satu kolom. Jika klausa WHERE dihilangkan, maka atribut tertentu diatur ke nilai yang sama dalam setiap baris tabel (yang biasanya tidak apa yang ingin Anda lakukan). Anda juga dapat mengatur beberapa nilai atribut pada saat yang sama dengan koma-delimited daftar atribut = pasangan ekspresi.

• The delete statement does just that, for rows in a table.

DELETE FROM <table name> WHERE <condition>;

Jika klausa WHERE dihilangkan, maka setiap baris tabel akan dihapus (yang lagi biasanya tidak apa yang ingin Anda lakukan)-dan sekali lagi, Anda tidak akan mendapatkan "apakah Anda benar-benar ingin melakukan ini" pesan?.

• Jika Anda menggunakan sistem multi-user yang besar, Anda mungkin perlu membuat perubahan DML anda dapat dilihat oleh seluruh pengguna database. Meskipun ini mungkin dilakukan secara otomatis saat Anda log out, Anda juga bisa cukup ketik:

COMMIT;

• Jika Anda telah mengacaukan perubahan dalam sistem semacam ini, dan ingin mengembalikan salinan pribadi Anda dari database ke jalan itu sebelum Anda mulai (ini bekerja hanya jika Anda belum mengetik COMMIT), ketik saja:

ROLLBACK;

Meskipun sistem single-user tidak mendukung komitmen dan pernyataan rollback, mereka digunakan dalam sistem yang besar untuk mengontrol transaksi, yang merupakan urutan perubahan ke database. Transaksi sering dibahas dalam kursus yang lebih maju.

Page 4: Artikel SQL

Keistimewaan

Jika Anda ingin orang lain dapat melihat atau memanipulasi data dalam tabel Anda, dan jika sistem Anda izin ini, Anda harus secara eksplisit memberikan hak istimewa atau hak istimewa yang sesuai (pilih, insert, update, atau menghapus) kepada mereka. Ini harus dilakukan untuk meja masing-masing. Kasus yang paling umum di mana Anda akan menggunakan hibah ini untuk tabel yang Anda ingin membuat tersedia untuk script yang berjalan pada server Web, misalnya:

GRANT select, insert ON customers TO webuser;

Basic query operation: the join

SQL syntax

Dalam query paling, kita akan ingin melihat data dari dua atau lebih tabel. Untuk melakukan hal ini, kita perlu bergabung dengan tabel dengan cara yang cocok sampai informasi yang tepat dari masing-masing ke lain-dalam contoh kita, daftar semua data pelanggan bersama dengan semua data agar perintah bahwa setiap pelanggan memiliki ditempatkan. Dalam standar SQL terbaru, yang bergabung ditentukan dalam klausa FROM:

SELECT * FROM customers NATURAL JOIN orders;Customers joined to Orderscfirstname clastname cphone cstreet czipcode orderdate soldbyAlvaro Monge 562-333-4141 2145 Main 90840 2003-07-14 PatrickWayne Dick 562-777-3030 1250 Bellflower 90840 2003-07-14 PatrickAlvaro Monge 562-333-4141 2145 Main 90840 2003-07-18 KathleenAlvaro Monge 562-333-4141 2145 Main 90840 2003-07-20 Kathleen

• NATURAL JOIN kata kunci yang menetapkan bahwa nilai-nilai atribut yang akan dicocokkan antara dua tabel yang memiliki nama yang sesuai, dengan pengecualian yang sangat jarang, ini akan menjadi pk / atribut fk, dan mereka harus memiliki tipe data yang cocok (dan domain) juga. Join atribut yang dicocokkan-sini (cfirstname, clastname, cphone)-ditampilkan hanya sekali dalam hasil pencarian, bersama dengan semua atribut lainnya dari kedua tabel.• Perhatikan bahwa semua informasi pelanggan untuk masing-masing diulang agar pelanggan telah ditempatkan; ini diharapkan karena hubungan satu-ke-banyak antara Pelanggan dan Pesanan. Perhatikan juga bahwa setiap pelanggan yang belum memesan hilang dari hasil; ini juga diharapkan karena tidak ada fk dalam tabel Perintah yang cocok pk pelanggan dalam tabel Nasabah.• The ALAMI BERGABUNG ditampilkan di sini cocok dengan RA bergabung definisi tepatnya.

Page 5: Artikel SQL

Sayangnya, tidak semua sistem database mendukung ALAMI BERGABUNG kata kunci, sehingga Anda mungkin harus menggunakan sintaks yang berbeda dan dapat melihat hasil yang sedikit berbeda. Kami akan mendiskusikan bergabung lain jenis di halaman berikutnya.Cara kerjanyaCara termudah untuk memahami bergabung adalah untuk memikirkan program database mencari satu-per-satu pada setiap pasang baris dari kedua tabel.

Customerscfirstname clastname cphone cstreet czipcodeTom Jewett 714-555-1212 10200 Slater 92708Alvaro Monge 562-333-4141 2145 Main 90840Wayne Dick 562-777-3030 1250 Bellflower 90840Orderscfirstname clastname cphone orderdate soldbyAlvaro Monge 562-333-4141 2003-07-14 PatrickWayne Dick 562-777-3030 2003-07-14 PatrickAlvaro Monge 562-333-4141 2003-07-18 KathleenAlvaro Monge 562-333-4141 2003-07-20 Kathleen

• Lihatlah pada baris pertama dari Perintah dan baris pertama Pelanggan. Apakah bergabung dengan atribut (pk / pasangan fk) cocok? Tidak, jadi tidak ada yang terjadi; baris ini bukan merupakan bagian dari hasil bergabung. Sekarang lihat pada baris pertama dari Perintah dan baris kedua Pelanggan. Apakah bergabung dengan atribut (pk / pasangan fk) cocok? Ya, mereka lakukan. Semua atribut masing-masing baris disisipkan bersama-sama (dengan satu salinan pk cocok / pasangan fk). Anda dapat melihat ini pada baris pertama dari SQL bergabung dengan contoh di atas. Pertama Pesanan baris dan baris ketiga dari Pelanggan? Tidak cocok, jadi tidak ada baris yang dihasilkan. • Selanjutnya, lihat pada baris kedua Perintah dan baris pertama Pelanggan. Tidak cocok, tidak ada baris yang dihasilkan. Sama dengan baris kedua dari baris kedua Perintah untuk Pelanggan. Kedua baris Perintah untuk baris ketiga dari Pelanggan? Ya, ini ditempel dan dimasukkan dalam hasil pencarian. • Ulangi langkah ini untuk baris ketiga dan keempat Pelanggan dan semua deretan Pesanan. Dua pertandingan yang ditemukan, yang menghasilkan dua baris disisipkan dalam hasil pencarian. Perhatikan bahwa tidak ada baris Pesanan telah cocok dengan baris pertama Pelanggan. • Jika Anda telah mengambil bahkan program studi yang paling dasar dalam algoritma, Anda akan menyadari bahwa SQL tidak benar-benar melaksanakan bergabung dengan cara yang kita baru saja dijelaskan itu. Namun, model mental akan membantu Anda untuk mengikuti definisi RA (di bawah), dengan cara kerja dalam perangkat lunak database kiri untuk kursus lebih maju atau tutorial. RA sintaks RA gabungan dua hubungan, r lebih dari skema R dan s over skema S, ditulis r s ⋈, atau dalam contoh kita, ⋈ pesanan pelanggan. Skema hasilnya, persis seperti yang Anda lihat dalam sintaks

Page 6: Artikel SQL

SQL, adalah gabungan dari dua skema relasi, R ∪ S. Join atribut yang ditemukan di persimpangan dari dua skema, R ∩ S. Jelas, atribut-atribut persimpangan harus mewarisi aturan tugas yang sama dari R dan S, ini membuat dua skema yang kompatibel. • Hasil RA bergabung terdiri dari pasta berpasangan dari semua tupel dari dua relasi, pasta ditulis (t, u) untuk setiap t tupel dari relasi r lebih dari skema R dan u dari hubungan s over skema S. Hasil operasi pasta persis seperti yang dijelaskan dalam bagian sebelumnya. • Pada kasus yang sangat, sangat langka di mana tidak ada persimpangan antara skema R dan S (yaitu, R ∩ S = (null)), skema masih kompatibel dan setiap tupel dari relasi r disisipkan ke setiap tupel dari relasi s , dengan semua atribut dari kedua pola yang terdapat dalam tupel yang dihasilkan. Dalam teori set, ini merupakan produk Cartesian dari dua hubungan, dalam prakteknya, hampir selalu omong kosong dan tidak apa yang Anda inginkan. Produk Cartesian juga dapat ditulis dalam RA sebagai r s ×, atau sengaja ditentukan dalam SQL dengan kata kunci CROSS JOIN. • Anda mungkin ingin memvisualisasikan tiga kemungkinan hasil operasi paste menggunakan skema representasi grafis dan tupel yang kami disajikan dalam halaman sebelumnya.

teknik SQL: beberapa bergabung dan kata kunci yang berbedaAdalah penting untuk menyadari bahwa jika Anda memiliki benar dirancang dan dihubungkan database, Anda dapat mengambil informasi mulai dari tabel yang Anda inginkan, tentukan berdasarkan kondisi pengambilan data dalam tabel, dan menampilkan hasil dalam urutan yang Anda sukai.Contoh: Kita akan menggunakan model pemrosesan order. Kami ingin daftar semua produk yang telah dibeli oleh pelanggan tertentu.

Page 7: Artikel SQL

• Kecuali Anda bisa menghafal ejaan yang tepat dari setiap atribut dalam database, bersama dengan semua PKS dan FKS (aku tidak bisa), Anda harus menyimpan salinan dari diagram skema relasi berguna ketika Anda membangun query. Kami akan menampilkan lagi di sini, mengelilingi atribut yang kita butuhkan untuk query ini.

• permintaan kami masih sederhana yang dapat disajikan dalam RA hanya menggunakan pilih, proyek, dan bergabung operator: πcLastName, cFirstName, σcFirstName prodName = 'Alvaro' dan cLastName Monge = '(pelanggan perintah orderlines produk) • Informasi yang kami butuhkan adalah ditemukan di tabel Produk. Anda dapat menganggap ini sebagai "output" dari query yang akan menjadi bagian dari daftar atribut klausa SELECT. Kondisi pengambilan, atau "masukan" untuk query, didasarkan pada Pelanggan meja-atribut ini akan dibutuhkan untuk klausa WHERE. Anda harus menyertakan atribut-atribut ini dalam daftar SELECT, sehingga Anda yakin bahwa pertanyaan Anda menunjukkan data yang Anda inginkan. • Kita juga akan perlu menyertakan tabel campur tangan dalam klausa FROM query, karena ini adalah satu-satunya cara untuk benar mengasosiasikan Pelanggan data dengan data Produk. (Anda tidak dapat bergabung Pelanggan untuk Produk, karena mereka tidak memiliki atribut umum.) • Cara lain untuk memikirkan hal ini adalah dengan hanya "mengikuti pasangan PK-FK" dari meja ke meja sampai Anda telah benar-benar terhubung semua informasi yang Anda butuhkan. Jika Anda perhatikan dengan teliti pada skema relasi untuk permintaan ini, Anda akan menyadari bahwa kita bisa melewati meja Perintah (sejak CustID juga merupakan bagian dari skema OrderLines). Seandainya ada orderID, atau jika kita membutuhkan data dari tabel Pesanan, itu harus dimasukkan, jadi kami akan menyimpannya di sini untuk ilustrasi. Dalam SQL, kita akan membangun query menggunakan prosedur langkah-demi-langkah yang sama yang telah Anda lihat sebelumnya.

Page 8: Artikel SQL

1. Lihat hasil set (semua data yang terhubung). Kami tidak akan menampilkan hasilnya di sini karena keterbatasan ruang pada halaman web.

SELECT * FROM customers NATURAL JOIN orders NATURAL JOIN orderlines NATURAL JOIN products;• sistem database Anda mungkin tidak mendukung sintaks yang ALAMI BERGABUNG kami tunjukkan di sini. Kita akan membahas masalah ini lebih lanjut ketika kita melihat bergabung jenis. Alam beberapa bergabung dalam pekerjaan contoh kita benar karena ada non-pk/fk ada atribut dalam tabel kita yang memiliki nama yang sama. Dalam lebih besar, database lebih rumit, ini tidak mungkin benar.2. Pilih baris yang Anda inginkan, dan pastikan bahwa semua informasi yang masuk akal dan benar-benar apa yang Anda cari. (Yang satu ini masih terlalu lebar untuk halaman.)Sumbangkan terjemahan yang lebih baik SELECT * FROM customers NATURAL JOIN orders NATURAL JOIN orderlines NATURAL JOIN products WHERE cFirstName = 'Alvaro' AND cLastName = 'Monge';

3. Sekarang memilih kolom yang Anda inginkan, dan sekali lagi memeriksa hasil. Perhatikan bahwa kita sudah termasuk kondisi retreival atribut dalam klausa SELECT, untuk memastikan bahwa ini benar-benar adalah jawaban yang tepat.

SELECT cFirstName, cLastName, prodName FROM customers NATURAL JOIN orders NATURAL JOIN orderlines NATURAL JOIN products WHERE cFirstName = 'Alvaro' AND cLastName = 'Monge';Products purchasedcFirstName cLastName prodNameAlvaro Monge Hammer, framing, 20 oz.Alvaro Monge Hammer, framing, 20 oz.Alvaro Monge Screwdriver, Phillips #2, 6 inchAlvaro Monge Screwdriver, Phillips #2, 6 inchAlvaro Monge Pliers, needle-nose, 4 inch

Kata kunci yang berbedaUps! Kami hanya ingin daftar nama-nama produk individual yang pelanggan ini telah membeli, tapi beberapa dari mereka yang terdaftar lebih dari sekali. Apa yang salah?• Jika versi RA dari query kita bisa benar-benar telah dilaksanakan, setiap baris tabel hasil di

Page 9: Artikel SQL

atas akan berbeda-ingat bahwa relasi adalah himpunan tupel, dan set tidak dapat memiliki duplikat-dan tentu saja akan ada lebih sedikit baris dari yang Anda lihat di sini.• SQL tidak bekerja dengan cara yang sama. Alasan untuk duplikat adalah bahwa klausa SELECT hanya menghilangkan kolom yang tidak diinginkan dari hasil set; itu meninggalkan semua baris yang diambil oleh klausa WHERE.• Masalah nyata dalam SQL adalah SELECT daftar atribut bukan kunci super untuk hasil set. Lihat lagi sangat hati-hati pada skema relasi untuk memahami mengapa hal ini benar. Setiap saat ini terjadi, kita bisa menghilangkan duplikasi baris dengan memasukkan kata kunci yang berbeda di klausa SELECT. Meskipun melakukan revisi ini, kami juga akan daftar nama produk dalam urutan abjad.

SELECT DISTINCT cFirstName, cLastName, prodName FROM customers NATURAL JOIN orders NATURAL JOIN orderlines NATURAL JOIN products WHERE cFirstName = 'Alvaro' AND cLastName = 'Monge' ORDER BY prodName;Distinct productscFirstName cLastName prodNameAlvaro Monge Hammer, framing, 20 oz.Alvaro Monge Pliers, needle-nose, 4 inchAlvaro Monge Screwdriver, Phillips #2, 6 inch

• Suatu cara yang ceroboh untuk memastikan bahwa Anda tidak memiliki duplikat baris akan selalu menggunakan kata kunci yang berbeda. Tolong jangan melakukan ini-itu hanya akan menjauhkan Anda dari memahami apa yang sebenarnya sedang terjadi dalam query. Jika daftar atribut SELECT tidak membentuk kunci super klausa DARI (hasil set), kata kunci yang berbeda tidak diperlukan, dan tidak harus digunakan.teknik SQL: bergabung jenisInner bergabungSemua bergabung bahwa Anda telah melihat sejauh ini telah menggunakan sintaks-bergabung dengan alam misalnya, untuk menghasilkan daftar pelanggan dan tanggal di mana mereka ditempatkan perintah. Ingat bahwa jika sintaks ini tersedia, maka secara otomatis akan memilih bergabung dengan atribut seperti pada nama yang sama di kedua tabel (persimpangan skema). Hal ini juga akan menghasilkan hanya satu salinan dari atribut-atribut dalam tabel hasil.

SELECT cFirstName, cLastName, orderDate FROM customers NATURAL JOIN orders;

• Join tidak mempertimbangkan bergabung dan fk pk atribut yang telah Anda tentukan. Jika ada atribut non-pk/fk apapun yang memiliki nama yang sama pada tabel yang akan bergabung, mereka juga akan disertakan di persimpangan dari skema, dan digunakan sebagai atribut bergabung di join natural. Hasil pasti tidak akan dapat benar! Masalah ini mungkin akan sangat

Page 10: Artikel SQL

sulit untuk mendeteksi di banyak kasus di mana alam bergabung dilakukan dalam permintaan yang sama. Untungnya, Anda selalu dapat menentukan bergabung atribut sendiri, seperti yang kita jelaskan berikutnya. • kata kunci lain yang menghasilkan hasil yang sama (tanpa nama atribut masalah potensial) adalah bergabung batin. Dengan sintaks ini, Anda dapat menentukan bergabung atribut dalam klausa MENGGUNAKAN. (Beberapa bergabung atribut dalam klausa MENGGUNAKAN dipisahkan oleh koma) ini juga menghasilkan hanya satu salinan bergabung atribut pada tabel hasil.. Seperti sintaks JOIN ALAMI, klausa MENGGUNAKAN tidak didukung oleh semua sistem.

SELECT cFirstName, cLastName, orderDate FROM customers INNER JOIN orders USING (custID);• Yang paling banyak digunakan (dan paling portabel) sintaks untuk bergabung pengganti dalam sebuah ON klausul untuk klausa MENGGUNAKAN. Hal ini mengharuskan Anda secara eksplisit menentukan tidak hanya bergabung nama atribut, tapi bergabung kondisi (biasanya kesetaraan). Hal ini juga mengharuskan Anda untuk pengantar (memenuhi syarat) yang bergabung dengan nama atribut dengan nama meja mereka, karena kedua kolom akan dimasukkan dalam tabel hasil. Ini adalah hanya sintaks yang akan membiarkan Anda menggunakan atribut yang telah bergabung dengan nama yang berbeda pada tabel yang akan bergabung. Sayangnya, hal itu juga memungkinkan Anda untuk bergabung dengan tabel pada atribut selain pk pasangan fk /, yang merupakan cara pra-1992 untuk menjawab query yang dapat ditulis dalam cara yang lebih baik hari ini. SELECT cFirstName, cLastName, orderDate FROM customers INNER JOIN orders ON customers.custID = orders.custID;

• Anda dapat menyimpan sedikit mengetik dengan menetapkan sebuah alias untuk setiap nama tabel (seperti c dan o dalam contoh ini), kemudian menggunakan alias bukan nama penuh saat Anda lihat atribut. Ini adalah hanya sintaks yang akan membiarkan Anda bergabung dengan meja untuk dirinya sendiri, seperti yang akan kita lihat ketika kita membicarakan hubungan rekursif.

SELECT cFirstName, cLastName, orderDate FROM customers c INNER JOIN orders o ON c.custID = o.custID;

• Semua pernyataan di atas join ditetapkan sebagai bagian dari standar, SQL 1992 yang tidak didukung secara luas selama beberapa tahun setelah itu. Dalam sistem sebelumnya, bergabung dilakukan dengan sintaks SQL 1986 standar. Meskipun Anda tidak harus menggunakan ini kecuali jika Anda benar-benar harus, Anda hanya mungkin terjebak bekerja pada sebuah database yang lebih tua. Jika demikian, Anda harus mengakui bahwa kondisi bergabung ditempatkan membingungkan pada klausa WHERE, bersama dengan semua tes untuk memilih baris yang benar:

SELECT cFirstName, cLastName, orderDate

Page 11: Artikel SQL

FROM customers c, orders o WHERE c.custID = o.custID;

Outer join

Salah satu efek penting dari semua bergabung alam dan batin adalah bahwa setiap nilai tak tertandingi PK hanya tetes dari hasilnya. Dalam contoh kita, ini berarti bahwa setiap pelanggan yang tidak memesan tidak ditampilkan. Misalkan bahwa kita ingin daftar semua pelanggan, bersama dengan tanggal order (s) bagi mereka yang melakukan pesanan tempat. Untuk memasukkan pelanggan yang tidak perintah tempat, kita akan menggunakan outer join, yang dapat mengambil baik atau ON MENGGUNAKAN sintaks klausa.

SELECT cFirstName, cLastName, orderDate FROM customers c LEFT OUTER JOIN orders o ON c.custID = o.custID;All customers and order datescfirstname clastname orderdateTom JewettAlvaro Monge 2003-07-14Alvaro Monge 2003-07-18Alvaro Monge 2003-07-20Wayne Dick 2003-07-14

• Perhatikan bahwa bagi pelanggan yang ditempatkan tidak perintah, setiap atribut dari tabel Order hanya diisi dengan nilai NULL.• Kata "kiri" mengacu pada urutan tabel di klausa DARI (pelanggan di sebelah kiri, perintah di sebelah kanan). Tabel kiri di sini adalah salah satu yang mungkin telah bergabung tertandingi atribut-salah satu dari yang kita inginkan semua baris. Kami bisa mendapatkan hasil yang sama jika tabel nama dan luar bergabung dengan arah terbalik:

SELECT cFirstName, cLastName, orderDate FROM orders o RIGHT OUTER JOIN customers c ON o.custID = c.custID;

• Sebuah outer join masuk akal hanya jika salah satu sisi hubungan tersebut memiliki kardinalitas minimum nol (seperti Order tidak di contoh ini). Jika tidak, outer join akan menghasilkan hasil yang sama persis sebagai bergabung dalam (misalnya, antara Order dan OrderLines).• Standar SQL juga memungkinkan bergabung FULL luar, di mana bergabung tertandingi atribut dari sisi baik dipasangkan dengan nilai-nilai null di sisi lain. Anda mungkin tidak akan menggunakan ini dengan database yang dirancang dengan baik.Evaluasi orderBeberapa bergabung dalam query dievaluasi kiri-ke-kanan dalam urutan yang Anda menulis mereka, kecuali jika Anda menggunakan tanda kurung untuk memaksa urutan evaluasi yang

Page 12: Artikel SQL

berbeda. (Beberapa sistem database membutuhkan tanda kurung dalam hal apapun) Skema dari bergabung. Juga kumulatif dengan urutan yang mereka dievaluasi, dalam RA, ini berarti bahwa

r1 r2 r3 = (r1 r2) r3.

• Hal ini terutama penting untuk mengingat aturan ketika luar bergabung dicampur dengan bergabung lain dalam query. Misalnya, jika Anda menulis:

SELECT cFirstName, cLastName, orderDate, UPC, quantity FROM customers LEFT OUTER JOIN orders USING (custID) NATURAL JOIN orderlines;

Anda akan kehilangan pelanggan yang belum menempatkan perintah. Mereka akan disimpan jika Anda memaksa bergabung kedua yang dijalankan pertama:

SELECT cFirstName, cLastName, orderDate, UPC, quantity FROM customers LEFT OUTER JOIN (orders NATURAL JOIN orderlines) USING (custID);

Jenis Join LainnyaDemi kelengkapan, Anda juga harus tahu bahwa jika Anda mencoba untuk bergabung dua tabel dengan kondisi tidak bergabung, hasilnya akan bahwa setiap baris dari satu sisi dipasangkan dengan setiap baris dari sisi lain. Secara matematis, ini merupakan produk Cartesian dari dua tabel, seperti yang Anda lihat sebelumnya. Hal ini hampir tidak pernah apa yang Anda inginkan. Dalam pra-1992 sintaks, mudah untuk melakukan ini sengaja, dengan lupa untuk menempatkan bergabung dengan kondisi di klausa WHERE:

SELECT cFirstName, cLastName, orderDate FROM customers, orders;

• If your system is backward-compatible (most are), you might actually try this just to prove to yourself that the result is pure nonsense. However, if you ever have an occasion to really need a Cartesian product of two tables, use the new cross join syntax to prove that you really mean it. Notice that this example still produces nonsense.

SELECT cFirstName, cLastName, orderDate FROM customers CROSS JOIN orders;

• Jika sistem anda kompatibel ke belakang (sebagian besar), Anda mungkin sebenarnya ini hanya mencoba untuk membuktikan sendiri bahwa hasilnya adalah omong kosong murni. Namun, jika Anda pernah memiliki kesempatan untuk benar-benar membutuhkan produk

Page 13: Artikel SQL

Cartesian dari dua tabel, gunakan sintaks baru bergabung salib untuk membuktikan bahwa Anda benar-benar serius. Perhatikan bahwa contoh ini masih menghasilkan omong kosong.

• Anda juga dapat mendengar istilah bergabung diri, yang tidak lain adalah sebuah bergabung dalam atau luar antara dua atribut dalam tabel yang sama. Kami akan melihat ini saat kita membahas hubungan rekursif.

Teknik SQL: fungsiKadang-kadang, informasi yang kita butuhkan adalah tidak benar-benar disimpan dalam database, tapi harus dihitung dengan cara tertentu dari data yang tersimpan. Dalam contoh order entri kami, ada dua atribut diturunkan (/ subtotal di OrderLines dan / total Order) yang merupakan bagian dari diagram kelas namun bukan merupakan bagian dari skema relasi. Kita bisa menghitung ini dengan menggunakan fungsi SQL dalam laporan SELECT.Ada banyak, banyak fungsi dalam implementasi dari SQL-jauh lebih dari yang kita dapat menunjukkan di sini. Sayangnya, banyak fungsi didefinisikan sangat berbeda dalam bentuk paket database yang berbeda, sehingga Anda harus selalu berkonsultasi dengan referensi manual untuk perangkat lunak khusus Anda.Kolom dihitungKita dapat menghitung nilai dari informasi yang ada di meja hanya dengan menunjukkan perhitungan dalam klausa SELECT. Setiap perhitungan menciptakan kolom baru dalam tabel output, seperti olah itu adalah atribut bernama.Contoh: Kita ingin mencari subtotal untuk setiap baris tabel OrderLines, seperti ditunjukkan dalam diagram kelas UML. Jelas, jumlah setiap baris hanya harga jual satuan kali kuantitas memerintahkan, sehingga kita bahkan tidak perlu namun fungsi-hanya perhitungan. Kami telah menyertakan semua tiga dari PK OrderLines atribut dalam daftar atribut klausa SELECT, untuk memastikan bahwa kita menunjukkan subtotal untuk setiap baris yang berbeda.

SELECT custID, orderDate, UPC, unitSalePrice * quantity FROM orderlines;Order line subtotalscustid orderdate upc unitsaleprice * quantity5678 2003-07-14 51820 33622 11.9499998092659012 2003-07-14 51820 33622 23.899999618539012 2003-07-14 11373 24793 21.255678 2003-07-18 81809 73555 185678 2003-07-20 51820 33622 23.899999618535678 2003-07-20 81809 73555 95678 2003-07-20 81810 63591 24.75

Komputasi tidak terbatas hanya untuk nama kolom, mereka juga termasuk konstanta. Misalnya, unitsaleprice * 1,06 dapat digunakan untuk mencari harga jual ditambah pajak penjualan.Perhatikan bahwa perhitungan sendiri ditampilkan sebagai judul untuk kolom dihitung. Hal ini canggung untuk membaca, dan tidak benar-benar tahu kami apa artinya kolom. Kami dapat membuat kolom pos kita sendiri atau alias menggunakan kata kunci AS seperti ditunjukkan di

Page 14: Artikel SQL

bawah. (Pada kenyataannya, kita hanya bisa menulis nama baru kolom tanpa mengatakan AS. Tolong jangan lakukan ini-itu menyakitkan dibaca kode Anda) Jika. Anda ingin kolom alias Anda memiliki ruang di dalamnya, Anda harus melampirkan dalam tanda kutip ganda.

SELECT custID, orderDate, UPC, unitSalePrice * quantity AS subtotal FROM orderlines;Order line subtotalscustid orderdate upc subtotal5678 2003-07-14 51820 33622 11.9499998092659012 2003-07-14 51820 33622 23.899999618539012 2003-07-14 11373 24793 21.255678 2003-07-18 81809 73555 185678 2003-07-20 51820 33622 23.899999618535678 2003-07-20 81809 73555 95678 2003-07-20 81810 63591 24.75

Fungsi AgregatSQL fungsi agregat mari kita hitung berdasarkan nilai beberapa baris dalam tabel kita. Mereka juga digunakan sebagai bagian dari klausa SELECT, dan juga membuat kolom baru pada output.Contoh: Pertama, mari kita hanya menemukan jumlah total dari seluruh penjualan kami. Untuk menghitung ini, semua yang kita butuhkan adalah lakukan adalah untuk menjumlahkan semua perhitungan harga-kali-jumlah dari setiap baris dari OrderLines. Kami akan menggunakan fungsi SUM untuk melakukan perhitungan. Tabel output, seperti yang Anda harus mengharapkan, akan berisi hanya satu baris.

SELECT SUM(unitSalePrice * quantity) AS totalsales FROM orderlines;Salestotalsales132.74999904633

Selanjutnya, kami akan menghitung total untuk tiap pesanan (yang berasal atribut ditampilkan dalam kelas Orde UML). Kita masih perlu menambahkan baris perintah, tapi kita perlu kelompok total untuk tiap pesanan. Kita bisa melakukan ini dengan klausa GROUP BY. Kali ini, output akan berisi satu baris untuk setiap pesanan, karena Pelanggan dan membentuk orderDate PK untuk Perintah, tidak OrderLines. Melihat bahwa klausa SELECT dan klausa GROUP BY tepat berisi daftar atribut yang sama, kecuali untuk perhitungan. Dalam kebanyakan kasus, Anda akan mendapatkan pesan kesalahan jika Anda lupa untuk melakukan hal ini.

SELECT custID, orderDate, SUM(unitSalePrice * quantity) AS total FROM orderlines GROUP BY custID, orderDate;

Page 15: Artikel SQL

Order totalscustid orderdate total5678 2003-07-14 11.94999980926515678 2003-07-18 185678 2003-07-20 57.64999961853039012 2003-07-14 45.1499996185303

fungsi yang sering digunakan lainnya yang bekerja dengan cara yang sama seperti SUM termasuk MIN (nilai minimum yang di pengelompokan), MAX (nilai maksimum yang di pengelompokan, dan AVG (nilai rata-rata mereka yang mengelompokkan).Fungsi COUNT sedikit berbeda, karena ia mengembalikan jumlah baris dalam sebuah kelompok. Untuk menghitung semua baris, kita dapat menggunakan * (misalnya, untuk mengetahui berapa banyak pesanan ditempatkan).

SELECT COUNT(*) FROM orders;OrdersCOUNT(*)4

Kami juga dapat menghitung kelompok baris dengan nilai-nilai identik dalam kolom. Dalam hal ini, akan COUNT mengabaikan nilai NULL di kolom. Di sini, kita akan tahu berapa kali masing-masing produk telah diperintahkan.

SELECT prodname AS "product name", COUNT(prodname) AS "times ordered" FROM products NATURAL JOIN orderlines GROUP BY prodname;Product ordersproduct name times orderedHammer, framing, 20 oz. 3Pliers, needle-nose, 4 inch 1Saw, crosscut, 10 tpi 1Screwdriver, Phillips #2, 6 inch 2

Sebuah klausa WHERE dapat digunakan seperti biasa sebelum DENGAN GROUP, untuk menghilangkan baris sebelum fungsi kelompok dijalankan. Namun, jika kita ingin memilih baris output berdasarkan hasil dari fungsi kelompok, klausa HAVING digunakan sebagai gantinya. Sebagai contoh, kita bisa meminta hanya produk yang telah terjual lebih dari sekali:

SELECT prodname AS "product name", COUNT(prodname) AS "times ordered" FROM products NATURAL JOIN orderlines GROUP BY prodname

Page 16: Artikel SQL

HAVING COUNT(prodname) > 1;

Fungsi lainKebanyakan sistem database menawarkan berbagai fungsi yang berhubungan dengan format dan tugas lain-lain. Fungsi ini cenderung eksklusif, jauh berbeda dari sistem ke sistem di kedua ketersediaan dan sintaks. Kebanyakan digunakan dalam klausa SELECT, meskipun beberapa mungkin muncul dalam ekspresi klausa WHERE atau pernyataan INSERT atau UPDATE. fungsi umum termasuk:• Fungsi untuk pembulatan, truncating, mengubah, dan format tipe data numerik.• Fungsi untuk concatenating, mengubah kasus, dan memanipulasi tipe data karakter.• Fungsi untuk memformat tanggal dan waktu, atau mengambil tanggal dan waktu dari sistem operasi.• Fungsi untuk mengubah tipe data seperti tanggal atau numerik ke string karakter, dan sebaliknya.• Fungsi untuk menyediakan nilai-nilai atribut dapat dilihat oleh null, memungkinkan output bersyarat, dan tugas lain-lain. Teknik SQL: subqueries Kadang-kadang Anda tidak memiliki informasi yang cukup tersedia saat Anda merancang query untuk menentukan baris yang Anda inginkan. Dalam hal ini, Anda harus menemukan informasi yang dibutuhkan dengan sebuah subquery.Contoh: Carilah nama pelanggan yang tinggal di daerah kode pos yang sama dengan Wayne Dick. Kita bisa mulai menulis query ini seperti yang kita akan apapun yang yang telah kita lakukan:

SELECT cFirstName, cLastName FROM customers WHERE cZipCode = ???

• Ups! Kita tidak tahu apa kode pos untuk dimasukkan ke dalam klausa WHERE. Tidak, kita tidak bisa mencarinya secara manual dan jenis ke dalam-permintaan kita harus menemukan jawaban hanya berdasarkan informasi yang kami telah diberi!• Untungnya, kita juga tahu cara menemukan kode pos yang benar dengan menulis query lain:

SELECT cZipCode FROM Customers WHERE cFirstName = 'Wayne' AND cLastName = 'Dick';Zip codeczipcode90840

• Perhatikan bahwa query ini mengembalikan sebuah kolom tunggal dan satu baris. Kami dapat menggunakan hasil sebagai nilai kondisi cZipCode dalam query kita. Akibatnya, output dari permintaan kedua menjadi masukan untuk yang pertama, yang kita dapat menggambarkan hubungan mereka dengan skema:

Page 17: Artikel SQL

• secara sintaktis, yang harus kita lakukan adalah menyertakan subquery di parenthses, di tempat yang sama di mana kami biasanya menggunakan konstan di klausa WHERE. Kami akan menyertakan kode pos pada baris SELECT untuk memverifikasi bahwa jawabannya adalah apa yang kita inginkan:

SELECT cFirstName, cLastName, cZipCode FROM customers WHERE cZipCode = (SELECT cZipCode FROM customers WHERE cFirstName = 'Wayne' AND cLastName = 'Dick');Customerscfirstname clastname czipcodeAlvaro Monge 90840Wayne Dick 90840

Sebuah subquery yang mengembalikan hanya satu kolom dan satu baris dapat digunakan setiap kali kita membutuhkan nilai tunggal. Contoh lain akan menemukan nama produk dan harga jual semua produk yang dijual harga satuan lebih besar daripada rata-rata semua produk. Kita bisa melihat bahwa kata kunci yang berbeda diperlukan, karena tidak SELECT atribut kunci super dari himpunan hasil:

SELECT DISTINCT prodName, unitSalePrice FROM Products NATURAL JOIN OrderLines WHERE unitSalePrice > the average unit sale price

• Sekali lagi, kita sudah tahu bagaimana menulis query lain yang menemukan rata-rata:

SELECT AVG(unitSalePrice) FROM OrderLines;AverageAVG(unitsaleprice)10.621428

• Kita bisa memvisualisasikan query dikombinasikan dengan skema hubungan mereka, dan menulis sintaks penuh seperti sebelumnya:

Page 18: Artikel SQL

SELECT DISTINCT prodName, unitSalePrice FROM Products NATURAL JOIN OrderLines WHERE unitSalePrice > (SELECT AVG(unitSalePrice) FROM OrderLines);Above averageprodname unitsalepriceHammer, framing, 20 oz. 11.95Saw, crosscut, 10 tpi 21.25

Subqueries juga dapat digunakan ketika kita membutuhkan lebih dari satu nilai tunggal sebagai bagian dari permintaan yang lebih besar. Kita akan melihat contoh-contoh di halaman ini kemudian.Teknik SQL: serikat dan minusSet operasi di atas mejaBeberapa siswa awalnya berpikir bahwa bergabung sebagai semacam kesatuan antara dua tabel. Ini bukan (kecuali untuk skema). Join pasangan cadangan data dari dua tabel yang sangat berbeda. Dalam RA dan SQL, serikat buruh hanya dapat beroperasi di dua meja identik. Ingat representasi diagram Venn-serikat dan operasi minus di set. Uni termasuk anggota salah satu atau kedua set (tanpa duplikat). Minus hanya mencakup anggota mengatur di sisi kiri ekspresi yang tidak terkandung dalam mengatur di sisi kanan dari ekspresi.

• Kedua kumpulan, R dan S, harus berisi objek dari jenis yang sama. Anda tidak dapat serikat buruh atau set minus integer dengan set karakter, misalnya. Semua perangkat, menurut definisi, adalah unordered dan tidak dapat mengandung elemen duplikat. • SQL dan RA mengatur operasi memperlakukan tabel sebagai set baris. Oleh karena itu, tabel di kedua sisi serikat atau operator minus harus memiliki minimal jumlah atribut yang sama,

Page 19: Artikel SQL

dengan atribut yang sesuai termasuk jenis data yang sama. Biasanya lebih bersih dan lebih mudah dibaca jika Anda hanya maju dan memberi mereka nama yang sama dengan menggunakan kunci AS. Serikat Untuk contoh ini, kita akan menambahkan tabel Pemasok untuk model entri data penjualan kami. "Pemasok merupakan perusahaan yang membeli produk kita bahwa kita akan kembali menjual" Setiap pemasok pemasok nol untuk banyak produk.; Setiap produk dipasok oleh satu dan hanya satu pemasok. pemasok atribut kelas meliputi nama perusahaan dan alamat, ditambah nama dan nomor telepon wakil dari siapa kita melakukan pembelian kami. • Kami ingin menghasilkan daftar yang menunjukkan nama dan nomor telepon semua orang yang kita hadapi, apakah mereka pemasok atau pelanggan. Kita perlu baris dari kedua tabel, tetapi mereka harus memiliki daftar atribut yang sama. Melihat skema relasi, kita menemukan nama yang sesuai, nama terakhir, dan atribut nomor telepon, tapi kita masih perlu menunjukkan apa yang masing-masing perusahaan pemasok wakil bekerja.

• Kita dapat membuat kolom tambahan dalam output query untuk tabel Pelanggan dengan hanya memberikan nama dan mengisinya dengan nilai konstan. Di sini, kita akan menggunakan nilai 'Pelanggan' untuk membedakan baris ini dari perwakilan pemasok. SQL menggunakan nama kolom dari bagian pertama dari query serikat sebagai nama kolom untuk output, jadi kami akan memberikan mereka masing-masing alias yang sesuai untuk seluruh himpunan data.• Membangun dan menguji setiap komponen permintaan serikat pekerja secara individu, kemudian menempatkannya bersama. Klausa ORDER BY harus datang di akhir.

SELECT cLastName AS "Last Name", cFirstName AS "First Name", cPhone as "Phone", 'Customer' AS "Company" FROM customers UNION SELECT repLName, repFName, repPhone, sCompanyName FROM suppliers ORDER BY "Last Name";Phone listLast Name First Name Phone Company Bradley Jerry 888-736-8000 Industrial Tool SupplyDick Wayne 562-777-3030 CustomerJewett Tom 714-555-1212 CustomerMonge Alvaro 562-333-4141 Customer

Page 20: Artikel SQL

Phone listLast Name First Name Phone Company O'Brien Tom 949-567-2312 Bosch Machine Tools

Minus

Kadang-kadang Anda harus berpikir tentang baik apa yang Anda inginkan dan apa yang tidak Anda inginkan dalam hasil query. Jika ada klausa WHERE predikat yang sepenuhnya partisi semua baris bunga (hasil set) ke orang yang Anda inginkan dan orang-orang yang tidak Anda inginkan, maka Anda memiliki pertanyaan sederhana dengan tes untuk ketidaksetaraan.• Banyaknya sebuah asosiasi dapat membantu Anda menentukan bagaimana membangun query. Karena produk masing-masing memiliki satu dan hanya satu pemasok, kita bisa partisi tabel Produk ke orang-orang yang dipasok oleh sebuah perusahaan tertentu dan yang tidak.

SELECT prodName, sCompanyName FROM Products NATURAL JOIN Suppliers WHERE sCompanyName <> 'Industrial Tool Supply';

• Kontras ini untuk menemukan pelanggan yang tidak melakukan pembelian pada tahun 2002. Karena asosiasi satu-ke-banyak opsional antara Pelanggan dan Order, sebenarnya ada empat kemungkinan:1. Seorang pelanggan melakukan pembelian tahun 2002 (saja).2. Seorang pelanggan melakukan pembelian di tahun lainnya, tetapi tidak pada tahun 2002.3. Seorang pelanggan melakukan pembelian baik di tahun lainnya dan pada tahun 2002.4. Seorang pelanggan tidak melakukan pembelian di setiap tahun.• Jika Anda mencoba untuk menulis ini sebagai tes sederhana untuk ketidaksetaraan,

SELECT DISTINCT cLastName, cFirstName, cStreet, cZipCode FROM Customers NATURAL JOIN Orders WHERE TO_CHAR(orderDate, 'YYYY') <> '2002';

Anda benar akan mengecualikan kelompok 1 dan termasuk kelompok 2, tapi palsu termasuk kelompok 3 dan palsu mengecualikan kelompok 4. Silakan ambil waktu untuk membaca kembali pernyataan ini dan meyakinkan diri sendiri mengapa itu benar!• Kita bisa menunjukkan dalam notasi mengatur apa yang perlu kita lakukan:

{customers who did not make purchases in 2002} = {all customers} − {those who did}

Ada dua cara untuk menulis ini di SQL.• Sintaks termudah dalam hal ini adalah untuk membandingkan hanya ID pelanggan. Kami akan menggunakan TIDAK DI operator diatur dalam klausa WHERE, bersama dengan subquery untuk mencari ID pelanggan orang-orang yang tidak melakukan pembelian pada tahun 2002.

Page 21: Artikel SQL

SELECT cLastName, cFirstName, cStreet, cZipCode FROM Customers WHERE custID NOT IN (SELECT custID FROM Orders WHERE TO_CHAR(orderDate, 'YYYY') = '2002');

• Kita juga dapat menggunakan operator MINUS untuk mengurangi baris kita tidak ingin dari semua baris di Pelanggan. (Beberapa versi dari SQL menggunakan kata kunci KECUALI bukan MINUS) Seperti UNION tersebut., Ini membutuhkan skema dari dua tabel untuk sama persis jumlah dan jenis atribut.

SELECT cLastName, cFirstName, cStreet, cZipCode FROM Customers MINUS SELECT cLastName, cFirstName, cStreet, cZipCode FROM Customers NATURAL JOIN Orders WHERE TO_CHAR(orderDate, 'YYYY') = '2002';

set operations lainnya

SQL memiliki dua operator paket tambahan. UNION ALL bekerja seperti UNION, kecuali ia terus duplikasi baris dalam hasil pencarian. INTERSECT beroperasi seperti yang Anda harapkan dari teori himpunan, lagi, skema dari dua tabel harus sama persis.

SQL technique: views and indexes

melihat adalah hanya ada pertanyaan SELECT yang telah diberi nama dan disimpan dalam database. Untuk alasan ini, melihat kadang-kadang disebut query bernama atau query disimpan. Untuk membuat tampilan, Anda menggunakan sintaks SQL:

CREATE OR REPLACE VIEW <view_name> AS SELECT <any valid select query>;

• Permintaan sendiri melihat disimpan dalam database, tetapi tidak benar-benar berjalan sampai disebut dengan pernyataan lain SELECT. Untuk alasan ini, melihat tidak mengambil setiap ruang disk untuk penyimpanan data, dan tidak berlebihan membuat salinan data yang sudah disimpan dalam tabel bahwa referensi (yang terkadang disebut tabel dasar pandangan).• Meskipun tidak diperlukan, pengembang banyak database mengidentifikasi pandangan dengan nama seperti v_Customers atau Customers_view. Hal ini tidak hanya menghindari konflik nama dengan tabel dasar, membantu dalam membaca ada pertanyaan yang menggunakan tampilan.• Kata kunci OR REPLACE dalam sintaks yang ditunjukkan di atas adalah opsional. Meskipun Anda tidak perlu menggunakannya pertama kali yang Anda buat melihat, termasuk mereka akan menimpa versi lama melihat dengan Anda terbaru satu, tanpa memberikan pesan kesalahan.• Sintaks untuk menghapus pandangan dari skema Anda adalah apa yang Anda harapkan:

Page 22: Artikel SQL

DROP VIEW <view_name>;

Menggunakan views

Sebuah nama tampilan dapat digunakan dengan cara yang persis sama seperti nama tabel dalam query SELECT. Setelah disimpan, melihat dapat digunakan lagi dan lagi, bukan menulis ulang kali sama banyak permintaan. • Penggunaan yang paling dasar akan melihat untuk * hanya SELECT dari itu, tetapi mungkin juga mewakili pra-subquery ditulis atau cara sederhana untuk menulis bagian dari klausa DARI. • Dalam banyak sistem, dilihat disimpan dalam bentuk pre-compiled. Hal ini dapat menghemat waktu eksekusi untuk query, tetapi biasanya tidak cukup untuk pengguna manusia untuk pemberitahuan. • Salah satu kegunaan yang paling penting dilihat adalah dalam sistem multi-user yang besar, di mana mereka memudahkan untuk mengontrol akses ke data untuk berbagai jenis pengguna. Sebagai contoh yang sangat sederhana, anggaplah bahwa Anda memiliki tabel informasi karyawan pada skema Karyawan = (employeeID, empFName, empLName, empPhone, jobTitle, payrate, ManagerId). Jelas, Anda tidak bisa membiarkan semua orang dalam melihat perusahaan di seluruh informasi ini, apalagi melakukan perubahan itu. • Database Anda administrator (DBA) dapat menentukan peran untuk mewakili berbagai kelompok pengguna, dan kemudian memberikan keanggotaan dalam satu atau lebih peran untuk setiap account pengguna khusus (skema). Pada gilirannya, Anda dapat memberikan tingkat meja atau melihat tingkat izin untuk peran serta pengguna tertentu. Misalkan DBA telah menciptakan manajer peran dan penggajian bagi orang-orang yang menempati posisi tersebut. Dalam Oracle ®, ada juga peran yang telah ditentukan bernama publik, yang berarti setiap pengguna database. • Anda dapat menciptakan pandangan terpisah bahkan hanya pada tabel Karyawan, dan mengontrol akses ke mereka seperti ini:

CREATE VIEW phone_view AS SELECT empFName, empLName, empPhone FROM Employees; GRANT SELECT ON phone_view TO public;

CREATE VIEW job_view AS SELECT employeeID, empFName, empLName, jobTitle, managerID FROM Employees; GRANT SELECT, UPDATE ON job_view TO managers;

CREATE VIEW pay_view AS SELECT employeeID, empFName, empLName, payRate FROM Employees; GRANT SELECT, UPDATE ON pay_view TO payroll;

• Hanya sedikit orang yang dipercaya akan SELECT, UPDATE, INSERT, DELETE dan hak-hak dasar di meja seluruh karyawan; semua orang sekarang harus persis akses yang mereka butuhkan, namun tidak lebih.• Ketika melihat adalah target pernyataan UPDATE, tabel nilai dasar berubah. Anda tidak dapat mengubah nilai dihitung dalam tampilan, atau nilai apapun dalam tampilan yang didasarkan pada

Page 23: Artikel SQL

query UNION. Anda juga dapat menggunakan pandangan sebagai sasaran dari pernyataan INSERT atau DELETE, tergantung kendala integritas yang telah ditempatkan di atas tabel dasar.

Materialized views

Kadang-kadang, kecepatan eksekusi query adalah sangat penting bahwa pengembang yang bersedia untuk perdagangan disk peningkatan penggunaan ruang untuk respon lebih cepat, dengan menciptakan pandangan terwujud. Tidak seperti tampilan yang dibahas di atas, pandangan yang muncul tidak membuat dan menyimpan tabel hasil di muka, diisi dengan data. Skema tabel ini diberikan oleh klausa SELECT dari definisi tampilan.• Teknik ini sangat berguna bila permintaan tersebut melibatkan banyak bergabung tabel besar, SQL atau fitur lain yang dapat berkontribusi pada waktu eksekusi yang lama. Anda mungkin pertemuan ini dalam proyek Web, di mana pengunjung situs hanya tidak dapat terus menunggu sementara permintaan berjalan.• Sejak melihat akan sia-sia jika dari tanggal, harus dijalankan kembali, minimal, ketika ada perubahan ke salah satu tabel yang didasarkan pada. Sintaks SQL untuk membuat tampilan terwujud mencakup banyak pilihan untuk saat pertama dijalankan, seberapa sering itu harus dijalankan kembali, dan seterusnya. Ini membutuhkan referensi lanjutan manual untuk sistem tertentu, dan berada di luar cakupan tutorial ini.

Indexes

Sebuah indeks, seperti yang diharapkan, adalah suatu struktur data yang menggunakan database untuk menemukan catatan dalam tabel lebih cepat. Indeks akan dibangun di satu atau lebih kolom tabel; indeks masing-masing menyimpan daftar nilai dalam field yang diurutkan menaik atau menurun. Daripada catatan penyortiran di lapangan atau ladang selama eksekusi query, sistem hanya dapat mengakses baris dalam urutan indeks.

Unique and non-unique indexes: Bila Anda membuat indeks, Anda dapat membiarkan kolom diindeks mengandung nilai ganda; indeks masih akan menampilkan semua baris dengan duplikat. Anda juga dapat menentukan bahwa nilai-nilai dalam kolom yang diindeks harus unik, seperti mereka harus dengan kunci primer. Bahkan, ketika Anda membuat batasan kunci primer di atas meja, Oracle dan sistem yang paling lain secara otomatis akan membuat indeks yang unik pada kolom primary key, serta tidak membiarkan nilai-nilai nol pada kolom tersebut. Salah satu alasan yang baik bagi Anda untuk membuat indeks yang unik di bidang non-kunci utama adalah untuk menegakkan integritas kunci calon, yang dinyatakan mungkin berakhir memiliki (omong kosong) duplikasi nilai dalam baris yang berbeda.

Queries versus insertion/update: Mungkin seolah-olah Anda harus membuat indeks di setiap kolom atau kelompok kolom yang akan pernah oleh digunakan dalam klausa ORDER BY (misalnya: NamaBelakang, Nama depan). Namun, setiap indeks harus diperbaharui setiap kali berturut-turut dimasukkan atau nilai dalam kolom yang diperbarui. Meskipun struktur indeks seperti B atau B + pohon membiarkan ini terjadi sangat cepat, mungkin masih ada keadaan di mana indeks terlalu banyak akan mengurangi kinerja sistem secara keseluruhan. Ini dan isu-isu serupa sering dibahas dalam kursus yang lebih maju.

Page 24: Artikel SQL

Syntax: Seperti yang Anda harapkan sekarang, SQL untuk membuat indeks adalah:

CREATE INDEX <indexname> ON <tablename> (<column>, <column>...);

Untuk menegakkan nilai-nilai yang unik, tambahkan kata kunci UNIK:

CREATE UNIQUE INDEX <indexname> ON <tablename> (<column>, <column>...);

Untuk menentukan tata urutan, tambahkan kata kunci ASC atau DESC setelah setiap nama kolom, seperti yang Anda akan lakukan dalam klausa ORDER BY.Untuk menghapus indeks, cukup masukkan:

DROP INDEX <indexname>;