Berita:

Sudah daftar tapi belum bisa masuk log? Aktifkan dulu akunmu. Lihat keterangan lebih lanjut di New Party.

Main Menu

SQL

Dimulai oleh Èxsharaèn, 09 Juli 2009, 10:23:01

« sebelumnya - berikutnya »

0 Anggota dan 1 Pengunjung sedang melihat topik ini.

Èxsharaèn

Materi ini sebetulnya jadi satu dengan artikel Basis Data, tapi berhubung artikelnya masih jalan, selagi nunggu aku akan berikan materi lain yang agak mirip pemrograman supaya pada nggak bosan (well, mendesain basis data yang baik teorinya memang agak panjang) :)

Aku akan menggunakan contoh kasus stash, karena materi ini akan lebih mudah dibayangkan kalau ada kasusnya. Kasusnya bisa dibaca di sini.

Anggap saja sekarang basis datanya sudah jadi dengan struktur seperti terlihat di sini, dan kita sudah memasukkan beberapa data. Entah itu hanya puluhan, atau ribuan bahkan bisa jutaan. Nah, sekarang kita hanya perlu mengambil beberapa data saja (misalnya barang yang stoknya kosong), menambah data baru, mengubah beberapa data (misalnya sedang ada diskon 10%), atau menghapus data yang sudah tidak valid lagi (misalkan saja toko stash tidak lagi menjual pensil karena tidak laku). Bisa bayangkan melakukannya manual?

Nah, untuk membantu kita melakukan hal-hal yang kusebutkan tadi, kita bisa saja melakukannya tanpa membuka basis data kita sama sekali (bahkan ini sebenarnya yang diharapkan dengan membuat program sendiri, agar tidak sembarang orang bisa mengutak-atik). Tiap manajer basis data pasti memiliki alat bantu ini, yang sebagian pasti sudah pernah dengar namanya.

SQL.

Yup ini memang nama grup pelawak itu ;D tapi kita tidak akan minta bantuan mereka, walaupun aku yakin mereka pasti bisa melakukannya. Bahkan, sebenarnya nama grup lawak itu mengambil nama alat bantu ini, yang kepanjangannya adalah Structured Query Language (agak susah terjemahkannya, karena query sendiri diterjemahkan jadi kueri). Bacanya pun macam-macam, ada yang /es.ki.el/ menggunakan lidah Indonesia, /es.kyu.el/ dalam bahasa Inggris, tapi ada juga yang membacanya sequel. Apa sih SQL itu? SQL adalah bahasa yang membantu kita memanipulasi basis data kita menggunakan kueri. Lha apa lagi nih kueri? Bahasa sederhananya, kueri adalah perintah untuk memanipulasi basis data (lengkapnya monggo tanya mbah Google atau eyang Wikipedia).

SQL sudah menjadi standar di tiap manajer basis data, tapi sayangnya para manajer itu agak "kreatif" dengan menambahkan fitur-fitur sendiri yang mungkin tidak ada di manajer basis data lainnya. Karena itu, SQL yang aku berikan di sini adalah SQL paling standar yang 100% jalan di manajer basis data manapun (kalau tidak jalan, pecat saja manajernya ;D). Kalau ada perbedaan, nanti aku berikan catatan khusus (utamanya untuk Access, SQL Server, dan MySQL. Pengguna Oracle bisa lihat MySQL.).

Tenang saja, SQL tidak seseram namanya, bahkan bisa juga membuat kita ketawa :D

Sedikit lagi teori, SQL sebenarnya ada dua macam:
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

DDL (Data Definition Language) digunakan untuk mendefinisikan data. Misalnya, membuat basis data baru (biasanya tidak berlaku untuk Access, bahasanya adalah CREATE DATABASE), tabel baru, dan di sistem yang lebih kompleks membuat pengguna baru dan mendefinisikan hak aksesnya (role), membuat prosedur dan trigger (jika didukung), dan lain sebagainya. Kita tidak akan pusing-pusing mengenal DDL karena ini tugas seorang DBA (Database Administrator) :D

DML (Data Manipulation Language) inilah yang sering disebut sebagai SQL, dan boleh lah dianggap begitu (jadi setelah ini kalau aku menyebut SQL, yang aku maksud adalah DML). DML ini digunakan untuk, tentu saja, memanipulasi data. Apa saja yang disebut "manipulasi" itu?

- Ambil
- Tambah
- Ubah
- Hapus

Mudah sekali menghapalnya, dengan urutan yang sama, SQL-nya adalah:

- SELECT
- INSERT
- UPDATE
- DELETE

Dari empat kata sakti ini, kita tinggalkan dulu SELECT karena penggunaannya paling luas dan kadang-kadang cukup rumit ;)

So, di mana pakai SQL ini?
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

Ada banyak jalan untuk menjalankan SQL. Tiap manajer basis data pasti punya alat untuk menjalankan SQL:
Access 2003 dan sebelumnya: tab Query
Access 2007: tempatnya agak sembunyi, aku cari dulu :P
SQL Server: Query Analyzer (bisa dari Start Menu atau dari Enterprise Manager, pilih menu Tools > SQL Server Query Analyzer...; hanya untuk SQL Server 2000)
SQL Server Express: aku cari dulu, kebetulan biasanya SQLSEE nggak menyertakan program untuk manipulasinya.
MySQL: MySQL Command Client (dari Start Menu) atau MySQL Query Browser. Pengguna PHP bisa menggunakan alat bantu phpMyAdmin. Pilih saja salah satu basis data dan cari tab SQL (mungkin perlu pilih satu tabel dulu sebelum tab ini muncul).

Nah, kalau dari program bikinan sendiri, gimana? Caranya mungkin berbeda-beda untuk tiap bahasa pemrograman, namun intinya biasanya sama, seperti ini:
- Buat dulu koneksi ke basis data, kemudian buka koneksinya.
- Berikan perintah ke basis data berupa SQL (biasanya ini dinamakan command.
- Ambil hasil yang diberikan basis data. Kalau mengambil data (SELECT), yang dikembalikan biasanya referensi ke data yang dipilih. Sisanya (INSERT, UPDATE, DELETE) biasanya mengembalikan jumlah data (row) yang terpengaruh.

Caranya akan aku berikan di akhir artikel menggunakan bahasa VB.NET dan PHP (khusus PHP silakan simak artikel Buat Web yuk! (PHP & MySQL), belum ditulis).

Yuk mulai!

Catatan: Sebelum mencoba SQL-SQL berikut, pastikan basis data yang akan digunakan sudah dipilih. Kalau belum, atau untuk meyakinkan diri, silakan gunakan perintah USE nama_database sebelum menjalankan SQL (tidak berlaku untuk Access).
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

#3
Untuk menambahkan data baru, mudah saja, kata kuncinya adalah INSERT. Bentuk lengkapnya seperti ini:

INSERT INTO nama_tabel[(nama_kolom1, nama_kolom2, ...)] VALUES(nilai1, nilai2, ...)

Yang aku berikan dalam kurung siku itu tidak wajib, jadi bisa diabaikan. Hanya saja, kalau diabaikan, berarti kita harus mengisi semua kolom. Besar kecilnya huruf bisa diabaikan (kecuali di beberapa manajer basis data, besar-kecil huruf untuk nama kolom harus diperhatikan), jadi INSERT dan insert maupun INSert sama saja, tapi aku sarankan gunakan huruf besar semua (UPPERCASE) supaya kelihatan kalau itu reserved words.

Bingung yah :) yuk ke tabel Barang stash. Coba isikan data baru dengan SQL ini:

INSERT INTO Barang VALUES('001', 'Pensil', 500, 5);

Catatan:
- Pada beberapa manajer basis data (misalkan Access), string mungkin diapit dengan tanda kutip ganda ". Yang umum adalah tanda kutip tunggal.
- Tanda titik koma ; di akhir SQL biasanya opsional. Coba cek dokumentasi manajer basis data yang dipakai.

Menggunakan INSERT di atas tadi, kita harus mengisi data di setiap kolom. Beda dengan INSERT berikut:

INSERT INTO Barang(KodeBarang, NamaBarang) VALUES('002', 'Penghapus');

kita tidak perlu mengisi semua kolom. Dalam kasus kita, kolom Harga dan Stok akan dikosongkan. Dianjurkan untuk tidak mengosongkan suatu kolom, kecuali kalau memang ada nilai dasarnya yang otomatis diisikan. INSERT lengkap seperti ini berguna kalau memang tidak semua kolom harus diisi sekarang, atau untuk menghindari kesalahan memasukkan data ke kolom yang tepat, andai susunan kolomnya ternyata berubah.

Catatan:
Kalau nama kolom ternyata mengandung spasi, Access dan SQL Server mengharuskan penggunaan [] mengapit nama kolom, sementara MySQL ``. Contoh: [Nama Barang] atau `Nama Barang`. MySQL biasanya juga menyarankan nama kolom diapit tanda `` walaupun tidak mengandung spasi sama sekali. Aku tidak terlalu menyarankan penggunaan spasi pada nama kolom, sebaiknya gunakan CamelCase (contoh: NamaBarang).

Untuk mencoba contoh di atas, pastikan tabel Barang sudah ada. Kalau belum, pengguna Access bisa ikuti langkah-langkah pembuatannya di sini. Pengguna SQL Server dan MySQL bisa menjalankan kode berikut, yang aku susulkan (kebetulan sekarang aku tidak punya akses).

RESERVED: SQL untuk membuat tabel Barang

MySQL
Ada kalanya kita memasukkan beberapa data sekaligus, misalkan seperti ini:

INSERT INTO Barang(KodeBarang, NamaBarang) VALUES('003', 'Penggaris');
INSERT INTO Barang(KodeBarang, NamaBarang) VALUES('004', 'Pulpen');


Kalau kebetulan susunan kolomnya sama, perintah itu bisa diringkas menjadi seperti berikut:

INSERT INTO Barang(KodeBarang, NamaBarang) VALUES('003', 'Penggaris'), ('004', 'Pulpen');

Menurut MySQL, kueri ini lebih cepat dijalankan dibandingkan perintah INSERT terpisah.

Gampang kan? :)
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

#4
Nah misal kita sudah memasukkan data. Eh ternyata keliru... betulinnya gimana? Silakan suruh tuan UPDATE untuk mengganti datanya, karena tugasnya memang mengubah data :D formatnya cukup mudah diingat karena mirip dengan perintah dalam bahasa manusia:

UPDATE nama_tabel
SET kolom1 = nilai1 [, kolom2 = nilai2, ...]
[WHERE syarat];


Seperti biasa, yang di dalam kurung siku tidak harus dipakai, tapi hati-hati untuk WHERE. Kalau tidak dipakai, semua data kita akan diubah :D WHERE akan kita bahas lebih dalam saat kita menyentuh SELECT.

Contoh! Tadi barang Penghapus belum ada harga dan stoknya kan? Kita coba isikan sekarang.

UPDATE Barang
SET HargaBarang = 1500, Stok = 30
WHERE KodeBarang = '002';


Coba jalankan. Access mungkin akan ngasih peringatan, tekan saja Yes, lalu buka tabel Barang. Berubah kan datanya :)

Kalau malas pindah dari tab SQL, gunakan saja SQL berikut (colong start dikit :P):

SELECT * FROM Barang;

Artinya akan aku jelaskan nanti waktu kita menyentuh SELECT.

Masih gampang kan ;)
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

#5
Nah, sekarang kita kenalan dengan tukang bersih-bersih, mas DELETE. Tugasnya jelas: menghapus data dari basis data kita. Kalau kita akan menghapus sesuatu, kita pasti tanya dulu kan:

Hapus dari mana?
Yang mana saja yang akan dihapus?

Nah mas DELETE ini agak pendiam, jadi kita harus jelaskan kedua pertanyaan tersebut padanya dengan perintah:

DELETE FROM tabel
[WHERE syarat];


Awas, dia benar-benar pendiam, jadi kalau kita kelupaan ngasih klausa WHERE, semua data akan dihapus tanpa pandang bulu ;D

Contoh! Misalkan saja tokonya stash nggak jual penghapus lagi. Datanya bisa dihapus dengan perintah:

DELETE FROM Barang
WHERE KodeBarang = '002';


Jalankan dan lihat hasilnya. Khusus Access, dia akan konfirmasi dulu apa benar data itu mau dihapus, jadi jawab saja Yes. Tapi ingat, Access hanya konfirmasi kalau kalian menjalankan perintah itu dari dalam Access. Dari luar, dia akan diam saja :D

Awas! Tidak ada Recycle Bin, dan nyaris semua manajer diam saja ketika mas DELETE beraksi, jadi kalau tidak hati-hati, bisa jadi ada data yang semestinya tidak terhapus tapi ikut dibabat habis ;D periksa kembali klausa WHERE sebelum menjalankan perintah ini.

Nah, mungkin sampai sini ada yang tanya, dari tadi syaratnya kok KodeBarang = terus. Boleh kah aku pakai NamaBarang = ? Boleh saja, tapi di kebanyakan kasus, menjalankan kueri yang menggunakan kolom yang diindeks (dalam hal ini, kunci utama, karena dia pasti diindeks) sebagai syarat jauh lebih cepat daripada menggunakan kolom lainnya. Tentu saja, kadang-kadang kita perlu syarat lain yang tidak menggunakan kunci utama, ini normal saja kok :)

MySQL
Ada cara lain untuk menghapus seluruh data dari suatu tabel. Selain menyuruh mas DELETE FROM tabel, kita bisa minta bantuan kembarannya, mas TRUNCATE. Perintahnya simpel saja, TRUNCATE TABLE tabel;. Selain menghapus seluruh data, dia akan mengembalikan nilai auto_increment (jika ada) ke nilai dasar.

Nah, itu tiga perintah utama untuk memanipulasi data. Sekarang ke bagian yang mengasyikkan sekaligus "menyeramkan" ;D
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

#6
Ini bisa jadi momok karena pak SELECT ini benar-benar "garang" ;D tapi jangan khawatir, kita kenalan dengannya pelan-pelan.

Tidak ada gunanya kan menyimpan data kalau tidak ditampilkan? Nah, seringkali tidak semua data perlu ditampilkan (terutama saat membuat laporan bulanan misalnya, nggak mungkin kan data bulan lalu juga ditampilkan?). Untuk memfasilitasi hal ini, kita akan menggunakan bantuan SELECT. Formatnya agak panjang dan mungkin berbeda urutan untuk tiap manajer basis data, tapi garis besarnya seperti ini:

SELECT nama_kolom1[, nama_kolom2, ...]
FROM nama_tabel1[, nama_tabel2, ...]
[WHERE syarat]
[GROUP BY nama_kolom1, nama_kolom2, ...]
[ORDER BY nama_kolom1 [ASC]|DESC, nama_kolom2 [ASC]|DESC, ...]
[HAVING syarat];


MySQL
Letak HAVING yang disarankan persis setelah GROUP BY, jadi urutannya SELECT-FROM-WHERE-GROUP BY-HAVING-ORDER BY.

Panjang ya? Walaupun begitu, yang harus ada hanya klausa SELECT dan FROM. Bahkan, di beberapa manajer basis data, klausa FROM bisa diabaikan (tapi khusus untuk coba-coba fungsi yang tidak perlu mengakses data dari tabel saja).

Kita coba SELECT yang sederhana saja dulu. Tadi kita sudah mencoba perintah ini:

SELECT * FROM Barang;

Maksud * di sini adalah semua kolom akan ditampilkan. Jadi, daripada nulis panjang-panjang:
SELECT KodeBarang, NamaBarang, HargaBarang, Stok FROM Barang;
gunakan saja *. Bedakan dengan SELECT berikut:
SELECT KodeBarang, NamaBarang, Stok FROM Barang;
hanya tiga kolom itu saja yang ditampilkan.

Mudah ya?

Ada kalanya data yang kita ambil ternyata sama, misal saat menampilkan tanggal berapa saja yang ada transaksi pembelian. Kalau kebetulan tanggalnya sama, perintah ini
SELECT Tanggal FROM FakturPenjualan;
akan menampilkan semua tanggal. Nah, daripada banyak yang muncul lebih dari sekali, gunakan kata bantu DISTINCT:
SELECT DISTINCT Tanggal FROM FakturPenjualan;

Oke! Sekarang kita ingin menyortir data apa saja yang akan ditampilkan. Gimana caranya?
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

Sebenarnya kita sudah pakai klausa ini dari tadi :D syarat yang digunakan adalah syarat yang bernilai TRUE atau FALSE, dan formatnya nyaris sama seperti saat kita menggunakan IF dalam bahasa pemrograman.

Contoh! Sederhana saja, stash ingin tahu barang apa saja yang stoknya di bawah stok minimum (anggap saja 5). Perintahnya:

SELECT *
FROM Barang
WHERE Stok < 5;


Mudah kan? Nah, ada beberapa hal yang perlu diperhatikan untuk klausa ini.

Saat berurusan dengan string, biasanya SQL akan membandingkan seluruh badan string jika kita menggunakan operator =. Jadi, syarat NamaBarang = 'Pensil' akan sesuai dengan barang yang bernama tepat 'Pensil', tapi tidak dengan barang bernama 'Pensil 2B'. Lha, kalau kita mau 'Pensil 2B' masuk? Di sinilah ada wildcard. Operator syarat pun berubah, tidak lagi pakai =, tapi LIKE. Jadinya:

SELECT *
FROM Barang
WHERE NamaBarang LIKE 'Pensil%';


Maksudnya, cari yang NamaBarang-nya diawali 'Pensil', setelahnya aku tak peduli. Jadi, 'Pensil' masuk, 'Pensil 2B' masuk, tapi 'Penghapus Pensil' tidak masuk. Sebaliknya, '%Pensil' memberikan hasil terbalik: 'Penghapus Pensil' masuk, tapi 'Pensil' dan 'Pensil 2B' tidak masuk. Wildcard ini bisa juga ditaruh di depan maupun belakang: '%Pensil%' akan menghasilkan barang yang namanya mengandung 'Pensil', tidak peduli posisinya di mana.

Access
Nyeleneh sendiri, wildcard-nya menggunakan *.

Nah, kalau berurusan dengan rentang (range), ada dua cara untuk melakukannya. Pertama, pakai operator AND, jadi bentuknya Stok >= 5 AND Stok < 10. Kedua, pakai operator BETWEEN nilai_awal AND nilai_akhir, jadi bentuknya Stok BETWEEN 5 AND 10. Lebih terbaca yang terakhir ya :)

Catatan
Ada anjuran untuk selalu menggunakan klausa WHERE, sekalipun kita tidak punya syarat apa-apa. Jadi misalkan saja kita mau ambil seluruh data dari tabel Barang, biasanya kan begini:

SELECT * FROM Barang;

Dengan menggunakan klausa WHERE, jadinya kita harus menambahkan satu syarat. Lha wong nggak ada syaratnya? Beri saja nilai TRUE, atau kasih ekspresi simpel yang pasti selalu menghasilkan nilai TRUE ;)

SELECT * FROM Barang WHERE TRUE;
SELECT * FROM Barang WHERE 1 = 1;


Konon pengambilan data dengan cara ini lebih cepat, tapi untuk data kecil biasanya sih nggak terasa :D

Sampai sekarang kita hanya berurusan dengan data dari satu tabel. Nah gimana kalau datanya ada di beberapa tabel?
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

#8
Pertanyaannya sederhana saja. stash ingin tahu barang apa saja yang sudah terjual dan tanggal berapa terjualnya, tapi dia minta tampilkan namanya. Nah, di tabel DetailFakturPenjualan kan hanya ada kode barang. Caranya gimana terus?

Catatan
Ada baiknya isi ketiga tabel dengan data yang agak banyak agar hasilnya kelihatan.

SELECT Barang.NamaBarang, FakturPenjualan.Tanggal
FROM Barang, FakturPenjualan, DetailFakturPenjualan
WHERE Barang.KodeBarang = DetailFakturPenjualan.KodeBarang AND FakturPenjualan.NoFaktur = DetailFakturPenjualan.NoFaktur;


Nah di sini cara penulisan nama kolom agak beda, karena kita melibatkan lebih dari satu tabel. Supaya manajer basis data kita tahu kolom itu nyarinya di tabel mana, kita beri tahu saja dengan menuliskan nama tabel diikuti tanda titik di depan nama kolom. Kalau tidak, dia pasti bingung, ini kolom yang mana :D

Di sini, triknya adalah mencari kolom yang sama di kedua tabel, lalu hubungkan menggunakan operator = di klausa WHERE. Lakukan untuk tiap tabel yang berpasangan. Tapi, apa akibatnya kalau kita melupakan klausa WHERE? Silakan dicoba :D akan terlihat nanti bahwa tiap data akan dipasangkan dengan tiap data di ketiga tabel itu. Jadinya nggak karuan ;D

Selain menggunakan bantuan operator = di klausa WHERE, kita juga bisa menggunakan operator JOIN. Ada 3 jenis JOIN yang paling umum dipakai, yaitu INNER, LEFT, dan RIGHT. Caranya pakai di klausa FROM seperti berikut:

SELECT kolom
FROM tabel_kiri INNER|LEFT|RIGHT JOIN tabel_kanan ON penghubung;


Sebelumnya, mari kita berasumsi data yang ada di ketiga tabel adalah sebagai berikut.

[spoiler=SQL isi basis data]
Catatan
SQL ini berlaku untuk Access. Untuk manajer basis data lain, khusus kolom Tanggal, ganti saja dengan tanda kutip tunggal biasa ' alih-alih tanda pagar #.

Barang
INSERT INTO Barang VALUES('001', 'Pensil', 1000, 10);
INSERT INTO Barang VALUES('002', 'Penghapus', 1500, 10);
INSERT INTO Barang VALUES('003', 'Pulpen', 2000, 5);
INSERT INTO Barang VALUES('004', 'Penggaris', 1750, 7);
INSERT INTO Barang VALUES('005', 'Amplop', 500, 200);

FakturPenjualan
INSERT INTO FakturPenjualan VALUES('000001', #07/10/2009#, 52, 27000);
INSERT INTO FakturPenjualan VALUES('000002', #07/10/2009#, 3, 3000);
INSERT INTO FakturPenjualan VALUES('000003', #07/10/2009#, 3, 4500);

DetailFakturPenjualan
INSERT INTO DetailFakturPenjualan VALUES('000001', '001', 2, 1000, 2000);
INSERT INTO DetailFakturPenjualan VALUES('000001', '005', 50, 500, 25000);
INSERT INTO DetailFakturPenjualan VALUES('000002', '001', 3, 1000, 3000);
INSERT INTO DetailFakturPenjualan VALUES('000003', '004', 3, 1500, 4500);
[/spoiler]

Sekarang kita abaikan saja tanggal terjualnya, sehingga SQL kita menjadi:

SELECT Barang.NamaBarang
FROM Barang, DetailFakturPenjualan
WHERE Barang.KodeBarang = DetailFakturPenjualan.KodeBarang;


Mari menggunakan perintah JOIN!

SELECT DetailFakturPenjualan.NoFaktur, Barang.NamaBarang
FROM Barang INNER JOIN DetailFakturPenjualan ON Barang.KodeBarang = DetailFakturPenjualan.KodeBarang;

INNER JOIN sama persis dengan klausa WHERE kita tadi, jadi secara pribadi aku lebih suka pakai klausa WHERE (klausa JOIN nggak terbaca dengan mudah dan kepanjangan :P). Dengan INNER JOIN, data pada tabel kiri dan tabel kanan akan diambil dan digabungkan sesuai dengan penghubung yang kita berikan.

SELECT DetailFakturPenjualan.NoFaktur, Barang.NamaBarang
FROM Barang LEFT JOIN DetailFakturPenjualan ON Barang.KodeBarang = DetailFakturPenjualan.KodeBarang;

Nah, LEFT JOIN ini agak unik. Dia akan ambil semua data dari tabel kiri (Barang), kemudian dipasangkan dengan tabel kanan (DetailFakturPenjualan). Padahal, di data kita, Penghapus dan Pulpen belum terjual sama sekali kan? Itu sebabnya di hasil kueri kita keduanya memiliki nomor faktur kosong. Nilai kosong pada basis data lazim disebut NULL.

SELECT DetailFakturPenjualan.NoFaktur, Barang.NamaBarang
FROM Barang RIGHT JOIN DetailFakturPenjualan ON Barang.KodeBarang = DetailFakturPenjualan.KodeBarang;

Sebaliknya, RIGHT JOIN mengambil semua data dari tabel kanan (DetailFakturPenjualan), kemudian dipasangkan dengan tabel kiri (Barang). Kebetulan hasilnya sama dengan INNER JOIN :)

Tapi dari tadi kueri kita panjang amat... apa nggak ada cara menyingkatnya? Ada!

... FROM nama_tabel [AS] alias

AS pada klausa FROM berfungsi memberi nama alias sebuah tabel. Ini sebenarnya juga bisa digunakan di SELECT untuk mengubah nama kolom. Khusus di FROM, AS bisa diabaikan :) jadi, kueri ini:
SELECT Barang.NamaBarang, FakturPenjualan.Tanggal
FROM Barang, FakturPenjualan, DetailFakturPenjualan
WHERE Barang.KodeBarang = DetailFakturPenjualan.KodeBarang AND FakturPenjualan.NoFaktur = DetailFakturPenjualan.NoFaktur;

bisa disingkat menjadi
SELECT b.NamaBarang, f.Tanggal
FROM Barang b, FakturPenjualan f, DetailFakturPenjualan d
WHERE b.KodeBarang = d.KodeBarang AND f.NoFaktur = d.NoFaktur;

Singkat kan :D

Well, klausa ini memang paling krusial untuk menyaring data, jadi panjang deh bahasannya :D

Kita abaikan dulu klausa GROUP BY dan lompat ke klausa berikutnya, ORDER BY. Bisa dilihat kan dari tadi hasilnya acak-acakan? Bagaimana kalau harus diurutkan, misalnya untuk tahu penjualan tertinggi (dilihat dari TotalQty)?
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

#9
ORDER BY, sesuai namanya, akan mengurutkan data kita sesuai kemauan. Urutannya bisa menaik (ASC) atau menurun (DESC). Dasarnya adalah ASC, jadi kita bisa mengabaikan kata kunci ASC. Contoh!

SELECT *
FROM FakturPenjualan
ORDER BY TotalQty DESC;


Gampang kan :) tapi andai kita hanya perlu data penjualan tertinggi saja? Apa nggak ada fungsi semacam Max dan Min seperti di Excel? Ada!
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

#10
Untuk keperluan rangkuman data, SQL menyediakan beberapa fungsi agregat (istilahnya bisa beda-beda di tiap manajer basis data). Ada 5 fungsi yang paling sering digunakan:

SUM menghitung total seluruh data di suatu kolom.
COUNT menghitung jumlah data di suatu kolom (awas, bedakan dengan SUM).
MAX dan MIN, sesuai namanya, mengambil nilai maksimum dan minimum dari suatu kolom.
AVG menghitung rata-data data di suatu kolom.

Silakan dicoba untuk kolom TotalQty :)

SELECT Count(TotalQty), Sum(TotalQty), Max(TotalQty), Min(TotalQty), Avg(TotalQty)
FROM FakturPenjualan;


Kalau nama kolomnya jelek (misal di Access jadi Expr1001), ubah saja menggunakan AS: Count(TotalQty) AS BanyakPenjualan.

Nah, misal kita ingin tahu tanggal berapa sih terjadi penjualan tertinggi?

SELECT NoFaktur, Tanggal, Max(TotalQty)
FROM FakturPenjualan;


Dijamin error ;D kok bisa? Alasannya agak aneh, tapi untuk sekarang kita nggak perlu tahu kenapa. Diingat saja, tiap kali kita menggunakan fungsi agregat di SELECT, kita harus menggunakan klausa GROUP BY dan mendaftarkan semua kolom yang tidak dikenai fungsi agregat di klausa tersebut. Jadi, seperti apa SQL yang benar?

SELECT NoFaktur, Tanggal, Max(TotalQty)
FROM FakturPenjualan
GROUP BY NoFaktur, Tanggal;


Lho kok malah keluar semua datanya :D pemikirannya sudah benar, tapi ternyata SQL-nya kurang tepat. Kita simpan dulu contoh kasus ini untuk sekarang.

Kita coba contoh lain dulu. stash ingin tahu barang apa saja yang terjual lebih dari sekali hari ini. Secara manual, kita tahu barang itu Pensil kan? SQL-nya?

SELECT b.NamaBarang, Count(d.KodeBarang)
FROM Barang b, DetailFakturPenjualan d, FakturPenjualan f
WHERE b.KodeBarang = d.KodeBarang AND f.NoFaktur = d.NoFaktur AND f.Tanggal = DATE() AND Count(d.KodeBarang) > 1
GROUP BY b.NamaBarang;


Dijamin error ;D aduh kenapa lagi nih??? Kesalahannya ada pada klausa WHERE, di situ ada syarat Count(d.KodeBarang) > 1. Padahal, Count ini fungsi agregat. Dia tidak dapat diletakkan pada klausa WHERE, melainkan pada klausa HAVING. Jadi, SQL yang benar adalah seperti ini.

SELECT b.NamaBarang, Count(d.KodeBarang)
FROM Barang b, DetailFakturPenjualan d, FakturPenjualan f
WHERE b.KodeBarang = d.KodeBarang AND f.NoFaktur = d.NoFaktur AND f.Tanggal = DATE()
GROUP BY b.NamaBarang
HAVING Count(d.KodeBarang) > 1;


Catatan
Beberapa manajer basis data mengizinkan kita menggunakan alias pada klausa HAVING alih-alih fungsinya. Jadi, ada yang mengizinkan HAVING jmlMurid > 1.

Agak ribet yah memahami fungsi agregat :) tapi kalau digunakan dengan benar, banyak manfaat yang bisa didapat.

Nah, dengan begitu semua klausa standar untuk SELECT sudah kita kenal. Tapi kita masih menyisakan satu contoh kasus yang belum terselesaikan. Gimana caranya menyelesaikan kasus tadi?
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

Inilah yang menjadikan SQL tampak mengerikan sekaligus mengagumkan, karena dalam kueri kita masih bisa memasukkan kueri lagi. Istilah kerennya subquery. Subkueri bisa diletakkan pada klausa FROM, WHERE, dan HAVING. Kita bahas subkueri pada klausa WHERE dulu (klausa HAVING mirip kan dengan WHERE ;)).

Nah, contoh kasus kita tadi, mencari tanggal penjualan tertinggi, bisa ditulis ulang seperti ini:

Pilih no faktur dan tanggalnya
dari tabel faktur penjualan
yang kuantitas penjualannya tertinggi.

Bisa terjemahkan ke SQL?

SELECT NoFaktur, Tanggal
FROM FakturPenjualan
WHERE TotalQty = ...


Waduh, lanjutannya bagaimana? Tahu kan cara mendapatkan nilai penjualan maksimum?

SELECT Max(TotalQty)
FROM FakturPenjualan;


Nah, klausa WHERE kita jadi seperti ini deh:
WHERE TotalQty =
(SELECT Max(TotalQty)
FROM FakturPenjualan)

SQL kita selengkapnya jadi seperti ini:
SELECT NoFaktur, Tanggal
FROM FakturPenjualan
WHERE TotalQty =
(SELECT Max(TotalQty)
FROM FakturPenjualan);


Dapat deh :D Nah, dari sini, kita dapat format umum untuk Min() dan Max(), boleh dihapalkan kalau perlu:

SELECT kolom_lain, kolom_pembanding_untuk_min_max
FROM tabel
WHERE kolom_pembanding_untuk_min_max = (SELECT Min|Max(kolom_pembanding_untuk_min_max) FROM tabel);


Sekarang kita coba kasus yang lebih kompleks. Coba cari barang apa saja yang sudah terjual lebih dari 10. SQL-nya?

SELECT NamaBarang
FROM Barang
WHERE KodeBarang IN
(
SELECT KodeBarang
FROM DetailFakturPenjualan
GROUP BY KodeBarang
HAVING Sum(Qty) > 10
);


Nah apa tuh operator IN? Kok nggak pakai = saja? Pakai = memang bisa, tapi kueri itu akan error andaikan subkueri kita menghasilkan lebih dari satu data (row). Menggunakan operator IN berarti kita meminta KodeBarang ada di dalam hasil subkueri kita. Untuk membuktikan, silakan ganti IN dengan = dan ganti salah satu detail faktur penjualan sehingga ada barang lain yang terjual lebih dari 10.

Sebetulnya masih ada dua lagi operator untuk subkueri, yaitu ANY dan ALL, tapi ini agak jarang dipakai. Sementara gunakan IN saja dulu :)

Bingung? Nii satu contoh lagi. Coba tambahkan dulu satu penjualan baru (isi sembarang) dengan pembelian 5 buah pulpen. Hanya saja, karena toko stash sedang ada diskon 10%, harganya menjadi 1800. Nah, sekarang, kita tahu ada beberapa barang yang harga jualnya tidak sesuai dengan harga di tabel Barang. Dari kumpulan barang itu, cari yang total selisih harganya paling besar, karena stash ingin tahu barang mana yang paling bikin dia rugi dan seberapa besar kerugiannya :D

Kalau kesulitan membangun sebuah subkueri utuh, pecah-pecah saja menjadi beberapa bagian yang mudah dibuat lebih dulu. Misalnya seperti ini:

1. Cari dulu barang dan selisih total untuk tiap barang:
SELECT b.KodeBarang, Sum(d.Qty * b.HargaBarang - d.Subtotal) AS TotalSelisihHarga
FROM Barang b, DetailFakturPenjualan d
WHERE b.KodeBarang = d.KodeBarang
GROUP BY b.KodeBarang;

Ternyata operasi matematika bisa juga ya dilakukan :D misalkan saja aku anggap hasilnya ini A.

2. Ambil nilai maksimumnya. Masih ingat ya cara ambil nilai maksimum?
SELECT b.NamaBarang, A.TotalSelisihHarga
FROM Barang b, A
WHERE b.KodeBarang = A.KodeBarang AND A.TotalSelisihHarga =
(SELECT Max(TotalSelisihHarga) FROM A)

Beberapa yang teliti mungkin bertanya-tanya, TotalSelisihHarga itu kan harusnya fungsi agregat, wong pakai Sum(). Kenapa syaratnya bisa ditaruh klausa WHERE??? Well, karena subkueri kita diletakkan di klausa FROM, hasil subkueri itu dianggap sebagai tabel baru. Dia tidak peduli apakah kolom itu hasil fungsi agregat atau tidak. Makanya kita bisa taruh di klausa WHERE :)

Jadi deh :D tinggal mengganti A di klausa FROM dengan hasil dari nomor 1. Jadinya memang panjang:

SELECT b.NamaBarang, a.TotalSelisihHarga
FROM Barang b,
(
SELECT b.KodeBarang, Sum(d.Qty * b.HargaBarang - d.Subtotal) AS TotalSelisihHarga
FROM Barang b, DetailFakturPenjualan d
WHERE b.KodeBarang = d.KodeBarang
GROUP BY b.KodeBarang
) AS a
WHERE b.KodeBarang = a.KodeBarang AND a.TotalSelisihHarga =
(
SELECT Max(TotalSelisihHarga) FROM
(
SELECT b.KodeBarang, Sum(d.Qty * b.HargaBarang - d.Subtotal) AS TotalSelisihHarga
FROM Barang b, DetailFakturPenjualan d
WHERE b.KodeBarang = d.KodeBarang
GROUP BY b.KodeBarang
)
);


Ini sekaligus memberikan contoh bahwa subkueri bisa juga diletakkan di klausa FROM, dan hasilnya dianggap sebagai sebuah tabel tersendiri.

Beberapa manajer basis data mengizinkan kita langsung menggunakan tabel baru hasil subkueri dalam klausa FROM, jadi kueri berikut sah:
SELECT b.NamaBarang, A.TotalSelisihHarga
FROM Barang b,
(
SELECT b.KodeBarang, Sum(d.Qty * b.HargaBarang - d.Subtotal) AS TotalSelisihHarga
FROM Barang b, DetailFakturPenjualan d
WHERE b.KodeBarang = d.KodeBarang
GROUP BY b.KodeBarang
) AS A
WHERE b.KodeBarang = A.KodeBarang AND A.TotalSelisihHarga = (SELECT Max(TotalSelisihHarga) FROM A);

Nanti aku konfirmasikan ulang apa benar kueri ini bisa dijalankan. Di Access pasti error :P

Terlihat mengerikan? Mungkin, tapi dengan banyak latihan, subkueri bisa jadi menyenangkan :D

Sekarang, coba isi data lebih banyak lagi, dan coba cari tanggal berapa yang memiliki total nilai transaksi di bawah rata-rata harian :)
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

Bagaimana? SQL nggak terlalu sulit kan? Memang kadang-kadang diperlukan trial-and-error untuk mendapatkan hasil yang kita inginkan, tapi setelah tahu konsepnya dan terbiasa, segalanya jadi mudah ;)

Sekarang kita tinggal menggabungkan teknik SQL ini ke program buatan kita sendiri, tapi sebelum itu ada beberapa teknik yang bisa digunakan pada kasus-kasus tertentu.

Mengambil nilai maksimum/minimum
Ini tadi sudah kan :) aku ulang lagi di sini supaya ingat.

SELECT kolom_lain, kolom_pembanding_untuk_min_max
FROM tabel
WHERE kolom_pembanding_untuk_min_max = (SELECT Min|Max(kolom_pembanding_untuk_min_max) FROM tabel);


Ada cara lain untuk mengambil nilai maksimum dan minimumnya saja tanpa harus menampilkan kolom lain. Kita pakai bantuan ORDER BY untuk mengurutkan data, kemudian ambil saja satu data teratas. Bagaimana caranya?

Access dan SQL Server
SELECT TOP 1 kolom_pembanding_untuk_min_max
FROM tabel
ORDER BY kolom_pembanding_untuk_min_max ASC|DESC;


MySQL
SELECT kolom_pembanding_untuk_min_max
FROM tabel
ORDER BY kolom_pembanding_untuk_min_max ASC|DESC
LIMIT 1; -- atau LIMIT 0, 1


Tanda -- digunakan untuk memberi komentar. Setelah tanda -- harus ada minimal satu spasi.

MySQL dan PostgreSQL
SELECT kolom_pembanding_untuk_min_max
FROM tabel
ORDER BY kolom_pembanding_untuk_min_max ASC|DESC
LIMIT 0 OFFSET 1;


Silakan pilih salah satu cara untuk MySQL. Cara yang paling umum digunakan MySQL adalah cara pertama (LIMIT 1 atau LIMIT 0, 1).

Penggunaan ASC atau DESC tergantung kebutuhan kita, bagaimana data itu akan diurutkan nantinya. Kalau angka sih, biasanya DESC digunakan untuk data maksimum dan ASC untuk data minimum. Pengertian TOP .../LIMIT ..., .../LIMIT ... OFFSET ... akan dijelaskan di bagian berikutnya.

Kelemahan cara ini, kalau kita harus menampilkan kolom lainnya juga dan kebetulan ada lebih dari satu data yang punya nilai maksimum/minimum, hanya satu data teratas saja (dari hasil ORDER BY) yang akan diberikan. Cara mengatasinya ya gunakan cara pertama ;)

Mengambil N data pertama

Formatnya sama persis dengan mengambil nilai maksimum/minimum, hanya saja kali ini kita mungkin tidak perlu klausa ORDER BY.

Access dan SQL Server
SELECT TOP N daftar_kolom
FROM tabel;


Jadi, TOP 10 akan mengambil 10 data pertama dari seluruh data.

MySQL
SELECT daftar_kolom
FROM tabel
LIMIT N;


MySQL dan PostgreSQL
SELECT daftar_kolom
FROM tabel
LIMIT 0 OFFSET N;


Di MySQL, LIMIT N sama artinya dengan LIMIT 0, N. Apa nih maksudnya? Baca bagian berikutnya untuk tahu jawabannya :)

Mengambil N data mulai data ke-M

Teknik ini biasa digunakan untuk navigasi, ketika data yang dihasilkan terlalu banyak sehingga sebaiknya ditampilkan sebagian saja. Bagaimana cara mengambil sebagian data saja?

Access dan SQL Server
Agak susah mengimplementasikan teknik ini di Access dan SQL Server karena tidak ada format khusus, jadi biasanya diimplementasikan melalui program.

MySQL
SELECT daftar_kolom
FROM tabel
LIMIT M, N;


MySQL dan PostgreSQL
SELECT daftar_kolom
FROM tabel
LIMIT M OFFSET N;


Misalnya, untuk mengambil 10 data mulai data ke-20 (kalau tiap halaman menampilkan 10 data dan kita mau buka halaman ke-3), gunakan LIMIT 20, 10 (MySQL) atau LIMIT 20 OFFSET 10 (MySQL/PostgreSQL).

Menggabungkan beberapa data hasil SELECT

Ada kalanya kita perlu menggabungkan dua atau lebih SELECT, misalnya saat mengambil nama dan alamat penduduk dari dua tabel yang berbeda, anggap saja tabel penduduk menetap dan penduduk musiman. Nah, kalau jumlah kolom dari kedua (atau lebih) kueri itu sama persis (bahkan sebenarnya tipe data tiap kolom harus sama persis), kueri-kueri itu bisa digabungkan dengan perintah UNION. Contoh:

SELECT nama, alamat
FROM tblPendudukTetap
UNION
SELECT nama, alamat
FROM tblPendudukMusiman;


Ini berlaku di kebanyakan manajer basis data.

Aku rasa itu dulu deh untuk kueri :) sekarang, bagaimana caranya menggunakan kueri-kueri ini di program?
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

Artikel tentang SQL-nya sendiri selesai sampai di sini. Sekarang, untuk mengimplementasikan SQL ini ke dalam program, ada dua pilihan:

Yang membuat program desktop (untuk PC) menggunakan VB 2008 bisa lihat contoh kasus stash di artikel Basis Data. Di sana aku sudah berikan contoh program sederhana untuk mengkoneksikan program dengan basis data (kebetulan menggunakan Access) dan menggunakan SQL untuk mengutak-atik basis data, beserta penjelasannya.

Yang membuat situs Web menggunakan PHP dan MySQL, tunggu lanjutan artikel Buat Web Yuk! (PHP & MySQL).

Oke! Dengan begitu sekarang siapa saja yang sudah membaca artikel ini siap untuk memperluas kemampuannya untuk membuat aplikasi maupun situs Web yang lebih dinamis dan kompleks dengan bantuan basis data. Selamat berkreasi :)
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

wrett

cara integrasi SQL server ama VB.net gimana y...
emm..