BASISDATA
Q U E R Y
LABORATORIUM 4 – BASISDATA
I. SELECT Statement
1. Mengambil data dengan SELECT
2. Query menggunakan parameter kondisi WHERE
3. Query menggunakan beberapa parameter kondisional
4. Memberikan alias hasil query pada SELECT
5. Query data bertipe teks dengan pattern matching
6. Query data unik menggunakan DISTINCT
7. Membatasi hasil query dengan LIMIT
8. Mengelompokkan hasil query menggunakan GROUP BY
9. Mendapatkan jumlah anggota setiap kelompok menggunakan COUNT()
10. Parameter kondisional dengan HAVING
11. Mengurutkan hasil query menggunakan ORDER BY
12. Mengurutkan hasil query berdasarkan lebih dari satu kolom
13. Kombinasi ORDER BY dengan LIMIT
14. Operator BETWEEN
15. MAX, MIN, AVERAGE, SUM data dari tabel
Sebelum kita memulai pembahsan dengan SELECT terlebih dahulu kita siapkan
tabel baru bernama table pegawai.
Perintah select untuk mengambil data sudah sering kita pakai sebelumnya,
untuk mengambil seluruh data yang ada di dalam suatu tabel kita bisa
menggunakan perintahSELECT * FROM <nama_tabel>
CONTOH :
PERINTAH DASAR :
SELECT * FROM <nama_table> WHERE <kondisi>
CONTOH :
Kita bisa menggunakan perintah SELECT untuk membuat alias pada suatu
kolom dengan perintah AS.
mysql> select nama_peg AS nama_pegawai, alamat_peg AS asal from pegawai
where alamat_peg='Jakarta';
+----------------+---------+
| nama_pegawai | asal |
+----------------+---------+
| Olga Syahputra | Jakarta |
| Ilham Ungara | Jakarta |
+----------------+---------+
2 rows in set (0.00 sec)
Di sini pada saat menampilkan hasil, nama kolom akan diganti dengan
perintah AS
Pada perintah diatas menunjukkan bahwa data yang diminta adalah data
yang memuat Jabatan berawalan M dan berjumlah 7 huruf.
Perintah di atas menunjukkan data yang diminta adalah data nama pegawai
yang jabatannya berawalan huruf ‘M’
CONTOH :
mysql> select * from pegawai;
mysql> select * from pegawai ORDER BY nama_peg;
+----------+-----------------------+-------------+----------------+---------+
| nip | nama_peg | alamat_peg | jabatan | gaji |
+----------+-----------------------+-------------+----------------+---------+
| PEG-1007 | Bambang Pamungkas | Kudus | Staff Senior | 3000000 |
| PEG-1006 | Budi Drajat | Malang | Supervisor | 4500000 |
| PEG-1004 | Chelsea Olivia | Bandung | Kepala Unit | 6000000 |
| PEG-1014 | Donny Damara | Makasar | Tenaga Kontrak | 1000000 |
| PEG-1008 | Ely Oktafiani | Yogyakarta | Staff Senior | 3000000 |
| PEG-1013 | Endang Melati | Madiun | Staff Junior | 2000000 |
| PEG-1002 | Felix Nababan | Medan | Manager | 8000000 |
| PEG-1012 | Ilham Ungara | Jakarta | Staff Junior | 2000000 |
| PEG-1003 | Olga Syahputra | Jakarta | Kepala Unit | 6000000 |
| PEG-1015 | Paijem | Yogyakarta | Tenaga Kontrak | 500000 |
| PEG-1011 | Rahmadi Sholeh | Yogyakarta | Staff Junior | 2000000 |
| PEG-1009 | Rani Wijaya | Magelang | Staff Senior | 3000000 |
| PEG-1010 | Rano Karno | Solo | Staff Junior | 2000000 |
| PEG-1001 | Soeharto Mangundirejo | Yogyakarta | C.E.O | 9000000 |
| PEG-1005 | Tuti Wardani | Jawa Tengah | Supervisor | 4500000 |
+----------+-----------------------+-------------+----------------+---------+
15 rows in set (0.42 sec)
Kita sudah punya tabel baru yang menunjukkan data pada kolom nama ada
yang sama, tapi di kolom alamat berbeda maka bisa diurutkan sbb :
Pada tabel ini telah diurutkan nama terlebih dahulu setelah itu baru
mengurutkan berdasarkan alamat.
Perintah BETWEEN digunakan untuk memfilter data diantara dua nilai yang
dispesifikkan
mysql> select * from pegawai WHERE gaji BETWEEN 4000000 AND 9000000;
+----------+-----------------------+-------------+-------------+---------+
| nip | nama_peg | alamat_peg | jabatan | gaji |
+----------+-----------------------+-------------+-------------+---------+
| PEG-1001 | Soeharto Mangundirejo | Yogyakarta | C.E.O | 9000000 |
| PEG-1002 | Felix Nababan | Medan | Manager | 8000000 |
| PEG-1003 | Olga Syahputra | Jakarta | Kepala Unit | 6000000 |
| PEG-1004 | Chelsea Olivia | Bandung | Kepala Unit | 6000000 |
| PEG-1005 | Tuti Wardani | Jawa Tengah | Supervisor | 4500000 |
| PEG-1006 | Budi Drajat | Malang | Supervisor | 4500000 |
+----------+-----------------------+-------------+-------------+---------+
6 rows in set (0.00 sec)
mysql> select nama_peg, gaji from pegawai WHERE nama_peg NOT BETWEEN
"Ely Oktafiani" AND "Olga Syahputra";
+-----------------------+---------+
| nama_peg | gaji |
+-----------------------+---------+
| Soeharto Mangundirejo | 9000000 |
| Chelsea Olivia | 6000000 |
| Tuti Wardani | 4500000 |
| Budi Drajat | 4500000 |
| Bambang Pamungkas | 3000000 |
| Rani Wijaya | 3000000 |
| Rano Karno | 2000000 |
| Rahmadi Sholeh | 2000000 |
| Donny Damara | 1000000 |
| Paijem | 500000 |
+-----------------------+---------+
10 rows in set (0.00 sec)
Menunjukkan hasil dari NOT BETWEEN dalam menampilkan data yang bukan
antara Ely Oktafiani dan Olga Syahputra
SUB QUERY
CONTOH :
mysql> select nama_peg, gaji from pegawai where gaji = (select max(gaji)
from pegawai);
+-----------------------+---------+
| nama_peg | gaji |
+-----------------------+---------+
| Soeharto Mangundirejo | 9000000 |
+-----------------------+---------+
1 row in set (0.06 sec)
Perintah ini hanya bisa menerima satu(1) buah hasil dari sub query, jika
hasil dari sub query ada lebih adari satu maka akan terjadi error.
Perintah diatas ini ERROR karena hasil sub query diatas ada lebih dari
satu(1)
mysql> select nama_peg, gaji from pegawai where gaji < ALL(select gaji
FROM pegawai WHERE gaji > '2500000');
+----------------+---------+
| nama_peg | gaji |
+----------------+---------+
| Rano Karno | 2000000 |
| Rahmadi Sholeh | 2000000 |
| Ilham Ungara | 2000000 |
| Endang Melati | 2000000 |
| Donny Damara | 1000000 |
| Paijem | 500000 |
+----------------+---------+
6 rows in set (0.00 sec)
Pada perintah diatas kita perhatikan perintah select yang berada di dalam
kurung (Sub Query), pada perintah itu menjelaskan bahwa penampilan daftar
nama pegawai yang gajinya lebih dari 2jt, sedangkan Quert seutuhnya
menampilkan nama pegawai yang gajinya lebih kecil dari pada hasil sub
query, Soeharto Mangundirejo tidak keluar di hasil karena tidak ada yang
mempunyai gaji sebesar dirinya.
mysql> select nama_peg, gaji from pegawai where gaji < SOME(select gaji
FROM pegawai WHERE gaji > '2000000');
+-------------------+---------+
| nama_peg | gaji |
+-------------------+---------+
| Felix Nababan | 8000000 |
| Olga Syahputra | 6000000 |
| Chelsea Olivia | 6000000 |
| Tuti Wardani | 4500000 |
| Budi Drajat | 4500000 |
| Bambang Pamungkas | 3000000 |
| Ely Oktafiani | 3000000 |
| Rani Wijaya | 3000000 |
| Rano Karno | 2000000 |
| Rahmadi Sholeh | 2000000 |
| Ilham Ungara | 2000000 |
| Endang Melati | 2000000 |
| Donny Damara | 1000000 |
| Paijem | 500000 |
+-------------------+---------+
14 rows in set (0.45 sec)
mysql> select * from pegawai where EXISTS (select * from pegawai where
alamat_peg = 'Kebumen');
Empty set (0.00 sec)
Sedangkan perintah ini tidak dijalankan karena Sub Query bernilai FALSE
atau tidak ada hasilnya.
Jika kita ganti EXISTS dengan NOT EXISTS maka hasil akan keluar seperti
di bawah ini, karena memang alamat-peg tidak ada yang bernilai ‘Kebumen’
mysql> select * from pegawai where NOT EXISTS (select * from pegawai
where alamat_peg = 'Kebumen');
+----------+-----------------------+-------------+----------------+---------+
| nip | nama_peg | alamat_peg | jabatan | gaji |
+----------+-----------------------+-------------+----------------+---------+
| PEG-1001 | Soeharto Mangundirejo | Yogyakarta | C.E.O | 9000000 |
| PEG-1002 | Felix Nababan | Medan | Manager | 8000000 |
| PEG-1003 | Olga Syahputra | Jakarta | Kepala Unit | 6000000 |
| PEG-1004 | Chelsea Olivia | Bandung | Kepala Unit | 6000000 |
| PEG-1005 | Tuti Wardani | Jawa Tengah | Supervisor | 4500000 |
| PEG-1006 | Budi Drajat | Malang | Supervisor | 4500000 |
| PEG-1007 | Bambang Pamungkas | Kudus | Staff Senior | 3000000 |
| PEG-1008 | Ely Oktafiani | Yogyakarta | Staff Senior | 3000000 |
| PEG-1009 | Rani Wijaya | Magelang | Staff Senior | 3000000 |
| PEG-1010 | Rano Karno | Solo | Staff Junior | 2000000 |
| PEG-1011 | Rahmadi Sholeh | Yogyakarta | Staff Junior | 2000000 |
| PEG-1012 | Ilham Ungara | Jakarta | Staff Junior | 2000000 |
| PEG-1013 | Endang Melati | Madiun | Staff Junior | 2000000 |
| PEG-1014 | Donny Damara | Makasar | Tenaga Kontrak | 1000000 |
| PEG-1015 | Paijem | Yogyakarta | Tenaga Kontrak | 500000 |
+----------+-----------------------+-------------+----------------+---------+
15 rows in set (0.00 sec)
Kita buat terlebih dahulu sebuah tabel yang menunjukkan hasil yang kita
inginkan, contoh tabel Job ini digunakan untuk menampilkan data yang
hasil dari sub query lebih dari satu.
Setelah kita buat table job, maka kita bisa terapkan perintah IN sbb :
+----------+-------------------+----------------+
| nip | nama_peg | jabatan |
+----------+-------------------+----------------+
| PEG-1005 | Tuti Wardani | Supervisor |
| PEG-1006 | Budi Drajat | Supervisor |
| PEG-1007 | Bambang Pamungkas | Staff Senior |
| PEG-1008 | Ely Oktafiani | Staff Senior |
| PEG-1009 | Rani Wijaya | Staff Senior |
| PEG-1010 | Rano Karno | Staff Junior |
| PEG-1011 | Rahmadi Sholeh | Staff Junior |
| PEG-1012 | Ilham Ungara | Staff Junior |
| PEG-1013 | Endang Melati | Staff Junior |
| PEG-1014 | Donny Damara | Tenaga Kontrak |
| PEG-1015 | Paijem | Tenaga Kontrak |
+----------+-------------------+----------------+
11 rows in set (0.00 sec)
Terlihat di dalam hasil bahwa, data pegawai yang jabatannya ada di dalam
tabel job akan ditampilkan, sedangkan yang tidak ada tidak akan
ditampilkan.
Table Join
Dalam basis data relasional, kita mengenal relasi antar tabel. Untuk melakukan
query terhadap dua atau lebih tabel yang memiliki relasi, kita bisa
menggunakan fitur table join di MySQL.
Sebelum kita mulai mempelajari Table Join kita persiapkan dulu Tabel-tabel
pendukungnya :
Setelah kita punya table jabatan / job, kita buat tabel baru untuk menerapkan
join, kita copykan table pegawai ke tabel pegawai_join
Untuk merelasikan table pegawai_join dan table jabatan kita tambahkan kolom
id_jabatan pada table pegawai_join untuk mereferensi ke dua table.
Jika kita lihat isi tablenya kolom id_jabatan masih NULL atau kosong karena ke
dua table belum berelasi
1. Cross Join
Operasi tabel yang pertama adalah cross join atau disebut juga sebagai
Cartesian join. Pada cross join, semua data dalam tabel yang pertama
dipasangkan dengan semua data pada tabel yang kedua. Berikut adalah
contohnya
SYNTAX DASAR
Selain Menggunakan WHERE kita juga bisa menggunakan INNER JOIN.. TO..
Berikut contoh syntaxnya :
+----------+-----------------------+-------------+----------------+---------+------------+----------------+
| nip | nama_peg | alamat_peg | jabatan | gaji | id_jabatan | nama_jabatan |
+----------+-----------------------+-------------+----------------+---------+------------+----------------+
| PEG-1001 | Soeharto Mangundirejo | Yogyakarta | C.E.O | 9000000 | 1 | C.E.O |
| PEG-1002 | Felix Nababan | Medan | Manager | 8000000 | 2 | Manager |
| PEG-1003 | Olga Syahputra | Jakarta | Kepala Unit | 6000000 | 3 | Kepala Unit |
| PEG-1004 | Chelsea Olivia | Bandung | Kepala Unit | 6000000 | 3 | Kepala Unit |
| PEG-1005 | Tuti Wardani | Jawa Tengah | Supervisor | 4500000 | 4 | Supervisor |
| PEG-1006 | Budi Drajat | Malang | Supervisor | 4500000 | 4 | Supervisor |
| PEG-1007 | Bambang Pamungkas | Kudus | Staff Senior | 3000000 | 5 | Staff Senior |
| PEG-1008 | Ely Oktafiani | Yogyakarta | Staff Senior | 3000000 | 5 | Staff Senior |
| PEG-1009 | Rani Wijaya | Magelang | Staff Senior | 3000000 | 5 | Staff Senior |
| PEG-1010 | Rano Karno | Solo | Staff Junior | 2000000 | 6 | Staff Junior |
| PEG-1011 | Rahmadi Sholeh | Yogyakarta | Staff Junior | 2000000 | 6 | Staff Junior |
| PEG-1012 | Ilham Ungara | Jakarta | Staff Junior | 2000000 | 6 | Staff Junior |
| PEG-1013 | Endang Melati | Madiun | Staff Junior | 2000000 | 6 | Staff Junior |
| PEG-1014 | Donny Damara | Makasar | Tenaga Kontrak | 1000000 | 7 | Tenaga Kontrak |
| PEG-1015 | Paijem | Yogyakarta | Tenaga Kontrak | 500000 | 7 | Tenaga Kontrak |
+----------+-----------------------+-------------+----------------+---------+------------+----------------+
15 rows in set (0.00 sec)
3. Natural Join
Natural join sebenarnya mirip dengan INNER JOIN. Namun kita tidak
perlu menspesifikasikan kolom mana yang ingin kita bandingkan. Secara
automatis, MySQL akan mencari kolom pada dua buah tabel yang memiliki
nilai yang sama dan membandingkannya. Sebagai contoh, untuk tabel
pegawai_join dan jabatan, yang dibandingkan adalah kolom id_jabatan yang
ada di keduanya.
+------------+----------+-----------------------+-------------+----------------+---------+----------------+
| id_jabatan | nip | nama_peg | alamat_peg | jabatan | gaji | nama_jabatan |
+------------+----------+-----------------------+-------------+----------------+---------+----------------+
| 1 | PEG-1001 | Soeharto Mangundirejo | Yogyakarta | C.E.O | 9000000 | C.E.O |
| 2 | PEG-1002 | Felix Nababan | Medan | Manager | 8000000 | Manager |
| 3 | PEG-1003 | Olga Syahputra | Jakarta | Kepala Unit | 6000000 | Kepala Unit |
| 3 | PEG-1004 | Chelsea Olivia | Bandung | Kepala Unit | 6000000 | Kepala Unit |
| 4 | PEG-1005 | Tuti Wardani | Jawa Tengah | Supervisor | 4500000 | Supervisor |
| 4 | PEG-1006 | Budi Drajat | Malang | Supervisor | 4500000 | Supervisor |
| 5 | PEG-1007 | Bambang Pamungkas | Kudus | Staff Senior | 3000000 | Staff Senior |
| 5 | PEG-1008 | Ely Oktafiani | Yogyakarta | Staff Senior | 3000000 | Staff Senior |
| 5 | PEG-1009 | Rani Wijaya | Magelang | Staff Senior | 3000000 | Staff Senior |
| 6 | PEG-1010 | Rano Karno | Solo | Staff Junior | 2000000 | Staff Junior |
| 6 | PEG-1011 | Rahmadi Sholeh | Yogyakarta | Staff Junior | 2000000 | Staff Junior |
| 6 | PEG-1012 | Ilham Ungara | Jakarta | Staff Junior | 2000000 | Staff Junior |
| 6 | PEG-1013 | Endang Melati | Madiun | Staff Junior | 2000000 | Staff Junior |
| 7 | PEG-1014 | Donny Damara | Makasar | Tenaga Kontrak | 1000000 | Tenaga Kontrak |
| 7 | PEG-1015 | Paijem | Yogyakarta | Tenaga Kontrak | 500000 | Tenaga Kontrak |
+------------+----------+-----------------------+-------------+----------------+---------+----------------+
15 rows in set (0.00 sec)
4. Left Join dan Right Join
Left join dan right join digunakan untuk menghindari data yang
hilang karena mungkin ada data yang belum direferensi oleh tabel yang
lain.
Kemudian jika kita lakukan LEFT JOIN dengan tabel jobs yang kita sebut
terlebih dahulu (atau di sebelah kiri) maka akan muncul sebagai berikut:
Meskipun pada tabel jabatan ada data yang belum direferensi, namun data tersebut tetap
ditampilkan dan diberi nilai NULL untuk nilai di tabel pegawai_join yang belum diketahui. Hal yang
sama juga berlaku untuk RIGHT JOIN, kali ini dengan tabel jabatan berada di sebelah kanan.
+----------+-----------------------+-------------+------------+----------------+---------+------------+----------------+
| nip | nama_peg | alamat_peg | id_jabatan | jabatan | gaji | id_jabatan | nama_jabatan |
+----------+-----------------------+-------------+------------+----------------+---------+------------+----------------+
| PEG-1001 | Soeharto Mangundirejo | Yogyakarta | 1 | C.E.O | 9000000 | 1 | C.E.O |
| PEG-1002 | Felix Nababan | Medan | 2 | Manager | 8000000 | 2 | Manager |
| PEG-1003 | Olga Syahputra | Jakarta | 3 | Kepala Unit | 6000000 | 3 | Kepala Unit |
| PEG-1004 | Chelsea Olivia | Bandung | 3 | Kepala Unit | 6000000 | 3 | Kepala Unit |
| PEG-1005 | Tuti Wardani | Jawa Tengah | 4 | Supervisor | 4500000 | 4 | Supervisor |
| PEG-1006 | Budi Drajat | Malang | 4 | Supervisor | 4500000 | 4 | Supervisor |
| PEG-1007 | Bambang Pamungkas | Kudus | 5 | Staff Senior | 3000000 | 5 | Staff Senior |
| PEG-1008 | Ely Oktafiani | Yogyakarta | 5 | Staff Senior | 3000000 | 5 | Staff Senior |
| PEG-1009 | Rani Wijaya | Magelang | 5 | Staff Senior | 3000000 | 5 | Staff Senior |
| PEG-1010 | Rano Karno | Solo | 6 | Staff Junior | 2000000 | 6 | Staff Junior |
| PEG-1011 | Rahmadi Sholeh | Yogyakarta | 6 | Staff Junior | 2000000 | 6 | Staff Junior |
| PEG-1012 | Ilham Ungara | Jakarta | 6 | Staff Junior | 2000000 | 6 | Staff Junior |
| PEG-1013 | Endang Melati | Madiun | 6 | Staff Junior | 2000000 | 6 | Staff Junior |
| PEG-1014 | Donny Damara | Makasar | 7 | Tenaga Kontrak | 1000000 | 7 | Tenaga Kontrak |
| PEG-1015 | Paijem | Yogyakarta | 7 | Tenaga Kontrak | 500000 | 7 | Tenaga Kontrak |
| NULL | NULL | NULL | NULL | NULL | NULL | 8 | Tenaga Magang |
+----------+-----------------------+-------------+------------+----------------+---------+------------+----------------+
Misal, kita ingin merubah nama belakang dari employee yang pekerjaannya
Spy menjadi 'Bono'. Kita dapat melakukannya sebagai berikut:
mysql> SELECT nip, nama_peg, jabatan FROM pegawai_join INNER JOIN jabatan
USING (id_jabatan) LIMIT 3;
+----------+---------------------+-------------+
| nip | nama_peg | jabatan |
+----------+---------------------+-------------+
| PEG-1001 | Soeharto Mangantelo | C.E.O |
| PEG-1002 | Felix Nababan | Manager |
| PEG-1003 | Olga Syahputra | Kepala Unit |
+----------+---------------------+-------------+
3 rows in set (0.00 sec)
Kita juga dapat menghapus data menggunakan join table sebagai berikut:
mysql> SELECT nip, nama_peg, jabatan FROM pegawai_join INNER JOIN jabatan
USING (id_jabatan) LIMIT 3;
+----------+---------------------+-------------+
| nip | nama_peg | jabatan |
+----------+---------------------+-------------+
| PEG-1001 | Soeharto Mangantelo | C.E.O |
| PEG-1003 | Olga Syahputra | Kepala Unit |
| PEG-1004 | Chelsea Olivia | Kepala Unit |
+----------+---------------------+-------------+
3 rows in set (0.00 sec)