Advanced SQL Query
Pendahuluan
Database yang digunakan dalam materi advanced query adalah Northwind
. Hal pertama yang dilakukan adalah membuat koneksi ke database tersebut dengan menggunakan dbConnect
pada package DBI
, kemudian membaca database tersebut menggunakan RSQLite::SQLite()
.
<- DBI::dbConnect(RSQLite::SQLite(), "C:/sqlite/db/Northwind_large.sqlite") nw
Untuk melihat tabel-tabel di dalam database Northwind dapat menggunakan RSQLite::dbListTables
. Terlihat bahwa di dalam database Northwind terdiri dari 14 tabel mulai dari tabel Category
sampai dengan tabel Territory
.
::dbListTables(nw) RSQLite
[1] "Category" "Customer" "CustomerCustomerDemo"
[4] "CustomerDemographic" "Employee" "EmployeeTerritory"
[7] "Order" "OrderDetail" "Product"
[10] "ProductDetails_V" "Region" "Shipper"
[13] "Supplier" "Territory"
Berikut adalah ERD dari database Northwind yang digunakan
ERD Database Northwind
Advanced SQL Query
Selanjutnya, menggunakan database Northwind tersebut, akan dilakukan beberapa teknik advanced SQL Query untuk mendapatkan output yang sesuai.
Operations on NULL Values
Menampilkan nama perusahaan (CompanyName
) dan kota (City
) yang tidak memiliki nomer fax (Fax
nya adalah NULL).
SELECT Id, CompanyName, City, Fax
FROM Customer
WHERE Fax IS NULL;
Nested Queries
Menampilkan nama perusahaan (CompanyName
) yang menjadi supplier dari produk Chef Anton’s Gumbo Mix.
SELECT CompanyName
FROM Supplier
WHERE Id IN (SELECT SupplierId
FROM Product
WHERE ProductName ="Chef Anton's Gumbo Mix");
EXISTS Functions
Menampilkan nama perusahaan (CompanyName
) dana alamat (Address
) yang menjadi supplier produk dalam kategori Meat/Poultry.
SELECT S.CompanyName, S.Address
FROM Supplier AS S
WHERE EXISTS (SELECT P.SupplierId FROM Product AS P, Category AS C
WHERE C.CategoryName='Meat/Poultry' AND P.CategoryId=C.Id AND S.Id=P.SupplierId);
NOT EXISTS Functions
Menampikan nama produk (ProductName
) dan harga per unit (UnitPrice
) dengan Id supplier selain 1.
SELECT P.ProductName, P.UnitPrice
FROM Product AS P
WHERE NOT EXISTS (SELECT * FROM Supplier AS S WHERE S.Id = 1 AND P.SupplierId=S.Id);
EXPLICIT SETS
Menampilkan nama produk (ProductName
), harga per unit (UnitPrice
), identitas supplier (SupplierId
) dengan id suppiler 1 atau 3.
SELECT ProductName, UnitPrice, SupplierId
FROM Product
WHERE SupplierId IN (1,3);
RENAMING Attribute
Mengganti CompanyName
menjadi Perusahaan
dan ContactName
menjadi Nama
dari tabel Customer
dimana Country
bernama di Germany, Mexico dan UK.
SELECT CompanyName as Perusahaan, ContactName as Nama
FROM Customer
WHERE Country IN ("Germany", "Mexico", "UK");
Joined Relations
Menampilkan nama pegawai (LastName
, FirstName
), jabatan (Title
), dan identitas wilayah (TerritoryId
) dari tabel Employee
dan EmployeeTerritory
.
SELECT E.LastName, E.FirstName, E.Title, ET.TerritoryId
FROM Employee as E, EmployeeTerritory as ET
WHERE E.Id = ET.EmployeeId;
Aggregate Function
Menampilkan jumlah produk dan rata-rata unit price dari product dengan category id yang sama
SELECT CategoryId, COUNT(*) AS Jumlah_Product, AVG(UnitPrice) AS RataRata_Harga
FROM Product GROUP BY CategoryId;
Grouping
Menampilkan jumlah produk pada masing-masing supplier.
SELECT SupplierId, COUNT(*) AS Jumlah_Product
FROM Product GROUP BY SupplierId;
HAVING Clause
Menampilkan category yang jumlah produknya lebih dari 10.
SELECT CategoryId, COUNT(*) AS Jumlah_Product, AVG(UnitPrice) AS RataRata_Harga
FROM Product GROUP BY CategoryId
HAVING Jumlah_Product >10;