Kurs
Bu derste, Oracle, MySQL, Microsoft SQL Server vb. tüm veritabanlarında çalışan ANSI (American National Standards Institute) SQL'e odaklanacaksınız! Hadi SQL'e giriş (Structured Query Language) ve bir veri bilimcisinin buna neden ihtiyaç duyduğuyla başlayalım.
SQL ve Veri Bilimi
Bu bölümde, bir veri bilimcisinin neden SQL öğrenmesi gerektiğini göreceksiniz. SQL'in veri bilimci olarak kariyerinizde size nasıl yardımcı olacağına bir göz atalım:
- SQL, veri analisti, BI (İş Zekası) geliştiricisi, programcı, veritabanı programcısı gibi çoğu veri bilimi işinde bir gereklilik haline geldi. SQL, veritabanıyla iletişim kurmanızı ve verinizle çalışmanızı sağlar.
- Tableau veya başka bir veri raporlama ya da görselleştirme yazılımı kullandıysanız, projenizi bir veritabanına nasıl bağladığınızı, yalnızca alanları belirleyerek grafikleri ve görselleri rapora sürükleyip bıraktığınızı ve gerisini yazılımın sizin için yaptığını görmüş olabilirsiniz. Yani veriye ait öznitelikleri sürükleyip bırakırken ya da tıklamalarla tüm işlemleri arayüz üzerinden yaparken, arka planda veritabanıyla etkileşen SQL çalışır. SQL öğrenerek veritabanıyla doğrudan etkileşime geçebilirsiniz.
- SQL, PHP, Java gibi tüm uygulama programlama dilleriyle kullanılabilir. SQL'i uygulamaya entegre ederek kendi veri görselleştirmelerinizi oluşturabilir ya da veritabanından veri çekip web servisleri veya API'lerde kullanmak üzere XML, JSON formatlarına dönüştürebilirsiniz.
- Yıllar içinde Büyük Veri gündeme geldikçe ve günlük hayatımızda veri kullanımı arttıkça, NoSQL veritabanları popüler hale geldi. SQL öğrenmek, veritabanlarında sağlam bir temel oluşturmanıza, ne zaman yapılandırılmış veritabanları ne zaman NoSQL veritabanları kullanılacağını anlamanıza ve aralarındaki farkları takdir etmenize yardımcı olur.
Burada, daha hızlı kod yazmanıza yardımcı olacak SQL ve veritabanlarında kullanılan bazı temel kavram ve terimlere kısaca değineceğim! İlişkisel veritabanının ne olduğunu ve SQL'in ne olduğunu zaten biliyorsanız, koda geçebilirsiniz.
SQL ve Veritabanlarına Giriş
Veritabanı, düzenli bir bilgi koleksiyonudur. Veritabanlarını yönetmek için Veri Tabanı Yönetim Sistemlerine (DBMS) ihtiyaç duyarız. DBMS, istek üzerine veritabanlarındaki verileri saklayan, getiren ve değiştiren bir programdır.
Zaman içinde farklı veritabanı türleri olmuştur: Hiyerarşik, ağ, ilişkisel veritabanları ve şimdi NoSQL veritabanları. İlişkisel Veritabanı, ilişkilerden veya iki boyutlu tablolardan oluşur.

RDBMS'te kullanılan terimler şunlardır:
| Terim | Açıklama |
|---|---|
| Tablo | Tablo, bir RDBMS'in temel depolama yapısıdır. Bir tablo, gerçek dünyadaki bir şeyle ilgili gerekli tüm verileri saklar. Örnek: Çalışanlar. |
| Tek Satır veya Kayıt (Tuple) | Belirli bir çalışana ait gerekli tüm verileri temsil eder. Tablodaki her satır, yinelenen satıra izin vermeyen bir Birincil Anahtar ile tanımlanabilir. |
| Sütun veya Öznitelik | Genellikle bir varlığın özelliğine karşılık gelir |
| Birincil Anahtar | Bir satırı benzersiz olarak tanımlayan bir alan |
| Yabancı Anahtar | Tabloların birbiriyle nasıl ilişkili olduğunu belirleyen bir sütundur. Bir yabancı anahtar, başka bir tablodaki Birincil Anahtara referans verir. |
Birincil ve Yabancı Anahtarları kullanarak birden çok tabloyu ilişkilendirebilirsiniz. İlişkisel bir veritabanındaki her satır bir Birincil Anahtar (PK) ile benzersiz olarak tanımlanır. Yabancı Anahtar (FK) kullanarak başka bir tabloya referans verebilirsiniz. Örneğin:

İlişkisel veritabanlarına Yapılandırılmış Sorgu Dili yani SQL ile erişilir. Her veritabanı, standart SQL olan ANSI SQL'i destekler ancak bazı işlemleri kolaylaştırmak için kendi sözdizimine de sahip olabilir. Bu derste, tüm veritabanlarıyla çalışabilmeniz için ANSI SQL öğreneceksiniz. ANSI SQL beş bölüme ayrılabilir. Hepsini adlandıracağım ancak burada sadece iki bölüme, Veri Getirme ve DML'e odaklanacağız:
- Veri Getirme:
- Select.
- Veri İşleme Dili (DML):
- Insert, Update, Delete, Merge
- Veri Tanımlama Dili (DDL):
- Create, Alter, Drop, Rename, Truncate.
- Veri Denetim Dili (DCL):
- Grant, Revoke.
- İşlem Denetimi:
- Commit, Rollback, Savepoint.
RDBMS için farklı satıcılar vardır. En yaygın ve en çok kullanılanlar şunlardır:
- Oracle (Oracle Corporation)
- Microsoft SQL Server (Microsoft)
- MySQL (Oracle Corporation)
- PostgreSQL (PostgreSQL Global Development Group)
- SQLite (D. Richard Hipp tarafından geliştirildi)
Peki SQL sorgularını nerede çalıştırırsınız? Şuralarda olabilir:
- Veritabanından okuma ve veriyi görüntüleme imkânı veren bir raporlama yazılımı (Örneğin: Tableau, Microsoft BI)
- Veritabanı yönetimi için bir GUI (örneğin: Oracle için TOAD, SQL Developer; MySQL için phpMyAdmin)
- Veritabanına doğrudan konsol tabanlı arayüz (Örneğin: Oracle veritabanı için SQL Plus)
Bir veritabanına giriş kimlik bilgileriniz varsa, sorgularla veya satıcınıza uygun GUI araçlarla veritabanı nesnelerini görüntüleyebilirsiniz.
Bu kadar! Hadi SQL öğrenmeye başlayalım...
SQL Veri Türleri
Bir veritabanındaki her sütunun bir adı, veri türü ve bazen buna bağlı bir boyutu vardır. Veritabanı tasarımcısının işi, gereksinimlere ve veri hacmine göre hangi veri türünün kullanılacağına karar vererek veritabanını tasarlamaktır.
Bir veri bilimcisi olarak, veri türlerine aşina olmanız gerekir; bu da veritabanı fonksiyonlarını doğru kullanmanıza ve sorgularınızı hatasız yazmanıza yardımcı olacaktır. Veritabanındaki her sütun türü için bir veri türü vardır; bir kişinin adı, saklanan metinler, sayılar, veritabanında saklanan bir görsel vb.
Burada Oracle Server, SQL Server ve MySQL Server için temel veri türleri gösterilecektir:

Daha fazla okuma için:
SQL ve Veri Raporlama
Bu derste kullanılacak tüm SQL için aşağıdaki örnek veritabanı şeması:
emp adlı çalışan verilerini tutan ve dept adlı departman kayıtlarını tutan iki tablonun olduğu bir veritabanını ele alın.
emp tablosunda çalışan numarası (empno), çalışan adı (ename), maaş (sal), prim (comm), iş unvanı (job), yönetici id'si (mgr), işe giriş tarihi (hiredate) ve departman numarası (deptno) bulunur. Yönetici de bir çalışandır ve bir çalışan numarası vardır; mgr, işi "MANAGER" olan empno'lardan biridir.
dept tablosunda departman numarası (deptno), departman adı (dname) ve departmanın konumu (loc) bulunur.

Farklı veritabanlarının farklı tarih biçimleri olduğunu unutmayın. Buradaki DD-MON-YY, Oracle veritabanı için varsayılan tarih biçimidir. Microsoft SQL Server ve MySQL için varsayılan biçim YYYY-MM-DD'dir.
Veritabanı tablolarınız farklı olabilir; bu nedenle yalnızca tablo adınızı ve öznitelik adlarınızı uyarlamanız gerekir. Bu derste yalnızca veritabanından okuma yapacak, veri yazma, güncelleme veya yeni tablo/nesne oluşturmayacaksınız. Dolayısıyla veri kaybı veya değişiklik konusunda endişe yok!
Bilgi: Şema, bir kullanıcıya ait tablolar, fonksiyonlar, prosedürler ve görünümler gibi nesnelerin bir koleksiyonudur
Yukarıdaki veritabanı şemasında, emp tablosunun Çalışan varlığı için altı özniteliği olduğunu görebilirsiniz. dept tablosu ise Departman varlığı için üç özniteliğe sahiptir.
SELECT İfadesiyle Veri Getirme
SELECT ifadesi, veritabanından bilgi getirir. Bir SELECT ifadesiyle şunları yapabilirsiniz:
1. Projeksiyon: Sorgunuzun döndürmesini istediğiniz tablodaki sütunları seçmek için SQL'deki projeksiyon yeteneğini kullanabilirsiniz. Gerektiği kadar az ya da çok sütun seçebilirsiniz.
2. Seçim: Sorgu tarafından döndürülmesini istediğiniz satırları seçmek için seçim yeteneğini kullanabilirsiniz.
Gördüğünüz satırları kısıtlamak için çeşitli ölçütler kullanabilirsiniz.
3. Birleştirme: Farklı tablolarda tutulan verileri aralarında bir bağlantı oluşturarak bir araya getirmek için birleştirme özelliğini kullanabilirsiniz.
Temel SELECT ifadesi, hangi tablodan hangi sütunları istediğinizi belirtmenizi sağlar. SELECT kısmı sütun ve ifadeleri, FROM kısmı ise verinin alınacağı tabloyu belirtir.
Örneğin, tüm çalışanların adları ve iş unvanları nedir: SELECT ename, job FROM employee; Yukarıdaki SQL sorgusu, yukarıda tartışılan veritabanı şemasına göre aşağıdaki çıktıyı verir:
| ename | job |
|---|---|
| A | Satış Elemanı |
| B | Yönetici |
| C | Yönetici |
Tüm öznitelikleri ve tüm satırları seçmek için * operatörü kullanılır:
SELECT *
FROM employee;
The output will be:
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
SQL ifadeleri yazmak için bazı ipuçları:
- SQL ifadeleri büyük/küçük harfe duyarlı değildir
- Okunabilirliği artırmak için cümlecikler ayrı satırlara yazılır
- SQL ifadesini bir veya birden fazla satıra yazabilirsiniz
Tarih ve sayısal veriler üzerinde +,-,/,* operatörleriyle ifade oluşturup gereken çıktıyı üretebilirsiniz. Örneğin, tüm çalışanların maaşlarının %20'sini bulmanız istendi. Sorgu şöyle olacaktır:
SELECT ename, sal*(20/100)
FROM employee;
Output:
ENAME SAL*(20/100)
---------- ------------
SMITH 160
ALLEN 320
WARD 250
JONES 595
BLAKE 570
Bilgi:
- İfadeyi netleştirmek için parantez kullanılır
- Bölme ve çarpmanın önceliği toplama ve çıkarmadan daha yüksektir
- Aynı öncelik olduğunda ifade soldan sağa değerlendirilir
NULL değerler veritabanlarında farklı ele alınır. NULL, değerin bilinmediğini ifade eder. NULL ile yapılan her işlem sonucu NULL olur. Farklı veritabanlarının NULL'ları ele almak için farklı fonksiyonları vardır. MySQL, Microsoft SQL Server ve Oracle'da NULL'ları ele almak için ortak bir fonksiyon vardır.
SELECT ename, sal+COALESCE(comm,0)
FROM employee;
Output:
ENAME SAL+COALESCE(COMM,0)
---------- --------------------
SMITH 800
ALLEN 1900
WARD 1750
JONES 2975
BLAKE 2850
Sütun Takma Adları ve Birleştirme
Yukarıdaki çıktılarda, sütun adının seçtiğiniz veritabanı alanı veya ifadeyle aynı olduğunu görebilirsiniz. Bazen, rapor üretirken başlıklara kendi adlarınızı vermek istersiniz. Bunu takma adlar kullanarak yapabilirsiniz.
SELECT ename AS "Emp Name", sal*(20/100) as "20% of Salary"
FROM employee;
Output:
Emp Name 20% of Salary
---------- ------------
SMITH 160
ALLEN 320
WARD 250
JONES 595
BLAKE 570
Boşluk içeren bir takma ad veriyorsanız çift tırnak kullanmalısınız. Aksi halde AS'ten sonra çift tırnak gerekmez. Bazen AS anahtar sözcüğünü de atlayabilirsiniz.
Çıktınızı birleştirme ile biçimlendirebilirsiniz. Kendi ifadelerinizi çıktıya, veritabanı satıcısına bağlı olarak CONCAT fonksiyonu veya || ya da + gibi operatörlerle ekleyebilirsiniz:
- Oracle CONCAT() ve || destekler ancak CONCAT() yalnızca iki argüman alır. İç içe CONCAT() kullanmanız gerekir.
- MySQL CONCAT() kullanır
- Microsoft SQL Server '+' operatörünü ve CONCAT()'ı kullanır.
Oracle: SELECT '20% of salary of '||ename||' is '||sal*(20/100) as "20% of salary" FROM employee;
SELECT CONCAT(CONCAT('20% of salary of',ename),CONCAT(' is ',sal(20/100))) as "20% of salary" FROM employee; MySQL ve Microsoft SQL Server: SELECT CONCAT('20% of salary of ',ename,' is ',sal(20/100)) as "20% of salary" FROM employee; Tümü aynı çıktıyı verir:
20% of salary
-----------------------------------------------------------------------
20% of salary of SMITH is 160
20% of salary of ALLEN is 320
20% of salary of WARD is 250
20% of salary of JONES is 595
20% of salary of BLAKE is 570
DISTINCT ile Tekrarlanan Satırları Eleme
SELECT deptno
FROM employee;
Above query will result in:
DEPTNO
----------
20
30
30
20
30
Burada 20 ve 30 deptno değerleri tekrarlanmaktadır. SELECT kısmında DISTINCT anahtar sözcüğünü kullanarak bu tür satırları eleyebilirsiniz.
SELECT distinct ename, deptno, job
FROM employee;
DEPTNO
----------
30
20
Veriyi Kısıtlama ve Sıralama
WHERE cümleciği, veriyi belirli bir koşula göre filtrelemek için kullanılır.
İşi CLERK olan tüm çalışanları bulun:
SELECT ename, job
FROM employee
WHERE job='CLERK';
ENAME JOB
---------- ---------
SMITH CLERK
Sonuçlarınızı farklı koşullarla filtrelemek isteyebilirsiniz. Bunun için operatörler, koşul sembolleri ve belirli anahtar sözcükler kullanılır:

=,<>,!=,>=,<=,>,< kullanımı, yukarıdaki sorguda = işaretinin kullanımında görüldüğü gibi basittir.
AND & OR sözdizimi: SELECT column1, column2,.. FROM table_name WHERE condition1 AND condition2 AND condition 3...;
SELECT column1, column2,.. FROM table_name WHERE condition1 OR condition2 OR condition 3...; İşi MANAGER olan ve 30 numaralı departmana bağlı çalışanların adlarını bulun:
SELECT ename
FROM employee
WHERE job='MANAGER' AND deptno=30;
ENAME
----------
BLAKE
SELECT ename
FROM employee
WHERE job='MANAGER' OR deptno=30;
ENAME
----------
ALLEN
WARD
JONES
BLAKE
NOT sözdizimi: SELECT column1, column2, ... FROM table_name WHERE NOT condition; İşi SALESMAN olmayan tüm çalışanları bulun:
SELECT ename, job
from employee
WHERE NOT job='SALESMAN';
ENAME JOB
---------- ---------
SMITH CLERK
JONES MANAGER
BLAKE MANAGER
AND, OR ve NOT operatörlerinin tümünü kullanarak karmaşık koşullar kurabilirsiniz. Öncelik sırası şöyledir:
- NOT
- AND
- OR
İşi CLERK olmayan ve 20 numaralı departmana bağlı tüm çalışanları bulun:
SELECT ename, job
from employee
WHERE NOT job='SALESMAN' AND sal>800;
ENAME JOB
---------- ---------
JONES MANAGER
BLAKE MANAGER
Burada önce NOT, sonra AND değerlendirilmiştir.
Diğer kullanışlı koşul operatörleri aşağıda gösterilmiştir:
BETWEEN...AND:
SELECT *
FROM employee
WHERE sal BETWEEN 1000 AND 2000;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
LIKE:
LIKE, desendeki karakter sayısını temsil etmek için yüzde % ve alt çizgi _ olmak üzere iki joker karakter kullanır.
- % sıfır, bir veya birden çok karakter anlamına gelir
- %M%: Herhangi bir konumda M geçen tüm dizgiler
- M%: M ile başlayan değerler
- %M: M ile biten değerler
- M%A: M ile başlayıp A ile biten değerler
Kalıplar büyük/küçük harfe duyarlıdır.
- _ bilinen karakterin öncesinde veya sonrasında kaç bilinmeyen karakter olduğunu belirtir. Bir alt çizgi bir karakterdir.
- _r%: İkinci konumda r olan değerler.
Adı 'B' ile başlayan tüm çalışanların adlarını alın:
SELECT *
FROM employee
WHERE ename LIKE 'B%';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
Adı 'A' ile başlayıp 'A'dan sonra herhangi bir konumda 'E' içeren tüm çalışanların adlarını alın:
SELECT *
FROM employee
WHERE ename LIKE 'A%E%';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
IN(value1,value2, value3,..):
IN() fonksiyonu bir veya birden çok değer alabilir ve WHERE cümleciğinde bir sütunu parantez içindeki verilere eşlemenize olanak tanır:
SELECT ename, job, hiredate
FROM employee
WHERE job IN ('CLERK','SALESMAN');
ENAME JOB HIREDATE
---------- --------- ---------
SMITH CLERK 17-DEC-80
ALLEN SALESMAN 20-FEB-81
WARD SALESMAN 22-FEB-81
IN() içinde değer döndüren bir SELECT ifadesi de kullanabilirsiniz. Örneğin:
SELECT ename, job, hiredate
FROM employee
WHERE deptno IN (select deptno FROM department WHERE loc='CHICAGO');
ENAME JOB HIREDATE
---------- --------- ---------
ALLEN SALESMAN 20-FEB-81
WARD SALESMAN 22-FEB-81
BLAKE MANAGER 01-MAY-81
IN() içindeki SELECT ifadesine alt sorgu da denir. Alt sorgular hakkında daha fazlasını bu derste ileride göreceksiniz!
IS NULL:
IS NULL, bir öznitelikte NULL değer olup olmadığını kontrol etmek için kullanılır. Örneğin, primi olmayan tüm çalışanları bulun:
SELECT ename, job, sal
FROM employee
WHERE comm IS NULL;
ENAME JOB SAL
---------- --------- ----------
SMITH CLERK 800
JONES MANAGER 2975
BLAKE MANAGER 2850
Prim almış çalışanların adlarını almak istiyorsanız IS NOT NULL kullanırsınız:
SELECT ename, job, sal, comm
FROM employee
WHERE comm IS NOT NULL;
ENAME JOB SAL COMM
---------- --------- ---------- ----------
ALLEN SALESMAN 1600 300
WARD SALESMAN 1250 500
Tarih sütunlarını kullanarak sonuçları filtrelemek için varsayılan tarih biçimini kullanmanız gerekir. Başka bir biçim kullanılacaksa, ileride göreceğiniz tarih fonksiyonlarını uygulamanız gerekir. 21 Şubat 1981'den sonra işe alınan tüm çalışanları bulun:
(Burada Oracle varsayılan tarih biçimi kullanılmıştır)
SELECT ename, job, sal, comm
FROM employee
WHERE hiredate>'21-FEB-81';
ENAME JOB SAL COMM
---------- --------- ---------- ----------
WARD SALESMAN 1250 500
JONES MANAGER 2975
BLAKE MANAGER 2850
Yukarıdaki tüm operatörlerin bir kombinasyonunu kullanarak karmaşık koşullu ifadeler oluşturabilirsiniz; ancak öncelik sırasına dikkat etmelisiniz. Öncelik, operatörlerin değerlendirilme sırasıdır. Farklı veritabanları için öncelik kuralları şunlardır:
- Microsoft Transact-SQL operatör önceliği
- Oracle 10g koşul önceliği
- Oracle MySQL 9 operatör önceliği
- PostgreSQL operatör önceliği
- SQLite operatör önceliği
Koşullarda kullanılabilen iki faydalı fonksiyon vardır: ANY(), ALL(). Örneğin:
SELECT ename, job, sal, comm FROM employee WHERE deptno=ANY(SELECT deptno from dept WHERE loc='NEW YORK');
SELECT ename, job, sal, comm FROM employee WHERE deptno=ALL(SELECT deptno from dept WHERE dname='SALES');
Yukarıdaki örneklerde alt sorguların kullanımına dikkat edin. Alt sorgular hakkında daha fazlasını ileride öğreneceksiniz.
ORDER BY Cümleciği ile Sonuçları Sıralama
Sonuçlarınızı tabloda yer alan herhangi bir özniteliğe göre artan (ASC) veya azalan (DESC) şekilde sıralayabilirsiniz. SELECT kısmında belirttiğiniz takma adlara göre de sıralayabilirsiniz:
SELECT ename, job, sal, comm
FROM employee
WHERE hiredate>'21-FEB-81'
ORDER BY sal desc;
ENAME JOB SAL COMM
---------- --------- ---------- ----------
JONES MANAGER 2975
BLAKE MANAGER 2850
WARD SALESMAN 1250 500
Not: Varsayılan sıralama artandır ve ASC ile gösterilir; ASC belirtmeniz gerekmez.
SELECT ename, job, sal, comm
FROM employee
WHERE hiredate>'21-FEB-81'
ORDER BY sal;
ENAME JOB SAL COMM
---------- --------- ---------- ----------
WARD SALESMAN 1250 500
BLAKE MANAGER 2850
JONES MANAGER 2975
ORDER BY cümleciğinde birden fazla sütun belirtebilirsiniz; yürütme, belirtilen sütun sırasına göre olur. Örneğin, çalışanları önce deptno'ya göre artan, ardından ada göre azalan sıralayın:
SELECT ename, job, sal, comm, deptno
FROM employee
WHERE hiredate>'21-FEB-81'
ORDER BY deptno ASC, ename DESC;
ENAME JOB SAL COMM DEPTNO
---------- --------- ---------- ---------- ----------
JONES MANAGER 2975 20
WARD SALESMAN 1250 500 30
BLAKE MANAGER 2850 30
Çıktıyı Özelleştirmek için Tek Satırlı Fonksiyonları Kullanma
Tüm RDBMS'lerde, bir dizedeki uzunluğu bulma, dizeleri birleştirme, biçimlendirme fonksiyonları, matematiksel fonksiyonlar gibi yaygın görevleri yapmanıza yardımcı olacak çok sayıda fonksiyon vardır. SQL'de iki tür satır fonksiyonu bulunur:
- Tek Satırlı fonksiyonlar
- Çok Satırlı fonksiyonlar
Tek Satırlı Fonksiyonlar:
Bu fonksiyonlar her satıra uygulanır ve satır başına bir sonuç döndürür. CONCAT(), bir karakter işleme tek satırlı fonksiyondur. SELECT, WHERE ve ORDER BY kısımlarında kullanılabilirler. Tüm RDBMS'lerde şu alanlarda tek satırlı fonksiyonlar vardır:
- Karakter İşleme fonksiyonları
- Tarih ve Saat fonksiyonları
- Sayı Fonksiyonları
- Dönüşüm Fonksiyonları
Farklı veritabanlarında aynı işlevsellik için farklı fonksiyon adları olabilir. Burada Microsoft SQL Server, Oracle ve MySQL arasında ortak ve kullanışlı fonksiyonlardan bahsedeceğim. Bazılarını yukarıdaki bölümlerde zaten öğrendiniz. Bu bölümün sonunda, daha fazla pratik için bu satıcılardaki fonksiyonların tam listesine bağlantılar bulacaksınız.
Her kategoriye göz atalım:
Karakter İşleme Fonksiyonları
LOWER(): Dizgeyi küçük harfe dönüştürür.
SELECT lower(ename) as ename
FROM employee;
ENAME
----------
smith
allen
ward
jones
blake
UPPER(): Dizgeyi büyük harfe dönüştürür.
SELECT upper(ename) as ename
FROM employee;
ENAME
----------
SMITH
ALLEN
WARD
JONES
BLAKE
SUBSTR()[Oracle, MySQL]: Belirtilen şekilde alt dize döndürür SUBSTR(string, başlangıç-konumu, uzunluk)
SUBSTRING()[SQL Server]: Belirtilen şekilde alt dize döndürür SUBSTRING(string, başlangıç-konumu, uzunluk).
SELECT SUBSTR(ename,2,3) as substr_ename FROM employee;
SQL Server için fonksiyon adını SUBSTRING ile değiştirin.
SUBSTR_ENAME ------------ MIT LLE ARD ONE LAK
LENGTH()[Oracle, MySQL]: Parantez içindeki dizgenin uzunluğunu döndürür
LEN()[SQL Server]: Parantez içindeki dizgenin uzunluğunu döndürür
SELECT LENGTH(ename) as len_ename FROM employee;
SQL Server için fonksiyon adını LEN ile değiştirin.
LEN_ENAME
----------
5
5
4
5
5
Bir dizgeyi sola veya sağa doldurma, değiştirme gibi fonksiyonlar için sözdizimi veritabanlarına göre değişir. Üç veritabanı satıcısı için Karakter ve Dizi fonksiyonları listesi:
Sayı Fonksiyonları
| Fonksiyon adı | İşlev |
|---|---|
| ROUND(m,n): | m değerini belirtilen n ondalık basamağa yuvarlar. |
| ABS(m,n): | Bir sayının mutlak değerini döndürür |
| FLOOR(n): | FLOOR, n'e eşit veya n'den küçük en büyük tam sayıyı döndürür. |
| MOD(m,n): | m'nin n'ye bölümünden kalanı döndürür (SQL Server'da yoktur, % operatörü kullanılır: 35 % 6) |
Oracle:
SELECT ROUND(45.926,2),MOD(11,5),FLOOR(34.4),ABS(-24) from dual;
OUTPUT:
ROUND(45.926,2) MOD(11,5) FLOOR(34.4) ABS(-24)
--------------- ---------- ----------- ----------
45.93 1 34 24
MySQL:
SELECT ROUND(45.926,2),MOD(11,5),FLOOR(34.4),ABS(-24);
SQL Server:
SELECT ROUND(45.926,2) as round,11%5 as mod, FLOOR(34.4) as floor,ABS(-24) as abs;
Üç veritabanı satıcısı için Sayısal fonksiyonların listesi:
Dönüşüm Fonksiyonları
Dönüşüm fonksiyonları, bir veri türünü diğerine dönüştürmek için kullanılır. Dönüşüm fonksiyonları sunucudan sunucuya değişir. Burada, to_char fonksiyonunu kullanan bir Oracle sunucu sorgusu örneği vereceğim. Bu, dönüşüm fonksiyonlarını çıktıyı özelleştirmek için nasıl kullanabileceğinizi anlamanıza yardımcı olacaktır. Oracle'ın varsayılan tarih biçimi DD-MON-YY'dir
SELECT ename, to_char(hiredate,'DD, MONTH YYYY') as Hiredate, to_char(hiredate,'DY') as Day
from employee;
ENAME Hiredate DAY
---------- -------------------------------------------- ------------
SMITH 17,DECEMBER 1980 WED
ALLEN 20,FEBRUARY 1981 FRI
WARD 22,FEBRUARY 1981 SUN
JONES 02,APRIL 1981 THU
BLAKE 01,MAY 1981 FRI
Her veritabanı sunucusu için çok sayıda dönüşüm fonksiyonu vardır. Daha fazla okuma ve keşif için farklı veritabanı sunucularının dönüşüm fonksiyonlarına bağlantılar aşağıdadır:
- Microsoft SQL Server dönüşüm fonksiyonları
- Oracle sunucu dönüşüm fonksiyonları
- MySQL dönüşüm fonksiyonları
Tarih ve Saat Fonksiyonları
Tarih ve saat fonksiyonları; gün ekleme, iki tarih arasındaki ayları hesaplama vb. işlemlerle tarihi değiştirmenize olanak tanır. Bu tür fonksiyonlar rapor üretirken faydalıdır. Tarih fonksiyonları da veritabanlarına göre değişir. Aynı işlevselliği sağlayan bir fonksiyon başka bir veritabanında farklı bir ada sahip olabilir. Burada birkaç örneğe bakacak ve ardından en yaygın üç veritabanı olan Oracle, SQL Server ve MySQL'in tarih fonksiyonlarına bağlantılar vereceğim. Bu örnekleri veritabanı sunucunuzda denemeye başlayın!

- Oracle Tarih ve Saat fonksiyonları
- MySQL Tarih ve Saat fonksiyonları
- Microsoft SQL Server Tarih ve Saat fonksiyonları
SQL Sonuçlarını Gruplama
Gruplama fonksiyonları veya Çok Satırlı fonksiyonlar, gruplara uygulanır ve grup başına tek bir sonuç döndürür. Çeyrek başına toplam satış, belirli bir dönem boyunca bir ürünün ortalama fiyatı, şirketinizin bu ay aldığı en yüksek yatırım gibi bilgileri bulmak istediğinizde grup fonksiyonlarına ihtiyaç duyarsınız.
Grup Fonksiyonlarını Kullanarak Toplulaştırılmış Veriyi Raporlama
GROUP BY cümleciği, sıklıkla COUNT, MAX, MIN, AVG ve SUM gibi fonksiyonlarla birlikte sonuçları gruplamak için kullanılır. GROUP BY sözdizimi şöyledir:
SELECT column_name(s) FROM table_name WHERE condition GROUP BY column_name(s) HAVING condition ORDER BY column_name(s);
GROUP BY cümleciği için akılda tutulması gerekenler:
- Takma adlar GROUP BY cümleciğinde kullanılamaz
- WHERE cümleciği her zaman GROUP BY'dan önce gelir
- HAVING cümleciği GROUP BY'dan sonra gelir ve grup fonksiyonlarına koşul uygular
- ORDER BY cümleciği her zaman en sonda gelir
COUNT, koşula bağlı veya koşulsuz olarak satır sayısını sayan bir grup fonksiyonudur. COUNT fonksiyonu null değerleri yok sayar.
Adı 'A' ile başlayan tüm çalışanları sayın:
SELECT count(ename)
FROM employee
WHERE ename LIKE 'A%';
Output:
COUNT(ENAME)
------------
1
employee tablosunda toplam maaş, ortalama maaş, en düşük maaş ve en yüksek maaşı bulun:
SELECT sum(sal) as "TOTAL SAL", avg(sal) as "AVG SAL", min(sal) as "MIN SAL", max(sal) as "MAX SAL"
FROM employee;
TOTAL SAL AVG SAL MIN SAL MAX SAL
---------- ---------- ---------- ----------
9475 1895 800 2975
Yukarıdaki sonucu her departman için gruplamak isteyebilirsiniz:
SELECT sum(sal) as "TOTAL SAL", avg(sal) as "AVG SAL", min(sal) as "MIN SAL", max(sal) as "MAX SAL", deptno
FROM employee
GROUP BY deptno;
TOTAL SAL AVG SAL MIN SAL MAX SAL DEPTNO
---------- ---------- ---------- ---------- ----------
5700 1900 1250 2850 30
3775 1887.5 800 2975 20
Ayrıca aşağıdaki fonksiyonları kullanarak Varyans ve Standart Sapmayı da hesaplayabilirsiniz:
| Oracle ve MySQL için | MS SQL SERVER |
|---|---|
| SELECT STDDEV(column_name) FROM table_name; | SELECT STDEV(column_name) FROM table_name; |
| SELECT VARIANCE(column_name) FROM table_name; | SELECT VAR(column_name) FROM table_name; |
Sonuçları birden fazla sütuna göre de gruplandırabilirsiniz.
Her departman içindeki her iş unvanı için maaş toplamını bulun:
SELECT sum(sal) as "TOTAL SAL", deptno, job
FROM employee
GROUP BY deptno, job;
TOTAL SAL DEPTNO JOB
---------- ---------- ---------
800 20 CLERK
2850 30 SALESMAN
2975 20 MANAGER
2850 30 MANAGER
HAVING cümleciğini kullanarak grup sonuçlarını kısıtlayabilirsiniz. Bu, yalnızca grup koşulları için kullanılır.
Not: Grup fonksiyonlarına koşul uygulamak için WHERE kullanmayın.
SELECT sum(sal) as "TOTAL SAL", deptno, job
FROM employee
GROUP BY deptno, job
HAVING sum(sal)>1000
ORDER BY sum(sal);
TOTAL SAL DEPTNO JOB
---------- ---------- ---------
2850 30 SALESMAN
2850 30 MANAGER
2975 20 MANAGER
Birden Çok Tablodan Veri Gösterme
Bu bölümde şu birleştirmeler ele alınacaktır:
- Kartezyen çarpım/Çapraz birleştirme
- İç birleştirme/EquiJoin
- Doğal birleştirme
- Dış Birleştirmeler (Sol, Sağ, Tam)
- Kendiliğinden Birleştirme (Self Join)
Birden çok tablodan veri alan raporlar göstermeniz gerekecektir. Aşağıdaki örneğe bakın:

Yukarıdaki gibi bir rapor üretmek için employee ve department tablolarını ilişkilendirip her ikisinden veri almalısınız. Bunun için SQL'de Join'ler kullanılır.
Kartezyen Çarpım/Çapraz Birleştirme:
Kartezyen çarpım, R ilişkisine ait her kaydın S ilişkisindeki her kayıtla kombinasyon oluşturmasıyla oluşur.

Kartezyen çarpım işlemi, Çapraz Birleştirme olarak da adlandırılır ve iki tabloyu çarparak, iki tablodan tüm olası kayıt çiftlerinden oluşan bir ilişki oluşturur. Örneğin R ilişkisinde M öznitelikli I kayıt ve S ilişkisinde N öznitelikli J kayıt varsa, kartezyen çarpım M+N öznitelikli IxJ kayıt içerir. Kartezyen çarpım, SQL uyumlu CROSS JOIN ile de oluşturulabilir.
SELECT empno, ename, dname
FROM employee, department;
OR
SELECT empno, ename, dname
FROM employee CROSS JOIN department;
EMPNO ENAME DNAME
---------- ---------- --------------
7369 SMITH ACCOUNTING
7499 ALLEN ACCOUNTING
7521 WARD ACCOUNTING
7566 JONES ACCOUNTING
7698 BLAKE ACCOUNTING
7369 SMITH RESEARCH
7499 ALLEN RESEARCH
7521 WARD RESEARCH
7566 JONES RESEARCH
7698 BLAKE RESEARCH
7369 SMITH SALES
EMPNO ENAME DNAME
---------- ---------- --------------
7499 ALLEN SALES
7521 WARD SALES
7566 JONES SALES
7698 BLAKE SALES
15 satır seçildi.
employee tablosu 5 kayıt, department tablosu 3 kayıt içerdiğinden kartezyen çarpım 5x3=15 satırdan oluşur. Kartezyen çarpım şu durumlarda oluşur:
- Birleştirme koşulu kullanılmadığında
- Birleştirme koşulu geçersiz veya doğru oluşturulmadığında
İki veya daha fazla tablodan veri gerekli olduğunda, ilgili tabloları birbirine bağlayan ortak öznitelikler kullanılarak bir birleştirme koşulu oluşturulur. Bunlar çoğunlukla Birincil Anahtar ve Yabancı Anahtardır.
Kartezyen çarpımlar, test amaçlarıyla büyük miktarda veriyi simüle etmek için kullanılır.
*İç Birleştirme/EquiJoin:
İç Birleştirme veya Equijoin (Oracle geliştiricilerinin kullandığı terim), iki veya daha fazla tabloyu birincil ve yabancı anahtar ilişkilerini kullanarak birleştirir:
SELECT ename, dname
FROM employee e,department d
WHERE e.deptno=d.deptno;
OR
SELECT ename, dname
FROM employee e
JOIN department d
ON e.deptno=d.deptno;
ENAME DNAME
---------- --------------
SMITH RESEARCH
ALLEN SALES
WARD SALES
JONES RESEARCH
BLAKE SALES
Yukarıdaki sorguda deptno, department tablosunda birincil anahtar, employee tablosunda yabancı anahtardır. Yukarıdaki bölümlerde tartışıldığı gibi mantıksal işlemlerle ek koşullar ekleyebilirsiniz.
JOIN'ler için hatırlanacak noktalar:
- Aynı sütun adı birden fazla tabloda görünüyorsa, sütun adı tablo adıyla öneklenmelidir. Aksi durumda da netlik için bunu yapmak iyi bir pratiktir.
- n tabloyu birleştirmek için en az n-1 birleştirme koşulu gerekir. Örneğin, dört tabloyu birleştirmek için en az üç birleştirme gereklidir.
Tablo takma adları: FROM employee e, department d örneğindeki gibi e ve d gibi tablo takma adları, özellikle aynı sütunlar birden fazla tabloda bulunduğunda, veritabanı motorunun sütunun hangi tablodan geldiğini kolayca belirlemesini sağlar; aksi halde belirsiz sütun hatası verilir. Ayrıca uzun tablo adlarını tekrar tekrar yazmaktan tasarruf sağlar.
Eşitlik dışı birleştirmeler (nonequi-join) de oluşturabilirsiniz; bu birleştirmeler, eşitlik dışındaki koşullara göre tabloları birleştirir. Maaşa göre çalışanın derecesi bilgisini içeren salgrade adlı başka bir tablo düşünün:

Her çalışanın maaşına göre derecesini bulmak istiyorsunuz; dereceler salgrade tablosunda, maaş ise employee tablosunda saklanır:
SELECT e.ename, e.sal, s.grade
FROM employee e, salgrade s
WHERE e.sal between s.losal AND s.hisal;
ENAME SAL GRADE
---------- ---------- ----------
JONES 2975 4
BLAKE 2850 4
ALLEN 1600 3
WARD 1250 2
SMITH 800 1
Örnek: Sizden çalışanların adını, maaşını, derecesini ve departman adını vermeniz isteniyor. Bildiğiniz gibi maaş employee tablosunda, dereceler salgrade tablosunda ve departman adı department tablosunda tutulduğundan üç tabloyu birlikte birleştirmeniz gerekir:
SELECT e.ename, e.sal, d.dname, s.grade FROM employee e, department d, salgrade s WHERE e.deptno=d.deptno AND e.sal BETWEEN s.losal AND s.hisal; Output: ENAME SAL DNAME GRADE ---------- ---------- -------------- ---------- JONES 2975 RESEARCH 4 BLAKE 2850 SALES 4 ALLEN 1600 SALES 3 WARD 1250 SALES 2 SMITH 800 RESEARCH 1
Yukarıdaki örnekte, üç tablo yer almakta ve iki birleştirme koşulu vardır; bunlardan biri eşitlik dışı birleştirmedir.
Doğal Birleştirme:
Doğal birleştirmeler, aynı ada sahip sütunları eşleştirerek tabloların otomatik olarak birleştirilmesine olanak tanır. Aynı ada sahip sütunlar eşleşir ancak veri türleri farklıysa hata oluşur.
Sözdizimi: SELECT FROM table1 NATURAL JOIN table2; SELECT FROM employee NATURAL JOIN department; Doğal birleştirme eşleşen sütunları kendisi bulduğundan, aynı ada sahip birden çok sütun bulabilir ancak veri türleri farklı olabilir; bu da hataya yol açar. Bu nedenle eşitlik birleştirmesi yapılacak sütunları belirtmek için USING cümleciği kullanılır.
Not: NATURAL JOIN ve USING iki farklı cümleciğidir ve ayrı kullanılır. Biri varken diğeri kullanılamaz; birbirini dışlar.
SELECT e.ename, d.dname, e.sal FROM employee e JOIN department d USING (deptno) WHERE deptno=20; output: ENAME DNAME SAL ---------- -------------- ---------- SMITH RESEARCH 800 JONES RESEARCH 2975
USING cümleciğindeki sütunlar, SQL ifadesinin hiçbir yerinde tablo adı veya tablo öneki kullanılarak yazılamaz. Örneğin aşağıdaki kullanım yanlıştır:
SELECT e.ename, d.dname, e.sal FROM employee e JOIN department d USING (d.deptno) WHERE d.deptno=20;
d.deptno yanlıştır. Yalnızca deptno kullanılmalıdır. Dış Birleştirmeler:
Üç tür dış birleştirme vardır:
- Sol Dış Birleştirme: İki tablo arasındaki birleştirmenin, iç birleştirme sonuçlarının yanı sıra sol tablonun eşleşmeyen satırlarını da döndürmesine LEFT OUTER JOIN denir
- Sağ Dış Birleştirme: İki tablo arasındaki birleştirmenin, iç birleştirme sonuçlarının yanı sıra sağ tablonun eşleşmeyen satırlarını da döndürmesine RIGHT OUTER JOIN denir.
- Tam Dış Birleştirme: İki tablo arasındaki birleştirmenin, iç birleştirme sonuçlarının yanı sıra her iki tablonun da eşleşmeyen satırlarını döndürmesine FULL OUTER JOIN denir.
Bunları tek tek görelim:
SELECT e.ename, s.grade FROM salgrade s LEFT OUTER JOIN employee e ON e.sal BETWEEN s.losal AND s.hisal; Output: ENAME DEPTNO DNAME ---------- ---------- -------------- SMITH 20 RESEARCH JONES 20 RESEARCH ALLEN 30 SALES WARD 30 SALES BLAKE 30 SALES.sal BETWEEN s.losal AND s.hisal; Output: ENAME DEPTNO DNAME ---------- ---------- -------------- SMITH 20 RESEARCH JONES 20 RESEARCH ALLEN 30 SALES WARD 30 SALES BLAKE 30 SALESSELECT e.ename, d.deptno, d.dname
FROM employee e RIGHT OUTER JOIN department d
ON e.deptno=d.deptno;
output:
ENAME DEPTNO DNAME
---------- ---------- --------------
SMITH 20 RESEARCH
ALLEN 30 SALES
WARD 30 SALES
JONES 20 RESEARCH
BLAKE 30 SALES
10 ACCOUNTINGSELECT e.ename, d.deptno, d.dname
FROM employee e FULL OUTER JOIN department d
ON e.deptno=d.deptno;
Output:
ENAME DEPTNO DNAME
---------- ---------- --------------
SMITH 20 RESEARCH
ALLEN 30 SALES
WARD 30 SALES
JONES 20 RESEARCH
BLAKE 30 SALES
10 ACCOUNTING
department tablosunda deptno 10 için eşleşmeyen bir satır vardı ve employee tablosu için eşleşmeyen satır bulunmadı. Benzer şekilde, salgrade'de 5. derece için eşleşmeyen bir satır var.
Kendiliğinden Birleştirme (Self-Join):
Bir tabloyu kendisiyle birleştirmek istediğiniz durumlar olabilir. Örneğin, employee tablosu, yöneticiler dahil tüm çalışanlara ilişkin bilgileri içerir (Yukarıdaki employee tablosuna bakın). Çalışanları ve yöneticilerini bulmanız istenirse, tabloyu kendisiyle birleştirmeniz gerekir. Self-Join şu şekilde yapılır:
SELECT e.ename as Employee, m.ename as Manager
FROM employee e, employee m
WHERE e.mgr=m.empno;
EMPLOYEE MANAGER
---------- ----------
ALLEN BLAKE
WARD BLAKE
Sorguları Çözmek için Alt Sorgular Kullanma
Alt sorgu, bir sorgunun içinde yer alan başka bir sorgudur. Büyük sorguları parçalara ayırmak için kullanışlıdır. Alt sorgular iç içe olabilir ve SQL'in şu kısımlarında kullanılabilir:
- WHERE
- FROM
- HAVING
Bir örnek düşünün; sizden maaşı, başka bir çalışanınki olan James'ten daha yüksek olan çalışanı bulmanız isteniyor. Buna nasıl yaklaşırdınız? Bu sorgu şu şekilde parçalanabilir:
- James'in maaşını bulun
- James'in maaşını tüm çalışanlarınkiyle karşılaştırın
Bu, bir alt sorgu kullanılarak çözülebilir. Alt sorgu (iç sorgu), ana sorgudan (dış sorgu) önce bir kez çalışır.
SELECT empno, ename FROM employee WHERE sal>(SELECT sal from employee where ename='JAMES');
Alt Sorgu Türleri:
-
Tek satırlı alt sorgu: İç SELECT ifadesinden yalnızca bir satır döndüren sorgu.
-
Çok satırlı alt sorgu: İç SELECT ifadesinden birden fazla satır döndüren sorgu.
Hatırlanacak noktalar:
- Alt sorguları parantez içinde yazın.
- Alt sorguları karşılaştırma operatörünün sağına yerleştirin.
- Tek satırlı alt sorgularda tek satır operatörlerini (>, < , >= , <= , < >) kullanın.
- Çok satırlı alt sorgularda çok satır operatörlerini (IN, ANY, ALL) kullanın.
Tek satırlı Alt Sorgu:
Sizden, iş unvanı empno 7521 ile aynı olan çalışanların adlarını bulmanız isteniyor
SELECT ename, job
FROM employee
WHERE job=(SELECT job FROM employee WHERE empno=7521);
ENAME JOB
---------- ---------
ALLEN SALESMAN
WARD SALESMAN
Maksimum maaşı, 20 numaralı departmanın maksimum maaşına büyük eşit olan departmanların maksimum maaşını seçin
SELECT deptno, max(sal)
FROM employee
GROUP BY deptno
HAVING max(sal)>=(SELECT max(sal) FROM employee WHERE deptno=20);
DEPTNO MAX(SAL)
---------- ----------
20 2975
Çok satırlı Alt Sorgu:
Maaşı, işi Manager olan çalışanların maaşlarından herhangi birine eşit olan çalışanları bulun. Alt sorgu birden fazla satır döndürebileceğinden bu bir çok satırlı alt sorgudur.
SELECT ename, job, sal
FROM employee
WHERE sal IN (SELECT sal FROM employee WHERE job='MANAGER');
ENAME JOB SAL
---------- --------- ----------
JONES MANAGER 2975
BLAKE MANAGER 2850
Alt sorgular FROM cümleciğinde kullanıldığında, depolamada fiziksel olarak var olmayan ancak verinin bir görünümü olan geçici bir tablo gibi davranır. Örneğin:
SELECT e.ename, e.job, e.sal
FROM employee e, (SELECT deptno FROM department WHERE loc='DALLAS') d
WHERE e.deptno=d.deptno;
ENAME JOB SAL
---------- --------- ----------
SMITH CLERK 800
JONES MANAGER 2975
Küme Operatörlerini Kullanma
SQL'de Küme operatörleri, birden çok sorgunun sonuçlarını tek bir sonuçta birleştirmek için kullanılır. Matematikteki küme kuramını ve UNION, MINUS, INTERSECT gibi işlemleri kullanır. Burada, sorgularınızı optimize etmek için SET operatörlerini nasıl kullanabileceğinizi göreceksiniz. Bu derste şu SET operatörleri ele alınacaktır.
Bilgi: SET operatörlerini kullanan sorgulara bileşik ifadeler denir.
- UNION ve UNION ALL
- INTERSECT
- EXCEPT (SQL standardı) ve MINUS (Oracle'a özgü)
UNION
R ve S adlı iki ilişki (tablo) düşünün; UNION, R'deki tüm satırları ve S'deki tüm satırları yinelenenleri kaldırarak seçer. Döndürülen satır sayısı en fazla r+s olabilir; burada r, R'deki ve s, S'deki satır sayısıdır.
23-OCT-1999'dan önce işe alınan çalışanların departman adları da dahil olmak üzere tüm departman adlarını seçin
SELECT dname
FROM department
UNION
SELECT dname
FROM department, employee
WHERE department.deptno=employee.deptno AND employee.hiredate<to_date('23-OCT-1999');
DNAME
--------------
ACCOUNTING
OPERATIONS
RESEARCH
SALES
UNION için hatırlanacak noktalar:
- Sorguda kullanılan tüm SELECT ifadelerinde seçilen sütun sayısı ve sütunların veri türleri aynı olmalıdır.
- Sütun adlarının aynı olması gerekmez.
- Çıktı, SELECT cümlesinin ilk sütununa göre artan sırada sıralanır.
- Yinelenenleri kontrol ederken NULL değerler yok sayılmaz.
UNION ALL, bir veya daha fazla sorgudan gelen sonuçları birleştirir ve yinelenenleri KALDIRMAZ; bu nedenle DISTINCT anahtar sözcüğü kullanılamaz. 2000 yılından itibaren çalışanları içeren emp adlı başka bir tablo düşünün. emp ve employee tablosundan tüm çalışan numarası, adı ve işini alın:
SELECT empno, ename, job
FROM employee
UNION ALL
SELECT empno, ename, job
FROM emp;
EMPNO ENAME JOB
---------- ---------- ---------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
7566 JONES MANAGER
7698 BLAKE MANAGER
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
7566 JONES MANAGER
7654 MARTIN SALESMAN
7698 BLAKE MANAGER
EMPNO ENAME JOB
---------- ---------- ---------
7782 CLARK MANAGER
7788 SCOTT ANALYST
7839 KING PRESIDENT
7844 TURNER SALESMAN
7876 ADAMS CLERK
7900 JAMES CLERK
INTERSECT
Kesişim, küme kuramındaki ile aynı kuralı izleyerek iki kümeden ortak değerleri verir. R ve S adlı iki ilişki düşünün; INTERSECT, hem R hem S'de ortak olan tüm kayıtların kümesini döndürür.
SELECT empno, ename, job
FROM employee
INTERSECT
SELECT empno, ename, job
FROM emp;
EMPNO ENAME JOB
---------- ---------- ---------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
7566 JONES MANAGER
7698 BLAKE MANAGER
INTERSECT için hatırlanacak noktalar:
- Sorguda kullanılan tüm SELECT ifadelerinde seçilen sütun sayısı ve sütunların veri türleri aynı olmalıdır.
- Sütun adlarının aynı olması gerekmez.
- INTERSECT, NULL değerleri yok saymaz
EXCEPT ve MINUS:
EXCEPT (SQL Server'da kullanılır) ve MINUS (Oracle'a özgü) aynı işleve sahiptir. İşlevleri, ilk sorgu tarafından seçilen ancak ikinci sorgu tarafından seçilmeyen tüm farklı satırları seçmektir. Bu operatörü anlamak için aşağıdaki tabloyu düşünün:

Diyelim ki miktarı 1 ile 100 arasında olan ancak 50-75 arasında olmayan ürünleri bulmanız gerekiyor. Burada SQL Server kullanıyorsanız EXCEPT'i, Oracle sunucusu kullanıyorsanız MINUS'ı kullanırsınız.
SELECT prod_name, qty FROM products WHERE qty BETWEEN 1 AND 100 EXCEPT SELECT prod_name, qty FROM products WHERE qty BETWEEN 50 AND 75;
Oracle sunucu için:
SELECT prod_name, qty
FROM products
WHERE qty BETWEEN 1 AND 100
MINUS
SELECT prod_name, qty
FROM products
WHERE qty BETWEEN 50 AND 75;
PROD_NAME QTY
------------- ----------
COLGATE 1
SENSODYNE 100
SENSODYNE TOOTHBRUSH 30
EXCEPT/MINUS için hatırlanacak noktalar:
- Sorguda kullanılan tüm SELECT ifadelerinde seçilen sütun sayısı ve sütunların veri türleri aynı olmalıdır.
- Sütun adlarının aynı olması gerekmez.
- MINUS operatörünün çalışması için WHERE cümleciğindeki tüm sütunlar SELECT cümlesinde yer almalıdır.
Tebrikler!
Dersin sonuna geldiniz. Bu derste, veri bilimi yolculuğunuzda SQL'e hakim olmanıza yardımcı olacak önemli ölçüde SQL öğrendiniz. SQL, veritabanlarından rapor üretmek için kullanılır. Bu derste veritabanlarının ve SQL'in temellerini, yaygın veri türlerini, raporları biçimlendirmenize yardımcı olan fonksiyonları, sonuçların toplulaştırılmasıyla özetler oluşturmayı ve ayrıca veritabanlarındaki farklı tablolardan gereksinimlerinize göre nasıl veri toplayacağınızı öğrendiniz! Bu ders, yalnızca ilişkisel veritabanlarında değil, NoSQL veritabanlarında da rahat ilerlemenize ve Büyük Veri çalışmalarında SQL becerilerinizi kullanmanıza yardımcı olacak şekilde veri bilimi öğrenenleri için özel olarak tasarlanmıştır.
SQL hakkında daha fazla öğrenmek isterseniz, DataCamp'in ücretsiz Veri Bilimi için SQL'e Giriş kursunu alın.
