Memilih kolom tabel basis data relasional

Pendahuluan
Aljabar relasional adalah bahasa teoritis yang mengoperasikan satu atau beberapa relasi dan menghasilkan relasi lain tanpa mengubah relasi asli. Keluaran sebuah operasi dapat menjadi masukan operasi lainnya.
Menurut Codd (1972), ada delapan operasi yang terdiri atas lima operasi dasar dan tiga operasi tambahan.
Lima operasi dasar:
▸ proyeksi
▸ seleksi
▸ produk Cartesian
▸ union
▸ set difference (selisih)
Tiga operasi tambahan yaitu turunan dari operasi dasar:
▸ join
▸ intersection (irisan)
▸ divisi.
Aljabar relasional menjadi dasar bagi query. Query adalah kata dalam bahasa Inggris, merupakan kata benda, bentuk jamaknya queries, secara semantik berarti pertanyaan atau permintaan informasi tentang sesuatu.
A query is a question or a request for information about something. (https://www.merriam-webster.com/dictionary/query)
Sebagai istilah dalam basis data, query berarti permintaan data yang diambil dari basis data. Query pada basis data relasional menggunakan Structured Query Language (SQL).
A query is a request for data or information from a database table or combination of tables. This data may be generated as results returned by Structured Query Language (SQL). (https://www.techopedia.com/definition/5736/query)
Operasi Proyeksi
Proyeksi digunakan untuk memilih kolom atau atribut dari sebuah relasi. Lihat Tabel 1. Operasi proyeksi menghasilkan relasi yang berisi nilai atribut a₁, a₂, … , aₙ tanpa duplikasi tuple dari relasi. Ekspresi aljabar relasionalnya menggunakan operator Π.
| Aljabar Relasional | Query |
|---|---|
| Πa1, a2, … , an (Relasi) | SELECT a1, a2, … , an FROM Relasi |
Contoh Kasus
Berikut adalah contoh kasus tabel mahasiswa yang terdiri atas enam kolom. Dengan operasi proyeksi, kita bisa memilih kolom sesuai dengan kebutuhan. Terlebih dahulu kita buat basis data InfoMhs yang berisi satu tabel Mahasiswa. Pernyataan SQL-nya menggunakan SQL Server.
-- Membuat basis dataInfoMhs
CREATE DATABASEInfoMhs
GO
-- Mengaktifkan basis data Simak
USEInfoMhs
GO
-- Membuat tabel Mahasiswa
CREATE TABLE Mahasiswa (
NIM Char(7) PRIMARY KEY,
Nama VarChar(16),
Gender Char(1),
TglLahir Date,
GolDarah VarChar(2),
IPK Decimal(3,2),
CHECK (Gender IN('L','P')),
CHECK (GolDarah IN('A','B','AB','O')),
CHECK (IPK BETWEEN 0.0 AND 4.0)
)
GO
-- Memasukkan data mahasiswa
INSERT INTO Mahasiswa VALUES
('1221234','Rajabasa', 'L','2003-03-25','A', 2.34),
('1120235','Merapi', 'L','2003-02-17','O', 3.55),
('1120236','Mawar Merah', 'P','2004-04-01',NULL,2.10),
('1222237','Semeru', 'L','2004-12-31','A', NULL),
('1322238','Melati Putih','P',NULL, 'B', 1.23),
('1321239','Kutilang', 'L','2004-03-17','O', 3.21),
('1221210','Cempaka', 'P','2003-03-07','O', 0.75),
('1219254','Kilau Intan', 'P',NULL, NULL, 2.00),
('1119300','Nur Cahaya', 'P','2002-04-16','B', NULL),
('1120335','Jayagiri', 'P',NULL, 'O', 3.50);
GO
Query SELECT * FROM Mahasiswa menghasilkan:
NIM Nama Gender TglLahir GolDarah IPK
------- ---------------- ------ ---------- -------- ----
1119300 Nur Cahaya P 2002-04-16 B NULL
1120235 Merapi L 2003-02-17 O 3.55
1120236 Mawar Merah P 2004-04-01 NULL 2.10
1120335 Jayagiri P NULL O 3.50
1219254 Kilau Intan P NULL NULL 2.00
1221210 Cempaka P 2003-03-07 O 0.75
1221234 Rajabasa L 2003-03-25 A 2.34
1222237 Semeru L 2004-12-31 A NULL
1321239 Kutilang L 2004-03-17 O 3.21
1322238 Melati Putih P NULL B 1.23
(10 rows affected)
(1) Daftar golongan darah mahasiswa
| Aljabar Relasional | Query |
|---|---|
| ΠGolDarah (Mahasiswa) | SELECT GolDarah FROM Mahasiswa |
Bila dieksekusi, query di atas menghasilkan:
GolDarah
--------
B
O
NULL
O
NULL
O
A
A
O
B
(10 rows affected)
Ternyata hasilnya tidak sesuai dengan yang ada di buku, tetap ada duplikasi data. DBMS tidak mengimplementasikannya dengan cara yang sama seperti yang dijelaskan dalam teori. Sudah dicoba dengan Oracle, MySQL, Access, PostgreSQL, semuanya memberikan data ganda. Untuk meniadakan duplikasi data, pengguna harus memintanya secara eksplisit menggunakan klausa DISTINCT.
SELECT DISTINCT GolDarah
FROM Mahasiswa
Hasilnya sesuai dengan teori.
GolDarah
--------
NULL
A
B
O
(4 rows affected)
(2) Jumlah mahasiswa untuk setiap golongan darah
Tambahkan fungsi agregasi Count(*) disertai dengan klausa GROUP BY.
SELECT GolDarah,
COUNT(*) AS Jumlah
FROM Mahasiswa
GROUP BY GolDarah
Klausa DISTINCT tidak diperlukan lagi. Berikut hasilnya.
GolDarah Jumlah
-------- ------
NULL 2
A 2
B 2
O 4
(4 rows affected)
(3) Daftar gender dan golongan darah
| Aljabar Relasional | Query |
|---|---|
| ΠGender, GolDarah (Mahasiswa) | SELECT DISTINCT Gender, GolDarah FROM Mahasiswa |
Query-nya menghasilkan:
Gender GolDarah
------ --------
L A
L O
P NULL
P B
P O
(5 rows affected)
Urutan kolom yang dihasilkan sesuai dengan urutan dalam pernyataan proyeksi. Urutan kolom pada waktu pendefinisian tabel tidak ada pengaruhnya.
(4) Jumlah mahasiswa untuk setiap gender dan golongan darah
Tambahkan fungsi agregasi Count(*) disertai dengan klausa GROUP BY.
SELECT Gender, GolDarah,
COUNT(*) AS Jumlah
FROM Mahasiswa
GROUP BY Gender, GolDarah
Bila dieksekusi, hasilnya sebagai berikut.
Gender GolDarah Jumlah
------ -------- ------
L A 2
L O 2
P NULL 2
P B 2
P O 2
(5 rows affected)
Penutup
Proyeksi adalah operasi memilih kolom tanpa duplikasi tuple. Kenyataannya DBMS tidak mengimplementasikannya dengan cara yang sama seperti yang dijelaskan dalam teori. Untuk memperoleh hasil tuple unik, pengguna harus memintanya secara eksplisit menggunakan klausa DISTINCT.
Daftar Pustaka
Codd, E.F. (March 1972). “Relational Completeness of Data Base Sublanguages” in Computer Sciences. San Jose, California: IBM Research Laboratory.
Connolly, Thomas M., & Begg, Carolyn E. (2015). Database Systems: A Practical Approach to Design, Implementation, and Management. 6th Edition. Essex, England: Pearson Education.
Coronel, C., Steven, M., Crockett, K., & Blewett, C. (2020). Database Principles: Fundamentals of Design, Implementation, and Management. 3rd Edition. Hampshire, United Kingdom: Cengage Learning
