SQL (Structured Query Language)

    İlişkisel Veritabanı Yönetim Sistemleri (Relational Database Management Systems -RDBMS) modeli ilk önce
1970 yılında Dr. E. F .Codd tarafından tarif edilmiştir. SQL veya Structured English Query Language (SEQUEL), IBM
firması tarafından Codd’un modelini kullanmak için geliştirilmiştir. SEQUEL sonraları SQL olmuştur. 1979 yılında,
Relational Software (şu an, Oracle Corporation), SQL’in ilk ticari uygulamasını geliştirmiştir. Bugün,SQL, ilişkisel
veritabanı yönetim sistemleri standardı olarak kabul edilmektedir.

SQL, ilişkisel veritabanlarındaki bilgileri orgulamak için kullanılan dildir. SQL, bütün kullanıcıların ve ygulamaların
veritabanına erişmek için kullandıkları komutlar bütünüdür. Uygulama programları ve veritabanı araçları kullanıcılara
çoğu durumda SQL kullanmadan veritabanına erişim imkanı sunmaktadırlar fakat bu uygulamalar da geri planda
SQL kullanmaktadırlar.

Oracle SQL’i, standartlara uygundur. Daha da ötesinde, Oracle, SQL standartlarının gelişmesinde motor güç olan
bir kurumdur. American National Standarts Institue (ANSI) ve International Standarts Organization (ISO) tarafından
belirlenen son SQL standardı, SQL-92’dir. SQL-92’de, üç aşamalı uygunluk vardır. Bunlar;
.ilk seviye (Entry Level)
.Orta seviye (Intermediate Level)
.ileri seviye’dir (Full Level)

Oracle7, ilk seviye uygunluğuna sahiptir. SQL, ilişkisel veritabanları ile uygulamaların diyaloğunu sağlamaktadır.
SQL, temelde verilerle mantıksal seviyede çalışmaktadır. Yani, bir tablodan bir kaç kayıt seçebilmek için, o kayıtları
seçebilecek bir şart belirtilir. Şarta uyan bütün kayıtlar bir basamakta gelir ve bunlar kullanıcıya gösterilebildiği gibi,
bir başka SQL’e veya bir uygulamaya da gönderilebilir. Kayıtların tek tek nasıl geldiği ve fiziksel olarak eritabanının
neresinde ve nasıl tutulduğu ile SQL ilgilenmemektedir.
SQL komutları ile
.veri sorgulama
.bir tabloya kayıt ekleme, değiştirme ve silme
.veritabanı nesnelerini (database objects) yaratma, değiştirme ve silme
.veritabanına ve nesnelerine erişimi kontrol etme
.veritabanı bütünlüğünü ve tutarlılığını sağlama işlemleri yapılabilmektedir.

SQL komutları bir veya daha fazla satır olabilmektedir. SQL cümlelerinin sonuna noktalı virgül (;) konmaktadır.
irden fazla satır olan komutlarda en son satırın sonuna ”/” işareti isteğe bağlı olarak konabilmektedir. PL/SQL, Oracle’ın SQL komutlarına yapısal dillere ait özellikleri (begin, end, ioop, for, if, elsif, vb.) eklediği kendi standardı
olan bir dildir. ORACLE SQL, SQL *PLUS, PL/SQL komutlarının kullanılabildiği Oracle ürünüdür.
ORACLE SQL, SQL *PLUS, PL/SQL ve eklemiş olduğu bir dildir. PUSQL ile, veritabanı ile ilgili çok önemli
işlemler yapılabilmektedir. SQL bilinmeden, PL/SQL ile hiçbir işlem yapılamaz, bu yüzden önce SQL iyi bir şekilde
öğrenilmelidir.

 

 

 

SQL cümlelerinde kullanılan tabloların yapısı ve içeriği

 

scott.jpg (18564 bytes)

Empno

Ename

Job

Mgr

Sal

Hiredate

Comm

Deptno

7369

SMITH

CLERK

7902

800

17.12.1980

 

20

7499

ALLEN

SALESMAN

7698

1600

20.02.1981

300

30

7521

WARD

SALESMAN

7698

1250

22.02.1981

500

30

7566

JONES

MANAGER

7839

2975

02.04.1981

 

20

7654

MARTIN

SALESMAN

7698

1250

28.09.1981

1400

30

7698

BLAKE

MANAGER

7839

2850

01.05.1981

 

30

7782

CLARK

MANAGER

7839

2450

09.06.1981

 

10

7788

SCOTT

ANALYST

7566

3000

19.04.1987

 

20

7839

KING

PRESIDENT

 

5000

17.11.1981

 

10

7844

TURNER

SALESMAN

7698

1500

08.09.1981

0

30

7876

ADAMS

CLERK

7788

1100

23.05.1987

 

20

7900

JAMES

CLERK

7698

950

03.12.1981

 

30

7902

FORD

ANALYST

7566

3000

03.12.1981

 

20

7934

MILLER

CLERK

7782

1300

23.01.1982

 

10

 

Deptno

Dname

Loc

10

ACCOUNTING

NEW YORK

20

RESEARCH

DALLAS

30

SALES

CHICAGO

40

OPERATIONS

BOSTON

 

 

 

 

 

 

 

İÇİNDEKİLER

 

 

 

 

 

        SQL’e giriş
Fonksiyonlar
Karakter fonksiyonları
Sayısal fonksiyonlar
Tarih fonksiyonları
Dönüştürme (Conversion) fonksiyonları
Değişik türlerde parametre kabul edebilen fonksiyonlar
Grup fonksiyonlarr
Birden fazla tabloyu sorgulama (Join)
Equi-Joins
Non-Equi-Joins
Outher Joins
Tabloyu kendisi ile birleştirme
Sorguda küme işlemleri kullanma (Union, intersect, minus)
İç içe sorgu cümleleri
Nasıl işlenir ?
ANY/ALL işleci
HAVING işleci
Sıralı liste üretme
Dikkat edilmesi gereken noktalar
EXIST işleci
Veri tanımlama Dili (Data Definition Language)

Tablo yaratma komutu (CREATE TABLE)
Tablo kolon türleri
Tablo tanrmlarını değiştirme (ALTER TABLE)
Tablo silme (DROP TABLE)
Tablo ismini degiştirme (RENAME)
Tablo tanımnr görme (DESCRIBE)

Veri Kullanma Dili

 

 

 

 

 

        Tabloya yeni kayıt ekleme (INSERT)
Başka bir tablodan kayıt kopyalama
Kayıt değiştirme (UPDATE)
Kayıt silme (DELETE)
İşlemleri bir süreç içerisinde toplama
(Transaction processing and COMMIT/ROLLBACK)
Tutarlı kayıt okuma (Read consistency)
Eşzamanlı işlemler ve kaynakların paylaşımı (LOCK)
Kaynak kilitleme türleri
ROWID yapay kolonunun kullanrmı
INDEX kuilanımı
Index kullanma nedenleri
Index türleri (unique, non-unique, single/concatenated)
Index yaratma (CREATE INDEX)
Index silme (DROP INDEX)

1. SQL’E GiRiŞ

 

 

 

 

 

    Onceleri SEQUEL (Structred English QUEry Language) olarak adlandırılan bu dilin adı, daha sonra ingilizce
söylenişine uygun olarak SQL olarak değiştirildi. SQL, bilgisayar uzmanı olmayan ve yüksek düzeyli, işlemsel
olmayan (non-procedural) bir dil aracılığıyla veri tabanı ile iletişim kurmak isteyen kullanıcı kitlelerine yönelik bir
veri tabanı dilidir.

SQL Komut Kümesi

 

 

 

 

 

Komut                Acıklama
SELECT             Verileri getirmek için kullanılır.
INSERT              Yeni kayıt eklemede kullanılır.
UPDATE             Var olan bir kaydı değiştirmek üzere kullanılır.
DELETE             Var alan bir kaydı silmek için kullanılır.
CREATE             Veri tabanında yeni bir nesne yararmak için kullanılır.  (Table, View, Index, Synonym vb.)
ALTER                 Veri tabanındaki nesne üzerinde değişiklik yapar. (Omeğin yeni bir kolon eklemek gibi)
DROP                  Veri tabanındaki bir nesneyi siler.
GRANT                Kullanıcılara erişim yetkilerinin verilmesinde kulanılır.
REVOKE            Verilen erişim yetkilerinin geri alınmasında kullanılır.

SQL komulan nasıl yazılır
.Yazılan SQL cümlesi bir yada daha fazla satır olabilir.
.SQL cümlesi içerisinde yer alan cümlecikler genelde farklı satırlara yazılır.
.Komut kelimeleri bölünerek alt satırdan devam edilemez.
.SQL komutları büyük yada küçük harflarle yazılabilir.
.Her SQL cümlesi noktalı virgül (;) ile bitirilir.

Basit SELECT ifadeleri

 

 

 

 

 

        En basit biçimiyle bir SELECT ifadesi
1. Istenilen tablonun kolonlarının belirtildiği bir SELECT cümleciği,
2. Hangi tablodan veri seçileceğini ifade eden bir FROM cümleciği içermelidir.
SELECT DEPTNO,ENAME,MGR FROM EMP;

 

DEPT NO

ENAME

MNG

10

KING

 

20

JONES

7839

30

BLAKE

7839

10

CLARK

7839

20

SCOTT

7566

20

FORD

7566

20

SMITH

7902

30

ALLEN

7698

30

WARD

7698

30

MARTIN

7698

30

TURNER

7698

20

ADAMS

7788

30

JAMES

7698

10

MILLER

7782

Eğer tablodaki bütün kolonlar seçilek istenseydi, * ile hepsi ifade edilebilirdi.
SELECT * FROM EMP

Aritmetik ifadeler     Aritmetik ifadeler içerisinde kolon isimleri, sabit sayılar ve aritmetik işleçler kullanılabilir.
~ Açıklama
+ toplama
– çıkrama
* çarpma
/ bölme
Aritmetik ifade içerisinde “*” ve “/” eşit öncelikli, “+” ve “-“ye göre daha önceliklidir. “+” ve “-” de eşit nceliklidirler. Cncelikleri tam ifade etmek için parantezler kullanılabilir.
SELECT SAL *12, COMM FROM EMP;
SAL kolonunun 12 ile çarpılmış biçimi getirilir.

Kolon isimlendirme Kolonların başlıkları SQl cümlesinde yazıldıkları biçimi ile getirilirler. Bunu değiştirmek mümkündür.
SELECT ENAME, SAL *12 ANNSAL, COMM FROM EMP;
Kolon başlığı olarak SAl *12 yerine ANNSAL kullanılacak.
Değiştirilen kolon başlıkları SQl cümlesi içerisinde artık yeni isimleri ile kullanılırlar.

Birleştirme işleci (||) Kolonlardan gelen değerleri yan yana yapıştırmak mümkündür. “11” Işleci ile
kolonlar arasında boşluk olmadığına dikkat ediniz.
SELECT EMPNOIIENAME EMPLOYEE FROM EMP;
EMPLOYEE
7839KING
7566JONES
7698BLAKE
7782CLARK

Literaller Literailer veriler ile birlikte çıkmasını istediğimiz karakterlerdir.
SELECT EMPNOII’-‘IIENAME CALISAN,’Calistigi bolum’, DEPTNO BLM. FROM EMP;

CALISAN

Calistigi bolum

BLM

7839-KING

Calistigi bolum

10

7566-JONES

Calistigi bolum

20

7698-BLAKE

Calistigi bolum

30

7782-CLARK

Calistigi bolum

10

7788-SCOTT

Calistigi bolum

20

7902-FORD

Calistigi bolum

20

7369-SMITH

Calistigi bolum

20

7499-ALLEN

Calistigi bolum

30

752l-WARD

Calistigi bolum

30

7654-MARTIN

Calistigi bolum

30

7844-TURNER

Calistigi bolum

30

7876-ADAMS

Calistigi bolum

20

7900-JAMES

Calistigi bolum

30

7934-MILLER

Calistigi bolum

10

Fonksiyonlar     Fonksiyonlar aldıkları kolonun yada sabit değişkenin değerini yeni bir biçime dönüştürürler. NULL değerlerin yakalanması NULL değeri olmayan anlamı taşır ve herhangibir işleme giren bu değer mutlaka NULL üretir ve istenmeyen bir sonuç alınmasına yol açabilir. Bunu engellemek için NVL fonksiyonu kullanılır.
SELECT SAL *12-NVL(COMM,O) YILLIK FROM EMP;
Eğer NVL fonksiyonu kullanılmamış olsa idi COMM değeri olmayan bütün kayırlar için SAL *12-COMM esaplamasından NULL geri döndürülecekti. NVL fonksiyonu içerisine yazılan kolonun değeri NULL ise NULL yerine ne kullanılacağını belirler. Omekte COMM kolonunun NULL değerleri için sıfır kullanılmaktadır.

DISTINCT ifadesi Eğer seçilen kolon aynı satırdan birden fazla getiriyorsa, bunlardan fazla olan satırları atmak mümkündür.
SELECT DISTICT DEPTNO FROM EMP;
Bu sorgu bir bölümde birden fazla çalışan olduğu halde çalışanlar tablosundan sadece bölüm numaralarını seçmekte ve tekkarlı satırları elemektedir.

ORDER BY ifadesi Seçilen kolonların hangi sırada geleceğini belirlemek amacıyla kullanılır.
SELECT ENAME,JOB FROM EMP ORDER BY ENAME;
Ornekte çalışanlar isimlerilerine göre sıralı olarak getirilmektedir.
ORDER BY ENAME ~ : Küçükten büyüğe sıralar
ORDER BY ENAME ~ : Büyükten küçüğe sıralar
Birden fazla kolon sıralanmak istendiğinde kolon isimleri virgül ile ayrılarak yazılır. (ODER BY DEPTNO.SAL DESC gibi). Sıralama sırasında NULL değerleri sıralama nasıl olursa olsun ilk sırada yer alırlar.

WHERE ifadesi Kayıtlar arasından sadece istenilen koşulları taşıyanların seçilebilmesini sağlamak amacıyla WHERE ifadesi kullanılır. Koşulu vermek için mantıksal işleçler kullanılır.
~ Anlamı
‘=’ eşittir
‘>’ büyüktür
‘<‘ küçüktür
‘>=’ büyük eşittir
‘<=’ küçük eşittir
SELECT DNAME,DEPTNO FROM DEPT DEPTNO WHERE DEPTNO>20;
20’den büyük olanları seç

SQL işleçleri
islec anlamı
BETWEEN …AND …iki değer arasında (değerler dahil)
IN (Iiste) Iistedeki değerler içinden en az biri
LlKE Benzer ise
IS NULL Boş değer ise
BETWEEN işleci
                SELECT ENAME,SAL FROM EMP WHERE SAl BETWEEN 1 000 AND 2000;
                Değeri 1000’e eşit ve 1000’den büyük ve 2000’e eşit ve 2000’den küçük olanları seçer.
IN İşleci
                SELECT EMPNO,ENAME,SAl,MGR FROM EMP WHERE MGR IN (7902, 7566, 7788);
                MGR 7902 yada 7566 yada 7788 olan kayıtlar seçilir.
LlKE İşleci
                Bazı durumlarda tam karşılaştırma yapmak işimize yaramayabilir. Omeğin adı ‘A’ harfi ile başlayanları
seçmek iştediğimizde. Bu durumda llKE işleci kullanılır. Karşılaştırmada kullanılacak sabit içerisinde
özel semboller kullanılır.
Sembol Anlamı
% Sıfır yada daha fazla karakterler
Bir karakter
SELECT ENAME FROM EMP WHERE ENAME llKE ‘S%’;
Omekteki SQL cümlesi ‘S’ harfi ile başlayan isimleri getirir.
SELECT ENAME FROM EMP WHERE ENAME llKE ‘-‘;
Ikinci ömekteki SQl cümlesi ise dört harfli isimleri getirir.
/%’ ve ‘-‘ sembolleri bir sabit içerisinde aynı anda değişik kombinasyonlarla kullanılabilir.

IS NULL işleci
Bir kolon değerinin NUll olup olmadığını anlamanın tek yolu bu işleci kullanmaktır. ‘=NUll’ işleci kullanmak aynı şey değildir ve hiçbir sonuç vermez.
SELECT ENAME,MGR FROM EMP WHERE MGR IS NULL;
Yukarıdaki ömek yöneticisi olmayan çalışanların Iistesini üretir.
Negatif Test
    Bir koşulu sağlayan değil de sağlamayanlar seçilmek isteniyor olabilir. Bu durumda işlecin anlamının tersine
çevrilmesi gerekir.
~ Anlamı
!= eşit değildir (V AX için)
,,= eşit değildir (IBM için)
<> eşit değildir

SQL isleci Anlamı
NOT BETWEEN     Verilen değerler arasında olamyan değerler
NOT IN (Iiste)         Listedeki değerler içerisinde olmayan
NOT LlKE              Benzer olmayan
IS NOT NULL         Boş olmayan

Sorguda birden fazla koşul kullanma AND (ve) ve OR (ya da) işleçleri birden fazla verilmiş olan koşul
ifadelerini birleştirmek amacıyla kullanılır. AND işleci arasında bulunduğu her iki koşul ifadesinin de doğru olmak
zorunda olduğunu, OR işleci arasında bulunduğu her iki koşul ifadesinden sadece birisinin doğru olmasının
yeterli olduğunu ifade etmek için kullanılır.

Aynı SQL cümlesinde hem AND hem de OR işleçleri koşullar arasında istenilen kombinasyonda kullanılabilir.
AND işleci her zaman OR işlecine göre daha önceliklidir ve daha önce işletilir. OR işlecini AND işlecine göre
öncelikli hale getirebilmek için parantezlerden “()” faydalanılır.
SELECT EMPNO,ENAME,JOB,SAL
FROM EMP
WHERE SAL BETWEEN 1 000 AND 2000
AND JOB=’CLERK’.

 

 

 

 

 

 

 

 

FONKSİYONLAR

 

 

    Fonksiyonlar aldıları değerleri, kendilerine yüklenmiş olan göreve göre yeni bir biçime dönüştürürler.

Fonksiyonlar aşağıdaki gibi sınıflandırılabilir.
.Karakter fonksiyonları
.Sayısal fonksiyonlar
.Tarih fonksiyonları
.Dönüştürme fonksiyonları
.Herhangibir tür veri üzerinde işlem yapabilen fonksiyonlar
.Grup fonksiyonları

Karakter Fonksiyonları
    Karakter türü değişken ya da sabitleri alarak yüklenmiş olduğu göreve göre bunlar üzerinde işlem yapar ve
karakter ya da sayısal bir değer döndürür.

LOWER(kolon/sabit) : Giriş olarak okuduğu karakter dizisini küçük harflere
önüştürür. ‘kolonlsabit’ şeklindeki gösterim bir tek parametre girileceğini ve bu parametrenin bir kolon adı ya da
bir sabit karakter dizisi olabileceğini gösterir.

SELECT LOWER(DNAME),LOWER(‘SQL’) FROM DEPT;

UPPER(kolonlsabit) : Parametre olarak alınan karakterleri büyük harfe dönüştürür.
İfadenin büyük harf veya küçük harf olması sonucu değiştirmez, her durumda byük harfe çevirir.

INITCAP(kolonlsabit) : Parametre olarak verilen karakter dizisi içerindeki her kelimenin baş harfini büyük harfe diğer harflerini küçük harfe dönüştürür.

LPAD(kolon/sabit,n,’karakter dizisi’) : Parametre olarak verilen kolon ya da sabiti
yazmadan önce başına n adet istenilen karakter dizisinden basar. Eğer karakter dizisi verilmez ise boşluk ekler.

SELECT LPAD(DNAME,20,’*’),LPAD(DNAME, 15) FROM DEPT;

PAD(DNAME,20,’*’)

LPAD(DNAME,15)

***********ACCOUNTING

ACCOUNTING

*************RESEARCH

RESEARCH

*******************SALES

SALES

**********OPERATIONS

OPERATIONS


RPAD(kolonlsabit,n,’karakter dizisi’) : Parametre olarak verilen kolon ya da sabitin
sonuna n adet istenilen karakter dizisinden basar. Eğer karakter dizisi verilmez ise boşluk ekler.

SELECT LPAD(DNAME,20,’*’),LPAD(DNAME, 15) FROM DEPT;

RPAD(DNAME,20,’*’)

RPAD(DNAME,15)

ACCOUNTING**********

ACCOUNTING

RESEARCH************

RESEARCH

SALES******************

SALES

OPERATIONS**********

OPERATIONS

    SUBSTR(kolonlsabit,poz,n) : Verilen kolon yada sabit karakter dizisinin istenilen
pozisyonundan başlayarak n adet karakteri geritir.

SELECT SUBSTR(‘Cengiz Çakmak’,4,3) FROM DUAL;

INSTR(kolonlsabit1’karakter dizisi’) : Verilen kolon ya da sabit karakter dizisi
içerisinde istenilen karakter ya da karakter dizisinin ilk
geçtiği konumu döndürür.

L TRIM(kolonlsabit,’karakter dizisi’) : Istenilen karakteri ya da istenilen karakterleri
verilen kolon ya da sabit karakter dizisinin başından siler. Dizinin başında yer alan silinecek karakter ard arda
yer aldığı sürece silinir. Eğer hiçbir karakter verilmez ise dizinin başındaki boşluklar silinir.

RTRIM(kolonlsabit,’karakter dizisi’) : L TRIM ile aynı işlemi yapar; tek farkı islenilen
karakteri (ya da karakterler) dizinin sonundan siler.

LENGTH(kolonlsabit) : Verilen karakter dizisinin toplam kaç karakter uzunlukta
olduğunu döndürür.

TRANSLATE(kolonlsabit1eski,yeni) : Verilen karakter dizisi içerisinde ‘eski’
parametresi olarak girilecek karakterleri bularak ‘yeni’ olarak girilecek olan karakterler ile yer değiştirir.

Sayısal Fonksiyonlar
Sayısal fonksiyonlar sayısal değerleri parametre olarak alır ve yine sayısal değerler üretirler.

ROUND(kolonlsabit,n) : Verilen değeri virgülden sonra n basamağını dikkate
alarak yuvarlar. Eğer n değeri negatif girilirse virgülün soluna kalan n adet rakam yuvarlanır.

ROUND(45.923,1) –> 45,9
ROUND(45.923) –> 46
ROUND(45.923,1) –> 45,3
ROUND(42.323,-1) –> 40

TRUNC(kolonlsabit,n) : Virgülden sonraki n basamak sıfırlanır. Eğer n değeri
negatif girilirse virgülün solunda kalan n adet rakam sıfırlanır.

CEIL(kolonlsabit) : Verilen değerden büyük en yakın tamsayıyı döndürür.

FLOOR(kolonlsabit) : Verilen değerden küçük en yakın tamsayıyı döndürür.

POWER(kolonlsabit,n) : Verilen değerin n’inci kuvvetini alır.

SQRT(konlsabit) : Verilen değerin kare kökünü bulur.

SIGN(kolonlsabit) : Eğer verilen değer 0 ise 0, negatif ise -1 , pozitif ise +1 değeri döndürür.

ABS(kolonlsabit) : Verilen değerin mutlak değerini döndürür.

MOD(d1 ,d2) : d1 ‘in d2’ye bölümü sonucu oluşan kalan değerini döndürür .

Tarih Fonksiyonları     Oracle DA TE türünde tanımlanmış alanlar içerisinde saniye düzeyine kadar tarih bilgisini saklayabilir. Fakat giriş ve çıkıŞ sırasında tarih formatı ayarlanarak bu detayda bilgi girişine gerek duyulmadan tarih bilgisi
üzerinde istenilen işlemler yapılabilir.

Tarih : Yüzyıl, Yıl, Ay, Gün, Saat, Dakika, Saniye,

Oracle veri tabanının başlanğıç olarak kullandığı tarih formatı (değiştirilmediği sürece) DD-MON-YY şeklindedir.
Eğer veri tabanı türkçe modunda çalıştırılıyorsa ayların kısaltmaları türkçe olarak yapılacaktır (MA YIS : MAY,
HAZIRAN : HAZ gibi).

Veri tabanından sistem tarihini de okumak aşağıdaki SQL sorgusu ile mümkündür.

SELECT SYSDATE FROM SYSTEM.DUAL;

Bu sorgu DUAL isimli sahte bir tablo kullanarak o andaki sistem tarihini okumamızı sağlamaktadır.

Tarih üzerinde aritmetik işlemler
tarih+sayı : Tarihe istenilen gün sayısı eklenir.
tarih-sayı : Tarihten istenilen gün sayısı çıkartılır.
tarih1-tarih2 : Iki tarih arasındaki gün sayısını bulunur
tarih+sayıl24 : Istenilen saat sayısını tarihe eklenir.

MONTHS_BETWEEN(tarih1,tarih2) : Iki tarih arasında kaç ay olduğunu hesaplar. Eğer tarih2 tarih1 ‘den daha büyükse sonuç negatif olarak üretilir.

ADD_MONTHS(tarih,n) : Istenilen tarihe n ay ekler.

NEXT_DAY(tarih,gün) : Verilen tarihten bir sonraki haftanın istenilen gününün tarihini döndürür. Girilen gün bir numara yada günün adı olabilir. ‘FRIDAV’ ve 6 aynı günü ifade eder. Günler pazar gününden itibaren sayılmaya başlanır. Omeğin pazartesi günü için 2 girilmelidir.

LAST_DAY(tarih) : Girilen tarihin ayının son gününün tarihini döndürür.

ROUND(tarih) : Girilen tarihin saat kısmını yuvarlar. Bu genelde saat bilgisi içeren tarihlerin arşılaştırılmasında faydalı olur.

ROUND(tarih,’MONTH’) : Girilen tarihi ay bilgisine kadar yuvarlar. Ayın 15’şinden önceki günler ayın ilk gününün tarihini, sonraki günler için sonraki ayın ilk gününün tarihini getirir.

ROUND(tarih,’VEAR’) : Girilen tarihi yıl bazında yuvarlar. Girilen tarih yılın ilk yarısını gösteriyor ise o yılın ilk gününün tarihi geri dönderilir, değilse bir sonraki yılın ilk gününün tarihi döndürülür.
TRUNC(tarih,’MONTH’) : Verilen tarihin ayının ilk gününün tarihini bulur.
TRUNC(tarih,’VEAR’) : Verilen tarihin yılının ilk gününün tarihini bulur.

Dönüştürme Fonksiyonlan

TO_CHAR(sayıltarih,[‘format]) : Verilen rakam ya da tarihi istenilen formatta karaktere dönüştürür.

TO_NUMBER(‘karakterler’) : Karakter türünde verilmiş olan rakamları sayısal türe dönüştürür.

TO_DATE(‘karakter’ ,’format’) : Formatı belirli karakter halindeki bir tarihi tarih türüne dönüştürür.

Tarih Formatlan  (TO_DATE ile kullanılabilen)

ELEMAN

Anlamı

yyyy

Dört Basamaklı Yıl

yyy

Yılın son üç basamağı

yy

Yılın son iki basamağı

Y

Yılın son basamağı

RR

Farklı Dil İçin yılın son iki basamağı

Q

Ocak-Mart i

MM

İki basamaklı ay

RM

Romen rakamı ile ay

MONTH

Ayın uzun ismi

MON

Ayın kısa ismi

ww

Yılın hangi haftası olduğu(1-53)

w

Ayın hangi haftası olduğu(1-5)

DDD

Yılın günü (1-366)

DD

Ayın günü (1-31)

D

Haftanın günü(1-7)

DAY

Günün uzun adı (Pazartesi)

DY

Günün kısa adı (Pzt)

HH

veya Günün saati (1-12)

HH12

Günün saati (1-12)

HH24

Günün Saati (0-23)

MI

Dakika(0-59)

SS

Saniye(0-59)

SSSSS

Gec nraki sagece yarısından sonra saniye sayısı

Ornek : TO-DATE(’27-0CT -95′,’DD-MON-RR’)

Sayı Formatlan

ELEMAN

ÖRNEK

Anlamı

9

9999

Yazılacak sayının uzunluğunu belirler

0

0999

Eğer sayı küçükse boşluk yerine sıfır basar

$

$999

Rakam başına dolar işareti ekler

B

B99999

Sıfır olan sayıları basmaz

S

S9999

Poz. sayıların başına + neg. ise – işareti ekler.

PR

99999PR

Negatif ise <…> şeklinde yazar

D

99D99

Ondalıklı sayıları bu şekilde ayırır

G

9G999

Grup ayrıcını G harfinin olduğu yere basar

C

99999C

Rakamın yanına parabirimi kısaltmasını yazar

L

9999L

Ülke için kullanılan parabirimi kısaltmasını yazar.

,

9,999

istenilen pozisyona virgül basılır

.

999.99

ondalıklı kısımlar nokta ile ayrılır

V

999V99

Gelen sayıyı 10’un n’inci kuvveti ile çarpar. n V harfinden sonraki 9’Iarın sayısıdır.

EEEE

9.999EEEE

8ilimsel olarak yazar

RN yada rn

RN rn

Girilen sayıyı büyük yada küçük romen rakamları ile 1 ile 3999 arası için   yazar.

Değişik türlerde parametre kabul edebilen fonksiyonlar
DECODE     Bu komut ile kolon isimlerini koşullara bağlayarak verilerin durumuna gôre değişik kolon isimlerini seçmek
mümkündür. Yapısal dillerdeki ‘if-then-else’ yapısının ilkel bir ômeğidir.
DECODE(kolon/ifade,ara1,sonuc1,[ara2,sonuc2, …,]default)
SELECT ENAME,JOB,
DECODE(JOB,’CLERK’,’WORKER’,’MANAGER’,’BOSS’,’UNDIFIENED’)
DECODE_JOB FROM EMP

ENAME

JOB

DECODE_JOB

SMITH

CLERK

WORKER

ALLEN

SALESMAN

UNDIFIENED

WARD

SALESMAN

UNDIFIENED

JONES

MANAGER

BOSS

MARTIN

SALESMAN

UNDIFIENED

BLAKE

MANAGER

BOSS

CLARK

MANAGER

BOSS

SCOTT

ANALYST

UNDIFIENED

KING

PRESIDENT

UNDIFIENED

TURNER

SALESMAN

UNDIFIENED

ADAMS

CLERK

WORKER

JAMES

CLERK

WORKER

FORD

ANALYST

UNDIFIENED

MILLER

CLERK

WORKER

14 satırları seçildi.

Grup Fonksiyonlan     Grup fonksiyonları veri tabanından seçilen bir dizi satır üzerinde işlem yapar ve sonuç olarak kendisine
yüklenmiş olan göreve göre özet bir bilgi üretir. AVG([DISTINCTIALL] kolon) : Verilen kolon değerlerinin
ortalamasını bulur.

COUNT([DISTINCTIALL] kolonl*): Verilen kolonun NULL olmayanlarının sayısını getirir. Eğer * kullanılırsa toplam kaç satır sorgulandığı bulunur.

MAX([DISTINCTIALL] kolon) : Maximum değeri getirir.

MIN((DISTINCTIALL] kolon) : Minimum değeri getirir.

SUM([DISTINCTIALL] kolon) : Verilen kolon toplamını bulur.

SELECT COUNT(*) FROM EMP WHERE DEPTNO = 20;

20 numaralı bölümde kaç kişi olduğunu bulur.

GROUP BY ifadesi GROUP BY ifadesi ile sorgulanan satırlar belirli guruplara ayrılarak bu gruplar üzerinde grup fonksiyonları kullanılır.
SELECT JOB,AVG(SAL) FROM EMP
GROUP BY JOB;
J

JOB

AVG(SAL)

ANALYST

3000

CLERK

1037.5

MANAGER

2758.3333

PRESIDENT

5000

SALESMAN

1400


Her iş için ayrı ayrı ne kadar ortalama maaş verildiğini hesaplar.

SELECT DEPTNO,JOB,AVG(SAL) FROM EMP
GROUP BY DEPTNO,JOB;

DEPT NO

JOB

AVG(SAL)

 

10

CLERK

1300

 

10

MANAGER

2450

 

10

PRESIDENT

5000

 

20

ANALYST

3000

 

20

CLERK

950

 

20

MANAGER

2975

 

30

CLERK

950

 

30

MANAGER

2850

 

30

SALESMAN

1400

 

9 satırları seçildi.

Her bölümdeki farklı işler için ne kadar ortalama maaş verildiğini hesaplar. Grup fonksiyonları ile birlikte kullanılan kolon isimleri mutlaka GROUP BY ifadesi içinde yer almalıdır. Tersi durumda hatalı bir SQL cümlesi yazılmış olur.

 


 

© www.cengizcakmak.8m.com 2000. Hazırlayan: Cengiz ÇAKMAK , Kaynak: Osman Nihat ŞEN (ORACLE kitabından)

 

 

 

 

Tabloların Oluşturulması     

 

 

Oluşturulması gereken tablolar ve aralarındaki ilişkiler aşağıda verilmiştir. Ayrıca tabloların üzerine tıklayarak örnek verileri de görebilirsiniz. Tabii ki veriler örnektir. Gerçek bir veritabanında kurum ve personel tabloları yüzbinlerce olabilir. Ayrıca SQL komutunun hızlı çalışabilmesi için birbirleriyle ilişki kurulmuş tablolar indexlenmelidir.
iliskiler.jpg (41033 bytes)
Burada örnek bir veritabanı tasarlanmıştır. Bir kuruluşun ülke çapında yayılmış şuıbeleri olsun. Bu şubelerde çalışan elemanların genel bilgileri ,maaş bilgileri ve hangi bölümde çalıştıklarına ilişkin bilgileri tutmaya çalışalım.
Primary Key Alanlar:
Per_No,Kur_Kodu,Ilce_Kodu,Il_KoduDep_Kodu  (Bu alanlara girilen değerlerin tekrarlanmaması için tanımlanır.)

 

 

 

 

 

 

Ders 1           Il tablosuna gözat (sorgularda kullanılan tablo)

il_kodu

il_adi

1

Adana

2

Adıyaman

3

Afyon

4

Ağrı

5

Amasya

6

Ankara

7

Antalya

8

Artvin

9

Aydın

10

Balıkesir

 

 

 

Basit SQL Cümleleri

 

Mevcut bir tablodan istenilen şartları sağlayan kayıtların seçilmesi için SELECT kullanılabilir.
Genel Kullanım Şekli:
SELECT [Tablodan istenen alan isimlerinin yazılacağı bölüm]
FROM [Verilerin bulunduğu tablo isimlerinin yeraldığı bölüm]
WHERE [Koşul Yazılacak bölüm]
GROUP BY [Kayıtları gruplayıp getirmek için kulanılacak cümlecik]
HAVING [Grup bulunan SQL cümleciklerinde grup içinde şart kullanmak için]
ORDER BY Kayıtlarının sıralanması için kullanılacak bölüm]

Bu cümleciğe şu soruları sormamız mümkündür;
SELECT (Hangi alanları ?)
FROM (Hangi tablo ya da tablolardan)
WHERE (Hangi şartlarda ?)
GROUP BY (Nasıl bir gruplama ?)
ORDER BY (Hangi sırada ?)

Öncelikle bir tablonun yapısını görmek için;
DESC il;
İsim     Null?       Tip
—-    ——— —-
IL_KODU            NUMBER(2)
IL_ADI               VARCHAR2(14)


Bu bilgiler ışığında basit bir SQL cümlesiyle işe başlayabiliriz.
SELECT * FROM IL;
IL tablosundan tüm alanları getir..

IL_KODU IL_ADI
———- ————–
1 Adana
2 Adıyaman
3 Afyon
4 Ağrı
5 Amasya
6 Ankara
7 Antalya
8 Artvin
9 Aydın
10 Balıkesir

10 satırları seçildi.

SELECT IL_ADI FROM IL;
Personel tablosundan tüm kayıtların perno,adı ve soyadı alanlarını listele..

IL_ADI
————–
Adana
Adıyaman
Afyon
Ağrı
Amasya
Ankara
Antalya
Artvin
Aydın
Balıkesir

10 satırları seçildi.

Sorguda koşul vermek gerektiğinde bir takım karşılaştırmalar yapmamız gerekir. Karşılaştırma işlemine geçmeden önce karşılaştırma operatörlerini bir inceleyelim. Sorguda istediğiniz koşulu aşağıda görülen operatörlerle yapabiliriz.

=        :eşit
>        :Büyük
>=      :Büyük eşit
<        :Küçük
<=      :Küçük eşit
!=       :Farklı

Şimdi de IL tablosundan belli koşullara uyan kayıtları listelemeye çalışalım;
SELECT * FROM IL WHERE IL_KODU=6;

IL_KODU IL_ADI
———- ——
6 Ankara

SELECT * FROM IL WHERE IL_KODU<5; Il tablosundan il_kodu 5 ten küçük kayıtlar seçildi

IL_KODU IL_ADI
——— ——–
1 Adana
2 Adıyaman
3 Afyon
4 Ağrı

SELECT * FROM IL WHERE IL_KODU<5; Il tablosundan il_kodu 5 veya 5 ten küçük kayıtlar seçildi

IL_KODU IL_ADI
———- ——–
1 Adana
2 Adıyaman
3 Afyon
4 Ağrı
5 Amasya

SELECT * FROM IL WHERE IL_KODU!=5; Il tablosundan il_kodu 5 ten farklı olan kayıtları listele..

IL_KODU IL_ADI
——— ———-
1 Adana
2 Adıyaman
3 Afyon
4 Ağrı
6 Ankara
7 Antalya
8 Artvin
9 Aydın
10 Balıkesir

Where cümleceğinden sonra koşul bir tane olmak zorunda değildir. Koşul sayısını artırabiliriz. Ancak kullanılacak koşullar arasında mantıksal bir bağlaç olması gerekir. Bunlar;
AND       : Koşulun sağlanması için şartlardan ikisinin de sağlanması gerekir.
OR          : Koşulun sağlanması için şartlardan yalnız birinin sağlanması yeterlidir.

SELECT * FROM il WHERE Il_kodu=5 AND il_kodu=7;

Bu sorguda ben Il_kodu 5 ve 7 olan kayıtları listele dedim ama sonuçte hiç bir kayıt dönmeyecektir. Çünkü Il_kodu hem 5 hem de 7 olan hiç bir kayıt yoktur.

SELECT per_no,per_adi,per_soyadi FROM personel WHERE per_adi=’ALİ’ AND per_departman=’SATIŞ’;

Burada ise kişinin adı ALİ olacak ve departmanı SATIŞ olacak. Yani Satış departmanında çalışan ALİ ‘leri listeleyen bir sorgu.

SELECT * FROM il WHERE il_kodu=5 OR il_kodu=7;

IL_KODU IL_ADI
———- ——-
7 Antalya
5 Amasya

Il_kodu 5 olan VEYA il_kodu 7 olan kayıtları listele ifadesini kullandığımda ise hem 5 hem 7  olan kayıtları listeledi.

Oracle SQL Plus’ta koşul hanesinde eğer string bir alan karşılaştırılacaksa ; sabit ifadeleri tek tırnak içinde belirtmeliyiz.

SELECT * FROM il WHERE il_adi=’ANKARA’; gibi..

WHERE şart cümleciği içinde yukarıdaki karşılaştırma operatörlerini kullanabildiğimiz gibi ayrıca operatörlerden de söz edebiliriz

BETWEEN a1 AND a2         :a1 ve a2 arasındaki kayıtlar
NOT BETWEEN a1 AND a2 :a1 ve a2 arasında olmayan kayıtlar
IN(a1,a2,a3,…)               : Listede belirtilen herhangi bir değeri içeren kayıtlar
NOT IN(liste)                   : Listede belirtilen herhangi bir değeri içermeyen kayıtlar
LIKE                               :Karakter ifadelerde alan içeriğinin bir bölümünü sağlayan kayıtlar
NOT LIKE                        :Karakter ifadelerde alan içeriğinin bir bölümünü sağlamayan kayıtlar
IS NULL                          :Boş olan kayıtlar
IS NOT NULL                    :Boş olmayan kayıtlar

SELECT * FROM il WHERE il_kodu BETWEEN 3 AND 7;

IL_KODU IL_ADI
———- ——–
3 Afyon
4 Ağrı
5 Amasya
6 Ankara
7 Antalya

SELECT * FROM il WHERE il_kodu NOT BETWEEN 3 AND 7;

IL_KODU IL_ADI
——— ———-
1 Adana
2 Adıyaman
8 Artvin
9 Aydın
10 Balıkesir

SELECT * FROM il WHERE il_kodu IN(3,5,8,105);

IL_KODU IL_ADI
———- ——-
3 Afyon
5 Amasya
8 Artvin

SELECT * FROM il WHERE il_kodu NOT IN(3,5,8,105);

IL_KODU IL_ADI
———- ————–
1 Adana
2 Adıyaman
4 Ağrı
6 Ankara
7 Antalya
9 Aydın
10 Balıkesir

LIKE Karakter alan içinde bulunan değerin yalnızca bir kısmını sorgulamak için kullanılır. Burada  % ifadesi de genelde kullanılır. Büyük küçük harf ayrımı yapılacağından sorgu yazılırken buna dikkat edilmesi gerekir. Eğer Access kullanılıyorsanız % yerine * kullanmalısınız. Ayrıca string ifadeleri  tek tırnak içine değil çift tırnak içine almalısınız.

SELECT * FROM il WHERE il_adi LIKE “A*”; il_adi A ile başlayan kayıtlar. (Access için)

SELECT * FROM il WHERE il_adi LIKE ‘A%’; il_adi A ile başlayan kayıtlar.

IL_KODU IL_ADI
———- ——–
1 Adana
2 Adıyaman
3 Afyon
4 Ağrı
5 Amasya
6 Ankara
7 Antalya
8 Artvin
9 Aydın

SELECT * FROM il WHERE il_adi LIKE ‘%a’; il_adi a ile biten  kayıtlar.

IL_KODU IL_ADI
——- ——-
1 Adana
5 Amasya
6 Ankara
7 Antalya

SELECT * FROM il WHERE il_adi LIKE ‘%s%’; il_adi içinde s harfi geçenler

IL_KODU IL_ADI
——– ———
5 Amasya
10 Balıkesir

 

 

 

 

 

 

 

 

 

 

 

 

 

Ders 2          

 

personel, kurum,departman tablolarına gözat

personel

per_no

per_adi

per_soyadi

per_kurum_kodu

40651092

MEHMET

AKYÜREK

111943

46404046

FATMA

ŞAHİN-ONAY

111943

48693196

İHSAN

ATEŞ

111918

49691388

AKGÜL

YILMAZ

111918

49696089

ABDULLAH

ESER

111943

50643261

MEHMET İHSAN

PEKMEZOĞLU

111918

64697143

ARİF

EFE

111906

41941157

AYSEL

KAYGUN

268532

42691389

KOCA

ŞİRİN

111607

43241232

OSMAN

KARAPINAR

111715

43691338

BEKİR

AYDIN

280543

43695150

MUSTAFA

DÜLDÜL

374215

43911080

MEHMET EMİN

ÇOKAN

473392

44557104

MUSTAFA

ÖZLÜ

473487

44691441

MEHMET

KARAMAN

244170

44691443

MUSA KAZIM

ÖRNEK

111656

44731206

SEVGİ GÜLŞEN

ÖNDERLİ

111597

45696146

MEHMET

YILDIZ

111607

45833157

ŞAHMAN

YILDIRIM

444123

45836109

HALİL

YILDIZ

113680

46661279

ZEYNEL

BUTEV

443703

46697250

ABDİ

TOPAKTAŞ

443715

46833136

İMAM

ERDOĞDU

211562

47506028

GÜLTEN

TURHAN

111835

47696097

SADULLAH

KARTAL

111872

47835108

ALİ

AYATA

268532

47849033

OSMAN

DENİZ

443715

47922026

AHMET

BİNARDAN

246886

48566170

ZEKİ

TORAMAN

473152

48703024

OSMAN

YAPÇA

336860

49696114

TASİN

GÜNGÖR

342828

49697408

KEMAL

AKTAŞ

215822

49702033

MUSTAFA

DÜNDAR

113680

49844045

M.EMİN

ÖNER

270814

49882068

HAYDAR

TEKİN

111668

49997023

ÖMER

DEMİRCAN

473259

50580089

YUSUF

DOĞANER

270814

50691303

HAMZA

KURTOĞLU

111668

50691638

SALİH

OBA

444123

50694061

CEZMİ

KIZILKAYA

111872

50697508

OSMAN

ÇOŞKUNOĞLU

111752

50697512

MEHMET

GÖZÜKARA

111536

50697537

RAHİME

KARAKUŞ

443703

50896193

MAHMUT

DAYIKARACA

352006

51354054

HANİFE

ÇAPÇI

790157

51580060

BEKIR

KELEŞER

270814

51691471

HANDAN

TATLI

111656

51691597

ESİN

CANAK

374107

51691640

KEMAL

KALKAN

111536

51693200

OSMAN

OZAN

113680

 

 

 

 

 

 

 

Kurum

 

 

kur_kodu  

kur_ilce_kodu  

kur_adi

111918  

100  

İl Milli Eğitim Müdürlüğü

111906  

100  

İl Eğitim Araçları ve Donatım Merkezi(ASO)

111943  

100  

Sağlık Eğitim Merkezi

733321  

101  

Süreyya Nihat Oral İlköğretim Okulu

323158  

101  

Adasokağı Lisesi

816584  

101  

Oğuz Kağan Köksal Görme Engelliler ilköğ.O

817959  

101  

Bahçeşehir İlköğretim Okulu

818894  

101  

Cumhuriyet Anaokulu

846449  

101  

Seyhan İlköğretim Okulu

846425  

101  

Yenişehir İlköğretim Okulu

846437  

101  

2000 Evler İlköğretim Okulu

320703  

101  

Şakirpaşa Lisesi

348168  

102  

Öğretmen Evi

375149  

102  

Büyüksofulu İlköğretim Okulu

337147  

102  

Sinanpaşa İlköğretim Okulu

337302  

102  

Akören İlköğretim Okulu

214088  

102  

Halk Eğitim Merkezi

111955  

102  

İlçe Milli Eğitim Müdürlüğü

428712  

104  

Kurtkulağı Orhanekinci İlköğretim Okulu

428773  

104  

Besocak İlköğretim Okulu

428797  

104  

Ataturk İlköğretim Okulu

428819  

104  

Ayse Malaz İlköğretim Okulu

428832  

104  

Fevzı Cakmak İlköğretim Okulu

428820  

104  

Dumlupınar İlköğretim Okulu

442710  

106  

Tortulu Ziyelli İlköğretim Okulu

442709  

106  

Yerebakan İlköğretim Okulu

442663  

106  

Tokmanaklı İlköğretim Okulu

442651  

106  

Sahmuratlı İlköğretim Okulu

442161  

106  

Çandırlar-Bekirhacılı İlköğretim Okulu

442053  

106  

Akkaya İlköğretim Okulu

441993  

106  

Belenköy İlköğretim Okulu

442041  

106  

Akoluk İlköğretim Okulu

790001  

107  

OTLUK İLKÖĞRETİM OKULU

790050  

107  

Ü.ORTAEĞRİÇAM İLKÖĞRETİM OKULU

790108  

107  

ALAYBEYİ İLKÖĞRETİM OKULU

337255  

107  

Mehmet Akif İlköğretim Okulu

374264  

107  

Cumhuriyet İlköğretim Okulu

322883  

107  

İmamoğlu Çok Programlı Lisesi

826526  

107  

Hürriyet İlköğretim Okulu

392081  

109  

Örcün İlköğretim Okulu

392093  

109  

Çevlik İlköğretim Okulu

 

 

 

 

 

 

 

 

Depertman

 

 

 

 

 

 

 

 

Dep Kodu

Dep Adi

 

 

1

Muhasebe

 

 

2

Satış

 

 

3

İnsan Kaynakları

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Alan (Sütun Birleştirmek ve sütunlara isim vermek)

 

Liste alırken bazı alanları birleşik olarak almanız gerekebilir. Personel Tablomuzda kişinin adı ve soyadı farklı alanlarda kayıtlı ve biz bu iki alanı birleşik almak istiyoruzbu durumda || (pipe) ifadesini kullanmalıyız.

SELECT per_no,per_adi||per_soyadi from personel where per_kurum_kodu=111918;

PER_NO

PER_ADI||PER_SOYADI

48693196

İHSANATEŞ

49691388

AKGÜLYILMAZ

50643261

MEHMETPEKMEZOĞLU

Yalnız burada isim ve soyad arasında boşluk eklemediğimiz için isim soyadı birleşik yazdı. Aynı mantıkla boşluğu da ekleyebiliriz.(tek tırnak içerisinde iki adet boşluk)

SELECT per_no,per_adi||’   ‘||per_soyadi from personel where per_kurum_kodu=111918;

PER_NO

PER_ADI||”||PER_SOYADI

48693196

İHSAN ATEŞ

49691388

AKGÜL YILMAZ

50643261

MEHMET  PEKMEZOĞLU

Şimdi oldu yalnız bir problemimiz daha var liste başlığının kötü görüntüsü onu da aşağıdaki şekilde çözebiliriz. (Sütunlara isim tanımlama)

SELECT per_no,per_adi||’   ‘||per_soyadi AdSoyad from personel where per_kurum_kodu=111918;

PER_NO

ADSOYAD

48693196

İHSAN ATEŞ

49691388

AKGÜL YILMAZ

50643261

MEHMET  PEKMEZOĞLU

İki alanı birleştirmek zorunda değiliz sabit bir ifadeyi de ekleyebiliriz.

SELECT il_kodu,il_adi||’  ‘||’Kenti’ FROM il WHERE il_kodu<6;

IL_KODU

IL_ADI||”||’KENTI’

1

Adana Kenti

2

Adıyaman Kenti

3

Afyon Kenti

4

Ağrı Kenti

5

Amasya Kenti

 

 

Birden fazla tablo ile Sorgu Yazmak

 

İlişkisel veritabanlarında, tablolara en hızlı ulaşım ve verilerin az yer kaplaması düşünülerek tasarım yapılır. Bu anlamda biz de tablo tasarımlarımızı bu ölçülere dikkat ederek yapmaya çalıştık. Verilen örnek veri tablolarında personel ile kurum dikkate alınacak olursa;
Personel tablosunda per_no,per_adi,per_soyadi,per_kuurum_kodu yer alıyor. Kurum adı değil kurum kodu yer alıyor. Peki neden ?

PER_NO

PER_ADI

PER_SOYADI

PER_KURUM_KODU

48693196

İHSAN

ATEŞ

111918

49691388

AKGÜL

YILMAZ

111918

50643261

MEHMET

PEKMEZOĞLU

111918

111918 koduna sahip kurumda üç kişi çalışıyor. Bu sayı tabii ki gerçek bir veritabanında yüzlerce olabilir. Eğer biz personel tablosuna kurum kodu değil de kurum adını girseydik her personel için bir kurum adı hanesi yer alacaktı ve aşağıda görüldüğü gibi personel başına kurum adi için ‘İl Milli Eğitim Müdürlüğü’ veri girilecekti ve toplam 25 Byte ‘lık bir yer gerekecekti. Oysa biz personel tablosuna kurum adı yerine kurum kodu girerek 4 byte ile bu veriyi ifade edebiliyoruz.

KUR_KODU

KUR_ILCE_KODU

KUR_ADI

111918

100

İl Milli Eğitim Müdürlüğü

111906

100

İl Eğitim Araçları ve Donatım Merkezi(ASO)

111943

100

Sağlık Eğitim Merkezi

Peki bu durumda biz personelin çalıştığı kurumu görüntülemek istersek ne yapmalıyız ? İşte bu durumda SQL yazarken birden fazla tablodan yararlanmak zorundayız. Yukarıda görülen personel tablosundaki per_kurum_kodu ile kurum tablosundaki kur_kodu alanları bağlantı alanlarıdır. SQL yazarken bu iki alanı join etmeliyiz;

SELECT per_no,per_adi,per_soyadi,kur_adi
FROM personel,kurum
WHERE per_kurum_kodu=kur_kodu and kur_kodu=111918;

PER_NO

PER_ADI

PER_SOYADI

KUR_ADI

48693196

İHSAN

ATEŞ

İl Milli Eğitim Müdürlüğü

49691388

AKGÜL

YILMAZ

İl Milli Eğitim Müdürlüğü

50643261

MEHMET

İHSAN PEKMEZOĞLU

İl Milli Eğitim Müdürlüğü

Select :Personel tablosundan per_no,per_adi,per_soyadi ve kurum tablosundan kur_adi listelenecek alanlar..
From :personel,kurum tablosundan alınacak..
Where: per_kurum_kodu=kur_kodu na eşitse  ve per_kurum_kodu=111918 ise..

Burada ilk bağlantılı bir SQL komutunu gerçekleştirmiş olduk.

Birleştirilecek tablo sayısı ikiden çok (örneğin onlarca) olabilir. Yukarıda personelin çalıştığı kurumu görüntülrmiştik. Departman tablomuzla da bağlayarak kişilerin çalıştığı bölümü de görüntüleyelim.

SELECT
per_no,per_adi,per_soyadi,dep_adi,kur_adi
FROM

personel,departman,kurum
WHERE

per_departman=dep_kodu and
per_kurum_kodu=kur_kodu and
kur_kodu=111918;

PER_NO

PER_ADI

PER_SOYADI

DEP_ADI

KUR_ADI

48693196

İHSAN

ATEŞ

Satış

İl Milli Eğitim Müdürlüğü

50643261

MEHMET

PEKMEZOĞLU

Satış

İl Milli Eğitim Müdürlüğü

49691388

AKGÜL

YILMAZ

İnsan Kaynakları

İl Milli Eğitim Müdürlüğü

Personellerimizin maaşları da MAAS isimli bir tabloda tutuluyor. Bu tabloda primary key olmayacak çünkü bir personelin her hay aldığı maaş bu tabloya yazılacak. Yani bir yıl için düşünülecek olursa bir kişiye ait 12 adet kayıt bu tabloda yer alacatır. Biz bu tür ilişkilere master-detail diyoruz. Burada master personel tablosu detail ise maas tablosudur. Bu durumda bir kişiye ait maaş dökümlerini almak istediğimizde personel ve maaş tablolarını kullanmak suretiyle aşağıdaki SQL cümleciğini yazabiliriz.

SELECT per_no,per_adi,per_soyadi,maas_ay,maas
FROM personel,maas
WHERE per_no=maas_kodu and per_no=48693196;

PER_NO

PER_ADI

PER_SOYADI

MAAS_AY

MAAS

48693196

İHSAN

ATEŞ

1

26000

48693196

İHSAN

ATEŞ

2

27000

48693196

İHSAN

ATEŞ

3

33000

48693196

İHSAN

ATEŞ

4

2000

Yukarıda görüldüğü gibi maaş tablosunda ilgili kişiye ait 4 adet kayıt olduğundan 4 kayıt görüntülendi. Maaş tablosunda kişinin hangi ayda ne kadar ücret aldığı belli ancak ayların ismi değil kaçıncı ay olduğu görünüyor. Ağer ayların ismini de görüntülemek için aylar isimli tabloyu da kullanmalıyız.

SELECT per_no,per_adi,per_soyadi,ay_adi,maas
FROM personel,aylar,maas
WHERE per_no=maas_kodu and

maas_ay=ay_kodu and
per_no=48693196;

PER_NO

PER_ADI

PER_SOYADI

AY_ADI

MAAS

48693196

İHSAN

ATEŞ

Ocak

26000

48693196

İHSAN

ATEŞ

Şubat

27000

48693196

İHSAN

ATEŞ

Mart

33000

48693196

İHSAN

ATEŞ

Nisan

2000

devam edecek…

Delphi ve SQL

DELPHİDE SQL KULLANIMI

Database İlişkisi 

ID AD MAAS } Kolon adı (field)

1 Kazım 10000 }

2 Metin 75000 } Kayıt (rows)

… …………….. ……….. }

Kolon Kolon Kolon

 

Table : Database'de saklanan kolonların birleşiminden oluşan kümedir. Table'ın data tipi yoktur.

Row : Tek kayıt demektir.

Column : Table'daki kolon adına ait kayıtlardır. Örneğin, 'AD' kolonu demek 'AD' kolonuna girilen verilerin tümüdür.

Field : Kolon başlıkları ile kayıt başlığı olanlardır.

Primary Key : Unique + not null (Tek olmalı ve boş geçilemez.)

Foreign Key : Primary key gibidir. Fakat null değerler alabilir. 

Table'lar ilişkisel veri tabanı(compact) olmalıdır. Tablolar arasında bir ilişki kurulmalıdır. 

Oracle database'i ile kullanıcı arasında SQL_NET ilişki kurar. Protokoller belirlenir, bir isim altında konfigurasyonlar birleştirilir. Böylece database ismi tanımlanmasıyla ona ait tüm konfigurasyonlar oluşturulur. 

RDBMS : Oracle'ın server tarafındaki protokoludür. Hızlı erişim sağlar. Güvenlik son derece güçlüdür. Client / server desteklidir.

TCP/IP : Oracle'ın server tarafındaki protokoludür.IP numaraları sayesinde client / server mimarisi iletişimi kurulur. RDBMS gibi ortak özellikler taşır. 

Referantional : Tablolar arasındaki referansların belirtilmesidir. Bazen bir kolonun değerlerinin başka bir tablodaki kolonlardan veri laması gerekmektedir. bu durumda referans verilir. 

Bir projeye başlarken şu aşamalar yapılır;

  1.  
  2. İyi bir analiz
  3.  
  4. Analizin tablolara göre dizaynı ve aralarındaki ilişkiler
  5.  
  6. Akış şeması ve döküman hazırlanması
  7.  
  8. Test edilmesi
  9.  
  10. Üretime geçilmesi 

Database'e üzerinde giriş,değişiklik,silme vb. İşlemlersql ile olur. Tablolar fiziksel olarak gözükmezler. Database içinde saklıdırlar. Operatörler kullanılabilir. 

Data Dictionary: Database'deki kullanıcılar, yaratılan tablolar vb. Nesneler hakkında detaylı bilgiler bulunan tablodur. Belli başlı fonksiyonlarla ulaşılabilir. 

SQL : Tablolar arasında iletişim kurar, sorgulama yapar.

SQL *Plus : Ek olarak bloklar oluşturulabiliyor. Mantıksal döngüler ve komutlar oluşturulabiliyor. IF, FOR vb.

PL / SQL : Server'a bağlanıp insert, update, delete vb. Database üzerinde direkt işlemler yapılabilir. Database'e en hızlı ulaşım ve sorgulama biçimidir.

  •  
  • Yazılan komutlar bufferda işlem yapar. O yüzden her yeni komut yazıldığında önceki komutu siler.
  •  
  • Yazılım kontrolu(syntax) her satırın sonunda kontrol edilir.
  •  
  • Çeşitli formatlarla çıktı alınabilir.
  •  
  • Direkt komut sonunda sonuç alınır.,
  •  
  • Select ile data okunur.
  •  
  • İnsert, update,delete (DML) ile var olan bir tablo üzerinde değişiklikler yapılabilir.
  •  
  • Create,alter,drop,rename, truncate(DDL) ile yapısal değişiklikler yapılabilir.
  •  
  • Commit,rollback,savepoint (tranaction) ile yapılan işleri onaylar veya geri alır, iptal edilebilir.
  •  
  • Grant,revoke (DCL) ile objelerin kullanılmasına hak vermek veya geri almak içindir. Güvenlik kurulur.
  •  
  • Exit (^D) ile SQL'den çıkış sağlanır. Böylece yapılan işlemler iptal olur.

 

NOT: Tnsnames.ora  Database hakkında bilgiler bu dosyada saklıdır.

Listener.ora  Server tarafında bulunan config dosyasıdır.

 

NOT: Komut yazılımdaki köşeli parantezler o alanın zorunlu olmadığını belirtir. {} işaretleri o alan için birden fazla değer alacağını gösterir. Büyük harf yazılanlar oldugu gibi yazılır. Küçük harf yazanlar açıklamadır. 

SELECT komutu 

Select komutu ile database'den istenilen kriterlere göre veri getirlir. 

Yazılımı:

SELECT [DISTINCT] {*,column [alias] ,….}

FROM Tablo

[WHERE koşullar]

[ORDER BY {column,expr} [ASC|DEXC] ] ; 

SELECT :Seçilen kolonları alır.

DISTINCT :Belirtilen kolondaki aynı değerlere sahip verilerden sadece birini alır. Örneğin personel kodu xxx olanın personel adı gibi.

alias :Kolon adlarının daha açık olması için tanımlanır.

FROM table :Belirtilen tabloyu açar.

WHERE :Belirli kriterler koşullar oluşturulur. Tablolar arasında birleştirmeler yapılabilir.

ORDER BY :Seçilen kolona göre sıralı kayıt getirir.

ASC :Artan sırada listelenir. Varsayılan budur.

DESC : Artan sırada listelenir. Varsayılan budur.

* : Tüm kolonlar seçilmiş anlamındadır.

 

Listelemede rakamlar sağa yanaşık, karakterler sola dayalı gözükür. Kolon adları büyük harf görüntülenir.Aritmatik işlemler kullanılabilir (+,-,/,*). Örneğin;

Select maas+maas*0.10 From Personel_Table;

Bazen bir matematiksel işlemler daha uzun veya daha karmaşık olabilir. Fonksiyon tanımlayarak kolona sorgulatıp bir sonuç üretebiliriz. Matematiksel işlemlerde öncelik sırası;

  1.  
  2. Parantezler (,)
  3.  
  4. *,/,+,-
  5.  
  6. soldan sağa doğru öncelik sırası,

şeklindedir.

 

Column Alias : Kolon başına açıklayıcı isim verilebilir. Tırnak işaretleri (") ile açıklayıcı kelime belirtilir. Tek kelime için " işareti kullanılmasada olur. Örneğin;

Select ad AS "Adı" From Personel_Table;

 

Concatenation Operator: Birden fazla stringi veya kolonu yan yana birleştirip listelemek için kullanılır. İfadeler string olmalıdır. Zaten karakter ve tarih formatındaki değerler tırnak( ' ) işaretleri içerisinde belirtilir. Örneğin;

Select ad||' ' ||soyad AS "Adı Soyadı" From Personel_Table;

 

Null : Değeri hiç girilmeyen kolonlar NULL değerini alırlar. NULL sıfır veya boşluk karakteri değildir. Yokluk demektir. Bir rakam ile NULL değer üzerinde matematiksel işlemler yapılamaz.

 

NVL Fonksiyonu: Null değeri yerine yeni değer atar. Alan tipi ne turde ise alacağı değer o türde olmalıdır.

 

Yazılımı:

NVL (null_değeri_alan,yeni_değer)

 

Örneğin;

NVL(Maas,0);  Maas kolonundaki null değerlerin yerine sıfır atar.

veya NVL(Ad,' ');  Ad kolonundaki null değerlerin yerine bos karakter atar.

 

En önemli kullanım amacı hesplamalara işlemin yarıda kesilmesini engellemek içindir. Örneğin maasa zam miktarı eklensin. Ama bazı personele zam yapılmadığı varsayılırsa bu kişiler icin zam kolon değeri null'dur. Buna göre;

SELECT maas+NVL(zam,0) From Personel_Table;

 

Tab : Tüm tabloların adlarının saklandığı alandır. Örneğin tüm tabloların listesini vermek için aşağıdaki iki yazılımı da kullanabiliriz.;

Yazılımı;

SELECT * From Tab;

SELECT table_name From user_tables;

 

Desc : Tablonun kolonlarının adlarını, kolonların tipini ve null değer alıp alamayacağı durumlarını gosterir.

 

Yazılımı:

DESC tablo_adı;

 

Kolon tiplerinden bazıları;

 

NUMBER(rakam,ondalık)  Sayısal ifadelerdir. Rakam alanı sayının max alabileceği tamsayı kısmını verir. Ondalık alan ise max. decimal değerini verir.

 

VARCHAR2(sayı)  Karakter ifadelerdir. Sayı ile belirtilen alan, max. karakter sayısıdır.

 

DATE  Tarih ve saat ifadeleridir. Ülke kodu desteğiyle çeşitli formatlarda database’de tutulurlar.

 

CHAR(sayı)  Karakter ifadesidir. VARCHAR2’den tek farkı database’de saklanma şeklidir. Max 255 karakter alabilir. Sayı ile belirtilen alan, max. karakter sayısıdır.

 

ORDER BY : Seçilen kolona göre sıralama yapar. DESC artan sırada, ASC azalan sırada listeler. Null değerler sıralamaya alınmazlar. Örneğin azalan sırada ada gore liste alınsın;

SELECT ad,soyad FROM Personel_Table ORDER BY ad DESC;

 

Eğer kolonlar birden fazla ise kolon numarası ile de tanım belirtilebilir;

SELECT ad,soyad FROM Personel_Table ORDER BY 1 DESC;

 

Eğer birden fazla kolona göre sıralama yapılmak istenirse, önce yazılan kolon baz alınarak diğer kolona göre sıralı listeler.

SELECT ad,soyad FROM Personel_Table ORDER BY 1,2 DESC;

 

WHERE : Sorgulamaları sınırlandırmak amacıyla koşullar konulur. Örneğin departmanı 38 kodlu personel listesi;

SELECT ad ||' ' ||soyad FROM Personel_Table WHERE Dept_Id=38;

 

<,>, >=, <= gibi karşılaştırma karakterleri kullanılabilir. Bunlar dışında bazı SQL operatörleri ile daha rahat koşullar konulabilmektedir.

 

BETWEEN Min AND Max: Belirtilen Min. ve Max. değerler arasında değer alabilir. Yani belirtilen iki değer arasında değerler alır. Örneğin yaşı 18 ile 30 arasındaki personeller;

SELECT ad ||' ' ||soyad FROM Personel_Table

WHERE yas BETWEEN 18 AND 30;

 

IN (liste) : Liste olarak tanımlanan değerleri alır. Yani bir şekilde OR ifadesine denktir. Örneğin yaşı 18, 25 ile 30 olan personeller;

SELECT ad ||' ' ||soyad FROM Personel_Table

WHERE yas=18 OR yas=25 OR yas=30;

Veya

SELECT ad ||' ' ||soyad FROM Personel_Table

WHERE yas IN(18,25,30);

 

LIKE : Benzerlik vermek için kullanılır. '%' karakteri tum karakterler yerine geçer. '_' karakteri ise tek karakter yerine geçer. Sadece _ işaretini çıkarmak için ' _ ' işareti kullanılır. Küçük büyük harf ayrımı vardır.

 

'%t'  t harfiyle başlayanlar.

'%t%'  t harfi geçen tüm kayıtlar.

'B_K%'  B baş harfi ile başlayan ve 3. Harfi K olan tüm kayıtlar.

 

karakterleri arasında değer girilirse kolon içinde Örneğin soyadı 'M' ile başlayan personeller;

SELECT ad ||' ' ||soyad FROM Personel_Table

WHERE soyad LIKE ' M% ' ;

 

IS NULL : Kayıdın null olup olmadığını kontrol eder. Örneğin maaşı null olan kayıtları listelesin;

SELECT ad ||' ' ||soyad FROM Personel_Table

WHERE maas IS NULL ;

NOT : Belirtilen koşulun tam ters koşulunu verir. Örneğin maaşı null olmayan kayıtları listelesin;

SELECT ad ||' ' ||soyad FROM Personel_Table

WHERE maas IS NOT NULL ;

 

SQL *Plus Üzerinde Sorgu Hazırlanmasında Kullanılacak

Yardımcı Komutlar

 

Sql komutları sadece hafızada tutulurlar. İşletilen her komut hafıza tutulur. O yüzden kullanıcının işini kolaylaştırmak için bazı ek komutlara ihtiyaç duyulmuştur.

 

Sql Plus’a girmek için komut satırında şu şekilde girilir;

SQLPLUS [kullanıcı adı [/şifre [@Database]]]

 

 

A[PPEND] Text  Satır sonuna kelime ekler.

C[HANGE] /eski/yeni  eski text yerine yeni text ekler. Yeni alanı boş bırakılırsa eski alan olarak belirtilen text silinir.

CL[EAR] BUFF[ER]  SQL hafızasındaki tüm satırları siler, hafızayı boşaltır.

DEL  Aktif olarak bulunduğu satırı siler. Satır no belirtilirse o satırı siler.

I[NPUT] Text  Satır arasına Text ifadesiyle belirtilen cumleyi ekler.

L[IST]  Hafızadaki tüm satırları listeler.

L[IST] m n  Sadece m ile n arasındaki satırları listeler.

R[UN]  Hafızadaki SQL satırını çalıştırır. Aynı işlevi "R,r,/, ; " karakterleride yapar.

n Text  n satırındaki cümleyi Text ifadesi belirtilen alana yazılan cümle ile değiştirir.

0 Text  Bulunduğu satırdan bir önceki satıra yeni alan açar ve texti oraya ekler.

SAVE Dosya  Hafızadaki komutu belirtilen dosya adı altında saklar.

GET Dosya  Belirtilen dosyayı hafızaya yukler.

START Dosya Belirtilen dosyayı direkt çalıştırır. Hafızaya yuklemez. @ işaretide aynıdır.

ED[IT] Dosya Belirtilen dosyayı bir editör içinde açar.

SPOOL  Ekranda yapılan her türlü işi dosyaya atar. SPOOL OFF ile dosyaya kayıt işlemini durdurur.

EXIT  SQL’den çıkış sağlar.

HELP Komut  Belirtilen komut için açıklayıcı bilgi verir.

 

SQL Plus Fonksiyonları

 

Fonksiyonlar sayesinde;

  • Datalar üzerinde hesap yapabilir,
  • Datalar üzerinde değişiklikler yapılabilir,
  • Grup oluşturularak bu kayıtlar için kullanılabilir.
  • Tarih datası çeşitli formatlarda görüntülenebilir,
  • Kolon tipleri değiştirilebilir.
  • İç içe fonksiyonlar tanımlanabilir. Öncelikle içteki fonksiyon çalışır. Çıkan sonuca göre dıştaki fonksiyon işlem görür.

 

Sys.Dual : Oracle database’inde bulunan tek kolon ve tek satırdan oluşan bir tablodur. Belirli bir tablodan değerler almadan fonksiyonların kullanılması gerektiginde bu tablo kullanılır.

 

Karakter Fonksiyonları

 

LOWER(Text) : Text olarak belirtilen alanı küçük harfe çevirir.

UPPER(Text) : Text olarak belirtilen alanı büyük harfe çevirir.

INITCAP(Text) : Text olarak belirtilen alanın baş harfini büyük diğerlerini küçük harfe çevirir.

CONCAT (Text1,Text2) : Text1 olarak belirtilen alan ile Text2 alanını birleştirir. ‘ || ‘ simgeside aynıdır.

SUBSTR(Text,m,n) : Text alanının m. karakterinden itibaren (m. karakter dahil) n kadar karakter alır.

LENGTH(Text) : Text alanın karakter uzunluğunu sayısal olarak verir.

NVL(KOLON,DEĞER) : Kolonun aldığı değer null ise değer alanında belirtilen değeri verir.

 

Sayısal Fonksiyonları

 

ROUND(Sayı,m): Sayı alanına girilen rakam, m olarak belirtilen ondalık kadar yuvarlar. Örneğin; ROUND(45.923,2)  45.92

ROUND(45.923,0)  46

ROUND(45.923,-1)  50

ROUND(45.951,2)  45.92

ROUND(45.929,2)  45.93

TRUNC(Sayı,m): Sayı alanına girilen rakam, m olarak belirtilen ondalık kadar sondan keser.

TRUNC(54.923,2)  45.92

TRUNC(54.923,-1)  40

TRUNC(54.929,2)  45.92

 

MOD(m,n) : m sayısı n sayısına bolundugunde kalan rakamı bulur.

 

Zamansal Fonksiyonları ve İşlemleri

 

Tarih + sayı  Tarihe sayı kadar gun ekler.

Tarih - sayı  Tarihe sayı kadar gun çıkarır.

Tarih - Tarih  İki tarih arasındaki gün farkını sayısal olarak verir.

Tarih + sayı / 24  Tarihe sayı kadar saat ekler.

 

SYSDATE  Sistem tarihini verir. Oracle’ın varsayılan tarih formatı ‘DD-MON-YY’ şeklindedir. Üzerinde aritmatiksel işlemler yapılabilir.

 

MONTHS_BETWEEN(tarih1,tarih2) İki tarih arasını ay olarak bulur.

ADD_MONTHS (tarih,n)  Tarihe n kadar ay ekler.

NEXT_DAY(tarih,' gün' )  tarih'den sonraki günün ilk tarihini verir.

LAST_DAY(tarih,' gün' )  tarih'den önceki günün ilk tarihini verir.

ROUND(tarih[,' fmt '] )  tarih'I belirtilen formata göre aya veya yıla göre yuvarlar.

TRUNC(tarih[,' fmt '] )  tarih'I belirtilen formata göre aya veya yıla göre keser.

 

Çevirme Fonksiyonları

 

TO_CHAR(Sayı,[‘fmt’]) : Girilen tarih veya sayıyı karakter tipine çevirir.

Tarih parametreleri;

YYYY  Yılı rakamsal olarak gosterir.

YEAR  Yılı yazısal olarak verir.

BC  Millattan once ve sonrası icin zaman verir.

MM  Ayı rakamsal olarak gösterir.

MONTH  Ayı yazısal olarak verir. Belirtilen ülkenin tarih yazısıyla

    verir.

MON  Ayı yazısal sadece ilk 3 harfini verir. Belirtilen ülkenin tarih

    yazısıyla verir.

RM  Ayı roma rakamıyla gösterir.

DD  Günü rakamsal olarak gösterir.

DAY  Günü yazısal olarak verir.

Sayısal parametreleri;

  1.  Rakamdır.
  1.  Sıfır rakamı verir.

$  Rakamın başına $ işareti koyar.

.  Ondalık haneye ayırır.

,  Rakamı 3’er hane ayırarark aralarına virgül koyar.

MI  Negatif sayılar için sonuna – itareti koyar.

 

Örneğin " x nolu kişi xxx'dir." Formatında ekrana liste oluşturalım (id number);

SELECT TO_CHAR(id) || ' nolu kisi ' ||name||'dir.'

Örneğin sistem tarihini DD-MM-YYYY olarak gösterelim;

SELECT TO_CHAR(sysdate,' DD-MM-YYYY')

 

Örneğin sistem zamanını HH:MI olarak gösterelim;

SELECT TO_CHAR(sysdate,' HH:MI' )

 

TO_NUMBER (Karakter) : Girilen karakteri sayısal ifadeye çevirir.

TO_DATE(char, [‘fmt’]) : Girilen karakteri belirtilen formatta tarih formatına çevirir.

 

Örneğin tarih kolonundaki değerleri, 7 /11/1998 tarihine eşit olanların listesini oluşturalım. Ama kolon değerleri string olarak ayın uzun ad, günü ve yılı sayısal olarak kayıtlıdır. Bu sorunu çözmek için kullanılır;

SELECT no, maas

FROM Personel

WHERE MAAS_TARIH=TO_DATE('KASIM 7, 1998', 'Month dd,YYYY')

 

Tablolar Arasında İlişki Kurulması (JOIN)

 

* Birden fazla tabloyla ilişki kurularak ortak sorgulama yapılmasıdır. Tabloları belli bir ortak kolona göre birleştirmek için join yöntemi kullanılır. Bunun için öncelikle tablolardaki kolonlar aynı tipte ve aynı büyüklükte olmalıdır.

 

Yazılımı:

SELECT table1.kolonları,table2.kolonları

FROM table1, table2

WHERE table1.kolon1=table2.kolon2

 

İki tabloyu birleştirmek için iki tabloda ortak bulunan kolonları where kotulu içinde etitleriz.

 

Örneğin personel adı ve bulunduğu departman listesi icin;

SELECT a.*,b.*

FROM personel a , departman b

WHERE a.dept_id=b.dept_id

 

Böylece personel tablosundan personel adı ve soyadı, departman tablosundan departman adı bilgisi getirilir.

 

* Bazı durumlarda tablo birleştirme koşulu bir aralık şeklinde oluşabilir. Yani tabloları birleştirirken anahtar sahaların belirli bir aralığı seçilebilir.

SELECT table1.kolonları, table2.kolonları

FROM table1, table2

WHERE table1.kolon1 BETWEEN table2.min2 AND table2. max2

 

* (OUTER JOIN) Bir diğer durumda tablodaki verilerin değerleri null olabilir. Fakat biz null değerlere sahip olanlarıda birlerştirmek istersek eksik olan tablonun yanına (+) işareti eklenir.

SELECT table1.kolonları, table2.kolonları

FROM table1, table2

WHERE table1.kolon1 (+) = table2.kolon2

 

* (SELF JOIN) Bir başka durumda aynı tablodaki kendi içindeki kolonlar arasında ilişki kurulabilir. Bazı durumlarda kolonlardaki değerleri eşit olma durumlarına göre sorgu düzenlenebilir.

SELECT table1.kolonları

FROM table1 a, table1 b

WHERE table1.a = table1. b

 

Grup (GROUP) Fonksiyonları

 

Bazen belli bir koşula uygun belli bir topluluk için sorgu kurulabilir. Bu durumda grup işlemi yapılır. Örneğin departmanlara göre grup oluşturulup o departmandaki personel sayısı hesaplanabilir. Grup fonksiyonları sadece grup ifadeleriyle kullanılabilir.

 

Yazılımı:

SELECT kolonlar, grup fonksiyonları

FROM table

[WHERE kotul]

[GROUP BY grup_kolonu]

[HAVING group_kotulu]

[ORDER BY kolon]

 

GROUP BY satırı ile kolonlar üzerinde küçük gruplar oluşturulur.

HAVING satırı ile bu oluşturulan grup için grup koşulları tanımlanabilir. Where koşulundan farkı WHERE kayıt üzerinde koşul koyar, HAVING ise sadece grup kayıtları üzerinde koşul konabilir ve grup fonksiyonları kullanılabilir.

 

AVG(Kolon) : Belirtilen kolonun ortalamasını bulur.

COUNT(Kolon) : Belirtilen kolonun kayıt sayısını bulur. Count(*) ile o grupta oluşturulan kayıt sayısı hesaplanır. Null değerler için nvl fonksiyonu kullanılır. Çünkü kolon içindeki null değerler işleme alınmaz.

MAX(Kolon) : Belirtilen kolondaki kayıtların değerlerinin maksimum değerini bulur. Sayısal, karakteristik veya tarihsel olarak kendi içinde sıralama yapabilir.

MIN(Kolon) : Belirtilen kolondaki kayıtların değerlerinin minimum değerini bulur. Sayısal, karakteristik veya tarihsel olarak kendi içinde sıralama yapabilir.

SUM(Kolon) : Belirtilen kolondaki kayıtların değerlerinin sayısal toplamını bulur.

VARIANCE(Kolon) : Belirtilen kolondaki kayıtların değerlerinin matematiksel varyansını bulur.

 

Örneğin bir personel listesindeki departmanların ayrı ayrı departman içindeki personelin max ve min maas alan kişilerin maaslarını isteyelim;

SELECT Departman_id, MAX(Maas) , MIN(maas)

TABLE Personel

GROUP BY Departman_id

 

Veya 38 nolu departmandaki personel sayısını bulalım;

SELECT COUNT(*)

TABLE Personel

WHERE Departman_id = 38

 

Veya tüm departmanlardaki maaşlarının ortalaması 80.000.000 ‘den büyük olanların listesini oluşturalım;

SELECT Departman_id, AVG(Maas)

TABLE Personel

GROUP BY Departman_id

HAVING AVG(maas) > 80000000

 

Bazı durumlarda iç içe grup oluşturulması istenebilir. Bu durumda şu şekilde yazılır.

GROUP BY Kolon1, Kolon2 , …

Örneğin Departman adına ve personel yasına göre grup oluşturalım.

SELECT Departman_id, Yas

TABLE Personel

GROUP BY Departman_id, Yas

 

Altsorgular(SUBQUERY)

 

Subquery, bir sorgu oluşturulurken, bu sorguya ait kriterleri başka bir sorgu belirleme durumudur. Kısaca sonucu bilinmeyen koşullar olduğunda bu yöntem kullanılır.

 

Yazılımı:

SELECT …..

FROM ……

WHERE kolon=( SELECT …

FROM ….

WHERE ….)

 

Select cümlesi parantes içinde tanımlanır. = koşulu kondu ise select cümlesi tek değer döndürmek zorundadır. Eğer birden fazla değer için koşul konulması gerekirse " in, not in " kelimesi kullanılır. Tek kayıt döndüğünde = yerine >,>=, <, <=, <> kontrol ifadeleride kullanabiliriz. Bir önemli nokta da koşula eşitlenecek değer 2. Select cümlesi içindeki kolon değerine eş olmalıdır. Yani tipleri eşit olmalıdır.

 

Subquery sorgulama tekniğinde order by kullanılamaz.

Having grup kotulu içinde select cümlesi kullanabiliriz.

 

Örneğin;

  1. sorgu : Kazım' ın departman numarası kaçtır?
  2. SELECT dept_id,name

FROM Personel

WHERE name='Kazım'

  1. sorgu : Departman numarası 38 olan kişilerin listesinden adı kazım olan var mı incele?
  2. SELECT dept_id,name

FROM Personel

WHERE dept_id=38

  1. sorgu : Bu iki sorgunun birleşimi istenirse, yani departmanı 38 olan kazım adlı personel bigisi ?

    SELECT dept_id,name

FROM Personel

WHERE dept_id=( SELECT dept_id

        FROM Personel

WHERE name='Kazım')

Çalışma Anında Sorguya Dışarıdan Değer Alma

 

Bir sorgu oluşturulurken bazen bazı alanların değerleri değişkendir. Bu yüzden sorguya dışarıdan değer girilmesi ve bu değere göre bir sorgu oluşturulması gerekir. Bunun için anahtar kelimenin başına ‘ & ‘ karakteri getirilir.

Örneğin istenilen departmankoduna göre personelin adı ve soyadı listeleyelim;

SELECT ad,soyad

FROM Personel

WHERE Dept_id = &Departman_kodu

 

Ekran:

Departman_kodu için değer gir: 38

eski 1: select ad,soyad from Personel where Dept_id = &Departman_kodu

yeni 1: select ad,soyad from Personel where Dept_id = 38

 

Eğer sorgu yazılımı sorunlu ise bu giriş yapıldıktan sonra anlaşılır ve kesinlikle girilen değer kolon tipine eş olmalıdır. Örneğin ‘&anahtar_kelime’ şeklinde tırnak arasında belirtilmişse giriş olarak sadece text değer girilir. Ama &anahtar_kelime tırnak içinde belirtilmemişse giriş yapılırken tırnak içinde giriş yapılmalıdır. Birden fazla &anahtar_kelime tanımlanırsa sırayla sorgu sorulur ve tüm değerler girildikten sonra sorgu oluşturulur. Eğer where koşulunda &anahtar_kelime’si kullanılmışsa giriş yapılırken matematiksel koşul şeklinde giriş yapabiliriz.

Eğer anahtar kelimenin başına ‘ && ‘ konulursa sorgu sırasında sadece bir kerelik sorgu sorulur. Bundan sonra anahtar kelimenin değeri ilk girilen değer olarak geçerlidir.

 

DEFINE değişken=değer : Belirtilen değişkene karakter atanır.

ACCEPT : Kullanıcıya açıklayıcı mesaj verilerek istenilen tipte veri girişi yapılması sağlanır. & işaretiyle yapılan işlemin daha kontrollu şeklidir.

Yazılımı :

ACCEPT değişken [datatipi] [ FORMAT ] [PROMPT text] [HIDE]

 

Değişken  Giriş yapılacak verinin değerinin tutulduğu anahtar kelimedir.

Datatipi  Girişi yapılacak verinin veri tipidir.

FORMAT  Giriş yapılacak verinin giriş düzeni sağlanır. Örneğin rakam için 9999 (4 haneli sayı) , karakter için A10 (10 karakterlik yer) .

PROMPT  Kullanıcıya gireceği değer için açıklayıcı mesaj görüntüler.

HIDE  Giriş yapılırken verinin görüntülernmeden giriş yapılması sağlanır. Örneğin şifre girişlerinde.

 

Örnekler;

ACCEPT adi PROMPT ‘Adınızı giriniz:’

ACCEPT yas NUMBER PROMPT ‘Yaşınızı giriniz:’

ACCEPT yil NUMBER FORMAT 9999 PROMPT ‘Bulunduğunuz yılı giriniz:’

ACCEPT sifre CHAR PROMPT ‘Tifrenizi giriniz:’ HIDE

 

Örnek: Personel adına göre personel bilgilerini gösterelim. Bunun için bir .sql uzantılı dosyada yazalım. Bu programı start ile çalıştıralım.

Ornek.sql

SET ECHO OFF

ACCEPT adi PROMPT ‘ Adınızı Giriniz:’

SELECT * FROM Personel

WHERE UPPER(Personel.ad) LIKE UPPER(‘&adi’)

/

SET ECHO ON

“Start Ornek.sql “ yazılarak sql çalıştırılır.

 

Bazen parametre girişlerini daha başlangıçta vermek istenirse;

Start Dosya_adı Parametreler,…

Örneğin yukarıdaki örnek için Start Ornek Kazım

 

Tabloların Yaratılması

 

Database’de verilerin saklanması amacıyla tablolar yaratılır. Tablo yaratabilmek için o kullanıcının buna yetkisi olmalıdır. Aynı zamanda limitsiz tablespace hakkına sahip olmalıdır.

 

Yazılımı :

CREATE TABLE [kullanıcı.]table

(kolon datatipi(boyutu) [DEFAULT değer]

[CONSTRAINT constraint_name] constraint_type]

[table_constraint]

[PCTFREE integer] [PCTUSED integer]

[TABLESPACE tablespace] [STORAGE storage_clause]

[CACHE]

[ENABLE enable_clause]

[DISABLE disable_clause]

[AS subquery]

 

Kullanıcı  Tablonun yaratıcısıdır. Onun sahip olduğu haklara ve mekana sahiptir.

Kolon  Tablonun kolon adlarını belirler. Bir tablodaki kolon sayısı 1-254 arasında olmalıdır.

Datatipi  Bir kolonun veri tipini belirler.

    Varchar2(boyut): Boyut ile belirtilen max miktar kadar karakterdir.Max

    değeri 2000’dir.

Char(boyut) : Boyut ile belirtilen max miktar kadar karakterdir.Max.

    değeri 255’dir.

Number : e38 ‘e kadar olan tüm sayısal değerlerdir.

    Number(m,n) : m kadar (max e38) sayının n kadar ondalık alan için

değer alır.

Date : Tarih ve saat değerlerini bir tutar.

Boolean : Mantıksal ifadeleri saklar. Yani doğru ise True,

        yanlış ise false.

Long : Max 2GB ‘a kadar büyük olan alanlar için yer tutar.

Raw : Grafiksel yapıdaki veriler için tanımlanır.

DEFAULT  Herhangi bir kolona değer girilmezse, direkt olarak değer atamaya yarar. Girilen değerin veri tipi ile aynı olması gerekir.

CONSTRAINT  O kolon için daha açıklayıcı olması açısından ve yapısı açısından kullanılır.

table_constraint  O tablo için daha açıklayıcı olması açısından belirtilen etikettir.

PCTFREE  Tablo üzerinde yapılan kayıt güncelleme işlemleri için, kayıt bloklarındaki ayrılacak rezervasyon yüzde değeridir. 1-99 arasında bir tamsayıdır. 0, tüm bloklara yeni kayıt girişine izin verilir. Varsayılan değer 10’dur. Yani güncelleme için her bloğun %10’unu rezerve eder. Geri kalan %90’nını ise yeni kayıt girişlerine ayırır.

PCTUSED  Tablonun her veri bloğu için Oracle’nin koruduğu, kullanılmış alanın min yüzdesini verir. 1-99 arasında bir tamsayıdır.Varsayılan değeri 40’dır. Verilen parametre değerinin altına düşek blok için, yeni kayıt girişi seçimliktir. PCTFREE+PCTUSED <100 olmak zorundadır.

TABLESPACE Oracle’ın tabloyu yaratacağı tablo boşluğunu belirler. Eğer tanımlanmazsa çalışılmakta olan kullanıcının tablo boşluğunda yaratılır.

STORAGE  Tablonun depolama karakteristiğini belirler. Büyük tablolarda perfonmans düzenleyici olarak kullanılır.

CACHE  Tablo üzerinde arama yapılırken, hafıza cache’nin en çok kullanılanlar üzerinde yer almasını sağlar.

ENABLE  Bütün sınırlamaları geçerli kılar.

DISABLE  Bütün sınırlamaları iptal eder.

AS query  Tablo yaratılırken, alt sorgu aracılığı ile geriye döndürülen satırlar tabloya yerlettirilir.(insert)

 

Data Dictionary

 

Database ile ilgili her türlü bilgiyi buraya atar. Buradan verilere ulaşabiliriz. Kullanıcılar, tablolar, indexler, constraintsler vb. birçok açıklayıcı bilgiler tutulur. Bütün tablo ve viewerların adlarını ve açıklamalarını görnek için ;

SELECT * FROM Dictionary;

Dictionary’nin yapısını görmek için;

DESC dictionary

İsim Tip

-------------------- --------------------------

TABLE_NAME VARCHAR2(30)

COMMENTS VARCHAR2(2000)

Dictionary’de bulunan objelerden bazıları;

User_tables  Hangi kullanıcı ile login olundu ise o kullanıcıya ait tabloları listeler.

All_tables  Bütün kullanıcıların yarattığı tabloları listeler.

Dba_tables  Database ile ilgili her türlü tablolar listelenir.

V$_tables  Systemin performansını ölçmek için tutulan bilgilerdir.

V$_librarycache Cache’in yeterli olup olmadığını anlamak için bakılır.

V$_rollstat  Rollback segmentinin yeterli olup olmadığını anlamak için bakılır.

Örnek : Login sifresiyle giren kullanıcının yarattığı tabloların listesini alalım;

SELECT table_name FROM user_tables

 

Örnek: Tüm obje isimlerinin listesini alalım;

SELECT object_name FROM user_objects

 

Database Üzerinde Transaction Kontrol Komutları

 

Transaction, datanın tutarlı şekilde korunmasını sağlayan yöntemdir. Database üzerinde kayıt yapma , silme, düzeltme vb. işlemlerin yapılabilmesi için aşağıdaki komutlara ihtiyaç vardır;

 

INSERT INTO : Tabloya yeni bir kayıt eklenmesini sağlar.

Yazılımı;

INSERT INTO table [(kolon1, kolon2, …)] VALUES (değer1, değer2, …)

 

Kolon  Tablonun kayıt yapılacağı kolon adlarını belirler. Bir tablodaki kolon sayısı 1-254 arasında ve o tabloda var olmalıdır.

Değer  O kolon için alacağı değer verilir. Kolon tipiyle aynı olmalıdır. Eğer kolon adları belirtilmezse değerler kolon sırasına göre değer almalıdır. Değerlere sysdate, user vb. hazır fonksiyonlar aktarılabilir. Eğer bir alana değer verilmesi istenmiyorsa, yani boş değer verilmesi isteniyorsa NULL değeri verilir.

Örnek: Personel tablosuna yeni bir personel giriti yapalım;

INSERT INTO personel (ad,soyad,maas,ayrilma_tarihi,kayit_giris_tarihi)

VALUES (‘Kazım’,’Sarıkaya’,400000000,NULL,SYSDATE)

 

Aynı örnek için kolon sırasını bildiğimiz düsünülürse şu şekildede yazılabilir;

INSERT INTO personel

VALUES (‘Kazım’,’Sarıkaya’,400000000,NULL,SYSDATE)

 

Sadece tek kayıt girişi yapılıyorsa, rahat veri girişi yapılması için değerlere değişken tanımlayarak veri girişi sağlayabiliriz. Böylece table her çalıştığında yeni veri girişi yapılır.

 

Örnek: Personel tablosuna her çalıştırdığımızda yeni bir personel girişi yapalım;

INSERT INTO personel (ad,soyad,maas,ayrilma_tarihi,kayit_giris_tarihi)

VALUES (‘&Adi’,’&Soyadi’,&maas,NULL,SYSDATE)

 

Örnek: Daha güvenli ve rahat giriş yapılacak şekilde kayıt yapılacak script yazalim;

SET ECHO OFF

ACCEPT ad PROMPT ‘Adını giriniz:’

ACCEPT soyad PROMPT ‘Soyadı giriniz:’

ACCEPT maas PROMPT ‘Maaşını giriniz:’

INSERT INTO personel(ad,soyad,maas,ayrilma_tarihi,kayit_giris_tarihi)

VALUES (‘&ad’,’&soyad’,&maas,NULL,SYSDATE)

/

SET ECHO OFF

Kayıt yapılacak kolonların değerleri bilinmiyorsa veya başka bir tablodan değer alınması gerekiyorsa aşağıdaki yapı kullanılır;

Yazılımı;

INSERT INTO table [(kolon1, kolon2, …)] Altsorgu

 

Örnek: Personel tablosuna departman tablosundan departman kodu 38 olan personellerin değerlerini aktaralım;

INSERT INTO personel(ad,soyad,maas,ayrilma_tarihi,kayit_giris_tarihi)

SELECT adi,soyadi,maasi,ayrilma,kayit_giris

    FROM departman

WHERE dept_id=38

UPDATE : Tablodaki kolonların değerlerini değiştirmek için kullanılır.

Yazılımı;

UPDATE table

SET kolon1=değer1, kolon2=değer2, …

[WHERE kotul]

 

Kolon  Tabloda değişiklik yapılacak kolon adıdır. Bir tablodaki kolon sayısı 1-254 arasında ve o tabloda var olmalıdır.

Değer  O kolon için alacağı değer verilir. Kolon tipiyle aynı olmalıdır. Eğer kolon adları belirtilmezse değerler kolon sırasına göre değer almalıdır. Değerlere sysdate, user vb. hazır fonksiyonlar aktarılabilir. Eğer bir alana değer verilmesi istenmiyorsa, yani boş değer verilmesi isteniyorsa NULL değeri verilir.

Örnek: 41 nolu departmanın maaşını %13 artıralım;

UPDATE Personel

SET maas=maas+maas*13/100

WHERE dept_id=41

 

Örnek: 649 nolu personelin departman kodu 10 olsun;

UPDATE Personel

SET dept_id=10

WHERE personel_id=649

 

Eğer WHERE koşulu konulmazsa tüm tablo için kolon değerini değiştirir. Koşulu SET ile değiştirdiğimiz kolona veremeyiz.

 

DELETE : Tabloda belirtilen kayıdı siler.

Yazılımı;

DELETE FROM table

[WHERE kotul]

 

Örnek : Personelin maaşları 100.000.000 ‘dan küçük olan kayıtları silelim;

DELETE FROM Personel

WHERE maas<100000000

 

Bir tablodaki tüm kayıtları silmek istersek koşul konmaz. Tablo silinmez, sadece kayıtları silinir.

Örneğin DELETE FROM Personel

 

Foreign key veya primary key silinecek kayıtda varsa silinme hatası verir. Çünkü başka tablo ile ilişki kurulduğundan(join), diğer tablonun kullandığı kayıt vardır. O yüzden bu kaydı silebilmek için, ilişkide bulunduğu tüm kayıtları önce silmek gerekir. Aynı zamanda tablo üzerinde çalışan kullanıcı varsa kayıtlar silinemez. ROLLBACK komutu ile silinen kayıtları kurtarabiliriz(Tabi ki en son COMMIT komutu kullanılana kadar).

 

COMMIT : Bütün yapılan işlemleri kesin olarak kalıcı olmasını sağlar. Böylece yapılan değişiklikleri varsa diğer kullanıcılarda görür.

SAVEPOINT x : İşlemi belirli bir yere yönlendirmek için kullanılır. X ile belirtilen alan için işaret konularak istenildiğinde bu işarete kadar işlemler yapılabilir.

ROLLBACK x : Bütün yapılan işlemleri kesin olarak iptal eder. SAVEPOINT komutu ile belirlenen x kodlu alana kadar olan tüm itleri iptal eder.

Yazılımı;

ROLLBACK [TO SAVEPOINT x]

 

Örnek:

UPDATE personel …..

SAVEPOINT dön

DELETE FROM Personel

INSERT INTO …..

ROLLBACK dön teklindeki bir itlemle personel kaydının silinmesi ve yeni kayıt eklenmesi işlemi iptal edildi. Ama ilk yapılan değişiklik kaldı.

Read uncommitted  Commit olmadan görünmez. O halde böyle level yoktur.

Read committed  Oracle’ın varsayılan değeridir. Committen sonra işlem görür.

Serializable  Yapılan insert işlemleri gözükmez. Eski datalar gözükür.
Read only  Transaction itleminde sadece okuma var demektir.

 

ALTER TABLE : Yeni bir kolon eklemek, kolonun tipini veya uzunluğunu değiştirmek vb. yapısal değişiklikler yapılması için kullanılır. Eğer kolon üzerinde değişiklikler yapılacaksa dikkat edilmesi gereken koşullar vardır. Örneğin kayıt uzunluğu 15 iken uzunluğunu 10’a indirirsek kayıt içindeki bilgiler kesilir. Kolonlar ekleyebilir ve yapısal değişiklikler yapabiliriz. Constraint yapısını ekler, silebilir, enable ve disable yapabiliriz.

Yazılımı;

ALTER TABLE table

[ADD (kolon datatipi [DEFAULT değer] [NOT NULL]) , …]

[ADD [CONSTRAINT açıklama] tipi (kolon)]

[MODIFY (kolon datatipi [DEFAULT değer] [NOT NULL]) , …]

[DROP [CONSTRAINT açıklama] tipi (kolon)]

[ENABLE | DISABLE CONSTRAINT açıklama]

 

ADD  Yeni bir kolon ekler.

MODIFY  Kolonun içeriğini, uzunluğunu ve tipini değiştirir. Bunun için kayıtların değeri null olmalıdır.

DROP  Kolonu siler.

Kolon  Tabloda itlem yapılacak kolon adıdır.

Datatipi  Kolonun alacağı tipi belirler.

DEFAULT değer Kolonun ilk alacağı değerdir. Kolon hiç değer atanmaz ise burada değer ile ifade edilen sabit veri aktarılır.

ENABLE  Unique veya primary key indexlerin otomatik yaratılmasını sağlar. Bütün kayıtların tanımlanan unique veya primary key tanımına uyması gerekir.

DISABLE  Unique veya primary key tanımını kaldırır.

 

Örnek : Personel tablosuna ek maas isminde 15 uzunluğunda bir kolon yaratalım. İlk değer 0 olsun.

ALTER TABLE Personel

ADD (ekmaas number(15) DEFAULT 15)

 

Örnek : Personel tablosundaki pers_id ile departman tablosundaki dept_id arasında FOREIGN KEY kuralım.

ALTER TABLE Personel

ADD CONSTRAINT personel_dept_id_fk

FOREIGN KEY (dept_id)

REFERENCES personel(pers_id)

 

Örnek : Personel tablosundaki maas kolonundaki alan uzunluğunu 15’e çıkaralım.

ALTER TABLE Personel

MODIFY (maas number(15))

 

Örnek : Personel tablosundaki maas kolonu silinsin.

ALTER TABLE Personel

DROP (maas number(15))

 

Örnek: Personel tablosundaki personel_id primary key için index yaratılması otomatikleştirelim;

ALTER TABLE Personel

ENABLE CONSTRAINT Personel_id_pk

DROP TABLE : Tabloyu fiziksel olarak siler. Rollback komutu ile silinen tablo geri getirilemez. Tabloyu ancak yetkisi olan kullanıcı silebilir.

Yazılımı;

DROP TABLE table

[CASCADE CONSTRAINTS]

 

Örnek: Personel tablosunu silelim;

DROP TABLE Personel

 

RENAME ..TO.. : Objelerin ismini değiştirmek için kullanılır. Otomatik olarak commit olur. Tabloyu ancak yetkisi olan kullanıcı silebilir.

Yazılımı;

RENAME eski_isim TO yeni_isim

 

Örnek: Personel tablosunun adını pers olarak değiştirelim;

RENAME personel TO pers

 

TRUNCATE TABLE : Tablodaki tüm kayıtları siler. Delete komutu gibi olmasına karşın o komuttan çok daha hızlı silme işlemi yapar. Rollback komutu ile silinen kayıtlar geri getirilemez. Otomatik olarak commit olur. Tabloyu ancak yetkisi olan kullanıcı silebilir.

Yazılımı;

TRUNCATE TABLE table

 

Delete komutu ile Truncate arasındaki en önemli fark; Delete komutu kayıtları silmek için kayıtlarda boşluk bırakır. Truncate ise tamamen kayıtları temizler, yani başa sarar.

 

Örnek: Personel tablosundaki tüm kayıtları silelim;

TRUNCATE TABLE Personel

 

COMMENT ON TABLE : Tablo veya kolonların içeriği hakkında açıklayıcı bilgi verilir. 2000 byte açıklama alanı girilebilir.

Yazılımı;

COMMENT ON TABLE table | COLUMN table.kolon

IS ‘açıklama’

 

Örnek : Personel tablosu açıklaması ‘Başak Sigorta’da çalışan kişiler’ olarak not düşelim;

COMMENT ON TABLE personel

IS ‘Başak Sigorta’da çalışan kişiler’

 

Örnek : Personel tablosundaki pers_id kolonun açıklaması ‘Personel numarası’ olarak not düşelim;

COMMENT ON COLUMN personel.pers_id

IS ‘Personel numarası’

 

ALL_COL_COMMENTS  Yetkili olan kullanıcının kolonlarının açıklayıcı notları listelenir.

USER_COL_COMMENTS  Tüm kullanıcıların kolonlarının açıklayıcı notları listelenir.

ALL_TAB_COMMENTS  Tüm kullanıcıların tablolarının açıklayıcı notları listelenir.

USER_TAB_COMMENTS  Yetkili olan kullanıcının tabloları için açıklayıcı notları listelenir.

 

Otomatik Numara Üretimi(Sequence)

 

Yaptığı iş unique sayılar üretmektir. Belli oranlarda arttırmalar yapılmakta kullanılır. Her çağrıldığında yeni bir sayı üretir. Extra bir hesaplama yapılmadan, seri olarak tanımlandığı şekilde rakamlar üretir. Sayıları cacheden okuduğu için çok hızlı sonuç üretir.

Yazılımı;

CREATE SEQUENCE kolon

[INCREMENT BY n]

[START WITH n]

[MAXVALUE n | NOMAXVALUE]

[MINVALUE n | NOMINVALUE]

[CYCLE | NOCYCLE]

[CACHE n | NOCACHE]

 

INCREMENT BY n  Sayının artış miktarı belirtilir. Varsayılan değer 1’dir. Birer birer sayı arttırılır.

START WITH n  Numaranın üretileceği başlangıç numarasıdır. Varsayılan değer 1’dir.

MAXVALUE n  Numaranın alabileceği maksimum rakam yazılır. NOMAXVALUE ile bitiş numarası verilmez. Max = 1027

MINVALUE n  Numaranın alabileceği minimum rakam yazılır. NOMINVALUE ile başlangıç numarası verilmez. Min = 1

CYCLE | NOCYCLE  Maxvalue değeri kadar işlem yapıldıktan sonra işlemi tekrardan başlatır.Varsayılan değer NOCYCLE’dır.

CACHE  Cache sayısı kadar sayıyı hafızaya gönderir. Varsayılan değer NOCACHE=20’dir.

 

Örnek: Personel departmanının pers_id kolonunu 10’dan 50’ye kadar 2’şer 2’şer arttıralım;

CREATE SEQUENCE pers_id

INCREMENT BY 2

START WITH 10

MAXVALUE 50

NOCYCLE

NOCACHE

 

Örnek: Personel departmanının pers_id kolonunu birer birer arttıralım;

CREATE SEQUENCE pers_id

INCREMENT BY 1

START WITH 1

NOMAXVALUE

NOCYCLE

NOCACHE

 

USER_SEQUENCES : Sequences’in en son durumu gösterir.

Yazılımı;

SELECT sequence_name, min_value, max_value, increment by, last_number

FROM user_ sequences

 

Sequence_name  İşlemlerin tanımlandığı isimdir.

Min_value  Sayının aldığı min değerdir.

Max_value  Sayının aldığı max değerdir.

Increment_by  Sayının aldığı artış miktarının gösterir.

Cycle_flag  İşlemin tekrar yapılması isteniyorsa Y, istenmiyorsa N değerini alır.

Cache_size  Hazıfazadaki cache sayısıdır.

Last_number  Numaranın alacağı değerdir

 

NEXTVAL : En son aldığı sayının bir sonra alacağı değeri gösterir.

 

Örnek: Personel tablosuna pers_id kolonuna otomatik değerler tayarak kayıt edelim;

INSERT INTO personel

VALUES (pers_id.NEXTVAL,’Kazım’,’Sarıkaya’)

 

CURRVAL : O anki sayısal değeri gösterir. Eğer hiç nextval fonksiyonu kullanılmamışsa değeri boş değer gelir.

 

Örnek: pers_id kolonunun o anki alacağı değeri seçelim;

SELECT pers_id.CURRVAL

FROM DUAL

 

ALTER_SEQUENCE : Değişiklik bir yerden başlanacaksa önce drop edilir, sequence işlemini değiştirir.

Yazılımı;

ALTER SEQUENCE kolon

[INCREMENT BY n]

[MAXVALUE n | NOMAXVALUE]

[MINVALUE n | NOMINVALUE]

[CYCLE | NOCYCLE]

[CACHE n | NOCACHE]

 

DROP_SEQUENCE : Kolon için yaratılan işlemleri siler.

Yazılımı;

DROP SEQUENCE kolon

View

 

Bir tablo üzerinde sorgulama yapılması için kullanılan nesnedir. Fiziksel olarak herhangi bir yerde saklanmaz. Avantajları;

  • Database erişimini kısıtlar. Böylece sadece sorgulanan verileri gözükür.
  • Sorgulamaları kolaylaştırabilir.
  • Datayı bağımsız olarak gösterebiliriz.

Yazılımı;

CREATE [OR REPLACE] [FORCE | NOFORCE]

VIEW view_adi [alias]

AS subquery

[WITH CHECK OPTION [CONSTRAINT constraint]]

[WITH READ ONLY]

 

FORCE  Hata durumu oluşursa gözardı ettirilir. NOFORCE ise gözardı edilmez.

View_adi  Yaratılan view sorgu adıdır..

Alias  Yaratılan işlemin adıdır.

WITH CHECK OPTION [CONSTRAINT  View objesine hatalı işleme yapılmasını engeller.

 

Örnek: Departman numarası 41 olan peroneller için perview isminde bir view olşturalım;

    CREATE VIEW persview

AS SELECT *

FROM personel

WHERE dept_id=41

WITH CHECK OPTION CONSTRAINT empview_ck;

 

Departman id’si 16 olan personellerin departman numarasını 38 yapalım;

UPDATE persview

SET dept_id=38

WHERE id=16;

Bu durumda bu değişiklik tabiki yapılamaz.

WITH READ ONLY  View objesinin sadece okuma amaçlı olduğu belirtilir. Farklı bir işlem yapıldığında bunu engeller. Aslında kayıtlar üzerinde değişiklik yapılmasını engeller.

 

Örnek: Departman numarası 45 olan peroneller için perview isminde bir view olşturalım;

    CREATE VIEW persview

AS SELECT *

FROM personel

WHERE dept_id=41

WITH READ ONLY;

 

Departman id’si 10 olan personellerin silinmesini sağlayalım;

DELETE FROM persview

WHERE id=10;

Bu durumda işlemi keser ve uyarı verir.

 

USER_VIEWS : Data dictionary tablosunda view tanımları bulunur. View adı, text uzunluğu ve text’I saklar.

VİEW_NAME  Kullanıcıya ait view adlarının tutar.

TEXT_LENGTH  Sql ifadenin uzunluğudur.

TEXT  Sql ifadedir.

 

DROP VİEW : Yaratılan view objesini siler.

 

Yazılımı;

DROP VIEW view_adı

 

INDEX YARATMA

 

Indexler, bir tablonun istenilen kolonlarına daha hızlı erişim olanağı sağlamak için kullanılır. Tablodaki kayıtlar üzerinde giriş/çıkış işlemleri yapılırken dataya daha hızlı ulaşılması sağlanır. Primary key tanımlanan kolonlar için otomatik olarak index yaratılır. Index en fazla 16 kolondan oluşur. Bir kolon tipi long veya long raw olamaz.

 

Yazılımı;

CREATE INDEX index_adi

ON tablo_adı(kolonlar)

 

Örnek: Personelin adına ve soyadına göre index oluşturalım;

CREATE INDEX personel_inx

ON personel(ad,soyad);

Böylece ad kolonu öncelikli olmak kaydıyla birlikte soyadına göre sıralama yapar, yani index oluşturur. Önce ada göre sıralar, eğer aynı isimden birden fazla kayıt oluşursa bu sefer soyad kolonundaki değerlere göre sıralama oluşturur.

 

Index yaratabilmek için;

  • Index yaratılacak tablonun var olması gereklidir,
  • Index yaratma hakkına sahip olmalıdır,
  • Limitsiz tablespace hakkına sahip olmalıdır.

 

Index yaratılma ihtiyacı aşağıdaki koşullar oluştuğunda belirir;

  • Where ifadesi ile sık sık kullanılan kolonlar kullanılıyorsa,
  • Join ile birleştirme işlemi yapıldığında,
  • Kolon değerleri geniş aralıkta ise,
  • Büyük rakamlı kolonların içinde null değerler bulunuyorsa.

 

Index yaratılmama ihtiyacı aşağıdaki koşullar oluştuğunda belirir;

  • Tablo küçük ise,
  • Tablodaki bazı kolonlara sık sık ihtiyaç duyulmadığında,
  • Tabloda sık sık değişiklikler yapılıyorsa.

 

USER_INDEXES  İndex isimlerini ve unique olup olmadığı bilgilerini saklar.

 

Örnek: Personel tablosuna ait index dosyalarını listeleyelim;

SELECT ic.index_name,ic.column_name,ic.colum_position,ix.uniqueness

FROM user_indexes ix, user_ind_columns ic

WHERE ic.index_name=ix.index_name

AND table_name=’Personel’;

 

DROP INDEX  Yaratılan indexleri veri tabanından yok etmek için kullanılır.

DATABASE GÜVENLİĞİ

 

Database güvenliği için kullanıcılar tanımlanır. Her kullanıcının bir şifresi bulunur. Kullanıcılara belirli yetkiler verilir.

 

Sistem ve data güvenliği olmak üzere iki kısımda incelenir. Sistem güvenliği içinde kullanıcıya yaratma, değiştirme, silme vb. yetkiler tanımlanır. Data güvenliği için ise datalar başka bir ortama yedekleme(backup) yapılarak sağlanır.

 

Database level aşamaları ile güvenlik sınırlanır. Eğer yüksel level yetkisi varsa yeni kullanıcı(veya tablolar) yaratabilir veya silinebilir. Tabloların yedekleri alınabilir.

 

CREATE USER  Database üzerinde işlemler yapılabilmesi için kulanıcı yaratılır.

 

Yazılımı;

CREATE USER user_adı

IDENTIFIED BY tifre

 

DROP USER  Databaseden kullanıcıyı siler.

 

Yazılımı;

DROP USER user_adı

 

GRANT (Yetki)  Kullanıcıya yetki verilmesi için kullanılır.

 

Yazılımı;

GRANT yetkiler_roller

TO kullanıcı [PUBLIC]

[WITH GRANT OPTION]

[PUBLIC]

 

WITH GRANT OPTION  Sistem haklarını veya rollerini diğer kullanıcılara vermeyi sağlar. Bir rolü bu şekilde belirlersek kullanıcı rolleri değiştirebilir veya silebilir.

 

PUBLIC  Sistem haklarını veya rollerini tüm kullanıcılara vermeyi sağlar.

 

Örnek: Personel tablosunun pers_id,ad kolonlarına webserver kullanıcısı için düzeltme yetkisi verelim;

GRANT select(pers_id,ad)

ON Personel

TO webserver

 

Örnek: Personel tablosuna webserver kullanıcısı için seçme yetkisi verelim;

GRANT select

ON Personel

TO webserver

Örnek: Kazım kullanıcısı, webserver kullanıcısının personel tablosu için kayıt etme ve sorgulama yetkilerini verelim;

GRANT select,insert

ON personel

TO webserver

WITH GRANT OPTION

 

Örnek: Kazım kullanıcısının personel tablosunu tüm kullanıcılara sorugulama yapabilmesini sağlayalım;

GRANT select

ON kazim.personel

TO PUBLIC

 

Grant yetkisi ile kullanıcılara aşağıdaki tablodaki yetkiler verilebilir

Objeler

Table

View

Sequences

Procedure

ALTER

?

 

?

 

DELETE

?

?

 

 

EXECUTE

 

 

 

?

INDEX

?

 

 

 

INSERT

?

?

 

 

REFERENCES

?

 

 

 

SELECT

?

?

?

 

UPDATE

?

?

 

 

 

CREATE ROLE  Kullanıcıya yetki olarak verilen rollerdir.

 

Yazılımı;

CREATE ROLE rol;

 

Örnek:

CREATE ROLE Manager;

GRANT create table, create view TO Manager;

GRANT Manager TO webserver;

 

Manager isminde rol tanımlandı. Tablo ve view yaratma yetkisi verildi. Bu yetkiler Webserver isminde kullanıcıya aktarıldı.

 

Kullanıcının şifresini değiştirmek için;

ALTER USER user_adı IDENTIFIED BY şifre

 

REVOKE  Verilen rolleri geri alır.

 

Yazılımı;

REVOKE rol

ON tablo

FROM kullanıcı

 

Örnek: webserver kullanıcısının şifre tablosuna kayıt etme,düzeltme ve sorgulama yetkilerini kaldıralım,

REVOKE select,insert,update

ON tifre

FROM webserver

CREATE SYNONYM  Bir objenin aynısının kopyasının alarak kendi userında yaratır.

 

Yazılımı;

CREATE [PUBLIC ] SYNONYM obje_adı

FOR kullanıcı.obje

 

PUBLIC  Tüm kullanıcıların yetkilerini alır.

 

Örnek: Webserver’ın personel tablosunun aynısını kendi alanımızda yaratalım

CREATE SYNONYM personel

FOR webserver.personel

 

DROP SYNONYM  Bir objenin aynısının kopyasının alarak yaratılan objeyi siler.

 

Yazılımı;

DROP [PUBLIC ] SYNONYM obje_adı

 

ADVANCED SQL

 

IN  Liste içinde belirlenen değerlerdir.

NOT IN  Liste içinde olmayan tüm değerlerdir.

ANY  Alt sorgulamadan seçilen değerlerden en az biri karşılaştırılır.

ALL  Alt sorgulamadan seçilen değerlerden hepsi karşılaştırılır.