You are on page 1of 48

SQL: Bahasa Pertanyaan

Berstruktur

1
Pengenalan
Bahasa pangkalan data membolehkan
pengguna:
•membina pangkalan data & struktur jadual
•tambah, kemaskini & hapus data dr. jadual
•pertanyaan mudah & kompleks

SQL diwujudkan utk penuhi kehendak2 di atas


RDBMS yg guna SQL: dBASEIV,, Oracle, MS
Access, FoxPro, SQL Server.
Pengenalan
SQL terbahagi kepada 2 kategori utama:
Bahasa Takrifan Data(Data Defn Language)
• Menakrif struktur jadual dan capaian
pangkalan data (CREATE, DROP)
Bahasa Manipulasi Data
(Data Manipulation Lang)
• Memasukkan, mengemaskini, menghapus
dan mencapai data dalam jadual
(INSERT,UPDATE, SELECT)
SQL mudah dipelajari krn:
• bahasa tidak bertatacara
• bebas format
• guna perkataan bhs Inggeris harian
• tidak “case sensitive”
• boleh digunakan oleh pelbagai
pengguna (berpengalaman dan baru)
Takrifan Data

Arahan SQL akan ditunjukkan melalui


contoh data dari 2 jadual (pekerja dan
bangunan)

•Cipta skema pangkalan data


CREATE TABLE nama_jadual
(nama_lajur, jenis_data [NULL|NOT
NULL]][,….])
Takrifan Data (Cipta Jadual)
CREATE TABLE pekerja (
no_pek VARCHAR(5) NOT NULL UNIQUE,
nama VARCHAR(15),
alamat VARCHAR(25),
tel_no VARCHAR(7),
jawatan VARCHAR(5),
t_kerja DATE,
gaji DECIMAL(7,0)
PRIMARY KEY (no_pek));
NOT NULL : memastikan no_pek mesti ada nilai
UNIQUE: nilai no_pek mesti unik
PRIMARY KEY : menakrif kunci utama
Jadual Pekerja
No_pe Nama Alamat No_Tel Jawatan T_kerja gaji
k
A01 John Cheras 03-9065112 Pengurus 01/01/95 30000
A02 Ani Bangi 03-8293345 Penolong 30/05/97 12000

A03 David Bangi 03-8292177 Timbalan 01/05/97 18000


.Pengurus
A04 Mariam Ampang Penolong 01/12/96 9000

A05 Salmah Bangi 03-8292001 Pengurus 12/07/96 24000

A06 Janice Kajang 03-8363541 Penolong 30/07/96 9000


Jadual Bangunan

No_aset Alamat Bandar Jeni Bilik Sewa no_pek


s
B01 16, Jalan K3/2, Ampang Rum 6 650 A04
Taman Kosas ah
B02 6, Jalan B3/4, Semenyih Flat 4 400 A06
Taman Raya
B03 6, Jalan 6/1 Bangi Flat 3 350 A03

B04 2, Jalan 4/5 Bangi Flat 3 375 A02

B05 18, Jalan 2/4 Bangi Rum 5 600 A02


ah
B06 5, Jalan 2/1 Bangi Flat 4 450 A03
Takrifan Data (Hapus Jadual)
DROP TABLE
DROP TABLE nama_jadual [RESTRICT|CASCADE]

DROP TABLE pekerja

DROP: hapus jadual & baris di dalamnya


RESTRICT: tidak boleh hapus jadual jika ada kunci
asing
CASCADE: menghapus segala atribut yg
bergantung kpd jadual ini
Pengurusan Data
Arahan INSERT
INSERT INTO nama_jadual [senarai_lajur]
VALUES (senarai_nilai_data)

Utk masukkan data ke dalam semua lajur:


INSERT INTO pekerja
VALUES (‘A07’, ‘Ali’, ‘Klang’, ‘03-7655661’,
‘Penolong pengurus’, ’13/5/2004’,‘12,000’);
Utk masukkan data ke dalam lajur pilihan:
INSERT INTO pekerja (no_pek, nama, jawatan)
VALUES (‘A07’, ‘Ali’, ‘Penolong pengurus’);
Pengurusan Data
Arahan UPDATE
UPDATE nama_jadual
SET nama_lajur1=nilai_data1, [nama_lajur2=nilai_data2]
WHERE [keadaan]

Berikan kenaikan gaji 3% kpd semua pekerja


UPDATE pekerja
SET gaji = gaji*1.03;

Berikan kenaikan gaji 3% kpd semua pengurus


UPDATE pekerja
SET gaji = gaji*1.03
WHERE jawatan = ‘pengurus’;
Pengurusan Data
Arahan DELETE

DELETE FROM nama_jadual


WHERE [keadaan]

Menghapuskan baris tertentu


DELETE FROM pekerja
WHERE no_pek = ‘SG14’

Menghapuskan semua baris


DELETE FROM pekerja
Pertanyaan Data

Arahan SELECT- arahan asas kpd semua pertanyaan SQL-


utk capai & papar data
Notasi
Huruf besar: Arahan SQL
Huruf kecil: Takrifan pengguna
|: pilihan
{}: elemen yg diperlukan
[]: elemen pilihan
(…): pengulangan pilihan (0 atau lebih)
Pertanyaan Data
Bentuk arahan secara umum:
SELECT [DISTINCT|ALL] {*|[arahan_lajur [AS
nama_baru]][,…]}
FROM nama_jadual [alias] [,…]
[WHERE keadaan]
[GROUP BY senarai_lajur] [HAVING keadaan]
[ORDER BY senarai_lajur]
- susunan di atas tidak boleh ditukar
- SELECT dan FROM - wajib dlm pertanyaan data
Pertanyaan Data
SELECT: kenalpasti lajur pilihan utk
output
FROM: kenalpasti jadual/jadual2 yg
dipilih
WHERE: pilih baris ikut syarat
GROUP BY: bentuk kumpulan baris yg
mempunyai nilai lajur yg sama
HAVING: membentuk kumpulan
mengikut syarat
ORDER BY: tentukan susunan output
Pertanyaan Mudah
Mencapai semua baris dan lajur
Senaraikan maklumat lengkap tentang pekerja
SELECT ALL SELECT *
FROM pekerja; FROM pekerja;

Hasil: semua baris dan lajur dalam jadual pekerja


Mencapai baris dan lajur tertentu
senaraikan nombor pekerja, nama & gaji setiap pekerja
SELECT no_pek, nama, gaji No_pek Nama gaji

FROM pekerja; A01 John 30000


A02 Ani 12000
Hasil: A03 David 18000
A04 Mariam 9000
A05 Salmah 24000
A06 Janice 9000
Pertanyaan Mudah
Penggunaan DISTINCT

Senaraikan nombor pekerja yg menguruskan bangunan


SELECT no_pek SELECT DISTINCT
no_pek
FROM bangunan;
No_pek FROM bangunan;
No_pek
A04 A04
A06 A06
hasil: hasil:
A03 A03
A02 A02
A02
A03
Pertanyaan Mudah
Lajur berkira
Senaraikan gaji bulanan utk setiap pekerja di mana
output ialah no_pek, nama dan gaji_bulanan

SELECT no_pek, nama, no_pek nama col3

gaji/12 A01 John 2500


A02 Ani 1000
FROM pekerja;
A03 David 1500
A04 Mariam 750
Hasil: A05 Salmah 2000
A06 Janice 750

lajur ke3 dilabelkan sebagai col3 secara automatik


Pertanyaan Mudah
Utk menamakan lajur, gunakan arahan AS

SELECT no_pek, nama, gaji/12 AS gaji_bulanan


FROM pekerja;

no_pek nama gaji_bulanan


Hasil: A01 John 2500
A02 Ani 12000

A03 David 18000


A05 Salmah 24000
Pertanyaan Mudah
Klausa WHERE
- digunakan utk menyatakan syarat tertentu
- hanya baris yg memenuhi syarat shj akan dihasilkan
- operator yg digunakan:
* perbandingan/julat
>,<, <=, >=, = , BETWEEN
* ahli kpd set
IN/NOT IN
* padan mengikut pattern
LIKE/NOT LIKE
% terdapat turutan (0 atau lebih aksara)
_ satu aksara
* null
Pertanyaan Mudah
Kaedah pencarian perbandingan
Senaraikan semua pekerja yang bergaji lebih
dr. RM 10000
SELECT no_pek, nama, gaji
FROM pekerja
WHERE gaji > 10000;
No_pek Nama gaji
Hasil A01 John 30000
A02 Salmah 12000
A03 David 18000
A05 Salmah 24000
Pertanyaan Mudah

Kaedah Pencarian Perbandingan Kompaun


Senaraikan alamat semua bangunan di Semenyih
atau Ampang
SELECT no_aset, alamat, bandar
FROM bangunan
WHERE bandar=‘Semenyih’ OR bandar= ‘Ampang’;
No_aset Alamat Bandar
Hasil:
B01 16, Jalan K3/2, Taman Ampang
Kosas
B02 6, Jalan B3/4, Taman Semenyih
Raya
Pertanyaan Mudah
Kaedah Pencarian antara 2 nilai
Senaraikan semua pekerja bergaji antara
RM2000 dan RM 30000
SELECT no_pek, nama, gaji
FROM pekerja
WHERE gaji BETWEEN 20000 AND 30000
atau WHERE gaji >= 20000 AND gaji <=3000;
Hasil:
no_pek nama gaji
A01 John 30000

A05 Salmah 24000


Pertanyaan Mudah
Kaedah Pencarian Ahli Set (IN/NOT IN)
Senaraikan semua Pengurus dan Timbalan Pengurus
SELECT no_pek, nama, jawatan
FROM pekerja
WHERE jawatan IN (‘Pengurus’, ‘Timbalan Pengurus’);
atau
WHERE jawatan = ‘Pengurus’ OR jawatan =
‘TimbalanPengurus’;
Hasil: no_pek Nama jawatan
A01 John Pengurus
A03 David Timbalan Pengurus
A05 Salmah Pengurus
Pertanyaan Mudah
Kaedah Pencarian Nilai Sepadan (LIKE/NOT LIKE)

Senaraikan semua bangunan di Tmn Kosas

SELECT no_aset, alamat, bandar


FROM bangunan
WHERE alamat LIKE ‘%Tmn Kosas%’;
Hasil:

no_aset alamat bandar


B01 16 Jalan K3/2 Ampang
Tmn Kosas
Pertanyaan Mudah

Simbol2 SQL utk pencarian nilai sepadan:


% - terdapat turutan (0 atau lebih aksara)
_ satu aksara
LIKE ‘A%’ - huruf pertama perkataan bermula
dr A dan diikuti oleh mana-mana
aksara (Ali, Ahmad, Anna)
LIKE ‘A_ _ _’ - mesti ada 4 huruf pada string
tersebut dan bermula dgn A (Anna)
LIKE ‘%m’ - turutan mana-mana aksara, sekurang2nya
satu huruf dan huruf terakhir m.(Am,Zam)
Pertanyaan Mudah

Kaedah Pencarian NULL (IS NULL/IS NOT NULL)

Senaraikan maklumat pekerja yg tiada no. telefon

SELECT no_pek, nama, no_tel


FROM pekerja
WHERE no_tel IS NULL;
no_pek nama no_tel
Hasil:
A04 Mariam
Mengisih Hasil
Susunan satu lajur

Senaraikan gaji pekerja dlm susunan menurun


SELECT no_pek, nama, gaji
FROM pekerja
ORDER BY gaji DESC;
no_pek Nama jawatan

Hasil: A01 John 30000


A05 Salmah 24000
A03 David 18000
A02 Ani 12000
A04 Mariam 9000
A06 Janice 9000
Mengisih Hasil
Susunan beberapa lajur menggunakan 1 lajur

Senaraikan maklumat bangunan menggunakan jenis


bangunan
SELECT no_aset, jenis, bilik, sewa
FROM bangunan
no_aset jenis bilik sewa
ORDER BY jenis;
B02 Flat 4 400
Hasil: B03 Flat 3 350
B04 Flat 3 375
B06 Flat 4 450
B01 Rumah 6 650
B05 Rumah 5 600
Mengisih Hasil
Pertanyaan menggunakan susunan >1 lajur

SELECT no_aset, jenis, bilik, sewa


FROM bangunan
ORDER BY jenis, sewa ASC;
no_aset jenis Bilik Sewa
Hasil:
B06 Flat 4 450
B02 Flat 4 400
B04 Flat 3 375
B03 Flat 3 350
B01 Rumah 6 650
B05 Rumah 5 600
Agregat
- fungsi dalaman yg beroperasi ke atas kumpulan baris
- memulangkan satu baris nilai shj
- digunakan pada klausa SELECT dan HAVING shj
- jika lajur lain disenaraikan dlm klausa SELECT yg
mengandungi fungsi agregat, klausa GROUP BY
mesti digunakan
Fungsi Tujuan
• COUNT mendapatkan bilangan lajur
• SUM menjumlah nilai sesuatu lajur
• AVG kira purata nilai sesuatu lajur
• MIN/MAX mencari nilai minima/maksima
yg terdapat dlm sesuatu lajur
Agregat

MIN/MAX boleh digunakan pd medan integer/bkn


integer
SUM & AVG boleh digunakan pd medan integer
shj
Semua fungsi tidak mengambilkira nilai nol/ruang
kosong kecuali COUNT(*)
DISTINCT boleh mengelakkan pengiraan data
lewah. Oleh itu, SUM/AVG hasilkan nilai yg
berbeza dgn penggunaan DISTINCT (MIN/MAX:
tiada kesan)
Agregat

COUNT(*)

Berapa bilangan bangunan yg sewa


bulanannya > RM350?

SELECT COUNT(*) AS jumlah


FROM bangunan
WHERE sewa > 350
Jumlah
Hasil: 5
Agregat
COUNT(DISTINCT)

Senaraikan bilangan pekerja yg mula bekerja pada


bulan Julai 1996.

SELECT COUNT(DISTINCT no_pek) AS jumlah


FROM pekerja
WHERE t_kerja BETWEEN DATE ‘01/07/96’ AND
‘31/07/96’;

Hasil: Jumlah
2
Agregat
COUNT & SUM
Kira bilangan pengurus dan jumlahkan gaji
mereka

SELECT COUNT(no_pek) AS jumlah_pengurus,


SUM(gaji) AS jumlah_gaji
FROM pekerja
WHERE jawatan = ‘Pengurus’;
Jumlah_pengurus Jumlah_gaji
Hasil: 2 54000
Agregat
MIN, MAX & AVG

Cari nilai minimum, maksimum & purata gaji


pekerja.

SELECT MIN(gaji) AS min, MAX(gaji) AS max,


AVG(gaji) AS purata
FROM pekerja
Hasil: Min Max Purata
9000 30000 17000
Mengumpulkan Hasil
Gunakan klausa SELECT dan GROUP BY
GROUP BY: baris2 dikumpulkan mengikut nilai
yg berlainan bagi lajur yg dinyatakan
Cari jumlah bangunan yg diuruskan oleh setiap
pekerja dan jumlah sewa bangunan
SELECT no_pek, COUNT(no_aset) AS
jumlah_bangunan, SUM(sewa) AS jumlah_sewa
FROM bangunan No_pek Jumlah_ Jumlah_
bangunan sewa
GROUP BY no_pek A02 2 975
ORDER BY no_pek; A03 2 800
A04 1 650
A06 1 400
Mengumpulkan Hasil
Cari jumlah pekerja di setiap cawangan dan
jumlahkan sewa bangunan utk bangunan yg
diuruskan oleh lebih seorang pekerja

SELECT no_pek, COUNT(no_aset) AS


jum_bangunan,SUM (sewa) AS jum_sewa
FROM bangunan
GROUP by no_pek
HAVING COUNT (jumlah_bangunan)>1
ORDER BY no_pek;
Hasil: No_pek Jum_bangunan Jum_sewa
A02 2 975
A03 2 800
Sub-Pertanyaan
Dengan persamaan

Senaraikan semua pekerja yg menguruskan


bangunan di Ampang.

SELECT no_pek, nama, jawatan


FROM pekerja SELECT no_pek, nama,
WHERE no_pek = jawatan
(SELECT no_pek
FROM pekerja
FROM bangunan WHERE no_pek = ‘A04’;
WHERE bandar = ‘Ampang’);

Hasil: No_pek Nama jawatan


A04 Mariam Penolong
Menggunakan subpertanyaan
dengan fungsi agregat
Senaraikan semua pekerja yang gajinya > gaji purata

SELECT no_pek, nama, SELECT no_pek, nama, jawatan,


jawatan gaji gaji
FROM pekerja FROM pekerja
WHERE gaji > WHERE gaji > 17000;
(SELECT avg(gaji)
FROM pekerja);

Arahan WHERE gaji > avg(gaji) tidak digunakan. Gunakan sub-


pertanyaan utk cari purata gaji (RM17000), kemudian purata
digunakan untuk cari pekerja dgn gaji melebihi purata.
Peraturan Sub-pertanyaan
ORDER BY tidak boleh guna dlm sub-pertanyaan
(hanya boleh diguna dalam SELECT luaran shj)
sub-pertanyaan SELECT mesti ada 1 lajur/arahan
kecuali sub-pertanyaan yg guna EXISTS
Nama lajur merujuk kepada jadual dalam arahan FROM
dalam sub-pertanyaan. Ia blh merujuk kepada jadual
dalam arahan FROM dgn menggunakan alias
Sub-pertanyaan
sub-pertanyaan Bersarang (Gunakan IN)
Senaraikan aset yg diuruskan oleh pekerja yg tinggal di
Kajang

SELECT no_aset, alamat, bandar, jenis, bilik, sewa


FROM bangunan
WHERE no_pek IN
(SELECT no_pek
FROM pekerja
WHERE alamat = Kajang);
No_aset Alamat Bandar Jenis bilik sewa

B02 6 Jalan B3/4 Semenyih Flat 4 400


Taman Raya
ANY dan ALL
Penggunaan ANY/SOME
Cari pekerja yg gajinya melebihi gaji sekurang2 seorang
pekerja yg berjawatan penolong
SELECT no_pek, nama, jawatan, gaji FROM pekerja
WHERE gaji > SOME
(SELECT gaji
FROM pekerja
WHERE jawatan = ‘Penolong’);
No_pek Nama Jawatan Gaji
A01 John Pengurus 30000
A02 Ani Penolong 12000
A03 David Tim. Pengurus 18000
A05 Salmah Pengurus 24000
ANY dan ALL
Penggunaan ALL
Cari pekerja yg gajinya melebihi gaji setiap pekerja
yg berjawatan penolong
SELECT no_pek, nama, jawatan, gaji FROM pekerja
WHERE gaji > ALL
(SELECT gaji
FROM pekerja
WHERE jawatan = ‘Penolong’);

No_pek Nama jawatan Gaji


A01 John Pengurus 30000
A03 David Tim.Peng 18000
urus
A05 Salmah Pengurus 24000
Pertanyaan Jadual Berbilang
Gabungan Mudah
Senaraikan nama semua pekerja yg
uruskan bangunan
SELECT p.no_pek, nama
FROM pekerja p, bangunan b
WHERE p.no_pek = b.no_pek
No_pek Nama
A02 Ani
A03 David
A04 Mariam
A06 Janice
Pertanyaan Jadual Berbilang
Menyusun Gabungan
Senaraikan nama semua pekerja yg uruskan
bangunan
SELECT p.no_pek, nama, no_aset
FROM pekerja p, bangunan b
WHERE p.no_pek = b.no_pek
ORDER BY p.no_pek, b.no_aset;
No_pek Nama No_aset
A02 Ani B04
A03 David B05
A04 Mariam B01
A06 Janice B02
EXISTS dan NOT EXISTS
Digunakan dlm sub-pertanyaanu utk hasilkan
keputusan BENAR/PALSU. EXIST:
BENAR: wujud => 1 baris dr. jadual hasil sub-
pertanyaan
PALSU: jadual kosong
NOT EXISTS - berlawanan dgn EXISTS
Senaraikan semua pekerja yg uruskan flat.
SELECT no_pek, nama, jenis FROM pekerja p
WHERE EXISTS
(SELECT * FROM banguan b
WHERE p.no_pek=b.no_pek AND jenis=‘Flat’);
@
SELECT p.no_pek, nama, no_aset, jenis
FROM pekerja p, bangunan b
WHERE p.no_pek = b.no_pek AND jenis = ‘Flat’;

No_pek Nama No_aset Jenis


A02 Ani B04 Flat
A03 David B03 Flat
A03 David B06 Flat
A06 Janice B02 Flat

You might also like