30 Eylül 2022 • 32 dakikalık okuma
PostgreSQL (yada postgres), ücretsiz ve açık kaynaklı ilişkisel veritabanıdır. İlk sürümü 1996 yılında yayımlanmıştır. SQL dilini destekler. Dünya çapında en çok tercih edilen açık kaynaklı veritabanı yönetim sistemlerinden biridir.
Postgres, veritabanını Debian/Ubuntu Linux işletim sistemine kurmak için terminalde;
sudo apt update
sudo apt install postgresql postgresql-contrib
komutları çalıştırılır.
sudo systemctl start postgresql.service
komutu ile postgres servisi başlatılır.
sudo systemctl status postgresql.service
komutu ile postgres servisi mevcut durumu kontrol edilir.
Postgres kurulum sonrasında sisteme varsayılan olarak postgres adlı bir kullanıcı ve rol tanımlar. Varsayılan kullanıcı ile bağlanmak için;
sudo -i -u postgres
psql
yada
sudo -u postgres psql
kodu çalıştırılarak bağlanılır.
Postgres terminal ekranından çıkmak için;
\q
kodu çalıştırılır.
Yeni rol oluşturmak için;
sudo -u postgres createuser --interactive
Yeni veritabanı oluşturma (yeni rol ile oturum açabilmek için rol ile aynı isimde veritabanı oluşturulmalıdır);
sudo -u postgres createdb melih
Yeni kullanıcı oluşturma (linux sisteminde kullanıcı yok ise);
sudo adduser melih
Farklı kullanıcı ile postgres de oturum açmak için;
sudo -u melih psql
Terminal ekranında postgres veritabanını kullanabilmek için kullanılır;
Postgres sürüm bilgileri için;
psql --version
Postgres yardım bilgileri için;
psql --help
Postgres bağlanmak için;
psql
Postgres çıkmak için;
\q
Postgres yardım için;
\?
Postgres komutlar yardımı için;
\h
yada
\help
Postgres terminal ekranı temizlemek için; Ctrl + L yada;
\! clear
Postgres veritabanlarını listelemek için;
\list
yada
\l
Veritabanı oluşturma;
create database melihDB;
yada
create database "MelihDB";
Mevcut bağlı olunan kullanıcıyı ve veritabanını görmek için;
\c
Detaylı bağlantı bilgisi görmek için;
\conninfo
Mevcut veritabanından farklı bir veritabanına bağlanma;
\connect melihDB2
yada
\c melihDB
Uzaktaki veritabanına bağlanma;
psql -h localhost -p 5432 -U melih melihDB
Veritabanı silmek için;
drop database melihDB;
Tablo oluşturmak için;
create table city (
id int,
code varchar(10),
title varchar(50),
createdDate date
);
Birincil anahtar ile tablo oluşturmak için;
create table country(
id bigserial not null primary key,
code varchar(10),
title varchar(50),
createdDate date
);
Tabloları listelemek için;
\d
Sadece tabloları listelemek için;
\dt
Tablo detaylarını listelemek için;
\d car
Tablo silmek için;
drop table city;
Tabloya kayıt eklemek;
insert into country (code, title, createdDate) values ('Pakistan', 'PK', date '2022-12-30');
Tablo kayıtlarını getirmek;
select * from country;
Tablo kayıtlarını güncellemek;
update country set title = 'Türkiye', code = 'TR' where id = 39;
Tablo kayıtlarını silmek;
delete from country where id = 78;
Tüm tablo kayıtlarını silmek;
truncate table country restart identity;
Sql dosyasından birden fazla kayıt eklemek;
\i /home/melih/Masaüstü/Postgres/person.sql
Tablo verilerini .csv biçiminde dosyaya kaydeder;
\copy (select * from country) TO '/home/melih/Masaüstü/Postgres/country-data.csv' delimiter ',' csv header;
SQL koduna yorum satırı eklemek;
-- Açıklama
Tablo kayıtlarını getirmek;
select * from person;
yada
select firstname, lastname from person;
Sonuçların kolon adını değiştirmek;
select firstname as "Ad", lastname as "Soyad" from person;
Tablo kayıtlarını sıralayıp getirmek;
-- Ad kolonuna göre sıralama;
select * from person order by firstname asc;
-- Sorgu sonucundaki 3. kolona göre tersten sıralama;
select * from person order by 3 desc;
-- Sorgu sonucundaki 3. ve sonra 2. kolona göre sıralama;
select * from person order by 3, 2 asc;
Tablo kayıtlarını tekrar etmeden getirmek;
select distinct lastname from person order by lastname;
Koşulu sağlayan kayıtları getirmek;
-- soyadı Yılmaz olan kayıtlar;
select * from person where lastname = 'Yılmaz'
-- soyadı Yılmaz ve cinsiyeti Erkek olan kayıtlar;
select * from person where lastname = 'Yılmaz' and gender = 'Male'
-- adı ve ya soyadı Yılmaz olan kayıtlar;
select * from person where firstname = 'Yılmaz' or lastname = 'Yılmaz'
-- Doğum tarihi 2000-01-01 tarihinden büyük ve eşit olan kayıtlar;
select * from person where birthdate >= '2000-01-01'
Tabloda ilk 10 kaydı getirmek;
select * from person limit 10;
yada
select * from person fetch first 10 row only;
Tabloda ilk 100 kaydı sıralayıp getirmek;
select * from person order by lastname desc limit 100;
İlk 100 kaydı koşul ile ve sıralayıp getirme;
select * from person where birthdate >= '2000-01-01' order by 5 desc limit 100;
İlk 5 kayıttan sonraki tüm kayıtları getirmek;
select * from person offset 5;
Kayıt aralığı getirme (5 kayıt atlar, 10 kayıt getirir);
select * from person offset 5 limit 10;
yada
select * from person offset 5 fetch first 10 row only;
In; yazılan koşullardan eşleşen kayıtları getirir;
select * from person where firstname in ('Ali', 'Veli', 'Yılmaz');
Between; yazılan koşullar arasındaki kayıtları getirir;
select * from person where birthDate between '2022-01-01' and '2022-12-31';
Like; kelime bazında yazılan koşullarda eşleşen kayıtları getirir;
-- Email adresi .net ile biten kayıtlar;
select * from person where email like '%.net'
-- İsmi Al ile başlayan kayıtlar
select * from person where firstname like 'Al%'
-- Soyadı içinde ol geçen kayıtlar
select * from person where lastname like '%ol%'
-- 4 karakterli y ile biten soyisimli kayıtlar
select * from person where lastname like '___y'
Ilike; Like gibi kelime bazında yazılan koşullarda eşleşen kayıtları getirir büyük ve küçük harf duyarsızdır;
-- Adı al ile başlayan kayıtlar;
select * from person where firstname ilike 'al%'
Group By; Tekrar eden kayıtları gruplayıp sayısını getirir;
-- Yıllara göre doğan kişi sayıları;
select date_part('year', birthdate) as "Year", count(*) from person group by "Year";
Group By Having; Tekrar eden kayıtları gruplayıp sayısını getirir ve koşul yazmayı sağlar.
-- Yıllara göre doğan kişi sayısı 15’ten büyük olan kayıtlar;
select date_part('year', birthdate) as "Year", count(*) from person group by "Year" having count(*) > 15;
Max; Kolondaki en fazla olan değeri getirir;
-- En pahalı aracın fiyatı;
select max(price) from car;
Min; Kolondaki en az olan değeri getirir;
-- En ucuz aracın fiyatı;
select min(price) from car;
Avg; Kolondaki ortalama değeri getirir;
-- Ortalama araç fiyatı;
select round(avg(price)) from car;
Fonksiyon ve gruplama;
-- En az fiyata göre gruplama; marka daki en düşük modeli ve fiyatını gösterir;
select brand, model, min(price) from car group by brand, model;
-- En az fiyata göre gruplama; markadaki en düşük fiyatı gösterir;
select brand, min(price) from car group by brand;
Sum; Kolondaki toplam değeri getirir;
-- Tüm kayıtların toplam fiyatı;
select sum(price) from car;
-- marka bazında toplam fiyat;
select brand, sum(price) from car group by brand;
Round; Kolondaki değeri yuvarlar;
-- Tüm kayıtlarda fiyatlara %10 indirim;
select brand, model, price, round(price*.10,2) as "İndirim Tutarı", round(price - (price*.10), 2) as "İndirimli Fiyat" from car;
Değer boş ise girilen yazıyı varsayılan olarak yazar;
-- Alan boş ise girilen yazıyı yazar;
select coalesce(email, 'E-posta adresi mevcut değil!') as "E-posta";
-- Diğer kolonlar ile kullanım;
select firstname, lastname, coalesce(email, 'E-posta adresi mevcut değil!') from person;
Güncel tarih ve saati verir;
select now();
Sadece tarihi verir;
select now()::date;
Sadece saati verir;
select now()::time;
Tarihte ekleme ve çıkarma yapar;
Güncel tarihten 5 yıl çıkarır;
select now() - interval '5 year';
Güncel tarihten 5 yıl 3 ay çıkarır;
select now() - interval '5 year 3 month';
Güncel tarihe 22 gün ekler;
select now() + interval '22 day';
Güncel tarihe 9 ay ekler; tarih döndürür;
select (now() + interval '9 months')::date;
Tarihin istenilen bölümünü verir;
Yılı verir;
select extract(year from now());
Ayı verir;
select extract(month from now());
Günü verir;
select extract(day from now());
Haftanın gününü verir;
select extract(dow from now());
Yaşı verir;
select firstname, lastname, birthdate, age(now(), birthdate) from person;
Birincil Anahtar ekler;
alter table person add primary key (id);
Birincil Anahtar siler;
alter table person drop constraint person_pkey;
Tekil Anahtar ekler;
alter table person add constraint unique_email unique (email);
Varsayılan ismi ile tekil Anahtar ekler;
alter table person add unique (email);
Tekil Anahtar siler;
alter table person drop constraints unique_email;
Check Constraint ekler;
alter table person add contraint isArchive_constraint check (isArchive = 'true' or isArchive = 'false');
Tabloları birleştirir. Sadece tablolardaki eşleşen kayıtları getirir;
select person.firstname, person.lastname, car.make, car.model, car.price from person
join car
on person.car_id = car.id;
Tabloları birleştirir. Sol taraftaki tablodaki tüm kayıtlar, sağ tablodan eşleşen kayıtlar getirilir;
select person.firstname, person.lastname, car.make, car.model, car.price from person
left join car
on person.car_id = car.id;
Universal Unique IDentifier kullanabilimek için extension oluşturulmalıdır;
-- kurulu extensionları görme;
select * from pg_available_extensions;
-- UUID extension kurulumu;
create extension if not exists "uuid-ossp";
-- UUID kullanımı;
select uuid_generate_v4();