SQL and R
SQL
Sebelum Anda memulai materi ini, Anda harus terlebih dahulu membuat company.db
dari El Masri (Buku Pegangan Anda), Silahkan akses Syntax SQL pada halaman Github berikut ini : El Masri Company Database
Perintah dalam SQL
Commands | Keterangan |
---|---|
SELECT |
Memilih Data dari Database |
FROM |
Memilih table darimana data diambil |
WHERE |
Menyaring query dengan mencocokkan suatu kondisi |
AS |
Mengubah nama kolom atau tabel dengan suatu alias |
JOIN |
Menggabungkan baris dari 2 atau lebih tabel |
AND |
Kombinasi Kondisi Query. Semua Kondisi harus terpenuhi |
OR |
Kombinasi Kondisi Query. Salah satu Kondisi harus terpenuhi |
LIMIT |
Membatasi jumlah baris yang ditampilkan |
IN |
Spesifikasi beberapa nilai ketika menggunakan WHERE |
IS NULL |
Mengembalikan baris dengan nilai NULL |
LIKE |
Mencari pola tertentu di suatu kolom |
GROUP BY |
Mengelompokkan Data |
ORDER BY |
Mengurutkan Data, default ASC. Gunakan DESC untuk sebaliknya |
HAVING |
Sama dengan WHERE tapi untuk Groups |
COUNT |
Menghitung jumlah baris |
SUM |
Menghitung jumlah dari kolom |
AVG |
Menghitung rata-rata dari kolom |
MIN |
Menghitung nilai minimal dari kolom |
MAX |
Menghitung nilai maksimum dari kolom |
Order Of Execution
FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
LIMIT
Contoh
Berikut ini adalah beberapa contoh, penggunaan Query SQL dengan menggunakan Entity EMPLOYEE
dari Database company.db
SELECT
*
FROM
EMPLOYEE;
Fname | Minit | Lname | Ssn | Bdate | Address | Sex | Salary | Super_ssn | Dno |
---|---|---|---|---|---|---|---|---|---|
John | B | Smith | 123456789 | 1965-01-09 | 731 Fondren, Houston TX | M | 30000 | 333445555 | 5 |
Franklin | T | Wong | 333445555 | 1965-12-08 | 638 Voss, Houston TX | M | 40000 | 888665555 | 5 |
Alicia | J | Zelaya | 999887777 | 1968-01-19 | 3321 Castle, Spring TX | F | 25000 | 987654321 | 4 |
Jennifer | S | Wallace | 987654321 | 1941-06-20 | 291 Berry, Bellaire TX | F | 43000 | 888665555 | 4 |
Ramesh | K | Narayan | 666884444 | 1962-09-15 | 975 Fire Oak, Humble TX | M | 38000 | 333445555 | 5 |
Joyce | A | English | 453453453 | 1972-07-31 | 5631 Rice, Houston TX | FEMALE | 25000 | 333445555 | 5 |
Ahmad | V | Jabbar | 987987987 | 1969-03-29 | 980 Dallas, Houston TX | MALE | 25000 | 987654321 | 4 |
James | E | Borg | 888665555 | 1937-11-10 | 450 Stone, Houston TX | ANYTHING | 55000 | NA | 1 |
1. Memilih Semua Kolom dengan Filter Tertentu
SELECT
*
FROM
EMPLOYEEWHERE
< 30000; SALARY
Fname | Minit | Lname | Ssn | Bdate | Address | Sex | Salary | Super_ssn | Dno |
---|---|---|---|---|---|---|---|---|---|
Alicia | J | Zelaya | 999887777 | 1968-01-19 | 3321 Castle, Spring TX | F | 25000 | 987654321 | 4 |
Joyce | A | English | 453453453 | 1972-07-31 | 5631 Rice, Houston TX | FEMALE | 25000 | 333445555 | 5 |
Ahmad | V | Jabbar | 987987987 | 1969-03-29 | 980 Dallas, Houston TX | MALE | 25000 | 987654321 | 4 |
2. Memilih 5 Baris Pertama dari 2 Kolom
SELECT
Fname, LnameFROM
EMPLOYEELIMIT
5;
Fname | Lname |
---|---|
John | Smith |
Franklin | Wong |
Alicia | Zelaya |
Jennifer | Wallace |
Ramesh | Narayan |
3. Memilih Semua Kolom dengan beberapa Filter
SELECT
*
FROM
EMPLOYEEWHERE
> 30000
SALARY AND
= 'M'; SEX
Fname | Minit | Lname | Ssn | Bdate | Address | Sex | Salary | Super_ssn | Dno |
---|---|---|---|---|---|---|---|---|---|
Franklin | T | Wong | 333445555 | 1965-12-08 | 638 Voss, Houston TX | M | 40000 | 888665555 | 5 |
Ramesh | K | Narayan | 666884444 | 1962-09-15 | 975 Fire Oak, Humble TX | M | 38000 | 333445555 | 5 |
4. Seperti Poin 3, gaji diurutkan dari yang terbesar
SELECT
FNAME, LNAME, SALARYFROM
EMPLOYEEWHERE
> 30000
SALARY AND
= 'M'
SEX ORDER BY
DESC; SALARY
Fname | Lname | Salary |
---|---|---|
Franklin | Wong | 40000 |
Ramesh | Narayan | 38000 |
Anda, juga bisa menuliskan Syntax di atas, sebagai berikut
SELECT
FNAME, LNAME, SALARYFROM
EMPLOYEEWHERE
> 30000
SALARY AND
= 'M'
SEX ORDER BY
3 DESC;
Fname | Lname | Salary |
---|---|---|
Franklin | Wong | 40000 |
Ramesh | Narayan | 38000 |
5. Menghitung Jumlah Baris
SELECT
COUNT(*)
FROM
EMPLOYEE;
COUNT(*) |
---|
8 |
6. Menghitung Total Gaji
SELECT
SUM(SALARY)
FROM
EMPLOYEE;
SUM(SALARY) |
---|
281000 |
7. Menampilkan Nama dan Gaji, dari Employee dengan Gaji Terbesar
SELECT
MAX(SALARY)
FNAME, LNAME, FROM
EMPLOYEE;
Fname | Lname | MAX(SALARY) |
---|---|---|
James | Borg | 55000 |
8. Menghitung Gaji rata-rata dari masing-masing Jenis Kelamin
SELECT
AVG(SALARY)
SEX, FROM
EMPLOYEEGROUP BY
SEX;
Sex | AVG(SALARY) |
---|---|
ANYTHING | 55000 |
F | 34000 |
FEMALE | 25000 |
M | 36000 |
MALE | 25000 |
Advanced SQL Query
Untuk Materi ini, akan dibuat suatu Database bernama Hospital.db dengan Informasi Berikut ini.
Hospital
Entity Relationship Diagram
Diketahui suatu Rumah Sakit memiliki ER Diagram (Conceptual Model) sebagai berikut :
Hospital Entity Relationship Diagram
Schema Diagram
ER Diagram di atas, diterjemahkan menjadi Schema Diagram sebagai berikut :
Hospital Schema Diagram
Relational Database Schema
Kemudian, diterjemahkan lebih lanjut menjadi Relational Database Schema yang berisi List Entities dan Atributes berikut ini.
Referential integrity constraints pada Hospital relational database schema
Hospital Database
CREATE TABLES
DOCTOR
CREATE TABLE DOCTOR
VARCHAR (20) NOT NULL,
( DOCTOR_ID NOT NULL,
NAME TEXT NUMERIC NOT NULL,
AGE VARCHAR (20) NOT NULL,
QUALIFICATION NUMERIC NOT NULL,
SALARY PRIMARY KEY (DOCTOR_ID));
PATIENTS
CREATE TABLE PATIENTS
VARCHAR (20) NOT NULL,
( PATIENT_ID NOT NULL,
NAME TEXT NOT NULL,
ADDRESS TEXT NUMERIC,
AGE NOT NULL,
APPEARANCE TEXT CHAR (15) NOT NULL,
MARITAL_STATUS INT NOT NULL,
HEIGHT INT NOT NULL,
WEIGHT INT NOT NULL,
BLOOD_PRESSURE PRIMARY KEY (PATIENT_ID));
ROOM
CREATE TABLE ROOM
VARCHAR (10) NOT NULL,
( ROOM_ID NUMERIC NOT NULL,
RENT CLASS CHAR (20) NOT NULL,
CHAR (20) NOT NULL,
AVAILABILITY PRIMARY KEY (ROOM_ID));
TREATS
CREATE TABLE TREATS
VARCHAR (20) NOT NULL,
( ID_DOCTOR VARCHAR (20) NOT NULL,
PATIENT_ID PRIMARY KEY (ID_DOCTOR, PATIENT_ID),
FOREIGN KEY (PATIENT_ID) REFERENCES PATIENTS (PATIENT_ID),
FOREIGN KEY (ID_DOCTOR) REFERENCES DOCTOR (DOCTOR_ID));
ROOM FOR PATIENT
CREATE TABLE ROOM_FOR_PATIENT
VARCHAR (20) NOT NULL,
( ID_PATIENT VARCHAR (10) NOT NULL,
ROOM_ID PRIMARY KEY (ID_PATIENT),
FOREIGN KEY (ID_PATIENT) REFERENCES PATIENTS (PATIENT_ID),
FOREIGN KEY (ROOM_ID) REFERENCES ROOM (ROOM_ID));
Insert Tuple
DOCTOR
INSERT INTO DOCTOR
VALUES ('DKV1509876','dr. Indah Risma Sp.BTKV ',45,'Kardiovaskular',6500000),
'DOT76896766','dr. Chairuddin Lubis Sp.OT',39,'Ortopedi',5650000),
('DOG5655123','dr. Amelia Rinta Sp.OG',38,'Kandungan',5500000),
('DKV1544569','dr. Wahyu Kusuma Sp.BTKV',49,'Kardiovaskular',7000000),
('DA76884560','dr. Muti Mulia Sp.A',36,'Anak',5300000),
('DU455434456','dr. Dyah Agustina',42,'Umum',5000000),
('DU453323565','dr. Mifthah Farhan',36,'Umum',4800000),
('DS34335980','dr. Ferdy Saragih Sp.S',50,'Saraf',7400000),
('DP00981287','dr. Joko Ahmad Sp.P',54,'Paru-paru',7400000); (
PATIENTS
INSERT INTO PATIENTS
VALUES ('ID0989096','Merlin Anindita','Jl. Majapahit No. 9',NULL,'Ideal','SINGLE',156,53,112),
'ID7689009','Ilham Mubarok','Jl. Soekarno Hatta No. 21',32,'Gemuk','MARRIED',168,70,120),
('ID9870034','Kislam','Jl. Merpati No.9',50,'Langsing','MARRIED',165,63,110),
('ID0966789','Nur Hakim','Jl. Kaliurang km 5',20,'Gemuk','SINGLE',153,65,130),
('ID1324564','Habibur Rifqi','Jl. Bunda no. 13',6,'Putih','SINGLE',135,35,90),
('ID1267864','Yulisman','Ujung Pandang',52,'Gemuk','MARRIED',163,70,135),
('ID1254789','Ibrahim Mika','Jl. Ginting no. 6',4,'Ideal','SINGLE',126,25,95),
('ID8764456','Agus Rahman','Jl. Merpati No.28',34,'Ideal','MARRIED',157,60,114),
('ID0987679','Putri Mayani','Jl. Anggur no. 7',28,'Ideal','MARRIED',156,55,115),
('ID0456989','Nur Kartika','Padang Raya No. 6',18,'Gemuk','SINGLE',150,60,110),
('ID0656554','Auliya Fikri','Jl. Lintas Angkasa No. 2',23,'Tinggi','SINGLE',170,75,123); (
ROOM
INSERT INTO ROOM
VALUES ('R101','RENT','GENERAL','AVAILABLE'),
'R102','RENT','GENERAL','AVAILABLE'),
('R103','RENT','GENERAL','AVAILABLE'),
('R104','RENT','GENERAL','AVAILABLE'),
('R201','RENT','SEMI SPECIAL','AVAILABLE'),
('R202','RENT','SEMI SPECIAL','AVAILABLE'),
('R203','RENT','SEMI SPECIAL','AVAILABLE'),
('R204','RENT','SEMI SPECIAL','AVAILABLE'),
('R301','RENT','SPECIAL','AVAILABLE'),
('R302','RENT','SPECIAL','AVAILABLE'),
('R303','RENT','SPECIAL','AVAILABLE'),
('R304','RENT','SPECIAL','AVAILABLE'); (
TREATS
INSERT INTO TREATS
VALUES ('DOT76896766','ID0989096'),
'DKV1509876','ID7689009'),
('DKV1544569','ID9870034'),
('DOT76896766','ID0966789'),
('DA76884560','ID1324564'),
('DS34335980','ID1267864'),
('DA76884560','ID1254789'),
('DKV1544569','ID8764456'),
('DOG5655123','ID0987679'),
('DU453323565','ID0456989'),
('DU455434456','ID0656554');( ID_DOCTOR VARCHAR (20) NOT NULL,
(VARCHAR (20) NOT NULL,
PATIENT_ID PRIMARY KEY (ID_DOCTOR, PATIENT_ID),
FOREIGN KEY (PATIENT_ID) REFERENCES PATIENTS (PATIENT_ID),
FOREIGN KEY (ID_DOCTOR) REFERENCES DOCTOR (DOCTOR_ID));
ROOM FOR PATIENT
INSERT INTO ROOM_FOR_PATIENT
VALUES ('ID0989096','R102'),
'ID7689009','R201'),
('ID0966789','R203'),
('ID1254789','R104'),
('ID8764456','R301'),
('ID0987679','R304'),
('ID1267864','R302'); (
Database
Tabel DOCTOR
SELECT * FROM DOCTOR;
DOCTOR_ID | NAME | AGE | QUALIFICATION | SALARY |
---|---|---|---|---|
DKV1509876 | dr. Indah Risma Sp.BTKV | 45 | Kardiovaskular | 6500000 |
DOT76896766 | dr. Chairuddin Lubis Sp.OT | 39 | Ortopedi | 5650000 |
DOG5655123 | dr. Amelia Rinta Sp.OG | 38 | Kandungan | 5500000 |
DKV1544569 | dr. Wahyu Kusuma Sp.BTKV | 49 | Kardiovaskular | 7000000 |
DA76884560 | dr. Muti Mulia Sp.A | 36 | Anak | 5300000 |
DU455434456 | dr. Dyah Agustina | 42 | Umum | 5000000 |
DU453323565 | dr. Mifthah Farhan | 36 | Umum | 4800000 |
DS34335980 | dr. Ferdy Saragih Sp.S | 50 | Saraf | 7400000 |
DP00981287 | dr. Joko Ahmad Sp.P | 54 | Paru-paru | 7400000 |
Tabel PATIENTS
SELECT * FROM PATIENTS;
PATIENT_ID | NAME | ADDRESS | AGE | APPEARANCE | MARITAL_STATUS | HEIGHT | WEIGHT | BLOOD_PRESSURE |
---|---|---|---|---|---|---|---|---|
ID0989096 | Merlin Anindita | Jl. Majapahit No. 9 | NA | Ideal | SINGLE | 156 | 53 | 112 |
ID7689009 | Ilham Mubarok | Jl. Soekarno Hatta No. 21 | 32 | Gemuk | MARRIED | 168 | 70 | 120 |
ID9870034 | Kislam | Jl. Merpati No.9 | 50 | Langsing | MARRIED | 165 | 63 | 110 |
ID0966789 | Nur Hakim | Jl. Kaliurang km 5 | 20 | Gemuk | SINGLE | 153 | 65 | 130 |
ID1324564 | Habibur Rifqi | Jl. Bunda no. 13 | 6 | Putih | SINGLE | 135 | 35 | 90 |
ID1267864 | Yulisman | Ujung Pandang | 52 | Gemuk | MARRIED | 163 | 70 | 135 |
ID1254789 | Ibrahim Mika | Jl. Ginting no. 6 | 4 | Ideal | SINGLE | 126 | 25 | 95 |
ID8764456 | Agus Rahman | Jl. Merpati No.28 | 34 | Ideal | MARRIED | 157 | 60 | 114 |
ID0987679 | Putri Mayani | Jl. Anggur no. 7 | 28 | Ideal | MARRIED | 156 | 55 | 115 |
ID0456989 | Nur Kartika | Padang Raya No. 6 | 18 | Gemuk | SINGLE | 150 | 60 | 110 |
Tabel ROOM
SELECT * FROM ROOM;
ROOM_ID | RENT | CLASS | AVAILABILITY |
---|---|---|---|
R101 | RENT | GENERAL | AVAILABLE |
R102 | RENT | GENERAL | AVAILABLE |
R103 | RENT | GENERAL | AVAILABLE |
R104 | RENT | GENERAL | AVAILABLE |
R201 | RENT | SEMI SPECIAL | AVAILABLE |
R202 | RENT | SEMI SPECIAL | AVAILABLE |
R203 | RENT | SEMI SPECIAL | AVAILABLE |
R204 | RENT | SEMI SPECIAL | AVAILABLE |
R301 | RENT | SPECIAL | AVAILABLE |
R302 | RENT | SPECIAL | AVAILABLE |
Tabel TREATS
SELECT * FROM TREATS;
ID_DOCTOR | PATIENT_ID |
---|---|
DOT76896766 | ID0989096 |
DKV1509876 | ID7689009 |
DKV1544569 | ID9870034 |
DOT76896766 | ID0966789 |
DA76884560 | ID1324564 |
DS34335980 | ID1267864 |
DA76884560 | ID1254789 |
DKV1544569 | ID8764456 |
DOG5655123 | ID0987679 |
DU453323565 | ID0456989 |
Tabel ROOM_FOR_PATIENT
SELECT * FROM ROOM_FOR_PATIENT;
ID_PATIENT | ROOM_ID |
---|---|
ID0989096 | R102 |
ID7689009 | R201 |
ID0966789 | R203 |
ID1254789 | R104 |
ID8764456 | R301 |
ID0987679 | R304 |
ID1267864 | R302 |
Advanced SQL Query
Operations on NULL values
Menampilkan NAME, ADDRESS dan AGE dari Tabel PATIENTS dimana AGE adalah NULL
SELECT NAME, ADDRESS, AGE
FROM PATIENTS
WHERE AGE IS NULL;
NAME | ADDRESS | AGE |
---|---|---|
Merlin Anindita | Jl. Majapahit No. 9 | NA |
Nested Queries
Menampilkan Ruangan yang ditempati oleh pasien yang berobat di bagian saraf
SELECT ROOM_ID
FROM ROOM_FOR_PATIENT
WHERE ID_PATIENT IN (SELECT PATIENT_ID
FROM TREATS
WHERE ID_DOCTOR IN (SELECT DOCTOR_ID
FROM DOCTOR
WHERE QUALIFICATION='Saraf'));
ROOM_ID |
---|
R302 |
Menampilkan Nama Dokter, Kualifikasi dan Gajinya dengan umur > 40 tahun yang memiliki gaji > 6500000
SELECT NAME, QUALIFICATION, SALARY
FROM DOCTOR
WHERE SALARY IN (SELECT SALARY
FROM DOCTOR
WHERE AGE>40
AND SALARY > 6500000);
NAME | QUALIFICATION | SALARY |
---|---|---|
dr. Wahyu Kusuma Sp.BTKV | Kardiovaskular | 7000000 |
dr. Ferdy Saragih Sp.S | Saraf | 7400000 |
dr. Joko Ahmad Sp.P | Paru-paru | 7400000 |
EXISTS and NOT EXISTS Functions
ID Pasien dan Nama Pasien yang rawat inap di ruangan kelas SPECIAL
SELECT P.PATIENT_ID, P.NAME
FROM PATIENTS AS P
WHERE EXISTS (SELECT * FROM ROOM_FOR_PATIENT AS RP
WHERE P.PATIENT_ID=RP.ID_PATIENT AND EXISTS (SELECT * FROM ROOM AS R
WHERE RP.ROOM_ID=R.ROOM_ID AND R.CLASS='SPECIAL'));
PATIENT_ID | NAME |
---|---|
ID1267864 | Yulisman |
ID8764456 | Agus Rahman |
ID0987679 | Putri Mayani |
Ruangan yang kosong (tidak ditempati pasien) (ID ROOM dan Kelas)
SELECT R.ROOM_ID,R.CLASS
FROM ROOM AS R
WHERE NOT EXISTS (SELECT * FROM ROOM_FOR_PATIENT AS RP
WHERE RP.ROOM_ID=R.ROOM_ID);
ROOM_ID | CLASS |
---|---|
R101 | GENERAL |
R103 | GENERAL |
R202 | SEMI SPECIAL |
R204 | SEMI SPECIAL |
R303 | SPECIAL |
EXPLICIT SETS
SELECT DISTINCT PATIENT_ID, APPEARANCE
FROM PATIENTS
WHERE APPEARANCE IN ('Gemuk','Langsing');
PATIENT_ID | APPEARANCE |
---|---|
ID7689009 | Gemuk |
ID9870034 | Langsing |
ID0966789 | Gemuk |
ID1267864 | Gemuk |
ID0456989 | Gemuk |
RENAMING Attribute
SELECT D.NAME AS NAMA, QUALIFICATION AS KUALIFIKASI
FROM DOCTOR AS D
WHERE AGE = 45;
NAMA | KUALIFIKASI |
---|---|
dr. Indah Risma Sp.BTKV | Kardiovaskular |
Joined Relations
SELECT * FROM DOCTOR AS D CROSS JOIN PATIENTS AS P
WHERE D.AGE = P.AGE
DOCTOR_ID | NAME | AGE | QUALIFICATION | SALARY | PATIENT_ID | NAME | ADDRESS | AGE | APPEARANCE | MARITAL_STATUS | HEIGHT | WEIGHT | BLOOD_PRESSURE |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
DS34335980 | dr. Ferdy Saragih Sp.S | 50 | Saraf | 7400000 | ID9870034 | Kislam | Jl. Merpati No.9 | 50 | Langsing | MARRIED | 165 | 63 | 110 |
Mencari Pasien dan Dokter yang usianya sama.
SELECT * FROM DOCTOR AS D JOIN PATIENTS AS P ON
= P.AGE D.AGE
DOCTOR_ID | NAME | AGE | QUALIFICATION | SALARY | PATIENT_ID | NAME | ADDRESS | AGE | APPEARANCE | MARITAL_STATUS | HEIGHT | WEIGHT | BLOOD_PRESSURE |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
DS34335980 | dr. Ferdy Saragih Sp.S | 50 | Saraf | 7400000 | ID9870034 | Kislam | Jl. Merpati No.9 | 50 | Langsing | MARRIED | 165 | 63 | 110 |
JOIN Menampilkan Nama dan Usia pasien yang dirawat di kamar SPECIAL dan USIA > 17.
SELECT p.name, p.age, r.class
FROM patients as p, Room_For_Patient as rp, room as r
WHERE p.patient_id=rp.id_patient AND rp.room_id=r.room_id AND r.class = 'SPECIAL' AND p.age>17;
NAME | AGE | CLASS |
---|---|---|
Yulisman | 52 | SPECIAL |
Agus Rahman | 34 | SPECIAL |
Putri Mayani | 28 | SPECIAL |
MULTIWAY JOIN
SELECT p.name, p.age
FROM ((patients as p JOIN Room_For_Patient as rp ON p.patient_id=rp.id_patient) JOIN room as r ON rp.room_id=r.room_id)
WHERE r.class = 'SPECIAL' AND p.age>17;
NAME | AGE |
---|---|
Yulisman | 52 |
Agus Rahman | 34 |
Putri Mayani | 28 |
NATURAL JOIN Menampilkan nama dan usia dari pasien anak-anak dibawah 18 tahun dan kode dokter yang merawatnya
SELECT name, age, ID_doctor FROM patients AS p NATURAL JOIN treats WHERE age<18;
NAME | AGE | ID_DOCTOR |
---|---|---|
Habibur Rifqi | 6 | DA76884560 |
Ibrahim Mika | 4 | DA76884560 |
Aggregate Function
Menampilkan jumlah dokter, total gaji, gaji tertinggi, gaji terendah, dan rata-rata gaji dari dokter
SELECT COUNT(*), SUM (Salary) AS Total_Sal, MAX (Salary) AS Highest_Sal, MIN (Salary) AS Lowest_Sal, AVG (Salary) AS Average_Sal
FROM doctor;
COUNT(*) | Total_Sal | Highest_Sal | Lowest_Sal | Average_Sal |
---|---|---|---|---|
9 | 54550000 | 7400000 | 4800000 | 6061111 |
Menampilkan gaji tertinggi, gaji terendah, dan rata-rata gaji dari dokter yang jumlah berdasarkan kualifikasinya > 1
SELECT qualification, MAX (Salary) AS Highest_Sal, MIN (Salary) AS Lowest_Sal, AVG (Salary) AS Average_Sal FROM doctor as d
GROUP BY d.qualification
HAVING COUNT(*)>1;
QUALIFICATION | Highest_Sal | Lowest_Sal | Average_Sal |
---|---|---|---|
Kardiovaskular | 7e+06 | 6500000 | 6750000 |
Umum | 5e+06 | 4800000 | 4900000 |
Mencari Dokter yang memiliki 2 atau lebih Pasien.
SELECT name
FROM doctor
WHERE (SELECT COUNT(*)
FROM treats
WHERE id_doctor=doctor_id) >=2;
NAME |
---|
dr. Chairuddin Lubis Sp.OT |
dr. Wahyu Kusuma Sp.BTKV |
dr. Muti Mulia Sp.A |
Grouping
Menghitung Jumlah dan Rata-rata Gaji setiap Kualifikasi Dokter dan mengurutkannya dari rata-rata salary tertinggi ke terendah
SELECT qualification, COUNT(*), AVG(salary)
FROM doctor
GROUP BY qualification
ORDER BY AVG(salary) DESC;
QUALIFICATION | COUNT(*) | AVG(salary) |
---|---|---|
Saraf | 1 | 7400000 |
Paru-paru | 1 | 7400000 |
Kardiovaskular | 2 | 6750000 |
Ortopedi | 1 | 5650000 |
Kandungan | 1 | 5500000 |
Anak | 1 | 5300000 |
Umum | 2 | 4900000 |
Menghitung jumlah pasien dari tiap kualifikasi dokter
SELECT d.qualification, COUNT(*)
FROM doctor as d, treats as t
WHERE d.doctor_id = t.id_doctor
GROUP BY d.qualification;
QUALIFICATION | COUNT(*) |
---|---|
Anak | 2 |
Kandungan | 1 |
Kardiovaskular | 3 |
Ortopedi | 2 |
Saraf | 1 |
Umum | 2 |
HAVING clause
Mencari kualifikasi dokter yang memiliki > 1 patient dan diurutkan berdasarkan jumlah pasien dari yang paling banyak ke paling sedikit
SELECT d.qualification, COUNT(*)
FROM doctor as d, treats as t
WHERE d.doctor_id = t.id_doctor
GROUP BY d.qualification
HAVING COUNT(*)>1
ORDER BY COUNT(*) DESC;
QUALIFICATION | COUNT(*) |
---|---|
Kardiovaskular | 3 |
Umum | 2 |
Ortopedi | 2 |
Anak | 2 |
Mencari jumlah pasien berdasarkan kualifikasi dokter yang mana pasien memiliki tekanan darah > 100 dan mengurutkannya dari paling banyak ke paling sedikit.
SELECT d.qualification, count(*)
FROM doctor as d, patients as p, treats as t
WHERE d.doctor_id = t.id_doctor AND p.patient_id = t.patient_id AND p.blood_pressure > 100
GROUP BY d.qualification
ORDER BY count(*) DESC;
QUALIFICATION | count(*) |
---|---|
Kardiovaskular | 3 |
Umum | 2 |
Ortopedi | 2 |
Saraf | 1 |
Kandungan | 1 |
Query Database dengan R
Terdapat banyak cara yang bisa digunakan untuk melakukan akses atas suatu database dengan R, berikut ini adalah 3 cara yang umum digunakan.
library(dplyr)
library(dbplyr)
Secara umum, sebuah Koneksi ke database membutuhkan 2 hal, yaitu :
1. Database Driver
2. Data Source Name
<- DBI::dbConnect(RSQLite::SQLite(), "C:/sqlite/company.db") con
Pada contoh di atas,
1. Database Drivernya adalah RSQLite::SQLite()
.
2. Data Source Name adalah C:/sqlite/company.db
Using DBI
<- DBI::dbGetQuery(con,'
df SELECT "fname", "lname"
FROM "Employee"
'
)
df
## Fname Lname
## 1 John Smith
## 2 Franklin Wong
## 3 Alicia Zelaya
## 4 Jennifer Wallace
## 5 Ramesh Narayan
## 6 Joyce English
## 7 Ahmad Jabbar
## 8 James Borg
class(df)
## [1] "data.frame"
Ada juga yang menulis sintax di atas sebagai berikut
<- DBI::dbGetQuery(con, statement = paste("SELECT fname, lname FROM employee")) df
Using dplyr syntax
<- tbl(con, "employee") %>%
df select(Fname, Lname)
Salah satu hal yang perlu diingat adalah, karena menggunakan dplyr
, maka berlaku aturan umum R, yaitu CASE SENSITIVE
. Jika menggunakan DBI
, Anda tidak perlu memperhatikan hal tersebut.
df
## # Source: lazy query [?? x 2]
## # Database: sqlite 3.36.0 [C:\sqlite\company.db]
## Fname Lname
## <chr> <chr>
## 1 John Smith
## 2 Franklin Wong
## 3 Alicia Zelaya
## 4 Jennifer Wallace
## 5 Ramesh Narayan
## 6 Joyce English
## 7 Ahmad Jabbar
## 8 James Borg
class(df)
## [1] "tbl_SQLiteConnection" "tbl_dbi" "tbl_sql"
## [4] "tbl_lazy" "tbl"
Dengan Perintah show_query
, Anda bisa menerjemahkan sintax dplyr di atas, menjadi SQL.
show_query(df)
## <SQL>
## SELECT `Fname`, `Lname`
## FROM `employee`
Using R Notebooks/Rmarkdown
Ini adalah cara yang digunakan dalam menuliskan SQL Query di atas, dimana dalam penulisan R Code Chunk ditambahkan beberapa opsi.
Pertama, buat objek koneksi, di sini dinamakan con
<- DBI::dbConnect(RSQLite::SQLite(), "C:/sqlite/company.db") con
Berikut ini adalah contoh
```{r, connection=con, engine="sql", output.var = "mydataframe"}
SELECT
*
FROM
EMPLOYEE;
```
Kode di atas, akan muncul sebagai berikut :
SELECT
*
FROM
EMPLOYEE;
Selain itu, akan didapat suatu dataframe dengan nama mydataframe
.
mydataframe
## Fname Minit Lname Ssn Bdate Address Sex
## 1 John B Smith 123456789 1965-01-09 731 Fondren, Houston TX M
## 2 Franklin T Wong 333445555 1965-12-08 638 Voss, Houston TX M
## 3 Alicia J Zelaya 999887777 1968-01-19 3321 Castle, Spring TX F
## 4 Jennifer S Wallace 987654321 1941-06-20 291 Berry, Bellaire TX F
## 5 Ramesh K Narayan 666884444 1962-09-15 975 Fire Oak, Humble TX M
## 6 Joyce A English 453453453 1972-07-31 5631 Rice, Houston TX FEMALE
## 7 Ahmad V Jabbar 987987987 1969-03-29 980 Dallas, Houston TX MALE
## 8 James E Borg 888665555 1937-11-10 450 Stone, Houston TX ANYTHING
## Salary Super_ssn Dno
## 1 30000 333445555 5
## 2 40000 888665555 5
## 3 25000 987654321 4
## 4 43000 888665555 4
## 5 38000 333445555 5
## 6 25000 333445555 5
## 7 25000 987654321 4
## 8 55000 <NA> 1
class(mydataframe)
## [1] "data.frame"
::dbDisconnect(con) DBI
Tugas UTS : Twitter BOT
Membuat sebuah Twitter Bot yang berjalan otomatis, yang dipublish dengan rvest
dan dijalankan dengan Github Action
.
Bahan : (Tidak mutlak, Jika Anda punya Opsi lebih baik, dipersilahkan)
1. Akun Twitter Developer dengan Elevated Access (sebaiknya Anda buat akun baru).
2. Akun ElephantSQL (Untuk Project ini, Anda cukup membuat 1).
3. Akun Github (sebaiknya Anda punya masing-masing).
Proses yang diharapkan :
1. Anda bisa menyimpan suatu data ke database SQL Online (ElephantSQL).
2. Anda bisa mengakses data dari database SQL Online tersebut, untuk kemudian dipublikasikan.
3. Semua proses di atas dilakukan secara Otomatis.
Penilaian
1. Kerjasama Tim, yang dapat dilihat dari history di Repository.
2. Bot Twitter berfungsi dengan baik.
Twitter Developer Account with Elevated Access
Langkah-Langkah mendapat Akun tersebut :
Membuat Akun Twitter.
Mendaftar sebagai Developer Account dengan membuka link berikut ini : link
Ketika Anda mendaftar, Anda mendapatkan Essential Access.
- Mengajukan Akses Tambahan ke Elevated.
Akun Elephant SQL
Anda bisa menggunakan versi FREE dari ElephantSQL.
Catatan : Max Connection dalam satu waktu, hanya 5.
Akun Github
Anda bisa melakukan Fork pada Github berikut ini : https://github.com/Nr5D/ManajemenData
Contoh Bot yang sudah berjalan : https://twitter.com/ManajemenData