Aljabar Relasional dan Query #1: Operasi Proyeksi

Memilih kolom pada tabel basis data relasional

M. Ramadhan
Telematika
4 min readMay 16, 2023

--

Daftar Isi

Pendahuluan
Operasi Proyeksi
Penutup
Referensi

Photo by Darryl Low on Unsplash

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 Π.

Tabel 1 Operasi proyeksi

Berikut adalah contoh pembuatan basis data Simak dengan tabel Mahasiswa menggunakan SQL Server.

CREATE DATABASE Simak
GO
USE Simak
GO
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
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)

Golongan darah apa yang dimiliki oleh para mahasiswa?

Tabel 2 Proyeksi GolDarah 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)

Bila ingin mengetahui jumlah mahasiswa untuk setiap golongan darah, tambahkan fungsi agregasi Count(*) disertai dengan 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)

Bagaimana dengan golongan darah untuk setiap gender?

Tabel 3 Proyeksi Gender, GolDarah 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.

Bila perlu, untuk mengetahui jumlah mahasiswa setiap gender dan golongan darah, Anda dapat menambahkan 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.

--

--

M. Ramadhan
Telematika

I’m a database designer and developer, childhood in Menggala, living in Palembang.