Database System
Tugas 3 ~ Data Manipulation - Simple Query
| Kontak | : \(\downarrow\) |
| yosia.yosia@student.matanauniversity.ac.id | |
| yyosia | |
| RPubs | https://rpubs.com/yosia/ |
Introduction
Seperti yang kita ketahui database dapat menyimpan dan memelihara serta mengelola data, dalam database SQL yang dapat digunakan untuk menyimpan dan memelihara serta mengelola data dalam database tersebut baik secara langsung maupun menggunakan macam-macam bahasa pemrograman. database yang relasional akan mengambil data dan menganalisis data dengan menggunakan query. kita akan mempelajari beberapa query untuk mengolah data.
sebelumnya kita konekan R dengan database kita. coding :
library(RMySQL)
library(DBI)
yosia <- dbConnect(RMySQL::MySQL(),
dbname = 'new_mariadb',
username = 'root',
password = '',
host = 'localhost',
port = 3306)
knitr::opts_chunk$set(connection = "yosia")Jadi kita konekan SQL dengan nama ‘yosia’ agar lebih simpel dalam memasukan coding
SELECT
di sesi ini kita akan mengambil data dari tabel yang sudah di gabungkan, kita memilih tabel mana yang akan kita ambil. contohnya :
SELECT CustomerName, Address, City, Country
FROM CUSTOMERS;| CustomerName | Address | City | Country |
|---|---|---|---|
| Alfreds Futterkiste | Obere Str. 57 | Frankfurt | Germany |
| Ana Trujillo Emparedados y helados | Avda. de la Constitución 2222 | México D.F. | Mexico |
| Antonio Moreno TaquerÃa | Mataderos 2312 | México D.F. | Mexico |
| Around the Horn | 120 Hanover Sq. | London | UK |
| Berglunds snabbköp | Berguvsvägen 8 | Luleå | Sweden |
| Blauer See Delikatessen | Forsterstr. 57 | Mannheim | Germany |
| Blondel père et fils | 24, place Kléber | Strasbourg | France |
| Bólido Comidas preparadas | C/ Araquil, 67 | Madrid | Spain |
| Bon app’ | 12, rue des Bouchers | Marseille | France |
| Bottom-Dollar Marketse | 23 Tsawassen Blvd. | Tsawassen | Canada |
dari tabel-tabel di atas muncul tabel yang sudah kita select atau pilih.
DISTINCT
DISTINCT digunakan saat kita ingin menampilkan representasi dari suatu tabel, dengan kata lain hanya 1 varian data yang muncul jika ada data yang sama. contohnya :
SELECT DISTINCT Country
From CUSTOMERS;| Country |
|---|
| Germany |
| Mexico |
| UK |
| Sweden |
| France |
| Spain |
| Canada |
| Argentina |
| Switzerland |
| Brazil |
dari tabel di atas kita melihat bahwa dari 91 data dari CUSTOMERS yang tabelnya COUNTRY ternyata ada 21 varian data yang berbeda, dan sisanya data yang duplicate.
WHERE
WHERE merupakan perintah dasar SQL yang di gunakan untuk mem-filter hasil SELECT dengan mengekstrak record yang memenuhi persyaratan tertentu.
SELECT *
FROM customers
WHERE country='Mexico';| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 5021 | Mexico |
| 3 | Antonio Moreno TaquerÃa | Antonio Moreno | Mataderos 2312 | México D.F. | 5023 | Mexico |
| 13 | Centro comercial Moctezuma | Francisco Chang | Sierras de Granada 9993 | México D.F. | 5022 | Mexico |
| 58 | Pericles Comidas clásicas | Guillermo Fernández | Calle Dr. Jorge Cash 321 | México D.F. | 5033 | Mexico |
| 80 | Tortuga Restaurante | Miguel Angel Paolino | Avda. Azteca 123 | México D.F. | 5033 | Mexico |
dilihat dari tabel diatas berarti kita mengambil data dari customers dan kita hanya memilih negara mexico yang di dalam data customers.
catatan
| Operator | Deskripsi |
|---|---|
| = | sama dengan |
| > | lebih besar |
| < | lebih kecil |
| >= | lebih besar sama dengan |
| <= | lebih kecil sama dengan |
| <> | tidak sama dengan, beberapa versi SQL dapat ditulis != |
| IS NULL or IS NOT NULL | field dengan nilai NULL adalah field tanpa nilai |
| BETWEEN | Antara rentang tertentu |
| LIKE | mencari pola |
| IN | Untuk menentukan beberapa kemungkinan nilai untuk kolom |
BETWEEN
kondisi yang memungkinkan kita untuk melakukan pengujian jika sebuah nilai berada dalam suatu rentang nilai tertentu. jadi kita ingin menampilkan data-data yang kita sudah tentukan. Contohnya:
SELECT *
FROM products
WHERE price
BETWEEN 10 AND 20;| ProductID | ProductName | SupplierID | CategoryID | Unit | Price |
|---|---|---|---|---|---|
| 1 | Chais | 1 | 1 | 10 boxes x 20 bags | 18.00 |
| 2 | Chang | 1 | 1 | 24 - 12 oz bottles | 19.00 |
| 3 | Aniseed Syrup | 1 | 2 | 12 - 550 ml bottles | 10.00 |
| 15 | Genen Shouyu | 6 | 2 | 24 - 250 ml bottles | 15.50 |
| 16 | Pavlova | 7 | 3 | 32 - 500 g boxes | 17.45 |
| 21 | Sir Rodney’s Scones | 8 | 3 | 24 pkgs. x 4 pieces | 10.00 |
| 25 | NuNuCa Nuß-Nougat-Creme | 11 | 3 | 20 - 450 g glasses | 14.00 |
| 31 | Gorgonzola Telino | 14 | 4 | 12 - 100 g pkgs | 12.50 |
| 34 | Sasquatch Ale | 16 | 1 | 24 - 12 oz bottles | 14.00 |
| 35 | Steeleye Stout | 16 | 1 | 24 - 12 oz bottles | 18.00 |
dari data di atas kita melihat bahwa price berada dalam rentang 10-20. kondisi between juga bisa digunakan dalam tanggal, jadi kita menentukan dari tanggal berapa dan sampai tanggal berapa. Contohnya OrderDate BETWEEN ‘01-July-1996’ and ‘31-July-1996’:
SELECT *
FROM orders
WHERE orderdate
BETWEEN '1996-07-01' AND '1996-07-31';| OrderID | CustomerID | EmployeeID | OrderDate | ShipperID |
|---|---|---|---|---|
| 10248 | 90 | 5 | 1996-07-04 | 3 |
| 10249 | 81 | 6 | 1996-07-05 | 1 |
| 10250 | 34 | 4 | 1996-07-08 | 2 |
| 10251 | 84 | 3 | 1996-07-08 | 1 |
| 10252 | 76 | 4 | 1996-07-09 | 2 |
| 10253 | 34 | 3 | 1996-07-10 | 2 |
| 10254 | 14 | 5 | 1996-07-11 | 2 |
| 10255 | 68 | 9 | 1996-07-12 | 3 |
| 10256 | 88 | 3 | 1996-07-15 | 2 |
| 10257 | 35 | 4 | 1996-07-16 | 3 |
IN
kondisi ini digunakan pada saat datanya string/character
SELECT *
FROM customers
WHERE country
IN ('Germany', 'France', 'UK');| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Alfreds Futterkiste | Alfred Schmidt | Obere Str. 57 | Frankfurt | 12209 | Germany |
| 4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
| 6 | Blauer See Delikatessen | Hanna Moos | Forsterstr. 57 | Mannheim | 68306 | Germany |
| 7 | Blondel père et fils | Frédérique Citeaux | 24, place Kléber | Strasbourg | 67000 | France |
| 9 | Bon app’ | Laurence Lebihans | 12, rue des Bouchers | Marseille | 13008 | France |
| 11 | B’s Beverages | Victoria Ashworth | Fauntleroy Circus | London | EC2 5NT | UK |
| 16 | Consolidated Holdings | Elizabeth Brown | Berkeley Gardens 12 Brewery | London | WX1 6LT | UK |
| 17 | Drachenblut Delikatessend | Sven Ottlieb | Walserweg 21 | Aachen | 52066 | Germany |
| 18 | Du monde entier | Janine Labrune | 67, rue des Cinquante Otages | Nantes | 44000 | France |
| 19 | Eastern Connection | Ann Devon | 35 King George | London | WX3 6FW | UK |
SELECT *
FROM customers
WHERE country
IN (SELECT country FROM suppliers);| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Alfreds Futterkiste | Alfred Schmidt | Obere Str. 57 | Frankfurt | 12209 | Germany |
| 4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
| 5 | Berglunds snabbköp | Christina Berglund | Berguvsvägen 8 | Luleå | S-958 22 | Sweden |
| 6 | Blauer See Delikatessen | Hanna Moos | Forsterstr. 57 | Mannheim | 68306 | Germany |
| 7 | Blondel père et fils | Frédérique Citeaux | 24, place Kléber | Strasbourg | 67000 | France |
| 8 | Bólido Comidas preparadas | MartÃn Sommer | C/ Araquil, 67 | Madrid | 28023 | Spain |
| 9 | Bon app’ | Laurence Lebihans | 12, rue des Bouchers | Marseille | 13008 | France |
| 10 | Bottom-Dollar Marketse | Elizabeth Lincoln | 23 Tsawassen Blvd. | Tsawassen | T2F 8M4 | Canada |
| 11 | B’s Beverages | Victoria Ashworth | Fauntleroy Circus | London | EC2 5NT | UK |
| 15 | Comércio Mineiro | Pedro Afonso | Av. dos LusÃadas, 23 | São Paulo | 05432-043 | Brazil |
LIKE
Kondisi ini dilakukan untuk mencari pola tertentu. ada 2 wildcard yang sering digunakan pada kondisi LIKE;
- % = mewakili nol, satu, atau beberapa karakter
- _ = mewakili satu karakter
kita ingin mencari customername yang namanya awalan ‘a’ :
SELECT *
FROM customers
WHERE customername
LIKE 'a%';| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Alfreds Futterkiste | Alfred Schmidt | Obere Str. 57 | Frankfurt | 12209 | Germany |
| 2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 5021 | Mexico |
| 3 | Antonio Moreno TaquerÃa | Antonio Moreno | Mataderos 2312 | México D.F. | 5023 | Mexico |
| 4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
beberapa contoh perbedaan operator LIKE antara ‘%’ dan ’_’ wildcard:
| Operator LIKE | Deskripsi |
|---|---|
| WHERE CustomerName LIKE ‘a%’ | mencari huruf yang awalan “a” |
| WHERE CustomerName LIKE ‘%a’ | mencari huruf yang akhiran “a” |
| WHERE CustomerName LIKE ‘%or%’ | mencari huruf yang ada “or” dalam data |
| WHERE CustomerName LIKE ’_r%’ | Menemukan nilai apa pun yang memiliki “r” di posisi kedua |
| WHERE CustomerName LIKE ‘a_%’ | Menemukan nilai apa pun yang dimulai dengan “a” dan panjangnya minimal 2 karakter |
| WHERE CustomerName LIKE ’a__%’ | Menemukan nilai apa pun yang dimulai dengan “a” dan panjangnya minimal 3 karakter |
| WHERE ContactName LIKE ‘a%o’ | Menemukan nilai apa pun yang dimulai dengan “a” dan diakhiri dengan “o” |
AND, OR and NOT
Operator AND, OR dan NOT merupakan perintah dasar SQL yang biasanya di kombinasikan dengan perintah WHERE. Ketiganya di gunakan untuk mem-filter record berdasarkan suatu kondisi, operator AND akan menampilkan record apabila semua kondisi bernilai TRUE, operator OR akan menampilkan record apabila salah satu kondisi bernilai TRUE, sedangkan operator NOT akan menampilkan record apabila semua kondisi bernilai FALSE.
SELECT * FROM customers
where country='Germany' AND (city='Berlin' OR city='München');| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 25 | Frankenversand | Peter Franken | Berliner Platz 43 | München | 80805 | Germany |
ORDER BY
di gunakan untuk mengurutkan result-set dalam pengurutan ‘ascending’ atau ’descending. mengurutkan dari yang terkecil ke terbesar.
SELECT * FROM orderdetails
WHERE quantity BETWEEN 20 AND 50
ORDER BY quantity, orderid;| OrderDetailID | OrderID | ProductID | Quantity |
|---|---|---|---|
| 11 | 10251 | 65 | 20 |
| 15 | 10253 | 31 | 20 |
| 21 | 10255 | 2 | 20 |
| 40 | 10261 | 35 | 20 |
| 39 | 10261 | 21 | 20 |
| 51 | 10265 | 70 | 20 |
| 59 | 10269 | 72 | 20 |
| 68 | 10273 | 33 | 20 |
| 71 | 10274 | 71 | 20 |
| 77 | 10277 | 28 | 20 |
LIMIT
kondisi ini kita gunakan saat kita hanya ingin menampilkan data teratas dari tabel yang kita pilih. contohnya saya akan menampilkan 3 teratas :
SELECT * FROM orderdetails
WHERE quantity BETWEEN 20 AND 50
ORDER BY quantity, orderid
LIMIT 3;| OrderDetailID | OrderID | ProductID | Quantity |
|---|---|---|---|
| 11 | 10251 | 65 | 20 |
| 15 | 10253 | 31 | 20 |
| 21 | 10255 | 2 | 20 |
selanjutnya, kita akan mengambil 5 baris teratas setelah 3 baris teratas.
SELECT * FROM orderdetails
WHERE quantity BETWEEN 20 AND 50
ORDER BY quantity, orderid
LIMIT 3,5;| OrderDetailID | OrderID | ProductID | Quantity |
|---|---|---|---|
| 40 | 10261 | 35 | 20 |
| 39 | 10261 | 21 | 20 |
| 51 | 10265 | 70 | 20 |
| 59 | 10269 | 72 | 20 |
| 68 | 10273 | 33 | 20 |
MIN and MAX
function MIN() digunakan untuk mencari nilai terkecil. dan function MAX() digunakan untuk mencari nilai terbesar. kedua fungsi ini hanya menampilkan 1 nilai tidak seperti order by. Contohnya
kita ingin mencari harga termurah dari suatu produk
SELECT MIN(price) AS SmallestPrice
FROM products ;| SmallestPrice |
|---|
| 2.5 |
selanjutnya kita ingin mencari nilai tertinggi dari suatu produk
SELECT MAX(price) AS LargestPrice
FROM products ;| LargestPrice |
|---|
| 263.5 |
COUNT, SUM, and AVG
fungsi COUNT() digunakan untuk mengetahui berapa kolom pada tabel. fungsi AVG() digunakan untuk mencari rata-rata. fungsi SUM() digunakan untuk mengetahui jumlahan atau total dari suatu kolom.
mencari rata-rata
SELECT AVG(price)
From Products| AVG(price) |
|---|
| 28.86636 |
mencari jumlahan
SELECT SUM(price)
From Products| SUM(price) |
|---|
| 2222.71 |
mencari berapa data
SELECT COUNT(price)
From Products| COUNT(price) |
|---|
| 77 |
HAVING
digunakan saat fungsi where tidak bisa digunakan. Penggunaan WHERE pada fungsi agregat akan menyebabkan error
Pernyataan SQL berikut mencantumkan jumlah customers di setiap country, diurutkan dari tinggi ke rendah (Hanya sertakan country dengan lebih dari 5 customers):
SELECT COUNT(customerid), country
FROM customers
GROUP BY country
HAVING count(customerid) > 5
ORDER BY count(customerid) DESC;| COUNT(customerid) | country |
|---|---|
| 13 | USA |
| 11 | France |
| 11 | Germany |
| 9 | Brazil |
| 7 | UK |
CASE
digunakan untuk memberikan pesan atau catatan dari suatu tabel. pernyataan sama seperti (IF, THEN, ELSE). jadi jika kondisi terpenuhi dia akan stop membaca dan memasukan hasilnya. tapi jika kondisi tidak terpenuhi dia akan memasukan nilai dari klausa ELSE. jika ELSE tidak terpenuhi juga maka akan diberikan nilai NULL.
Contohnya:
SELECT orderid, quantity,
CASE
WHEN quantity > 30 THEN 'kuantitas lebih besar dari 30'
WHEN quantity = 30 THEN 'kuantitas sama dengan 30'
ELSE 'Kuantitas lebih kecil dari 30'
END AS QuantityText
FROM orderdetails;| orderid | quantity | QuantityText |
|---|---|---|
| 10248 | 12 | Kuantitas lebih kecil dari 30 |
| 10248 | 10 | Kuantitas lebih kecil dari 30 |
| 10248 | 5 | Kuantitas lebih kecil dari 30 |
| 10249 | 9 | Kuantitas lebih kecil dari 30 |
| 10249 | 40 | kuantitas lebih besar dari 30 |
| 10250 | 10 | Kuantitas lebih kecil dari 30 |
| 10250 | 35 | kuantitas lebih besar dari 30 |
| 10250 | 15 | Kuantitas lebih kecil dari 30 |
| 10251 | 6 | Kuantitas lebih kecil dari 30 |
| 10251 | 15 | Kuantitas lebih kecil dari 30 |
SQL berikut akan mengurutkan customers berdasarkan city. Namun, jika city adalah NULL, maka order by Country:
SELECT customername, city, country
FROM customers
ORDER BY
(CASE
WHEN city IS NULL THEN country
ELSE city
END);| customername | city | country |
|---|---|---|
| Drachenblut Delikatessend | Aachen | Germany |
| Rattlesnake Canyon Grocery | Albuquerque | USA |
| Old World Delicatessen | Anchorage | USA |
| Vaffeljernet | Ã…rhus | Denmark |
| GalerÃa del gastrónomo | Barcelona | Spain |
| LILA-Supermercado | Barquisimeto | Venezuela |
| Magazzini Alimentari Riuniti | Bergamo | Italy |
| Chop-suey Chinese | Bern | Switzerland |
| Save-a-lot Markets | Boise | USA |
| Folk och fä HB | Bräcke | Sweden |