Ana içeriğe atla

SQL: Raporlama ve Analiz

Bir veritabanından toplulaştırılmış veriyi nasıl raporlayabileceğinizi; veriyi nasıl seçeceğinizi, filtreleyip sıralayacağınızı, çıktıyı nasıl özelleştireceğinizi öğrenerek Veri Raporlama ve günlük veri analizinde SQL'e hakim olun!
Güncel 3 Eki 2026  · 15 dk. oku

Yapay Zeka ile Keşfedin

ChatGPTClaudePerplexity

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.

sample relational database

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:

multiple tables

İ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:

  1. Veri Getirme:
    • Select.
  2. Veri İşleme Dili (DML):
    • Insert, Update, Delete, Merge
  3. Veri Tanımlama Dili (DDL):
    • Create, Alter, Drop, Rename, Truncate.
  4. Veri Denetim Dili (DCL):
    • Grant, Revoke.
  5. İş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:

servers

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.

tables

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:

operators

=,<>,!=,>=,<=,>,< 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:

  1. NOT
  2. AND
  3. 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.

  1. % 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.

  1. _ 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:

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:

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!

servers

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:

tables

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.

cartesian product

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:

salgrade table

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:

  1. 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
  2. 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.
  3. 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:

products

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.

Kaynaklar

  1. https://docs.oracle.com/cd/B19306_01/server.102/b14200/operators005.htm
  2. https://en.wikipedia.org/wiki/Set_operations_(SQL)#EXCEPT_operator
  3. https://www.w3schools.com/sql/sql_datatypes.asp
  4. https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT012
Konular
SQL
Veri Analizi

SQL hakkında daha fazlasını öğrenin

Kurs

SQL ile Raporlama

4 sa
40K
Kendi SQL raporlarınızı ve gösterge panellerinizi oluşturmayı öğrenin, ayrıca veri keşfi, temizleme ve doğrulama becerilerinizi geliştirin.
Ayrıntıları GörüntüleRight Arrow
Kursa Başla
Devamını GörRight Arrow
İlgili

blog

Hızlı Sevkiyat İçin Pratik Vibe Kodlama Teknoloji Yığını

Ön uç, arka uç, veritabanları, kimlik doğrulama, depolama, e-posta, test, dağıtım ve izleme için en iyi araçları keşfedin.
Abid Ali Awan's photo

Abid Ali Awan

14 dk.

blog

2026’da En Popüler 40 Yazılım Mühendisi Mülakat Sorusu

Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Dario Radečić's photo

Dario Radečić

15 dk.

Eğitim

Python'da Listeyi String'e Nasıl Dönüştürürsünüz

Bu hızlı eğitimde, Python'da bir listeyi string'e nasıl dönüştüreceğinizi öğrenin.
Adel Nehme's photo

Adel Nehme

Eğitim

.gitignore Nasıl Kullanılır: Örneklerle Pratik Bir Giriş

Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
Kurtis Pykes 's photo

Kurtis Pykes

8 dk.

Devamını GörDevamını Gör