c
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.
Laporan DDL digunakan untuk membangun dan memodifikasi struktur tabel Anda dan objek
lain dalam database. Ketika Anda menjalankan sebuah pernyataan DDL, itu berlaku segera.
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.
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.
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.
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.
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.
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.
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.
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.
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.
°
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:
c
!"
SELECT *
FROM customers
NATURAL JOIN orders;
Customers joined to Orders
Alvaro Monge 562-333-4141 2145 Main 90840 2003-07-14 Patrick
Wayne Dick 562-777-3030 1250 Bellflower 90840 2003-07-14 Patrick
Alvaro Monge 562-333-4141 2145 Main 90840 2003-07-18 Kathleen
Alvaro Monge 562-333-4141 2145 Main 90840 2003-07-20 Kathleen
Customers
Tom Jewett 714-555-1212 10200 Slater 92708
Alvaro Monge 562-333-4141 2145 Main 90840
Wayne Dick 562-777-3030 1250 Bellflower 90840
Orders
Alvaro Monge 562-333-4141 2003-07-14 Patrick
Wayne Dick 562-777-3030 2003-07-14 Patrick
Alvaro Monge 562-333-4141 2003-07-18 Kathleen
Alvaro Monge 562-333-4141 2003-07-20 Kathleen
U
,
, $
* ) + 3 %
(
(
-
,
, $
* ) +34
*
) +$
, ,
, 3%
(
U (
,
, %
,
,
1
,
, 34
U
, ,
c
,
,
,
U &
$
$
(
(
#
$
$*
+
(
(
$
$
5
$
&
ß&
U 6
$
*
+
5
6
(
U,
*
ß7*++
c
2
$
,2
(
$
8
(
2 & '#
U $
5
(
"
$
(
$
$
$
$
2" 1
1
U 1
$
(
,1 1*
+
$
$ 1
U
(
$
"
9 #
#
:
# # 7 ;$5 ; # ! 7
;*
+
U'
,$
< <
(
//2%1
< <
, (
=6// $
//2%
$
$ ( $
U1
( !
, ,
*$
, ,
+
U 2
<
,11<
( (
$
$
&
$
$
( ,
*( 2'c(
+
'c
(
,
(
c
$
>
* +1
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';
1
?1
5
$ 3
U &
5
$
(
$
U
( $
//2%
-
=6//
U ! //2%
(
//2%!
5
(
(
U&
$ &
)
(
(
6
?!
$
(
U
*
+
c
$
!/#00#$1$# *.
!/#00#$1$#
+
(
& '#$$!'
!/#00#$1$#
U$
*
+
$
'
$
(
U
(
>@@A
c
>@BC !
$
(
$
$
( (
&
$
=6//
"
SELECT cFirstName, cLastName, orderDate
FROM customers c, orders o
WHERE c.custID = o.custID;
Ñ
,1
c
!
*+
(
#!/#00#$1$#
U,
#
U1 <
<
c$'*
+%
1
(
"
U (
(
*
+ &
(
*
+
U (
$
/5
.
5
$
(
$ 5
*.
+
&
5
$
Ê Ê Ê = (Ê Ê) Ê.
U 6
!
(
$
"
$
!
(
$
( "
&
&
c
$ ( (
$
2
$
6
$
c >@@A
(
=6//"
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 syntax to prove that you really mean it.
Notice that this example still produces nonsense.
U &
*
+
$
#
(
$
2
$
,
%
"
1
c
*)
) +
1
//2%
$
(
(
$
$
1
1
( (
//2%
2" 1
(
! &
(
(
1
,1
//2%
(
1
( !
D >
EC
(
( (
,
(
6
1
$
(
*,
$
%(
$ +&
$
$
$
$
!
(
//2%
(
2",
(
(
(
(
1
!
%
$
(
*
!+ 1
1
0 ,.41
,
c ,1 ,
!
//2%
0 ,.4
c
$ (
$
SELECT custID, orderDate, SUM(unitSalePrice * quantity)
AS total
FROM orderlines
GROUP BY custID, orderDate;
Order totals
5678 2003-07-14 11.9499998092651
5678 2003-07-18 18
5678 2003-07-20 57.6499996185303
9012 2003-07-14 45.1499996185303
(
!
!'# *
+
!$F *
$G0 *
+
2 #%
(
D *
+
SELECT COUNT(*)
FROM orders;
Orders
ëÑ !" #
4
1
(
c
2 #%
#
c
=6//
c/#0$# 0 ,
( #
(
6$G'#0
(
"
D
1
(
1
//2%
=6// '#/% ,c$%/
"
U
U
U
U
U
%
"
1 $
$
$
c
$
2" 2
=
c
1
"
U ?1
=6//%
(
(
?
U
(
"
SELECT cZipCode
FROM Customers
WHERE cFirstName = 'Wayne' AND cLastName = 'Dick';
Zip code
Zip code
90840
U,
1
H
2
$
(
"
U
=6//1
//2%5
(
"
SELECT AVG(unitSalePrice)
FROM OrderLines;
Average
R "
#
10.621428
U 1
5
"
(
1
%
"
(
.
'
*
+&
c $
(
'
G
*
+!
U1
(
(
$
U $
(
(
.
(
$ (
$
,
(
<,
( <
-
U 1
(
1
!
(
(
U 1
,
c
;, ;
(
U ! (
(
5
1 c/.4
1 $
$
$
&
=6//
*
+ $
$
$
U .
$
1
,
U1
AEEA
1
,
"
>
AEEA * ( +
A
AEEA
AEEA
I
U&
$
$
> A
I
?
U1
(
"
Úð Ê
Êð
=
Úð Ê í Ú
$
U
'c 1
%'c$1c'
=6//
'c
AEEA
U 1
( !'#
, *. 5
1/2$'
!'#+
#' #
'
( (
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:
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
query UNION. Anda juga dapat menggunakan pandangan sebagai sasaran dari pernyataan
INSERT atau DELETE, tergantung kendala integritas yang telah ditempatkan di atas tabel dasar.
(
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.
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.
Y Ê
Ê
Ê
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.
Seperti yang Anda harapkan sekarang, SQL untuk membuat indeks adalah:
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: