You are on page 1of 16

Materi SQL

Sejarah SQL dimulai dari artikel seorang peneliti dari IBM bernama EF Codd yang membahas
tentang ide pembuatan basis data relasional pada bulan Juni 1970. Artikel ini juga membahas
kemungkinan pembuatan bahasa standar untuk mengakses data dalam basis data tersebut. Bahasa
tersebut kemudian diberi nama SEQUEL (Structured English Query Language).

Setelah terbitnya artikel tersebut, IBM mengadakan proyek pembuatan basis data relasional
berbasis bahasa SEQUEL. Akan tetapi, karena permasalahan hukum mengenai penamaan
SEQUEL, IBM pun mengubahnya menjadi SQL. Implementasi basis data relasional dikenal
dengan System/R.

Di akhir tahun 1970-an, muncul perusahaan bernama Oracle yang membuat server basis data
populer yang bernama sama dengan nama perusahaannya. Dengan naiknya kepopuleran Oracle,
maka SQL juga ikut populer sehingga saat ini menjadi standar de facto bahasa dalam manajemen
basis data.

Secara umum, SQL terdiri dari dua bahasa, yaitu Data Definition Language (DDL) dan Data
Manipulation Language (DML). Implementasi DDL dan DML berbeda untuk tiap sistem
manajemen basis data (SMBD)[1], namun secara umum implementasi tiap bahasa ini memiliki
bentuk standar yang ditetapkan ANSI. Artikel ini akan menggunakan bentuk paling umum yang
dapat digunakan pada kebanyakan SMBD.

Data Definition Language

DDL digunakan untuk mendefinisikan, mengubah, serta menghapus basis data dan objek-objek
yang diperlukan dalam basis data, misalnya tabel, view, user, dan sebagainya. Secara umum,
DDL yang digunakan adalah CREATE untuk membuat objek baru, USE untuk menggunakan objek,
ALTER untuk mengubah objek yang sudah ada, dan DROP untuk menghapus objek. DDL biasanya
digunakan oleh administrator basis data dalam pembuatan sebuah aplikasi basis data.

CREATE

CREATE digunakan untuk membuat basis data maupun objek-objek basis data. SQL yang umum
digunakan adalah:

CREATE DATABASE nama_basis_data

CREATE DATABASE membuat sebuah basis data baru.

CREATE TABLE nama_tabel

CREATE TABLE membuat tabel baru pada basis data yang sedang aktif. Secara umum, perintah ini
memiliki bentuk

CREATE TABLE [nama_tabel]


(
nama_field1 tipe_data [constraints][,
nama_field2 tipe_data,
...]
)

atau

CREATE TABLE [nama_tabel]


(
nama_field1 tipe_data [,
nama_field2 tipe_data,
...]
[CONSTRAINT nama_field constraints]
)

dengan:

nama_field adalah nama kolom (field) yang akan dibuat. Beberapa sistem manajemen basis data
mengizinkan penggunaan spasi dan karakter nonhuruf pada nama kolom.

tipe_data tergantung implementasi sistem manajemen basis data. Misalnya, pada MySQL, tipe
data dapat berupa VARCHAR, TEXT, BLOB, ENUM, dan sebagainya.

constraints adalah batasan-batasan yang diberikan untuk tiap kolom. Ini juga tergantung
implementasi sistem manajemen basis data, misalnya NOT NULL, UNIQUE, dan sebagainya. Ini
dapat digunakan untuk mendefinisikan kunci primer (primary key) dan kunci asing (foreign key).

Satu tabel boleh tidak memiliki kunci primer sama sekali, namun sangat disarankan
mendefinisikan paling tidak satu kolom sebagai kunci primer.

Contoh:

CREATE TABLE user


(
username VARCHAR(30) CONSTRAINT PRIMARY KEY,
passwd VARCHAR(20) NOT NULL,
tanggal_lahir DATETIME
);

Data Manipulation Language

DML digunakan untuk memanipulasi data yang ada dalam suatu tabel. Perintah yang umum
dilakukan adalah:

 SELECT untuk menampilkan data


 INSERT untuk menambahkan data baru
 UPDATE untuk mengubah data yang sudah ada
 DELETE untuk menghapus data
SELECT

SELECT adalah perintah yang paling sering digunakan pada SQL, sehingga terkadang istilah
query dirujukkan pada perintah SELECT. SELECT digunakan untuk menampilkan data dari satu
atau lebih tabel, biasanya dalam sebuah basis data yang sama. Secara umum, perintah SELECT
memiliki bentuk lengkap: ( QUERY BUDIN ) Cilegon.

SELECT [nama_tabel|alias.]nama_field1 [AS alias1] [, nama_field2, ...]


FROM nama_tabel1 [AS alias1] [INNER|LEFT|RIGHT JOIN tabel2 ON
kondisi_penghubung]
[, nama_tabel3 [AS alias3], ...]
[WHERE kondisi]
[ORDER BY nama_field1 [ASC|DESC][, nama_field2 [ASC|DESC], ...]]
[GROUP BY nama_field1[, nama_field2, ...]]
[HAVING kondisi_aggregat]

dengan:

 kondisi adalah syarat yang harus dipenuhi suatu data agar ditampilkan.
 kondisi_aggregat adalah syarat khusus untuk fungsi aggregat.

Kondisi dapat dihubungkan dengan operator logika, misalnya AND, OR, dan sebagainya.

Contoh:

Diasumsikan terdapat tabel user yang berisi data sebagai berikut.

username passwd tanggal_lahir jml_transaksi total_transaksi


Aris 6487AD5EF 09-09-1987 6 10.000
Budi 97AD4erD 01-01-1994 0 0
Charlie 548794654 06-12-1965 24 312.150
Daniel FLKH947HF 24-04-1980 3 0
Erik 94RER54 17-08-1945 34 50.000

Contoh 1: Tampilkan seluruh data.

SELECT *
FROM user

Contoh 2: Tampilkan pengguna yang tidak pernah bertransaksi.

SELECT *
FROM user
WHERE total_transaksi = 0

Contoh 3: Tampilkan username pengguna yang bertransaksi kurang dari 10 dan nilainya lebih
dari 1.000.
SELECT username
FROM user
WHERE jml_transakai < 10 AND total_transaksi > 1000

Contoh 4: Tampilkan total nominal transaksi yang sudah terjadi.

SELECT SUM(total_transaksi) AS total_nominal_transaksi


FROM user

Contoh 5: Tampilkan seluruh data diurutkan berdasarkan jumlah transaksi terbesar ke terkecil.

SELECT *
FROM user
ORDER BY jml_transaksi DESC

Fungsi aggregat

Beberapa SMBD memiliki fungsi aggregat, yaitu fungsi-fungsi khusus yang melibatkan
sekelompok data (aggregat). Secara umum fungsi aggregat adalah:

 SUM untuk menghitung total nominal data


 COUNT untuk menghitung jumlah kemunculan data
 AVG untuk menghitung rata-rata sekelompok data
 MAX dan MIN untuk mendapatkan nilai maksimum/minimum dari sekelompok data.

Fungsi aggregat digunakan pada bagian SELECT. Syarat untuk fungsi aggregat diletakkan pada
bagian HAVING, bukan WHERE.

Subquery

Ada kalanya query dapat menjadi kompleks, terutama jika melibatkan lebih dari satu tabel
dan/atau fungsi aggregat. Beberapa SMBD mengizinkan penggunaan subquery. Contoh:

Tampilkan username pengguna yang memiliki jumlah transaksi terbesar.

SELECT username
FROM user
WHERE jml_transaksi =
(
SELECT MAX(jml_transaksi)
FROM user
)

INSERT

Untuk menyimpan data dalam tabel dipergunakan sintaks:

INSERT INTO [NAMA_TABLE] ([DAFTAR_FIELD]) VALUES ([DAFTAR_NILAI])


Contoh:

INSERT INTO TEST (NAMA, ALAMAT, PASSWORD) VALUES ('test', 'alamat', 'pass');

UPDATE

Untuk mengubah data menggunakan sintaks:

UPDATE [NAMA_TABLE] SET [NAMA_KOLOM]=[NILAI] WHERE [KONDISI]

Contoh:

UPDATE Msuser set password="123456" where username="abc"

DELETE

Untuk menghapus data dipergunakan sintaks:

DELETE FROM [NAMA_TABLE] [KONDISI]

Contoh:

DELETE FROM TEST WHERE NAMA='test';


Contoh-contoh query SQL

Pada kesempatan kali ini saya akan menjelaskan contoh-contoh query dalam MySQL. Tabel-
tabel yang akan kita gunakan adalah sebagai berikut:

 matakuliah(kodemk, namamk, sks), berisi daftar matakuliah yang ditawarkan


 dosen(nip, nama), berisi daftar dosen pengampu kuliah
 mahasiswa(nim, nama, dosenpembimbing), berisi daftar mahasiswa
 kuliah(kodekuliah, kodemk, nip, thnakademik, semester), berisi daftar matakuliah dan dosen
pengampu
 peserta(nim, kodekuliah, nilai), berisi kuliah yang diikuti mahasiswa beserta nilainya dalam huruf

Dalam pembahasan kali ini diasumsikan:

 matakuliah hanya ditawarkan sekali dalam setahun, yaitu pada semester 1 (ganjil) saja atau
semester 2 (genap) saja dan tidak kedua-duanya.
 bila pernah mengulang matakuliah, nilai yang diikutkan untuk perhitungan IP adalah nilai
terakhir
 matakuliah dikatakan lulus bila nilai yang diperoleh minimal ‘D’

Berikut ini adalah contoh-contoh query dalam MySQL:

1.      Menampilkan banyaknya SKS yang telah diselesaikan oleh masing-masing mahasiswa

a.       Bila matakuliah yang diulang semua masuk dalam perhitungan

SELECT nim, SUM( sks ) jumlahsks

FROM peserta, (

SELECT kodekuliah, kuliah.kodemk, sks

FROM kuliah, matakuliah

WHERE kuliah.kodemk = matakuliah.kodemk

)A

WHERE peserta.kodekuliah = A.kodekuliah

GROUP BY nim

Penjelasan:

Pada query ini kita menampilkan jumlah SKS yang telah diselesaikan oleh masing-masing
mahasiswa bila matakuliah yang diulang semua masuk dalam perhitungan. Pertama-tama, kita
melakukan join tabel kuliah dengan tabel matakuliah pada kondisi kodemk pada
tabel kuliah sama dengan kodemk pada tabel matakuliah untuk
mendapatkankodekuliah, kodemk dan sks.

…(

SELECT kodekuliah, kuliah.kodemk, sks

FROM kuliah, matakuliah

WHERE kuliah.kodemk = matakuliah.kodemk

)A

Lalu hasil join tersebut diberi alias A. Selanjutnya, tabel A tadi kita join-kan dengan tabel peserta
pada kondisi kodekuliah pada tabel peserta sama dengan kodekuliah pada tabelA untuk
mendapatkan nim dan sks yang selanjutnya kita menjumlahkan sks dengan SUM(sks) yang
dikelompokkan berdasarkan nim menggunakan GROUP BY nim.

b.      Bila matakuliah yang diulang hanya yang sesuai dengan asumsi yang masuk dalam
perhitungan

SELECT nim, SUM( sks ) totalsks

FROM (

SELECT DISTINCT nim, kodemk

FROM peserta, kuliah

WHERE peserta.kodekuliah = kuliah.kodekuliah

)P, matakuliah

WHERE P.kodemk = matakuliah.kodemk

GROUP BY nim

Penjelasan:

Pada query ini kita menampilkan jumlah SKS yang telah diselesaikan oleh masing-masing
mahasiswa bila matakuliah yang diulang hanya dihitung sekali. Pertama-tama kita melakukan
join tabel peserta dengan tabel kuliah pada kondisi kodekuliah pada tabel peserta sama
dengan kodekuliah pada tabel kuliah untuk mendapatkan nim dan kodemk.
…(

SELECT DISTINCT nim, kodemk

FROM peserta, kuliah

WHERE peserta.kodekuliah = kuliah.kodekuliah

)P …

Kata DISTINCT setelah SELECT digunakan untuk menghilangkan pengulangan record yang


mempunyai nim dan kodemk yang sama agar matakuliah yang diulang oleh seorang mahasiswa
hanya muncul sekali. Hasil join tersebut diberi alias P. Lalu tabel P kita join-kan dengan
tabel matakuliah pada kondisi kodemk pada tabel P sama dengan kodemk pada
tabel matakuliah untuk mendapatkan nim dan sks yang dijumlahkan dengan SUM(sks) setelah
dikelompokkan berdasarkan GROUP BY nim.

2.      Menampilkan data-data yang bisa untuk melakukan perhitungan IPK (berdasar asumsi di
atas)

SELECT nim, kuliah.kodemk, nilai, sks

FROM peserta, matakuliah, kuliah

WHERE kuliah.kodekuliah = peserta.kodekuliah

AND kuliah.kodemk = matakuliah.kodemk

AND (

nim, kuliah.kodemk, thnakademik

IN (

SELECT nim, kodemk, MAX( thnakademik ) thnterakhir

FROM peserta, kuliah

WHERE kuliah.kodekuliah = peserta.kodekuliah

GROUP BY nim, kodemk

)
Penjelasan:

Pada query ini kita melakukan join pada tiga tabel, yaitu peserta, matakuliah dan kuliah dengan
kondisi kodekuliah pada tabel kuliah sama dengan kodekuliah pada
tabelpeserta dan kodemk pada tabel kuliah sama dengan kodemk pada tabel matakuliah. Setelah
itu kita lakukan operasi intersection dengan query yang menampilkan tahun terakhir
menyelesaikan suatu matakuliah.

AND (

nim, kuliah.kodemk, thnakademik

IN (

SELECT nim, kodemk, MAX( thnakademik ) thnterakhir

FROM peserta, kuliah

WHERE kuliah.kodekuliah = peserta.kodekuliah

GROUP BY nim, kodemk

Pada query untuk menampilkan tahun terakhir menyelesaikan suatu matakuliah, kita melakukan
join pada tabel peserta dan tabel kuliah dengan kondisi kodekuliah pada tabel kuliahsama
dengan kodekuliah pada tabel peserta. Lalu untuk mencari tahun terakhir digunakan
fungsi MAX(thnakademik) setelah dikelompokkan berdasarkan nim dan kodemk denganGROUP
BY nim, kodemk. Lalu operasi intersection dilakukan dengan memeriksa apakah record nim,
kodemk, thnakademik dari hasil join tiga tabel ada pada hasil query untuk menampilkan tahun
terakhir menyelesaikan suatu matakuliah.

3.      Menampilkan dosen yang pernah mengampu kelas matakuliah yang pesertanya tidak lebih
dari 15 mahasiswa

SELECT DISTINCT nip

FROM kuliah, (

SELECT kodekuliah, COUNT( * ) jumlahpeserta

FROM peserta
GROUP

BY kodekuliah

) banyakpeserta

WHERE kuliah.kodekuliah = banyakpeserta.kodekuliah

AND jumlahpeserta <=15

Penjelasan:

Pada query ini kita akan menampilkan dosen yang pernah mengampu matakuliah yang
pesertanya <= 15 mahasiswa. Awalnya menggunakan tabel peserta, kita hitung dahulu jumlah
peserta dari setiap kuliah dengan menggunakan COUNT(*) setelah dikelompokkan berdasarkan
kodekuliah dengan GROUP BY kodekuliah.

…(

SELECT kodekuliah, COUNT( * ) jumlahpeserta

FROM peserta

GROUP

BY kodekuliah

) banyakpeserta

Setelah itu query tersebut diberi alias banyakpeserta. Lalu pada query utama kita melakukan join
pada tabel banyakpeserta dengan tabel kuliah pada kondisi kodekuliah pada tabelkuliah sama
dengan kodekuliah pada tabel banyakpeserta serta menambahkan kondisi jumlahpeserta <= 15.
Pada query utama kita menampilkan nip yang di dahului dengan kataDISTINCT agar nip yang
ditampilkan tidak ada perulangan.

4.      Menampilkan nama mahasiswa yang telah lulus lebih dari 100 SKS

SELECT nama

FROM (

SELECT nim, SUM( sks ) jumlahsks

FROM peserta, kuliah, matakuliah


WHERE nilai <  'E'

AND kuliah.kodekuliah = peserta.kodekuliah

AND kuliah.kodemk = matakuliah.kodemk

GROUP

BY nim

) yanglulus, mahasiswa

WHERE jumlahsks >100

AND yanglulus.nim = mahasiswa.nim

Penjelasan:

Pada query ini kita akan menampilkan nama mahasiswa yang telah lulus > 100 SKS. Mula-mula
kita menghitung jumlah SKS dari matakuliah yang lulus untuk masing-masing mahasiswa. Kita
melakukan join pada tiga tabel peserta, kuliah dan matakuliah dengan kondisi kodekuliah pada
tabel kuliah sama dengan kodekuliah pada tabel peserta dan kodemk pada tabel kuliah sama
dengan kodemk pada tabel matakuliah disertai dengan kondisi nilai < ‘E’ yang berarti nilai >=
‘E’ tidak diikutkan. Lalu sks yang memenuhi kondisi dijumlahkan dengan SUM(sks) yang diberi
alias jumlahsks setelah dikelompokkan berdasarkan nim dengan GROUP BY nim. Query
tersebut diberi alias jumlahlulus.

…(

SELECT nim, SUM( sks ) jumlahsks

FROM peserta, kuliah, matakuliah

WHERE nilai <  'E'

AND kuliah.kodekuliah = peserta.kodekuliah

AND kuliah.kodemk = matakuliah.kodemk

GROUP

BY nim

) yanglulus …
Pada query utama kita melakukan join pada tabel yanglulus dengan mahasiswa dengan
kondisi nim pada tabel yanglulus sama dengan nim pada tabel mahasiswa disertai
kondisijumlahsks > 100 untuk menampilkan nama mahasiswa yang telah lulus > 100 SKS.

5.      Menampilkan banyaknya siswa yang telah lulus tugas akhir bila kode matakuliah untuk
tugas akhir adalah ‘M0012’

SELECT COUNT( * ) lulusTA

FROM peserta, kuliah

WHERE nilai <  'E'

AND kuliah.kodekuliah = peserta.kodekuliah

AND kodemk =  'M0012'

Penjelasan:

Pada query kali ini kita akan menampilkan jumlah mahasiswa yang telah lulus tugas akhir bila
kode matakuliah tugas akhir = ‘M0012’. Pertama-tama kita melakukan join pada
tabel peserta dankuliah dengan kondisi kodekuliah pada tabel kuliah sama
dengan kodekuliah pada tabel peserta untuk mendapatkan nilai dan kodemk. Lalu hasil join
tersebut kita saring dengan kondisi nilai < ‘E’ dan kodemk = ‘M0012’ yang selanjutnya setelah
disaring kita hitung dengan COUNT(*) dan diberi alias lulusTA untuk menghitung jumlah
mahasiswa yang telah lulus tugas akhir.

6.      Menampilkan daftar nomor dan nama mahasiswa beserta IP  berdasar dua asumsi di atas

SELECT buatip.nim, nama, (

SUM( nilaisks ) / SUM( sks )

) ip

FROM mahasiswa, (

SELECT nim, kuliah.kodemk, (

( 69 – ASCII( UPPER( nilai ) ) ) * sks

) nilaisks, sks

FROM peserta, matakuliah, kuliah

WHERE kuliah.kodekuliah = peserta.kodekuliah


AND kuliah.kodemk = matakuliah.kodemk

AND (

nim, kuliah.kodemk, thnakademik

IN (

SELECT nim, kodemk, MAX( thnakademik ) thnterakhir

FROM peserta, kuliah

WHERE kuliah.kodekuliah = peserta.kodekuliah

GROUP BY nim, kodemk

)buatip

WHERE mahasiswa.nim = buatip.nim

GROUP BY nim

Penjelasan:

Pada query yang cukup panjang ini. kita akan menampilkan nomor dan nama mahasiswa beserta
IP berdasar dua asumsi di atas. Pada awalnya kita membuat query untuk
menampilkan nim,kodemk dan nilai yang sudah dikali sks. Query ini mirip seperti query yang
dijelaskan pada nomor 2 dengan sedikit perubahan.

…(

SELECT nim, kuliah.kodemk, (

( 69 – ASCII( UPPER( nilai ) ) ) * sks

) nilaisks, sks

FROM peserta, matakuliah, kuliah

WHERE kuliah.kodekuliah = peserta.kodekuliah

AND kuliah.kodemk = matakuliah.kodemk


AND (

nim, kuliah.kodemk, thnakademik

IN (

SELECT nim, kodemk, MAX( thnakademik ) thnterakhir

FROM peserta, kuliah

WHERE kuliah.kodekuliah = peserta.kodekuliah

GROUP BY nim, kodemk

) buatip

Bagian yang ditebalkan merupakan perubahan yang dilakukan untuk query kali ini. Hasil query
tersebut diberi alias buatip. Lalu kita melakukan join pada tabel buatip dan tabel nama dengan
kondisi nim pada tabel mahasiswa sama dengan nim pada tabel buatip untuk mendapatkan nama.
Selanjutnya untuk menghitung IP, kita menjumlahkan semua nilaisks dan membaginya dengan
jumlah sks dengan SUM(nilaisks) / SUM(sks) setelah dikelompokkan menurut nim-nya dengan
menggunakan GROUP BY nim.

7.      Menghitung IP bila asumsi kedua di atas diganti bahwa nilai yang dipakai untuk penentuan
IP adalah nilai yang terbaik (dari serangkaian mengulang matakuliah)

SELECT nim, (

SUM( nilaimaxsks ) / SUM( sks )

)ip

FROM (

SELECT nim, (

( 69 – ASCII( UPPER( nilaimax ) ) ) * sks

)nilaimaxsks, sks

FROM matakuliah, (
SELECT nim, kodemk, MIN( nilai ) nilaimax

FROM peserta, kuliah

WHERE kuliah.kodekuliah = peserta.kodekuliah

GROUP BY nim, kodemk

) nilaiterbaik

WHERE nilaiterbaik.kodemk = matakuliah.kodemk

)buatip

GROUP BY nim

Penjelasan:

Pada query ini kita akan menampilkan IP dengan asumsi kedua diganti menjadi nilai yang
dipakai untuk menghitung IP adalah nilai yang terbaik. Mula-mula kita mencari nilai terbaik
pada setiap matakuliah untuk masing-masing mahasiswa. Kita melakukan join pada
tabel peserta dengan tabel kuliah pada kondisi kodekuliah pada tabel kuliah sama
dengan kodekuliah pada tabel peserta untuk mendapatkan kodemk dan nilai. Lalu kita mencari
nilai terbaik dari setiap matakuliah untuk masing-masing mahasiswa dengan MIN(nilai) setelah
dikelompokkan berdasarkan nim dan kodemk dengan menggunakan GROUP BY nim,
kodemk karena nilai ascii ‘A’ < ‘B’ < ‘C’ < ‘D’ < ‘E’.

…(

SELECT nim, kodemk, MIN( nilai ) nilaimax

FROM peserta, kuliah

WHERE kuliah.kodekuliah = peserta.kodekuliah

GROUP BY nim, kodemk

) nilaiterbaik

Hasil query tersebut diberi alias nilaiterbaik. Setelah itu kita melakukan join
tabel nilaiterbaik dengan tabel matakuliah pada kondisi kodemk pada tabel nilaiterbaik sama
dengan kodemk pada tabel kuliah untuk mendapatkan sks.

Selanjutnya ditampilkan nim, nilaimaxsks yang merupakan nilaimax dikali sks serta sks.
…(

SELECT nim, (

( 69 – ASCII( UPPER( nilaimax ) ) ) * sks

)nilaimaxsks, sks

FROM matakuliah, (

SELECT nim, kodemk, MIN( nilai ) nilaimax

FROM peserta, kuliah

WHERE kuliah.kodekuliah = peserta.kodekuliah

GROUP BY nim, kodemk

) nilaiterbaik

WHERE nilaiterbaik.kodemk = matakuliah.kodemk

)buatip

Hasil query tersebut diberi alias buatip. Kemudian kita menghitung IP seperti query pada nomor
6 yaitu SUM(nilaimaxsks) / SUM(sks)  setelah dikelompokkan berdasarkan nimdengan
menggunakan GROUP BY nim.

You might also like