$ psql --help
$ psql
Contoh misalkan kita ingin login ke server Postgre yang memiliki data host localhost, port default 5432, user ucup dan nama database belajar :
$ psql -h localhost -p 5432 -U ucup belajar
$ help
\?
\q
\l
CREATE DATABASE belajar;DROP DATABASE belajar;grant all privileges on database "belajar" to ucup;Untuk memilih database / koneksi ke database yang ingin digunakan ikuti perintah di bawah ini:
\c belajar
CREATE TABLE table_name (
Column_name + data type + constrains if any;
)Untuk melihat daftar tipe data dalam PostgreSQL, bisa dilihat di dokumentasi resmi PostreSQL.
contoh
CREATE TABLE person (
id INT,
first_name VARCHAR(50),
last_name VARCHAR(50),
email VARCHAR(50)
); \d
\d person
DROP TABLE person;CREATE TABLE person (
id BIGSERIAL NOT NULL PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
country VARCHAR(50) NOT NULL,
email VARCHAR(50) NOT NULL UNIQUE
);BIGSERIAL adalah tipe data yang memiliki constraint auto increment.
ALTER TABLE table_name
ADD COLUMN new_column_name data_type constraint;Contoh :
alter table person
add date_of_birth DATE NOT NULL;INSERT INTO person (first_name, last_name, email, country, date_of_birth)
VALUES ('Ucup', 'Topekox', '[email protected]', 'Indonesia', '1990-01-01');SELECT * FROM person;Kita bisa generate random data di https://www.mockaroo.com/.
\i /Users/ucup/Downloads/person.sqlTip: untuk mengubah tampilan/Expanded hasil query 'select' gunakan perintah \x.
select from person;select * first_name from person;select * from person where email='[email protected]';select * from person order by date_of_birth asc;select * from person order by date_of_birth desc;
select * from person order by email, date_of_birth descMenampilkan data hanya satu dari value yang duplikat.
SELECT DISTINCT country FROM person ORDER BY country ASC;SELECT * FROM person WHERE country = 'Indonesia';SELECT * FROM person WHERE country = 'Indonesia' AND last_name = 'Ambrosi';SELECT * FROM person WHERE country = 'Indonesia' AND (last_name = 'Ambrosi' OR first_name='Jocko');SELECT 1 = 1;Hasil t untuk true dan f untuk false.
Daftar Operator dengan asumsi a bernilai 10 dan b bernilai 20:
| Operator | Description | Example |
|---|---|---|
| = | Jika nilai sama maka true. | (a = b) is not true. |
| != | Jika nilai tidak sama true. | (a != b) is true. |
| <> | Memeriksa apakah nilai kedua nilai sama atau tidak, jika nilainya tidak sama maka kondisinya menjadi true. | (a <> b) is true. |
| > | Jika nilai sebelah kiri operator lebih besar dari nilai sebelah kanan operator maka true. | (a > b) is not true. |
| < | Jika nilai sebelah kiri operator lebih kecil dari nilai sebelah kanan operator maka true. | (a < b) is true. |
| >= | Jika nilai sebelah kiri operator lebih besar atau sama dengan nilai sebelah kanan operator maka true. | (a >= b) is not true. |
| <= | Jika nilai sebelah kiri operator lebih kecil atau sama dengan nilai sebelah kanan operator maka true. | (a <= b) is true. |
SELECT * FROM person LIMIT 5;result:
id | first_name | last_name | country | email | date_of_birth
----+------------+------------+-------------+---------------------------+---------------
1 | Maddalena | Chisnall | South Korea | [email protected] | 1986-01-27
2 | Kari | Norwich | Indonesia | [email protected] | 1989-12-01
3 | Sybila | Carreyette | China | [email protected] | 1999-07-14
4 | Cliff | Kruger | Portugal | [email protected] | 2000-11-01
5 | Arlin | Cissen | Georgia | [email protected] | 1987-09-29
(5 rows)Offset digunakan untuk mengambil data dari nilai awal baris pada table.
SELECT * FROM person OFFSET 5 LIMIT 5;result:
id | first_name | last_name | country | email | date_of_birth
----+------------+-----------+----------------+--------------------------+---------------
6 | Inger | Oda | Czech Republic | [email protected] | 1993-02-02
7 | Jilleen | Tartt | Brazil | [email protected] | 1992-09-07
8 | Ban | Insull | China | [email protected] | 1996-11-05
9 | Evelin | Valentin | China | [email protected] | 1998-09-29
10 | Hildegaard | Aldin | China | [email protected] | 1993-05-10
(5 rows)Mengambil jumlah data yang diinginkan misal kita butuh 3 data:
SELECT * FROM person OFFSET 5 FETCH FIRST 3 ROW ONLY;result:
id | first_name | last_name | country | email | date_of_birth
----+------------+-----------+----------------+------------------------+---------------
6 | Inger | Oda | Czech Republic | [email protected] | 1993-02-02
7 | Jilleen | Tartt | Brazil | [email protected] | 1992-09-07
8 | Ban | Insull | China | [email protected] | 1996-11-05
(3 rows)select * from person where country = 'China' or country = 'Indonesia';Menampilkan data sesuai dalam IN:
select * from person where country in ('Indonesia', 'Malaysia', 'Thailand');select * from person where date_of_birth between '1991-01-01' and '1993-12-31';SELECT * FROM person WHERE email LIKE '%@msn.com';Menampilkan data dengan jumlah 6 karakter dengan menggunakan underscore _ dan diakhiri dengan alamat domain email @...
SELECT * FROM person WHERE email LIKE '______@%';ILIKE berfungsi untuk menonaktifkan perbedaan uppercase dan lowercase misalnya tidak ada perbedaan untuk pencarian yang diawali dengan huruf p dan P.
SELECT * FROM person WHERE country ilike 'p%';SELECT country FROM person GROUP BY country;dengan count
SELECT country, count(*) FROM person GROUP BY country;Having digunakan untuk menampilkan data berdasarkan jumlah kondisi valuenya. Misalnya menampilkan data country yang groupnya / jumlah negaranya lebih dari 5.
SELECT country, count(*) FROM person GROUP BY country HAVING COUNT(*) > 5 ORDER BY country ASC;Untuk macam-macam jenis Aggregate Functions Postgre bisa dilihat di dokumentasi resminya.
create table car (
id BIGSERIAL NOT NULL PRIMARY KEY,
merk VARCHAR(100) NOT NULL,
model VARCHAR(100) NOT NULL,
price NUMERIC(19,2) NOT NULL
);SELECT MAX(price) FROM car;SELECT MIN(price) FROM car;SELECT AVG(price) FROM car;example result:
avg
--------------------
54510.659000000000
(1 row)Round digunakan untuk mengubah ke kebilangan bulat.
SELECT ROUND(AVG(price)) FROM car;example result
round
-------
54511
(1 row)SELECT merk, model, MIN(price) FROM car GROUP BY merk, model;example result:
merk | model | min
---------------+----------------+----------
Toyota | Land Cruiser | 25999.00
Mercedes-Benz | S-Class | 28967.00
BMW | M6 | 17124.00
Saturn | Aura | 29511.00
Kia | Amanti | 98550.00
Oldsmobile | Silhouette | 10639.00
Daewoo | Lanos | 35664.00
Subaru | Forester | 28026.00
Ford | Econoline E350 | 37298.00
Ferrari | 612 Scaglietti | 55531.00
(10 rows)SELECT merk, model, MIN(price) FROM car GROUP BY merk, model;example result:
merk | model | min
---------------+----------------+----------
Toyota | Land Cruiser | 25999.00
Mercedes-Benz | S-Class | 28967.00
BMW | M6 | 17124.00
Saturn | Aura | 29511.00
Kia | Amanti | 98550.00
Oldsmobile | Silhouette | 10639.00
Daewoo | Lanos | 35664.00
Subaru | Forester | 28026.00
Ford | Econoline E350 | 37298.00
Ferrari | 612 Scaglietti | 55531.00
(10 rows)SELECT SUM(price) FROM car;SUM Group By
SELECT merk, SUM(price) FROM car GROUP BY merk;SELECT 10 + 2;Untuk selengkapnya silahkan ke Dokumentasi Aritmatika PostgreSQL.
Memberi diskon 10% dari harga mobil:
SELECT id, merk, model, price, price * .10 from car;Membulatkan nilai
SELECT id, merk, model, price, round(price * .10) from car;Mengurangi harga total dengan diskon:
SELECT id, merk, model, price, round(price * .10), round(price - (price * .10)) from car;Memberikan nilai desimal 2 digit.
SELECT id, merk, model, price, round(price * .10), round(price - (price * .10), 2) from car;Coalesce biasanya digunakan untuk mereplace suatu data. Misalnya kita akan mereplace value dalam kolom yang bernilai null atau kosong ''.
select coalesce(email, 'Email Not Provided') from person;NULLIF(argument_1,argument_2);function NULLIF akan mengembalikan null value jika argument_1 sama dengan argument_2, selain itu akan mengembalikan argument_1.
contoh:
select 10 / nullif(2, 9);
?column?
----------
5
(1 row)contoh 2:
select coalesce(10 / nullif(0, 0), 0);
coalesce
----------
0
(1 row)Lihat selengkapnya di dokumentasi resminya.
SELECT NOW();
now
-------------------------------
2022-06-01 14:24:26.306704+08
(1 row)dengan tanggal
SELECT NOW()::DATE;dengan waktu
SELECT NOW()::TIME;Mengurangi waktu saat ini 1 tahun
SELECT NOW() - INTERVAL '1 YEAR';
?column?
-------------------------------
2021-06-01 14:33:49.919447+08
(1 row)menambah wwaktu saat ini 1 bulan
SELECT NOW() + INTERVAL '1 MONTHS';
?column?
-------------------------------
2022-07-01 14:34:14.937614+08
(1 row)Digunakan untuk mengekstrak bagian dari Datetime.
select now();
now
-------------------------------
2022-06-01 15:18:11.776978+08
(1 row)
select extract(month from now());
date_part
-----------
6
(1 row)
select extract(year from now());
date_part
-----------
2022
(1 row)
select extract(day from now());
date_part
-----------
1
(1 row)
select extract(dow from now());
date_part
-----------
3
(1 row)
select extract(century from now());
date_part
-----------
21
(1 row)Digunakan untuk menghitung usia
select first_name, last_name, date_of_birth, AGE(NOW(), date_of_birth) from person;Menampilkan data yang nilainya null
select * from person where email IS NULL;Menghapus constraint primary key
alter table person drop constraint person_pkey;Membuat Primary Key
alter table person add primary key(id);Menambahkan constraint unique
ALTER TABLE person ADD CONSTRAINT unique_email_name UNIQUE (email);atau
alter table person add unique (email);Menghapus constraint unique
ALTER TABLE person DROP CONSTRAINT unique_email_name;Digunakan untuk hanya membatasi value yang ingin dimasukan.
ALTER TABLE person ADD CONSTRAINT gender_constraint CHECK (gender = 'Female' OR gender = 'Male');delete from person where id = 2;Dengan kondisi
delete from person where gender = 'Female' and country = 'Nigeria';update person set first_name = 'ucup' where id = 11;Multiple kolom
update person set first_name='ucup', last_name='topekox', email='[email protected]' where id = 11;Berfungsi untuk tidak menghiraukan error ketika menginput data yang duplikat terhadap feild yang memiliki key atau field yang unique.
insert into person (id, first_name, last_name, email, gender, country, date_of_birth) values (2, 'Lorri', 'Werendell', '[email protected]', 'Female', 'China', '2000-07-28') ON CONFLICT (id) DO NOTHING;Catatan: Query ini hanya berfungsi terhadap field yang memiliki constraint.
Jika terdapat data konflik pada constraint maka tetap akan di update.
insert into person (id, first_name, last_name, email, gender, country, date_of_birth) values (2, 'Naruto', 'Uzumaki', '[email protected]', 'Female', 'China', '2000-07-28') ON CONFLICT (id) DO UPDATE set first_name = EXCLUDED.first_name, last_name = EXCLUDED.last_name, email = EXCLUDED.email;create table car (
id bigserial not null primary key,
merk varchar(100) not null,
model varchar(100) not null,
price numeric(19, 2) not null
);create table person (
id bigserial not null primary key,
first_name varchar(50) not null,
last_name varchar(50) not null,
gender varchar(7) not null,
email varchar(100),
date_of_birth date not null,
country varchar(50) not null,
car_id bigint references car (id)
);Menampilkan data yang punya relasi saja.
select * from person join car on person.car_id = car.id;Contoh lain:
select person.first_name, car.merk, car.model, car.price from person join car on person.car_id = car.id;Hanya menampilkan data yang berada di tabel sisi kiri dan tabel lain yang berelasi.
select * from person left join car on car.id = person.car_id;Menampilkan data left join yang memiliki car_id null
select * from person left join car on car.id = person.car_id where person.car_id IS NULL;Untuk menghapus record yang berelasi pastikan untuk mengahpus data yang sudah teralasi sebelum yang berada tabel master.
\copy (select * from person left join car on car.id = person.car_id) to '/Users/ucup/Desktop/result.csv' delimiter '.'CSV HEADER;Cek sequnce
\d
List of relations
Schema | Name | Type | Owner
--------+---------------+----------+-------
public | car | table | ucup
public | car_id_seq | sequence | ucup
public | person | table | ucup
public | person_id_seq | sequence | ucup
(4 rows)
select * from person_id_seq;
last_value | log_cnt | is_called
------------+---------+-----------
11 | 22 | t
(1 row)Membuat next value sequence
select nextval('person_id_seq'::regclass);
nextval
---------
12
(1 row)Reset value sequence
alter sequence person_id_seq RESTART WITH 11;select * from pg_available_extensions ;create extension if not exists "uuid-ossp";Cek semua function
\dfGenerate UUID
select uuid_generate_v4();Contoh menggunakan UUID generator sebagai id primary key.
create table car (
car_uid UUID NOT NULL PRIMARY KEY,
merk VARCHAR(100) NOT NULL,
model VARCHAR(100) NOT NULL,
price NUMERIC(19, 2) NOT NULL CHECK (price > 0)
);
create table person (
person_uid UUID NOT NULL PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
email VARCHAR(50),
gender VARCHAR(50) NOT NULL,
country VARCHAR(50) NOT NULL,
date_of_birth DATE,
car_uid UUID REFERENCES car(car_uid),
UNIQUE(car_uid),
UNIQUE(email)
);
-- Insert into person
insert into person (person_uid, first_name, last_name, email, gender, country, date_of_birth)
values (uuid_generate_v4(), 'Krissie', 'Dorie', null, 'Female', 'Ukraine', '1994-02-26');
insert into person (person_uid, first_name, last_name, email, gender, country, date_of_birth)
values (uuid_generate_v4(), 'Mahmud', 'Cundict', '[email protected]', 'Male', 'China', '1993-12-05');
insert into person (person_uid, first_name, last_name, email, gender, country, date_of_birth)
values (uuid_generate_v4(), 'Gusta', 'Breed', '[email protected]', 'Female', 'Russia', '1987-06-05');
-- Insert into car
insert into car (car_uid, merk, model, price) values (uuid_generate_v4(), 'GMC', 'Yukon', 98421);
insert into car (car_uid, merk, model, price) values (uuid_generate_v4(), 'Mercedes-Benz', 'CL-Class', 55099);Query :
select * from person;
person_uid | first_name | last_name | email | gender | country | date_of_birth | car_uid
--------------------------------------+------------+-----------+--------------------------+--------+---------+---------------+---------
bc16f40f-44ae-4bce-98d0-3680d948f45e | Krissie | Dorie | | Female | Ukraine | 1994-02-26 |
4c627003-4992-43e5-83eb-190886c565ab | Mahmud | Cundict | mcundictl@opensource.org | Male | China | 1993-12-05 |
4b982532-a05c-4bb3-b7d7-b75236067f43 | Gusta | Breed | gbreed1g@vistaprint.com | Female | Russia | 1987-06-05 |
(3 rows)select * from car;
car_uid | merk | model | price
--------------------------------------+---------------+----------+----------
2330fb0e-c9e1-46bb-b408-c7bd5b3c8f64 | GMC | Yukon | 98421.00
c7ec543b-e094-4065-817b-e0847ebd9e1c | Mercedes-Benz | CL-Class | 55099.00
(2 rows)Insert Relasi
update person set car_uid='c7ec543b-e094-4065-817b-e0847ebd9e1c' where person_uid='bc16f40f-44ae-4bce-98d0-3680d948f45e';
update person set car_uid='2330fb0e-c9e1-46bb-b408-c7bd5b3c8f64' where person_uid='4b982532-a05c-4bb3-b7d7-b75236067f43';Show data
select * from person join car on person.car_uid = car.car_uid;
-- menggunakan using
select * from person join car using(car_uid);- backup menggunakan pg_dump
pg_dump -U username -d database_name -f backup_file.sql- backup menggunakan pg_dumpal
pg_dumpall -U username -f backup_file.sql- restore menggunakan pg_restore
pg_restore -U username -d new_database_name -1 backup_file.sql- restore menggunakan psql
createdb -U username new_database_name
psql -U username -d new_database_name -f backup_file.sql- menggunakan psql untuk pg_dumpall
psql -U username -f backup_file.sql