SQL

Veritabanı Yönetim Sistemi (DBMS)

Veritabanı verilerimizi organize bir şekilde depolamımızı sağlayan yapılardı. İşte bu veritabanımızı oluşturmamızı, yönetmemizi ve SQL yardımıyla gerekli gördüğümüz sorguları yapmamızı sağlayan yazılımlara Database Management System veritabanı yönetim sistemi adı verilir.

SQL (Structured Query Language) Nedir?

SQL Türkçe ifadesiyle yapılandırılmış sorgu dili anlamına gelmektedir. Biz SQL sayesinde verilerimizin bulunduğu veritabanı ile iletişime geçeriz.

Daha önce de konuştuğumuz gibi veritabanı yönetim sitemi (DBMS) veritabanını barındıra bir yazılım. Bizler bu yazılım üzerinden verilerimiz için yapmak istediğimiz sorguları SQL dili standartlarına uygun olarak yazmak durumundayız.

Bir Programlama dili olarak SQL

SQL üzerine konuşulurken ilk olarak şu soru akla gelir. SQL bir programlama dili midir? Evet, SQL ilişkisel veritabanı yönetim sistemleri ile ilişki kurmamızı sağlayan bir declarative bildirimsel bir programlama dilidir

SQL Kodları

ortam: pgAdmin 4
database->database_name->Schemas->tables->film(sağ klik)->query tool

SQL komutlarının büyük harf - küçük harf duyarlılıkları yoktur.

SQL boşlukları yok sayar. Kodun devamını alt satıra da yazabiliriz.

Başına iki adet eksi işareti konulan satır yorum satırı olarak algılanır.
--buraya yorum yazılabilir.
Satır içinde ctrl + ö ile satır yorum satırına dönüştürülür

SELECT

query (sorgu)
SELECT title FROM film;: film tablosundaki title kolonunu seç

SELECT title, description FROM film; film tablosundaki title kolonunu ve description kolonunu seç

SELECT * FROM film; film tablosundaki tüm kolonları seç

WHERE

filtreleme işlemi.

SELECT * FROM film WHERE replacement_cost = 12.99; film tablosunda replacement_cost = 12.99; olan filmleri listele.

WHERE sorgusunda string bir koşul kullanılacaksa tek tırnak içine alınır.
SELECT * FROM actor WHERE first_name = 'Penelope'
sorgu büyük-küçük harf duyarlıdır.

Karşılaştırma Operatörleri

datatype < datatype → boolean Less than
datatype > datatype → boolean Greater than
datatype <= datatype → boolean Less than or equal to
datatype >= datatype → boolean Greater than or equal to
datatype = datatype → boolean Equal
datatype <> datatype → boolean Not equal
datatype != datatype → boolean Not equal

Mantıksal Operatörler

and, or, not

AND

her iki yanındaki koşul da doğru ise true döner.

SELECT * FROM actor WHERE first_name = 'Penelope' AND last_name = 'Pinkett' adı Pnelope, soyadı Pinkett olanları döner.

OR

İki yanındakilerden biri doğru ise true döner

SELECT * FROM actor WHERE first_name = 'Penelope' OR first_name = 'Bob' adı Penelope veya Bob olanları döner.

AND sorgusundan sonra OR eklenirse AND koşuluna uyan listeye OR dan sonraki koşula uyan listeyi ekler.

NOT

başına yazıldığı koşula uymayanları listeler.

SELECT * FROM film WHERE NOT rental_rate = 4.99 rental_rate = 4.99 olmayanları listeler.

AND veya OR ile konulan koşulun tamamınına uymayan durum isteniyorsa koşul parantez içine alınır

SELECT * FROM film WHERE NOT (rental_rate = 4.99 AND replacement_cost = 20.99) parantez içindeki koşula uymayanları listeler.

BETWEEN ve IN

WHERE columnName BETWEEN ... AND ...

Aralık belirtmek için kullanılır. sınırlar dahil aralığı verir.

SELECT title, length FROM film WHERE length BETWEEN 90 AND 120
ile
SELECT title, length FROM film WHERE length >= 90 AND length <= 120 ifadesi aynı sonucu verir.

WHERE columnName IN (..,..,..)

kolondaki birden fazla spesifik değeri bulmak için kullanılır

SELECT title, length FROM film WHERE length IN (40,50,60)
ile
SELECT title, length FROM film WHERE length = 40 OR length = 50 OR length = 60 ifadesi aynı sonucu verir

LIKE ve ILIKE

WHERE columnName LIKE ..%

Bir kısmına göre getirmek istediğimiz veriler için kullanılır. İstediğimiz kısmı yazar kalan yere % koyarız.

SELECT * FROM customer WHERE last_name LIKE '%av%' soyadında 'av' olanları listeler.

SELECT * FROM customer WHERE last_name LIKE 'Av%' soyadı 'Av' ile başlayanları listeler.

Büyük-küçük harfe duyarlıdır. Duyarlı olmaması için ILIKE kullanılır.

Sadece tek bir karakter için yer tutucu gerektiğinde alt çizgi "_" kullanılır. 'J_an' bize ilk harfi "J" ikinci harfi herhangi bir karakter ve devamı "an" olan verileri ifade eder.

LIKE yerine ~~ kullanılabilir.

ILIKE yerine ~~* kullanılabilir.

NOT LIKE yerine !~~ kullanılabilir.

NOT ILIKE yerine !~~* kullanılabilir.

DISTINCT ve COUNT

SELECT DISTINCT columnName

Bir sütundaki distinct (farklı) ifadeleri görmek için kullanılır.

SELECT DISTINCT rental_rate FROM film rental_rate kolonunda kaç farklı ifade olduğunu ve bunların ne olduğunu verir.

SELECT DISTINCT ifadesinden sonra birden fazla kolon adı girilirse, kolonların eşleşmesinde farklı olan kombinasyonları gösterir.

SELECT COUNT(*)

Koşulu sağlayan değerleri sayar.

SELECT COUNT(*) FROM actor WHERE first_name = 'Penelope' 'Penelope' adındaki aktörlerin sayısını verir.

COUNT() parantezinin içine kolon adı yazılabilir ancak "*" konulması ile değişiklik oluşturmaz. içerik boş bırakılır veya kolon adı ve * değerinden başka bir şey yazılırsa kod hata verir.

SELECT COUNT(DISTINCT first_name) FROM actor actor tablosunda kaç farklı first_name verisi olduğunu sayar.

SELECT COUNT(DISTINCT(first_name, last_name)) FROM actor actor tablosunda kaç farklı first_name last_name ikilisi olduğunu sayar.

PSQL

postgreSQL in termina arayüzü

Ortam:
başlat -> cmd -> psql ile varsayılan kullanıcıya ulaşırız ki bizim qspl altındaki kullanıcı adımız farklı. ctrl + c ile geri dönebiliriz.

psql yerine psql -U postgres yazarak postgres kullanıcısına ulaşabiliriz. Sonra da şifremizi gireriz.

ekranda yazan postgres=# varsayılan veri tabanı olan postgres veri tabanında olduğumuzu gösterir.

help komutu ile yapabileceklerimizin bir listesi açılır.
\copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit

\h ile tüm sql komutları listelenir.

\? ile psql komutları ile ilgili bilgi var.

ctrl + c ile geri çıkılır

\list veya \l ile veri tabanları listelenir

\connect dvdrental veya \c dvdrental ile dvdrental veri tabanına geçilir. Bu işlemin sonunda ekrandaki yazı dvdrental=# olarak güncellenir.

\dt ile veri tabanında bulunan tablolar listelenir

\d actor ile actor tablosunun detayları görüntülenir.

sql kodları yazılarak istenilen tablo görüntülenebilir.
SELECT * FROM actor WHERE first_name = 'Penelope';

noktalı virgül (;) koymadan enter'a basarsak kodu yazmaya devam ederek alt satıra geçer. En sona noktalı virgül koyup ENTER yapınca da kodu çalıştırır.

ORDER BY

Sıralama yapmak için kullanılır.

SELECT * FROM film ORDER BY title DESC; film tablosunu title kolonuna göre azalan (DESC) sırayla sıralar.

sistem varsayılanı artan sıralamadır. Herhangi bir şey belirtilmezse artan sıralar. Bunu ASC yazarak da sağlayabiliriz. Tersi için DESC yazılır.

Birden fazla koşula göre sıralama yaptığımızda önce ilk yazılana göre sıralar. Eşit olanları ikinci koşula göre kendi içinde sıralar.

SELECT title, rental_rate, length FROM film
ORDER BY rental_rate, length DESC;
önce rental_rate e göre artan sırayla sıralar. rental_rate eşit olanları length değerine göre azalan sıralar.

ORDER BY komutu koşul komutundan sonra yazılır.

SELECT title, rental_rate, length FROM film
WHERE title LIKE 'A%'
ORDER BY rental_rate, length DESC;

Özelleştirilmiş Sıralama

ORDER BY sort_expression1 [ASC | DESC] [NULLS { FIRST | LAST }]
[, sort_expression2 [ASC | DESC] [NULLS { FIRST | LAST }] ...]

NULLS FIRST ve NULLS LAST seçenekleri, sıralama düzeninde boş değerlerin boş olmayan değerlerden önce mi yoksa sonra mı görüneceğini belirlemek için kullanılabilir. Varsayılan olarak, boş değerler boş olmayan herhangi bir değerden daha büyük gibi sıralanır; yani, DESC sırası için varsayılan NULLS FIRST, aksi takdirde NULLS LAST olur.

Hackerrank çözümü
SELECT Name FROM STUDENTS WHERE Marks > 75 ORDER BY RIGHT(Name,3), ID;
Mark > 75 olanları önce adının son 3 karakterine göre listeler sonra aynı olanları ID ye göre listeler.

RIGHT() işlevi, bir diziden (sağdan başlayarak) bir dizi karakter çıkarır.

LIMIT ve OFFSET

LIMIT

kaç adet veri satırının görüneceğini belirler.

SELECT * FROM film
LIMIT 20;

LIMIT en sona yazılır.

SELECT * FROM film
WHERE replacement_cost = 14.99 AND rental_rate = 0.99
ORDER By length DESC
LIMIT 10;

OFFSET

Bazı verileri geçmek için kullanılır.

SELECT * FROM country
OFFSET 6
ilk 6 veriyi geçip 7. veriden başlar.

Aggregate Fonksiyonlar

veri kümelerimizden sonuçlar çıkarabiliriz.

COUNT bir aggregate fonksiyonudur.

MAX

En yüksek değeri verir.

SELECT MAX(replacement_cost) FROM film; replacement_cost kolonundaki en yüksek değeri verir.

MIN

En düşük değeri verir.

SELECT MIN(rental_rate) FROM film; rental_rate kolonundaki en düşük değeri verir.

AVG

Ortalamayı verir

SELECT AVG(rental_rate) FROM film; rental_rate kolonundaki değerlerin ortalamasını verir.

verilen değer virgülden sonra istemediğimz kadar değer içerebilir. Bu durumda ROUND fonksiyonuna AVG fonksiyonu parametre olarak atanır.

SELECT ROUND(AVG(rental_rate), 3) FROM film; AVG den çıkan sonucun virgülden sonraki değerini 3. basamağa yuvarlar.

SUM

verilen kolondaki tüm değerleri toplar.

SELECT SUM(rental_rate) FROM film; rental_rate kolonundaki tüm değerleri toplar.

Bir seferde birden fazla aggregate fonksiyonu çalıştırılabilir.

SELECT MAX(length), MIN(length), SUM(rental_rate) FROM film;

Aggregate fonksiyonu ile sütun eş zamanlı çağırılamaz.

GROUP BY

Aynı sonuçları veri kümesinin içerisinde bulunan farklı gruplarda bulmak için kullanılır

SELECT rental_rate, MAX(length) FROM film
GROUP BY rental_rate
her bir rental_rate değerindeki en uzun length değerini verir.

Gruplamada bir kolonu görebilmek için GROUP BY içinde de olması gerekir.

SELECT rating, rental_rate, MAX(length) FROM film
GROUP BY rental_rate, rating
her bir rental_rate, rating çifti değeri için en uzun filmin uzunluğunu verir.

HAVING

gruplanmış verilere koşul eklemek için kullanılır.

SELECT rental_rate, COUNT(*) FROM film
GROUP BY rental_rate
HAVING COUNT(*) > 325;

ALIAS AS

Sorguda tablo ve sütunlara geçici ad verilmesini sağlar

SELECT first_name AS isim, last_name AS soyisim FROM actor;
veya
SELECT first_name isim, last_name soyisim FROM actor; olarak yazılabilir.

birden fazla karakter eklenecek ise çift tırnak içine alınır.

SELECT first_name "isim deneme", last_name "soyisim deneme" FROM actor;

CONCET

iki sütundaki veriyi birleştirmek için kullanılır.

SELECT CONCAT(first_name, ' ', last_name) "İSİM VE SOYİSİM" FROM actor; first_name ve last_name kolonları aralarına boşluk bırakılarak "İSİM VE SOYİSİM" adlı geçici kolonda birleştirildi.

Tablo Oluşturmak ve Silmek (CREATE - DROP)

Tablo oluştur CREATE TABLE

Söz dizimi:
CREATE TABLE tablo_adı (
sütun_adıveri_tip kısıtlama_adı,
....
sütun_adı veri_tip kısıtlama_adı
);

CREATE TABLE author (
id SERIAL PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
email VARCHAR(100),
birthday DATE
);

veri tipi ve kısıtlama aşağıda detaylı anlatılacak.

veri tipi SERIAL: sayısal değer. kendiliğinden artar.

kısıt adı PRIMARY KEY: her satır için eşsiz değer.

veri tipi VARCHAR(50): 50 karakter alabilir.

kısıt adı NOT NULL: Boş bırakılamaz.

veri tipi DATE: tarih

Veri Eklemek INSERT INTO

INSERT INTO author (first_name, last_name, email, birthday)
VALUES
('Haruki', 'Murakami', 'haruki@murakami.com', '1948-11-07'),
('Sabahattin', 'Ali', 'sabahattin.ali', '1950-05-01'),
('Orhan', 'Pamuk', 'orhan@pamuk.com', '1940-10-16'),
('Halide Edip', 'Adıvar', 'halide@edip.com', '1956-10-25'),
('Zugmunt', 'Bauman', 'zymung@bauman.com', '1953-03-05');

id bilgisinin eklenmesine gerek yok. Her seferinde 1 artarak kendini ekliyor (data tipi SERIAL seçildiği için)

tarih YYYY-AA-GG formatında yazılır.

Referans Alarak Tablo Oluşturmak

CREATE TABLE author2 (LIKE author)

author tablosunu referans alan boş bir tablo oluşturur.

Bir Tablodan Diğerine Veri Taşımak INSERT INTO

INSERT INTO author2 SELECT * FROM author
WHERE first_name = 'Sabahattin';

Tablo Kopyalayarak Yeni Tablo Oluşturmak

CREATE TABLE author3 AS
SELECT * FROM author;

Tablo Silmek DROP TABLE

DROP TABLE author4;
tablo olmadığı durumda: ERROR: table "author4" does not exist SQL state: 42P01 hatası alınır.

DROP TABLE IF EXISTS author4;
tablo olmadığı durumda hata vermez. NOTICE: table "author4" does not exist, skipping DROP TABLE uyarısı alınır.

Verilerle Çalışmak İçin Rasgele veri Oluşturmak

mockaroo.com üzerinden veriler istenildiği gibi seçilir. Dosya tipi SQL olarak ayarlanır. Preview tıklanır. Çıkan ekran kopyalanıp kod olarak SQL programına yapıştırılır.

Verileri Güncellemek - Silmek

UPDATE

veri güncellemek için kullanılır.

Söz dizimi: UPDATE tablo_adı
SET sütun_adı = değer,
sütun_adı = değer,
----
WHERE koşul_adı;

UPDATE author
SET
first_name = 'JRR',
last_name = 'Tolkien',
email = 'jrr@tolkien. com'
WHERE id = 6
RETURNING *;
id = 6 olan satırın first_name, last_name ve email bilgisi güncellendi.
RETURNING * fonksiyonu yapılan son değişikliği ekrana getirir

DELETE

Söz dizimi: DELETE FROM tablo_adı
WHERE koşul_adı;

DELETE FROM author
WHERE id > 10
id değeri 10 dan büyük olan tüm değerleri siler.

PRIMARY KEY - FOREIGN KEY

PRIMARY KEY

Tablodaki satırları diğer satırlardan ayırmak için kullanılır.

Bulundukları kolonda eşsiz bir değer alırlar.

Bir tabloda 1 adet PRIMARY KEY sütunu olur.

PRIMARY KEY sütununudaki veriler değiştirilmezler.

FOREIGN KEY

Başka bir tablodaki veriye referans verir.

Tablo oluşturulurken REFERENCES tablo_adi(kolon_adi) kodu ilgili kolonun bilgilerinin sonuna yazılır.
örnek:
...
author_id INTEGER REFERENCES author(id)
...

veri eklerken referans alındığı diğer tabloda ilgili değer yoksa ...violetes foreign key constraint... hatası verir.

JOIN işlemi ile iki tablo birleştirildiğinde bu referanslar kullanılır.

SELECT * FROM book
JOIN author ON author.id = book.author_id

JOIN işlemi daha sonra detaylı anlatılacaktır.

Veri Tipleri

postgresql.org/docs/current/datatype

Numeric

Integer

smallint (2 bytes): -32768 to +32767
integer (4 bytes): -2147483648 to +2147483647
bigint (8 bytes): -9223372036854775808 to +9223372036854775807

Serial

1 den başlayıp kendiliğinden artarak ilerler. Ayrıca girilmelerine gerek yoktur.

smallserial (2 bytes): 1 to 32767
serial (4 bytes): 1 to 2147483647
bigserial (8 bytes): 1 to 9223372036854775807

Ondalıklı sayılar için

decimal = numeric: virgülden önce 131072 virgülden sonra 16383 rakam alır.
real (float4) (4 bytes): 6 ondalık basamak hassasiyeti
double precision (float8) (8 bytes):15 ondalık basamak hassasiyeti

SELECT (istenilen_veri); söz dizimi ile istenilen_veri yerine yazılan verinin veri tipini kabaca alabiliriz. SELECT (istenilen_veri::veritipi); söz dizimine numeric veri tipini yazarsak veriyi o veri tipinde görüneceği şekilde aktarır.

Karakter

character varying(n) = varchar(n) içine n kadar karakter alabilir. Fazlasını atar. Daha fazla alamaz. Daha az alabilir. Parantez içi boş bırakılırsa istenildiği kadar karakter alır.

character(n), char(n) içine n kadar karakter alabilir. Daha fazla alamaz. Fazlasını atar. Daha az alırsa boşluk ile n e tamamlanır.

text istenildiği kadar karakter alabilir.

Boolean

true, false veya null alır.

true = true, yes, on, 1, t

false = false, no, off, 0, f

Tarih/Zaman

DATE yyyy-aa-gg formatına dönüşür.

TIME saat:dakika:saniye formatında, time without time zone etiketiyle verir.
TIME WITH TIME ZONE saat: dakika:saniye+03.00 formatında, time with time zone etiketiyle verir.

TIMESTAMP yyyy-aa-gg saat:dakika:saniye formatında, time without time zone etiketiyle verir.

CONSTRAINT

veriler için kısıt oluşturan kurallardır.

yukarıda anlatılan PRIMARY KEY ve FOREIGN KEY de constraintdir.

NOT NULL

ilgili kolonun boş olmasını engeller.

Tablo oluşturulurken belirtilebilir.

oluşmuş tabloya özellik olarak eklenebilir. (ALTER kolonu ile.)

ALTER

var olan tabloda değişiklik yapmak için kullanılır.

Söz dizimi
ALTER TABLE tablo_adı
ALTER COLUMN sütun_adı
SET NOT NULL;

kolon içinde zaten NULL var ise hata verir

NULL değerleri bulmak ve silmek için
WHERE user_name IS NULL kullanılır.

ALTER TABLE users
ALTER COLUMN user_name
SET NOT NULL;

NULL bilinmeyen veya eksik veri demektir. Boş string veya 0 NULL değildir.

UNIQUE

Verilerin eşsiz olmasını kısıtını getirir.

Tablo oluştururken yazılabileceği gibi sonrasında ALTAR ile de eklenebilir.

Söz dizimi
ALTER TABLE tablo_adı
ADD UNIQUE(sütun_adı)

Eklenilen tabloda eşsiz olmayan veriler varsa hata verir.

ALTER TABLE users
ADD UNIQUE(email);

CHECK

sütundaki verilere belirli koşullar vermek için kullanılır.

Tablo oluştururken yazılabileceği gibi sonrasında ALTAR ile de eklenebilir.

Söz dizimi:
CREATE TABLE tablo_adı (
kolon_adı veri_tipi CHECK (koşul)
);

veya
ALTER TABLE tablo_adı
ADD CHECK (koşul);

ALTER TABLE users
ADD CHECK (age>18);
age kolonuna 18 den büyük olma koşulu getirir. Özellik eklerken tabloda buna uymayan değer var ise hata mesajı alınır.

CREATE TABLE products (
product_no integer,
name text,
price numeric CHECK (price > 0),
discounted_price numeric CHECK (discounted_price > 0),
CHECK (price > discounted_price) );
price ve discounted_price için 0'dan büyük olma şart ve price için discounted_price'dan büyük olma şartı konulmuş.

CONSTRAINT silmek

ALTER TABLE tablo_adı
DROP CONSTRAINT constraint_adı;
constraint_adı: bu constraint ile uymayan bir veri girilmek istediğinde alınan uyarıdan kopyalanabilir.

ALTER TABLE book
DROP CONSTRAINT book_author_id_fkey;
book tablosundaki "book_author_id_fkey" constraint silindi.

PSQL II

CMD -> psql -U postgres

CREATE DATABASE testdb; ile testdb adında database yaratıldı.

\q ile çıkış yapılır.

ilgili database e direk bağlanmak için:
psql -h localhost -p 5432 -U postgres testdb yazılır.

\c ile başka bir database'e bağlanılabilir.
Örnek
\c dvdrental

CREATE TABLE ... metodu ile yeni tablo oluşturuldu.

\d ile ilgili database içindeki tablolar listelenir.

\d+ ile ilgili database içindeki tablolar detayları ile listelenir.

\d tablo_adı ile adı verilen tablonun özelliği listelenir.

\d+ tablo_adı ile adı verilen tablo özelliği detaylı listelenir.

INSERT INTO (...)
VALUES (...)
ile değerler eklenir.

Hatalı kolon adı var ise:
ALTER TABLE tablo_adı
RENAME COLUMN kolon_adı TO düzeltilmiş_kolon_adı;

ALTER TABLE users
ADD CONSTRAINT kısıt_adı UNIQUE(username);
ile username kolonu UNIQUE kısıtı kısıt_adı adıyla eklenir.

JOIN

Birden fazla tablodaki ifadeyi birleştirmeyi sağlar.

Birden fazla JOIN tipi vardır. Tek başına JOIN yazılırsa varsayılan olarak INNER JOIN işlemi yapılır.

INNER JOIN

Birbiri ile ilişkili iki tablolarda kesişen verileri listelemek için kullanılır.

Simetriktir. Birleşen ve birleştiren tabloların yer değiştirmesi sonucu değiştirmez.

Söz dizimi SELECT sütun_adı, sütun_adı ...
FROM tablo1_adı
INNER JOIN tablo2_adı
ON tablo1_adı.sütun_adı = tablo2_adı.sütun_adı;

SELECT title, first_name, last_name
FROM book
INNER JOIN author
ON book.author_id = author.id;

Örnekte author_id foreign key yapısındadır. Foreign key olmasaydı ancak veriler aynı olsaydı da eşleşebilirdi ancak foreign key olmasının avantajı, yeni veri girilirken referans aldığı tablodan farklı bir değer alamamasıdır.

SELECT komutundan sonra yazılan kolon isimleri tablo_adı.kolon_adı şeklinde de yazılabilir. Her iki tabloda aynı ada sahip kolonlar var ise karışması bu şekilde engellenebilir.

LEFT JOIN

Soldaki tabloyu (tablo1) alır. Sağdaki tablodan (tablo2) eşleşenleri alır. Olmayanları NULL getirir.

Söz dizimi SELECT sütun_adı, sütun_adı ...
FROM tablo1_adı
LEFT JOIN tablo2_adı
ON tablo1_adı.sütun_adı = tablo2_adı.sütun_adı;

SELECT title, first_name, last_name
FROM author LEFT JOIN book
ON author.id = book.author_id;
author tablosundaki değerlerin tamamını alır. book tablosundaki karşılığını alır. book tablosunda karşılığı olmayan yazarların karşısında NULL değeri yer alır.

RIGHT JOIN

LEFT JOIN'in tersi

Sağdaki tabloyu (tablo2) alır. Soldaki tablodan (tablo1) eşleşenleri alır. Olmayanları NULL getirir.

Söz dizimi SELECT sütun_adı, sütun_adı ...
FROM tablo1_adı
RIGHT JOIN tablo2_adı
ON tablo1_adı.sütun_adı = tablo2_adı.sütun_adı;

SELECT title, first_name, last_name
FROM author RIGHT JOIN book
ON author.id = book.author_id;
book tablosundaki değerlerin tamamını alır. author tablosundaki karşılığını alır. author tablosunda karşılığı olmayan yazarların karşısında NULL değeri yer alır.

FULL JOIN

Her iki tablodaki tüm değerleri getirir.

FULL JOIN de INNER JOIN gibi simetriktir.

FULL JOIN = FULL OUTER JOIN

Söz dizimi SELECT sütun_adı, sütun_adı ...
FROM tablo1_adı
FULL JOIN tablo2_adı
ON tablo1_adı.sütun_adı = tablo2_adı.sütun_adı;

Birden Fazla Tabloyu Birleştirmek

Birden fazla JOIN yapısını kullanarak birbiri ile bağlantısı olmayan tabloları, her ikisi ile de bağlantısı olan bir tablo aracılığı ile bağlayabiliriz.

SELECT film.title, film.length, actor.first_name, actor.last_name FROM film
JOIN film_actor ON film.film_id = film_actor.film_id
JOIN actor ON film_actor.actor_id = actor.actor_id
ORDER BY film.length DESC;
birbirlerinde referansı olmayan actor ve film tablosu her ikisinde de referansı olan actor_film tablosu ile bağlanır.

UNION

Birden fazla SELECT sorgusunu tek bir sonuç kümesi olarak göstermek için kullanılır.

Her iki sorguda kesişim var ise onları tek gösterir. Kesişenleri birleştirmemesi için UNION ALL kullanılır.

Birden fazla tablo birleştirirken kolon isimlerini ilk sorgudan alır.

Söz dizimi
(ilk sorgu)
UNION
(ikinci sorgu)

Sorgularda kullanılan sütun sayıları aynı olmalıdır.

Sorguda kullanılan id tipi aynı olmalıdır.

(SELECT id, title FROM book
ORDER BY id
LIMIT 5)
UNION
(SELECT id, email FROM author
ORDER BY id
LIMIT 5);

INTERSECT ve EXCEPT

INTERSECT

Sorguların kesişimlerini gösterir.

Söz dizimi
(ilk sorgu)
INTERSECT
(ikinci sorgu)

Sorgularda kullanılan sütun sayıları aynı olmalıdır.

Sorguda kullanılan id tipi aynı olmalıdır.

(SELECT * FROM book
ORDER BY id
LIMIT 10)
INTERSECT
(SELECT * FROM book
ORDER BY title
LIMIT 10)

EXCEPT

ilk sorguda olan ancak ikincide olmayan verileri getirir.

Söz dizimi
(ilk sorgu)
EXCEPT
(ikinci sorgu)

Sorgularda kullanılan sütun sayıları aynı olmalıdır.

Sorguda kullanılan id tipi aynı olmalıdır.

(SELECT * FROM book
ORDER BY id
LIMIT 10)
EXCEPT
(SELECT * FROM book
ORDER BY title
LIMIT 10)

Alt Sorgu

Bir sorgu içerisinde, o sorgunun ihtiyaç duyduğu veri veya verileri getiren sorgulardır.

SELECT * FROM book
WHERE page_number >= (
SELECT page_number FROM book
WHERE title = 'Chaplin'
)

Önce alt sorgular çalışır. Çıkan sonuca göre ana sorgu çalışır.

Any ve All Operatörleri

bir sütundaki değerin birden fazla değer gelmesi durumunda listelenebilmesi için kullanılırlar. Özellikle alt sorgu durumlarında çok faydalılar.

ANY sorguya OR anlamı katar.

ALL sorguya AND anlamı katar.

ANY

Değerlerden biri bile karşılıyorsa sonuç verir.

SELECT first_name, last_name, id FROM author
WHERE id > ANY
(
SELECT author_id FROM book
WHERE title =
'Reprise' OR title = 'Vesku from Finland (Vesku)'
);
Alt sorgudan gelen id değerleri 3 ve 6. sorgu 3 veya 6 dan büyük olanlar diye okunur. çıktı 3 ten büyük olan tüm değerleri verir.

ALL

Tüm değerler karşılıyorsa sonuç verir

SELECT first_name, last_name, id FROM author
WHERE id > ALL
(
SELECT author_id FROM book
WHERE title =
'Reprise' OR title = 'Vesku from Finland (Vesku)'
);
Alt sorgudan gelen id değerleri 3 ve 6. sorgu 3 ve 6 dan büyük olanlar diye okunur. çıktı sadece 6 dan büyük olan değerleri verir.

Alt Sorgular ve JOIN Kullanımı

Önce JOIN ile tablolar birleştirilip sonra WHERE alt sorgu ile filtreleme yapılabilir.

SELECT film.title, film.length, actor.first_name, actor.last_name FROM film
JOIN film_actor ON film.film_id = film_actor.film_id
JOIN actor ON film_actor.actor_id = actor.actor_id
WHERE film.length > (
SELECT AVG(length) FROM film
)
ORDER BY film.title;
film_actor yardımı ile film ve actor tabloları bağlandı. Alt sorgu ile ortalama film uzunluğu bulundu ve bundan uzun olan filmler listelendi. Film adına göre listelendi.