0% found this document useful (0 votes)
52 views35 pages

SQL Notlar

Uploaded by

hakiki
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
52 views35 pages

SQL Notlar

Uploaded by

hakiki
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd

ADIM 3.

VERİ TABANI OLUŞTURMA


Veri tabanının fiziksel yapısını oluşturmak için kullanılan sql komutları
CREATE TABLE departments(
deptno NUMBER(5) CONSTRAINT depts_deptno_PK PRIMARY KEY,
name VARCHAR2(25) CONSTRAINT depts_name_NN NOT NULL,
loc VARCHAR2(30) CONSTRAINT depts_loc_NN NOT NULL);
CREATE TABLE employees
empno NUMBER(9) CONSTRAINT emps_empno_PK PRIMARY KEY,
fname VARCHAR2(15) CONSTRAINT emps_fname_NN NOT NULL,
lname VARCHAR2(20) CONSTRAINT emps_lname_NN NOT NULL,
hiredate DATE CONSTRAINT emps_hiredt_NN NOT NULL,
salary NUMBER(9,2),
commission NUMBER(9,2),
mgr NUMBER(9) CONSTRAINT emps_mgr_FK REFERENCES employees(empno),
deptno NUMBER(5) CONSTRAINT emps_deptno_FK REFERENCES departments(deptno));

Veri tabanını doldurmak, erişmek ve manipüle etmek için kullanılan sql komutları
INSERT INTO departments(deptno, name, loc)
VALUES (123, ‘Accounts’, ‘US’);

SELECT fname, lname, deptno


FROM employees
WHERE deptno = 123;

UPDATE departments
SET name = ‘marketing’
WHERE deptno = 123

İLK KISIM SADECE VERİ TABANI OLUŞTURMA SÜRECİ İÇİN ÖRNEK OLMASI AMACIYLA
KONULMUŞTUR.

BÖLÜM 1: VERİ TABANI PROGRAMLAMAYA GİRİŞ


Table (Tablo) – Basit depolama yapısı Column (Sütun) – Tablodaki tek tür veri
Row (Satır) – Bir instance’ın verisi Field (Alan) – Satır ve Sütun kesişiminde bulunan
değer. Primary Key (Birincil Anahtar) – Her satır için benzersiz tanımlayıcı
Foreign Key (Yabancı Anahtar) – Başka bir tablodaki PK’yı işaret eden sütun
Tabloların özellikleri
Sütunlardaki girişler tek değerlidir. Sütunlardaki girişler aynı türdedir. Her satır benzersizdir.
Sütun ve satır sırası önemsizdir. Her sütunun benzersiz bir adı vardır.
RDBMS (Relational Database-Management System) İlişkisel veri tabanı yönetim sistemi’nde verilere erişmek
için SQL ifadeleri ve operatörleri kullanılır. SQL ifadesi girilir. İfade sunucuya iletilir. Veri sunucudan döner.
SQL ifadelerinin türleri
1. DML (Data Manipulation Language)
INSERT, UPDATE, DELETE, MERGE tabloya yeni sütun ekleme, var olan sütunları
değiştirmek veya kaldırmak için kullanılan ifadelerdir.
2. DDL (Data Definition Language)
CREATE, ALTER, DROP, RENAME, TRUNCATE veri tabanında veri yapıları oluşturmak,
değiştirmek veya kaldırmak için kullanılan ifadelerdir.
3. TCL (Transaction Control Language)
COMMIT, ROLLBACK, SAVEPOINT DML ifadelerinin sebep olduğu değişiklikleri control
etmek için kullanılır.
4. DCL (Data Control Language)
GRANT, REVOKE veri tabanına ve içindeki yapılarına erişim yetkisi vermek veya yetkiyi
kaldırmak için kullanılır.
SELECT <column name 1, column name 2, ...> FROM <table name>
WHERE <condition>;
Select komutu tablodaki satırların döndürülmesini sağlar. Sütun isimleri yerine * koymak bütün sütunları
seçmek anlamına gelir.
SELECT <column name, column name * column name 2, column name + 300>
FROM <table name>;
Select ifadesi ile aritmetik ifadeler kullanılabilir. Aritmetik ifadelerde işlem önceliği * / + - soldan sağa parentez
Null ifadeler 0 veya boşluk ile aynı değildir. 0 bir sayı boşluk ise bir karekterdir. Bilinmeyen değerler null ile
ifade edilir. Null değere uygulanan aritmetik işlemlerin sonucu belirsiz veya nulldur.
Aliases (Takma adlar), çıktıdaki sütunun başlığını değiştirmek için kullanılır. Takma ad kullanılmadığı zaman
çıktı başlığı kullanılan ifade veya aritmetik işlem olabilir.
SELECT * |column|expr [AS alias], .... // AS kullanmadan yapmak için “” kullanılablir.
FROM table;
SELECT AND WHERE
DESCRIBE <table_name>;
Tablonun yapısını göstermek için kullanılır. DESC tablo adı, veri tipleri, PKler ve FKler, Null olabilen sütunlar
gibi detayları döndürür.
string1 || string2 || string_n Concatenation (Birleştirme) Operatörü
SELECT column ||' '|| column1 AS Name FROM table;
SELECT column || ' sentence ' || column1 || 'sentence.' AS name
FROM table;
Distinct kullanarak yinelenen ifadeleri kaldırmak.
SELECT DISTINCT column FROM table;
SEÇİLECEK SATIRLARI SINIRLAMAK
SELECT *|{[DISTINCT] column | expression alias]..} FROM table
[WHERE condition(s)];
“|” veya anlamında “[]” isteğe bağlı anlamında kullanılır.
WHERE column_name comparison_condition comparison_value
Where ifadesinde takma adlar kullanılamaz.
Where ifadesinde karşılaştırma operatörleri = > >= < <= <> (!= veya ^=)
Where ifadesinde karakter ve tarih kullanılırken tek tırnak (‘ ’) kullanılmalıdır. Tek tırnak içine girilen ifade ile
arama yapılabilir bu arama büyük ve küçük harfe duyarlıdır.
Karşılaştırma operatörleri
WHERE column BETWEEN x AND y;
WHERE column IN('x', 'y');
WHERE column LIKE '_x%';
WHERE column LIKE '%\_x%' ESCAPE '\';
Escape olarak kullanılan karakter kendisinden sonra gelecek karakterin aranmasını istediğini söyler. Örneğin _
tek bir karakter % sıfır veya daha fazla sayıdan oluşan sırayı temsil eder. Aranacak ifadede _ % geçiyorsa
escape kullanılır.
IS NULL ve IS NOT NULL
Null ifadeleri karşılaştırmak için = != operatörleri kullanılamaz onların yerine kullanılır.
WHERE, ORDER BY VE FONKSİYONLARA GİRİŞ
AND – Eğer iki ifade birden True ise True döndürür.
OR – Eğer ifadelerden biri True ise True döndürür.
NOT – Eğer ifade False ise True döndürür.
ORDER BY, varsayılan olarak ASC (artan) sıralama yapar, sonuna DESC (azalan)
eklenirse azalan sıralama yapar. Null değerler ASC sıralamada sonda DESC sıralamada
başta yer alır. NULLS FIRST önce null değerlerin, NULLS LAST sonra null değerlerin başta yer almasını
sağlar.
SELECT last_name, hire_date FROM employees
ORDER BY hire_date DESC, department_id;
Komutların Yürütme sırası : FROM WHERE SELECT ORDER BY
ÇOKLU SATIR FONKSİYONLARI MAX (en büyük) – MIN (en küçük) – AVG (ortalama)
TEKLİ SATIR FONKSİYONLARI
CASE MANIPULATION
LOWER hepsi küçük UPPER hepsi büyük INITCAP baş harfi büyük
CHARACTER MANIPULATION
CONCAT İki değeri birleştirmeye yarar. CONCAT (fname, lname)
SUBSTR Belirlenen uzunlukta stringi böler. SUBSTR (fname, 1, 3)
LENGTH Stringin uzunluğunu döndürür. LENGTH (lname)
INSTR Verilen karakterin sayısal konumunu bulur. INSTR (lname, ‘a’)
LPAD Karakter dizisinin sol tarafını doldurur. LPAD (lname, 15, ‘*’)
RPAD Karakter dizisinin sağ tarafını doldurur. RPAD (lname, 15, ‘*’)
TRIM {LEADING (baştaki) , TRAILING (sondaki), BOTH (ikisi birden)}x TRIM (x ‘a’ from
‘astring’)
REPLACE Bir dizideki karakter dizisini karakter dizisiyle değiştirir. REPLACE (str1, str2, [strr] )
SUBSTITUTION VARIABLE (YERİNE GEÇEN DEĞİŞKEN) Kullanıcı girişi için kullanılır.
WHERE department_id=:enter_dept_id;
SAYI FONKSİYONLARI
ROUND Hem tarih hem saatler için kullanılabilir. ROUND(column|expression, decimal places)
Örnek ROUND(45.926, 2) 45.93 ROUND(453.926, -1) 50 (-3 olsa sıfır dönecekti, -2 olsa 500)
TRUNC Yuvarlama yapmaz. Sayıyı sonlandırır. TRUNC(column|expression, decimal places)
Örnek TRUNC (45.926) 45 TRUNC (45.926, 2) 45.92
MOD Kalanı bulmaya yarar. MOD(airports,2)
TARİH FONKSİYONLARI

SYSDATE Veri tabanındaki güncel tarih ve saati döndürür.


DATE veri tipi 4 haneli sayı olarak saklanır. Aritmatik işlemler kullanılabilir.
MONTHS_BETWEEN Argüman: 2 Date. 2 Date arasındaki tarihi ay cinsinden döndürür.
ADD_MONTHS Argüman: 1 Date ve sayı. Verilen sayısı ay cinsinden tarihe ekleyerek döndürür.
NEXT_DAY Argüman: 1 Date ve gün. Alınan günün bir sonraki ortaya çıkış tarihini döndürür.
LAST_DAY Argüman: 1 Date. Alınan tarihteki ayın son gününü döndürür.
ROUND Argüman: 1 Date ve belirleyici. Alınan belirleyiciye göre tarihi yuvarlar.
TRUNC Argüman: 1 Date ve belirleyici. Alınan belirleyiciye göre tarihi keser.
Month = Ayın ilk günü Year = Yılın ilk günü
DÖNÜŞTÜRME FONKSİYONLARI
VARCHAR2 değişken uzunlukta sayılar,tire ve özel karakterler dahil
CHAR sabit uzunlukta sayılar, tire, ve özel karakterler
NUMBER değişken uzunlukta sayısal veri. Tire, metin ve sayısal olmayan verilere izin verilmez. Para birimi
DATE tarih ve zaman DD-Mon-YYYY

Implict (örtük) ve Explict (açık) dönüşümler


VARCHAR2 / CHAR <-> NUMBER / DATE
Örtük veri tipi dönüşümleri.

DATE -> CHAR, NUMBER -> CHAR


CHAR -> NUMBER, CHAR -> DATE
Açık veri tipi dönüşümleri

DATE -> CHAR Dönüşümü TO_CHAR (date veri tipinde sütun adı, 'biçim modeli')
SELECT TO_CHAR (hire_date, 'Month dd, YYYY') FROM employees; June 07, 1994
SELECT TO_CHAR (hire_date, 'fmMonth dd, YYYY') FROM employees; June 7, 1994
SELECT TO_CHAR (hire_date, 'fmMonth ddth, YYYY') FROM employees; January 3rd, 1990
SELECT TO_CHAR (hire_date, 'fmDay ddth Mon,YYYY') FROM employees; Tuesday 7th Jun, 1994
SELECT TO_CHAR (hire_date, fmDay ddthsp Mon, YYYY') FROM Tuesday, seventh Jun,1994
employees;
SELECT TO_CHAR (hire_date, 'fmDay, ddthsp "of" Month, Year') Tuesday, seventh of June,
FROM employees; Nineteen Ninety-Four
SELECT TO_CHAR (SYSDATE, 'hh:mm') FROM dual; 02:07
SELECT TO_CHAR (SYSDATE, 'hh:mm pm') FROM dual; 02:07 am
SELECT TO_CHAR (SYSDATE, 'hh:mm:ss pm') FROM dual; 02:07:23 am
*fm baştaki sıfırları kaldırmak için
kullanılır. *th sıralayıcı ekler (3rd gibi) *sp
sayıyı yazıya çevirir. *Herhangi bir metin
eklemek için çift tırnak kullanılır.
NUMBER -> CHAR (VARCHAR2)
TO_CHAR(number veri
tipi, 'biçim modeli')
SELECT TO_CHAR(salary,'$99,999') AS "Salary" FROM employees; Çıktı : SALARY $24,000
CHAR -> NUMBER TO_NUMBER(karakter string, 'biçim modeli')
SELECT TO_NUMBER('5,320', '9,999') AS "Number" FROM dual; Çıktı : Number 5320
SELECT last_name, TO_NUMBER(bonus, '999') FROM employees WHERE department_id =
80; Bu komut hata döndürecektir. Biçim modeli gelen veri ile eşleşmiyorsa bu hata ortaya
çıkar. (bonus 4 haneli)
SELECT last_name, TO_NUMBER(bonus, '9999') AS "Bonus" FROM employees
WHERE department_id = 80;
Çıktı : LAST_NAME Zlotkey Bonus 1300
CHAR -> DATE TO_DATE('karakter string', 'biçim modeli')
Date veri tipi olmayan bir stringi date veri tipine çevirmek için kullanılır.
TO_DATE('November 3, 2001', 'Month dd, yyyy')
fx Niteleyici kuralları
Character argümanı biçim modeli ile tam olarak eşleşmelidir (büyük küçük harf hariç.).
Character argümanı fazladan boşluklara sahip olamaz.
SELECT TO_DATE('Sep 07, 1965', 'fxMon dd, YYYY') AS "Date" FROM 07-Sep-1965
DUAL;
SELECT TO_DATE ('July312004', 'fxMonthDDYYYY') AS "Date" FROM 31-Jul-2004
DUAL;
SELECT TO_DATE ('June 19, 1990', 'fxMonth dd, YYYY') AS "Date" FROM 19-Jun-1990
DUAL;

RR Tarih formatı ve YY Tarih formatı RR geçen yüzyıl YY şimdiki yüzyıl


SELECT TO_DATE('27-Oct-95','DD-Mon-YY') AS "Date" FROM dual; Çıktı : Date 27-Oct-2095
SELECT TO_DATE('27-Oct-95','DD-Mon-RR') AS "Date" FROM dual; Çıktı : Date 27-Oct-1995
SQL NULL FONKSİYONLARI
İçteki fonksiyon önce çalışır. Örn TO_CHAR(NEXT_DAY(ADD_MONTHS()))
Adım 1. add_months () Adım 2. next_day() Adım 3. To_char()
NVL Argüman : 1 Null olma ihtimali olan ifade, eğer ilk ifade Null ise onun yerine geçecek veri.
NVL (internet_extension, ‘None’ )
NVL2 Argüman : Null olma ihtimali olan ifade, eğer ilk ifade Null değilse onun yerine geçecek ifade,
eğer ilk ifade Null ise onun yerine geçecek ifade.
NVL2(commission_pct, salary + (salary * commission_pct), salary)
NULLIF Argüman : ifade 1, ifade 2. Eğer ifade 1 ifade2’ye eşitse Null döndürür. Değilse ilk ifade
döner.
NULLIF(LENGTH(first_name),LENGTH(last_name))
COALESCE NVL gibi çalışır fakat argüman olarak daha fazla değer alır. Coalesce bir araya gelmek
anlamına gelir. Eğer ilk ifade Null ise, Null olmayan ifade bulunana kadar devam eder.
COALESCE(commission_pct, salary, 10)

KOŞULLU İFADELER
CASE – If else gibi çalışır. Kullanılacak ifadelerin veri tipleri aynı olmalıdır.
DECODE – Case ile aynı syntaxları farklı.

SELECT last_name, SELECT last_name,


CASE department_id DECODE(department_id,
WHEN 90 THEN 'Management' 90, 'Management',
WHEN 80 THEN 'Sales' 80, 'Sales',
WHEN 60 THEN 'It' 60, 'It',
ELSE 'Other dept.' 'Other dept.')
END AS "Department" FROM employees; AS "Department" FROM employees;

JOINs (Birleşimler)
SQL bir tablodan veri sorgulamak ve döndürmek konusunda kısıtlıdır. Eğer veri tabanındaki tüm veriler bir
tabloda tutulsaydı bu problem olmazdı. Fakat ilişkisel veri tabanlarında veriyi farklı tablolara bölmek ve bu
tabloların birbirleriyle ortak olması bu işin doğasıdır. Neyse ki, SQL join bize farklı tabloları kullanmayı ve tek
bir yerde birleştirmeyi sağlar.
ANSI (American National Standarts Institute). SQL (Structured Query Language), RDBMS’lerde kullanılan dil.
NATURAL JOIN (DOĞAL BİRLEŞTİRME)
Natural join iki tabloda aynı isme sahip (veri tipleri de aynı olmalı) sütunları birleştirir. Jobs tablosunda
PK olan JOB_ID employees tablosunda FK’dir bu tabloların birbirlerine bağlanmasını sağlar.

SELECT
first_name, last_name, job_id, job_title
FROM employees NATURAL JOIN jobs WHERE department_id > 80;
FIRST_NAME LAST_NAME JOB_ID JOB_TITLE
Steven King AD_PRES President
TOP 1
Natural joinde yazılan sütun adı select ifadesinde yer almak zorunda değildir.
SELECT department_name, city
FROM departments NATURAL JOIN locations;
Departments ve locations, location_id sütununa sahiptir ve bu sütun tabloyu birleştirmek için kullanılır.
Marketing Toronto
CROSS JOIN (ÇAPRAZ BİRLEŞİM)
Bir tablodaki her satırı diğer tablodaki her satırla birleştirir. İki tablonun sahip olabileceği olasılıkları ifade
etmek için kullanılır. Örnek olarak 20 ve 100 satırlık tabloları birleştirmek 2000 satırlı tablo döndürür.

SELECT
last_name,

department_name
FROM employees CROSS JOIN departments;
Cartesian Product (Kartezyen Çarpım)
ANSI/ISO SQL :1999 SQL CROSS JOIN

SQL JOIN İFADELERİ


Natural join kullanırken aynı isme sahip fakat farklı veri tipinden sütunlar kullanıldığında hata
alıyorduk. Bunu çözmek için USING ifadesi kullanılabilir. Joinde kullanılacak sütunları belirtir. USING
kullanırken başvurulan sütunlarda niteleyici (tablo ismi veya takma ad) SQL ifadesi içinde kullanılmaz.
SELECT first_name, last_name, department_id, department_name
FROM

employees JOIN departments USING (department_id);


TAKMA ADLAR (Aliases) Uzun uzun tablo adlarını yazmak yerine hem okunabilir hem daha kısa
olması için kullanılır. Eğer bir tablo için takma ad kullanılmışsa select ifadesinde de takma ad kullanılmalıdır.
Aşağıdaki örnekte employees.job_id yazmak hata mesajı döndürür.
SELECT last_name, e.job_id, job_title FROM employees e, jobs j
WHERE e.job_id = j.job_id AND department_id = 80;
Join yapılacak sütunların farklı isimleri varsa veya join eşitsizlik operatörlerini (<, >, between)
kullanıyorsa USING kullanamayız onun yerine ON ifadesi kullanılır.
SELECT last_name, job_title FROM employees e JOIN jobs j ON (e.job_id = j.job_id);
Bu örnekte job_id hem aynı isme hem aynı veri tipine sahip olduğundan NATURAL JOIN veya
JOIN USING de kullanılabilir.
Aşağıdaki örnekte job_grades tablosu employees tablosu ile ortak bir sütuna sahip değil ve eşitsizlik
operatörleri kullanılmış bu yüzden sorgu ON ile yazılmalı.
SELECT last_name, salary, grade_level, lowest_sal, highest_sal
FROM employees JOIN job_grades ON(salary BETWEEN lowest_sal AND highest_sal);
LAST_NAME SALARY GRADE_LEVEL LOWEST_SAL HIGHEST_SALAR
Y
Vargas 2500 A 1000 2999
Fay 6000 C 6000 9999

3 FARKLI TABLO İLE JOIN KULLANMAK


Varsayalım ki çalışanlarımızı, departmanlarını ve departmanların nerede olduğunu raporlamak istiyoruz bu
durumda 3 farklı tabloyu birleştirmemiz gerekir.
SELECT last_name, department_name AS "Department", city
FROM employees JOIN departments USING (department_id) JOIN locations USING (location_id);
INNER VE OUTER JOINLER
İki veya daha fazla tablo join işleminden sonra sadece eşleşen satırları döndürüyorsa INNER JOIN, hem eşleşen
satırları hem eşleşmeyen satırları döndürüyorsa OUTER JOIN olarak adlandırılır. Outer join kavramları
left,full,ve right bu ifadeler from ifadesindeki tablo isimlerinin sırası olarak kullanılır.
RIGHT JOIN isminden anlaşılacağı üzere sağdaki tablonun tüm satırlarının yazılmasını sağlar soldaki tabloda
eşleşen satır olmasına gerek yoktur eşleşmeyen satırlar Null değer alır. LEFT JOIN ise RIGHT JOIN’in tam
tersidir.
FULL JOIN ise LEFT ve RIGHT joinden dönen satırların tekrarsız kombinasyonudur.
Örnek: Çalışanların şuanki işlerini ve varsa sahip oldukları önceki işleri döndüren bir join yazınız.
SELECT last_name, e.job_id AS "Job", jh.job_id AS "Old job", end_date
FROM employees e LEFT OUTER JOIN job_history jh ON(e.employee_id = jh.employee_id);

SELF JOIN, örnekteki gibi ilişkiye sahip tablolarda kullanılır.


SELECT worker.last_name, manager.last_name
FROM employees worker JOIN employees manager
ON (worker.manager_id = manager.employee_id);
Aynı tablo için farklı takma adlar (alias) kullanarak karışıklığı
önleyebiliriz.

HİYERARŞİK SORGULAR
START WITH Ağacın rootu olacak satırı belirlemek için kullanılır.
CONNECT BY PRIOR satırlararası birleşimin nasıl olacağını açıklar.
LEVEL ağacın ne kadar derine ineceğini belirtir. Level sözde bir sütundur (pseudo-column). Root için
1, bir altı için 2, bir altın bir altı için 3 … olarak devam eder.

SELECT employee_id, last_name, job_id, manager_id


FROM employees
START WITH employee_id = 100
CONNECT BY PRIOR employee_id = manager_id

Top Down yaklaşımı


SELECT LPAD(last_name, LENGTH(last_name)+(LEVEL*2)-2,'_')AS "Org Chart" FROM employees
START WITH last_name = 'King' CONNECT BY PRIOR employee_id = manager_id;
Bottom Up yaklaşımı
SELECT LPAD(last_name, LENGTH(last_name) + (LEVEL*2)-2, '_') AS "Org Chart" FROM
employees
START WITH last_name = 'Grant'
CONNECT BY employee_id = PRIOR
manager_id
JOINs (Birleşimler) 2
SELECT [Link], [Link] FROM table1, table2
WHERE table1.column1 = table2.column2;
EQUIJOIN, simple veya inner join olarak adlandırılır ve belirtilen sütunlarda benzer değerlere sahip satırları
birleştir. Equijoinlerin ANSI karşılıkları NATURAL JOIN, JOIN USING, JOIN ON. Equijoin, eşitlik
operatörünü kullanarak join koşulunu ifade eder.
What? Select ifadesi döndürülecek sütun adlarını belirtir.
Where? From ifadesi veritabanının mutlaka erişmesi gereken tabloları belirtir.
How? Where ifadesi tabloların nasıl birleştirileceğini belirtir.

CARTESIAN PRODUCT (Kartezyen çarpım) JOIN, eğer join sorgusu where ifadesi içermiyorsa veya sorgu
geçerli değilse Oracle sunucusu iki tablonun kartezyen çarpımını döndürür.
SELECT employees.last_name, departments.department_name FROM employees, departments;
Proprietary joinlerde ansi joinler gibi satırlar where ifadesi ise kısıtlanabilir.
Join syntax örneği, 3 adayı birleştirmek için kaç köprü gerekir?
3 tabloyu birleştirmek isterseniz kaç join gerekir?
Bir join ifadesi AND kullanılarak Where ifadesine eklenir.
SELECT last_name, city FROM employees e, departments d, locations l
WHERE e.department_id = d.department_id AND d.location_id = l.location_id;
NONEQUIJOIN, Ansi JOIN ON’a karşılık gelir. Tablolar arasında birebir eşleşme olmadığından eşitlik
operatörü kullanılamaz.
SELECT last_name, salary, grade_level, lowest_sal, highest_sal FROM employees, job_grades
WHERE (salary BETWEEN lowest_sal AND highest_sal);
OUTER JOIN, left right ve full join’e karşılık gelir. Değerleri istenen tablo isminin sonuna ‘(+)’ eklenir.
SELECT e.last_name, d.department_id, d.department_name FROM employees e, departments d
WHERE e.department_id = d.department_id(+); // LEFT JOIN örneği
SELECT e.last_name, d.department_id, d.department_name FROM employees e, departments d
WHERE e.department_id(+) = d.department_id; // RIGHT JOIN örneği
FULL JOIN için iki tarafa (+) koymak hata dönmesine sebep olur. Doğrudan bir karşılığı yoktur.
GRUP FONKSİYONLARI
MIN, herhangi bir veri tipi bulunduran sütunlardaki minumum değeri döndürür.
MAX, herhangi bir veri tipi bulunduran sütunlardaki maximum değeri döndürür.
SUM, nümerik veri bulunduran sütunlarda verilerin toplamını döndürür.
AVG, nümerik veri bulunduran sütunlarda verilerin ortalamasını döndürür.
COUNT, satır sayısını döndürür. COUNT(*) sorgudan dönen veri kümesindeki satırları sayar.
VARIANCE, nümerik veri bulunduran sütunlarda verinin ortalamadan yayılımını hesaplar.
STDDEV, variance’a benzer olarak verinin yayılımını ölçer.
VARIANCE, veri setindeki sayıların arasındakı yayılma.
STDDEV, verilerin ortalamaya göre nasıl dağıldığını ölçer ve
VARIANCE’ın karekökü olarak hesaplanır. Varyans verilerin aritmetik
ortalaması alınır ve verilerin sapmalarının karesinin aritmetik ortalaması
alınarak hesaplanır.
Grup fonksiyonları where ifadelerinde kullanılamaz. Grup fonksiyonları NULL değerleri görmezden gelir. Null
değerleri grup fonksiyonlara dahil etmek için Null fonksiyonları kullanılabilir. (NVL gibi)
GRUP FONKSİYONLARI 2
GROUP BY, satırları küçük gruplara bölmek için kullanılır. Alias kullanılamaz.
SELECT department_id, AVG(salary) FROM employees
GROUP BY department_id
ORDER BY department_id;
AVG fonksiyonu her departman için ayrı ayrı uygulanır ve değerleri departman numarasına göre sıralar.
Grup fonksiyonlarında Select ifadesinde yer alan ve bir grup fonksiyonunda kullanılmayan sütunlar group by
ifadesinde yer almalıdır. Aşağıdaki örnek hatalıdır ve not a GROUP BY expression hatası döndürür. Group by
ifadesine last_name eklemek hatayı çözer.
SELECT job_id, last_name, AVG(salary) FROM employees
GROUP BY job_id;
SELECT COUNT(*), region_id FROM wf_countries SELECT department_id, MAX(salary) FROM
GROUP BY region_id employees
ORDER BY region_id; WHERE last_name != 'King'
GROUP BY department_id;
WHERE ifadesi sütunları gruplara bölünmeden önce hariç tutar.
SELECT department_id, job_id, count(*) FROM employees
WHERE department_id > 40
GROUP BY department_id, job_id;
Bu sorguda bütün çalışanlar önce departmana göre sonra her departmanda işe göre gruplanır.
SELECT max(avg(salary)) FROM employees
GROUP BY department_id;
Bu sorguda grup fonksiyonları group by kullanıldığında iki derinliğe kadar yuvalanabilir (nesting). Sorgudan
tek bir değer döner, önce her departman için ortalama maaşı bulur ve ortalama maaşlardan en büyüğünü seçer
ve döndürür.

HAVING, grupları sınırlandırmak için kullanılır. Group by ve having kullanılan sorguda satırlar önce gruplanır,
grup fonksiyonları uygulanır ve having ile eşleşen gruplar döndürülür.
SELECT department_id, MAX(salary) SELECT department_id,MAX(salary)
FROM employees FROM employees
WHERE COUNT(*) > 1 GROUP BY department_id
GROUP BY department_id; HAVING COUNT(*)>1
Group function is not allowed here.

Önerilen sıralama
1. SELECT column, group_function
2. FROM table
3. WHERE
4. GROUP BY
5. HAVING
6. ORDER BY
ROLLUP VE CUBE İŞLEMLERİNİ, VE GRUPLANDIRMA KÜMESİ KULLANMAK
ROLLUP, group by ifadesinin eklentisidir, toplama
SELECT department_id, job_id, SUM(salary) Departmanlar için ayrı ayrı toplama yapar.
FROM employees En son bütün departmanların toplamını yazar.
WHERE department_id < 50 Alt toplamlar için job_id Null değer alırken
GROUP BY ROLLUP (department_id, job_id); Toplam için hem department id hem job id Null olur.
SELECT department_id, job_id, SUM(salary) Benzer işi yapar fakat alt topları birleştirmek için
FROM employees birkaç sorgu daha gerekir.
WHERE department_id < 50
GROUP BY (department_id, job_id);

CUBE, group by ifadesinin eklentisidir, çapraz tablolama yapar


SELECT department_id, job_id, SUM(salary) Rollup ile aynı çalışır fakat toplam değerleri en üstte
FROM employees belirtir. Daha sonra alt toplam değerlerini her job_id
WHERE department_id < 50 için yazar. En son her departman_id için ayrıntılı bir
GROUP BY CUBE (department_id, job_id); şekilde yazar.

GROUPING SETS, group by ifadesinin eklentisidir, birçok gruplandırmayı belirtir.


SELECT department_id, job_id, manager_id, SUM(salary) FROM employees
WHERE department_id < 50 GROUP BY GROUPING SETS
((job_id, manager_id),(department_id, job_id),
(department_id, manager_id));

Roll up ve Cube kullanırken hesaplamalardan dolayı


fazladan null satırlar oluşur peki biz bunları nasıl
ayırt edebiliriz?
Grouping kullananarak.
SET İŞLEMLERİNİ KULLANMA
Sütun sayısı ve veri tipleri sorguda kullanılan Select ifadelerinde aynı olmalıdır.
Sütunların isimlerinin aynı olmasına gerek yoktur.
Çıkıştaki sütun adları ilk select ifadesinden alınır. Bu yüzden takma adlar önce girilmelidir.
UNION, iki tablodan bütün satırları döndürür tekrar eden değerler dahil edilmez. FULL OUTER JOIN
UNION ALL, tekrar eden değerleri dahil ederek bütün satırları döndürür.
INTERSECT, iki tablonun kesişimi olan değerleri döndürür.
MINUS, iki tablodan sadece birinde bulunan değerleri döndürür.
SELECT hire_date, employee_id, job_id TO_DATE(NULL), hire_date kısmını karşılamak
FROM employees için eklenmesi gerekir. İki select ifadesinin sütun
UNION sayısı aynı olmalıdır.
SELECT TO_DATE(NULL),employee_id, job_id
FROM job_history;

Eğer ORDER BY kullanılacaksa sadece 1 kere yazılması yeterlidir.


SUBQUERIES, Alt sorgu başka bir select ifadesinin içine gömülü select ifadesidir. Alt sorgular ana sorgudan
(outer) önce yürütülür. Where, having ve from ile kullanılabilir.
SELECT select_list FROM table WHERE expression operator (SELECT select_list FROM table);
Alt sorgu parentez içinde yazılır. Karşılaştırma ifadelerinin sağında yer alı[Link] ve inner sorgular farklı
tabloları kullanabilir. Alt sorguların tek limiti sorgunun kullandığı buffer büyüklüğü ile ilgilidir.
Order by sadece bir select tarafından kullanılabilir ve eğer kullanıldıysa outer sorgunun son ifadesi olmalıdır.
Alt sorgu kendine ait order by ifadesine sahip olamaz.
Eğer alt sorgu null bir ifade veya hiç satır döndürmüyorsa outer sorguda where ile karşılaştıracak bir şey
olmayacağından null döner (Null ile karşılaştırma yapmak her zaman null döndürür.).
SELECT first_name, last_name, hire_date Peter Vargas’dan sonra işe alınan çalışanları bulmak.
FROM employees
WHERE hire_date > Önce Peter’in ne zaman işe alındığını bulmamız
(SELECT hire_date gerekir. Bu sorunun cevabını bulduktan sonra o
FROM employees tarihten sonra ile alınan çalışanları bulabiliriz.
WHERE last_name = 'Vargas');

SINGLE-ROW SUBQUERIES, sadece bir satır döndürür. Karşılaştırma operatörleri (=, >,>=, <, <=, <>)
SELECT last_name, job_id, department_id SELECT last_name, salary
FROM employees FROM employees
WHERE department_id = WHERE salary <
(SELECT department_id (SELECT AVG(salary)
FROM departments FROM employees);
WHERE department_name = 'Marketing')
ORDER BY job_id;
SELECT department_id, MIN(salary) SELECT first_name, last_name FROM
FROM employees employees
GROUP BY department_id WHERE salary =
HAVING MIN(salary) > (SELECT salary
(SELECT MIN(salary) FROM employees
FROM employees WHERE department_id = 20);
WHERE department_id = 50); Hatalı sorgu. 1 satırdan fazla değer döndüremez.
MULTIPLE-ROW SUBQUERIES, birden fazla değer döndürür. IN, ANY, ALL kullanılır. NOT eklenebilir.
IN, sadece alt sorgudan dönen satırların kullanılmasını sağlar.
ANY, alt sorgu sonuç kümesinden en azından biriyle eşleşen satırların kullanılmasını sağlar.
ALL, alt sorgu sonuç kümesinin hepsiyle eşleşen satırların kullanılmasını sağlar.
Null değerler ile IN ve ANY kullanılırsa outer sorgu null olmayan değerler ile eşleşen satırları döndürür. ALL
kullanılırsa herhangi bir satır dönmez çünkü null ile karşılaştırma yapmak null döndürür.
SELECT department_id, MIN(salary) SELECT first_name, last_name, job_id
FROM employees FROM employees
GROUP BY department_id WHERE job_id =
HAVING MIN(salary) < ANY (SELECT job_id
(SELECT salary FROM employees
FROM employees WHERE last_name = 'Ernst');
WHERE department_id IN (10,20))
ORDER BY department_id;
SELECT employee_id, manager_id, SELECT employee_id,manager_id,
department_id department_id
FROM employees FROM employees
WHERE(manager_id,department_id) IN WHERE manager_id IN
(SELECT manager_id,department_id (SELECT manager_id FROM employees
FROM employees WHERE employee_id IN (149,174))
WHERE employee_id IN (149,174)) AND department_id IN
AND employee_id NOT IN (149,174) (SELECT department_id FROM employees
WHERE employee_id IN (149,174))
AND employee_id NOT IN(149,174);
Non-pair-wise multiple column İkili olmayan Pair-wise multiple-column İkili
Bazı alt sorgular tek satır veya birden çok satır döndürebilir. Eğer birden çok satır döndürme ihtimali varsa
multiple-row query yazmak daha iyidir. Çünkü single-row query gibi çalışabilir.
SELECT first_name, last_name, job_id FROM employees
WHERE job_id = Eğer kararsız kalırsanız multiple-row kullanın.
(SELECT job_id
FROM employees
WHERE last_name = 'Ernst');

CORRELATED SUBQUERIES (İLİŞKİLİ ALT SORGULAR), alt sorgu ebeveyni olan tablodan bir sütun
istediğinde oracle sunucusu ilişkili alt sorgu gerçekleştirir.
G
T
U
E
S
C
X
GET outer sorgu için aday satır
EXECUTE aday satır değerini kullanan alt sorgu
USE alt sorgudan gelen değerleri aday satır için seçmek veya
diskalifiye etmek

SELECT o.first_name,o.last_name, [Link] Hangi çalışanın maaşının departmanın


FROM employees o ortalamasından yüksek olduğunu bulan sorgu.
WHERE [Link] > Row-by-row (satır satır) çalışır. Outer sorgu
(SELECT AVG([Link]) tarafından değerlendirilen satırlar için inner sorgu bir
FROM employees i kez yürütülür. Inner sorgu outer sorgu tarafından
WHERE i.department_id = kontrol edilir.
o.department_id);

EXISTS & NOT EXISTS KULLANIMI, alt sorgularda eşleşmelerin kontrolü için kullanılır.
SELECT last_name AS "Not a Manager" Hangi çalışanlar müdür değildir? sorusunu
FROM employees emp cevaplamak için önce müdürler kim? sorusunu
WHERE NOT EXISTS cevaplamak gerekir, ondan sonra müdürler listesinde
(SELECT * kim yok (not exists)? olarak sorabiliriz.
FROM employees mgr
WHERE mgr.manager_id =
emp.employee_id);
Eğer aynı sorgu NOT IN kullanarak çalıştırılırsa sonuç farklı olur ve veri döndürmez çünkü “müdür olmayan
çalışan yoktur ve bütün çalışanlar müdürdür” şeklinde önerme yapar ve bu doğru değildir.
Alt sorgularda (In veya Not kullanırken) Null ifadelere dikkat edin IS NOT NULL veya NOT EXISTS
kullanarak
WITH İfadesi, karmaşık sorgular yazıyorsanız sorgu blokları oluşturmak için kullanılır. Performansı arttırır.
Sorguyu daha rahat okunabilir yapar.
WITH subquery-name AS (subquery),
subquery-name AS (subquery)
SELECT column-list
FROM {table | subquery-name | view}
WHERE condition is true;
Müdür olmayan çalışanların WITH managers AS
soyadlarını döndüren bir sorgu (SELECT DISTINCT manager_id
yazınız. FROM employees
WHERE manager_id IS NOT NULL)
SELECT last_name AS "Not a manager" FROM employees
WHERE employee_id NOT IN (SELECT * FROM managers);

KALİTELİ SORGU SONUÇLARI SAĞLAMAK 1 (ENSURING QUALITY QUERIES 1)


SELECT SUBSTR(first_name,1 1) ||' '|| last_name, "Employee Name", salary "Salary",
DEC(commission_pct NULL, 'No', 'Yes')'Commission'
FROM employees;
Verilen problem, çıktı ve kullanılan tablolara göre uygun sorgular yazmak. (ALIŞTIRMA)
DATA MANIPULATION LANGUAGE (DML), veri tabanındaki verilerde değişiklik yapmak için kullanılır.
Tabloları değiştirmek sorumluluk gerektirir bu yüzden komutlar kullanılmadan önce tabloyu
kopyalamak önemlidir eğer hata yaparsanız orijinal kopyayı kullanarak düzeltebilirsiniz.
CREATE TABLE copy_tablename AS (SELECT * FROM tablename);
INSERT, tabloya yeni bir satır eklemek için kullanılır. 3 değer gerektirir tablonun adı, doldurulacak
tablodaki sütunların adları, ve sütunlara karşılık gelen değerler.
INSERT INTO copy_departments INSERT INTO copy_departments
(department_id, department_name, manager_id, VALUES
location_id) (210,'Estate Management', 102, 1700);
VALUES (200,'Human Resources', 205, 1500); // explict (açık)
Sütun adları yazılmadan da Insert kullanılabilir fakat tablodaki varsayılan sırayla birebir eşleşmelidir.
Veri eklemeden önce tabloyu kontrol etmek önemlidir. DESCRIBE komutu tablonun yapısını döndürür.
Tabloda bakılması gerekenler: tekrar eden değerlere izin veriliyor mu?, veri tipi (Data Type), verinin boyutu
(length), null değerlere izin veriliyor mu? Insert ifadesinin her sütunu belirtmesi gerekmez boş bırakılabilen
(Nullable) sütunlar hariç tutulabilir.
INSERT INTO copy_employees INSERT INTO copy_employees
(employee_id, first_name, last_name, (employee_id, first_name, last_name, email,
phone_number, hire_date, job_id, salary) phone_number, hire_date, job_id, salary)
VALUES VALUES
(302,'Grigorz','Polanski', '8586667641', (302,'Grigorz','Polanski', 'gpolanski', '', '15-Jun-2017',
'15-Jun-2017', 'IT_PROG',4200); 'IT_PROG',4200);
Cannot insert NULL into … Boş değer girmek için tek tırnak kullanılabilir(boşluk
olmadan)
Özel değerleri Insert ile kullanmak, SYSDATE ve USER (APEX_PUBLIC_USER koyar)
INSERT INTO copy_employees INSERT INTO sales_reps(id, name, salary,
(employee_id, first_name, last_name, email, commission_pct)
phone_number, hire_date,job_id, salary) SELECT employee_id, last_name, salary,
VALUES commission_pct
(301,'Katie','Hernandez', FROM employees
'khernandez','8586667641', WHERE job_id LIKE '%REP%';
TO_DATE('July 8, 2017', 'Month fmdd, yyyy'), // alt sorgu kullanarak satır kopyalama
'MK_REP',4200);
Varsayılan tarih formatı DD-Mon-YYYY
Satırları kopyalamak için alt sorgu kullanmak. Alt sorgudan dönen tüm değerler tabloya eklenir. Sütun sayısı ve
veri tipleri eşleşmek zorundadır. Alt sorgunun where ifadesinde kullanıldığı gibi parentez içinde yazılmasına
gerek yoktur.
Eğer bütün verileri ve satırları kopyalamak istersek sorgu çok daha basit yazılabilir.
INSERT INTO sales_reps SELECT * FROM employees;
Sütun değerlerini güncellemek ve satırları silmek,
UPDATE, var olan satırları değiştirmek için kullanılır. 4 değer gerektirir tablonun adı, değiştirilecek
sütun/ların adı, değiştirilecek sütunlar için yeni değerler, hangi satırların değiştirileceğini belirten koşul.
UPDATE copy_employees UPDATE copy_employees
SET phone_number = '123456' SET phone_number = '654321', last_name =
WHERE employee_id = 303; 'Jones'
WHERE employee_id >= 303;
Eğer where ifadesini atlarsanız tablodaki bütün satırların verileri değişir. Dikkatli olun!
Alter (değiştirme) ALTER TABLE copy_employees
ADD (department_name varchar2(30) NOT
NULL);
UPDATE copy_employees UPDATE copy_employees e
SET salary = (SELECT salary SET e.department_name = (SELECT
FROM copy_employees d.department_name
WHERE employee_id = FROM departments d
100) WHERE
WHERE employee_id = 101; e.department_id =
d.department_id);
Bir veya birden fazla alt sorgu kullanılabilir.
DELETE, var olan satırı silmek için kullanılır. Where ifadesi atlanırsa bütün satırlar silinir.
Alt sorgu kullanarak silme işlemi
DELETE FROM copy_employees DELETE FROM copy_employees e
WHERE department_id = WHERE e.manager_id IN
(SELECT department_id (SELECT d.manager_id FROM employees d
FROM departments HAVING count (d.department_id) < 2
WHERE department_name = GROUP BY d.manager_id);
'Shipping');
Tablodan Shipping’de çalışanları siler. 2’den daha az çalışan yöneten müdürlerin satırlarını
siler.
Bütünlük kısıtlaması hataları, bütünlük kısıtlaması verinin kurallara uygun olmasını kontrol eder. Eğer çiğnenen
bir kural varsa tabloda değişiklik yapılmaz ve hata döndürür.
FOR UPDATE, select ifadesi kullanıldığında talep edilen satırlarda kilit yoktur ve çoğu zaman veri
tabanında kilitlerin sayısının az olmasını isteriz ama bazı zamanlar bir sorgu devam ederken başka birinin
kayıtları silmesi veya değiştirmesini istemeyiz.
SELECT e.employee_id, [Link], d.department_name For update kullanıldığında select
FROM employees e JOIN departments d USING ifadesinden dönen tüm satırlar
(department_id) kilitlenir ve COMMIT (işle) veya
WHERE job_id = 'ST_CLERK' AND location_id = 1500 ROLLBACK (geri al) kullanana kadar
FOR UPDATE kilitli kalır.
ORDER BY e.employee_id;

VARSAYILAN DEĞERLER, MERGE, ÇOKLU TABLO INSERT


DEFAULT, her sütun varsayılan bir değere sahip olabilir. Eğer yeni bir sütun eklenirse ve değer
atanmazsa o sütun için belirlenen varsayılan değeri alır. Varsayılan değer başka bir sütunun adı olamaz.
Varsayılan değerin veri tipi sütun ile aynı olmalıdır. Tablo oluşturulduğunda veya değiştirildiğinde atanabilir.
CREATE TABLE test (hire_date DATE DEFAULT SYSDATE, first_name VARCHAR2(15))
Explicit (açık) Implicit (kapalı / örtük)
INSERT INTO my_employees INSERT INTO my_employees
(hire_date, first_name, last_name) (first_name, last_name)
VALUES VALUES
(DEFAULT, 'Angelina','Wright'); ('Angelina','Wright');

Eğer varsayılan değer belirlenmemişse null değer atanır.


MERGE, iki görevin aynı anda yapılmasını sağlar. Eşzamanlı olarak INSERT ve UPDATE yapar. Eğer
değer eksikse yeni bir tane ekler (insert) eğer değer mevcutsa fakat değiştirilmesi gerekiyorsa değiştirir
(update). Hedef tabloda Insert ve Update kaynak tabloda ise Select ayrıcalıklarına sahip olmak gerekir. Takma
adlar (alias) kullanılabilir.
Kaynak tablodan bir satır okunur ve hedef tabloda eşleşme koşulu ile karşılaştırılır. Eğer satır mevcutsa kaynak
satırı kullanılarak değiştirilir mevcut değilse yeni bir satır tabloya eklenir.
MERGE INTO copy_emp c USING employees e ON (c.employee_id = e.employee_id)
WHEN MATCHED THEN UPDATE
SET
c.last_name = e.last_name,
c.department_id = e.department_id
WHEN NOT MATCHED THEN INSERT
VALUES (e.employee_id, e.last_name, e.department_id);

MULTI-TABLE INSERTS (Çoklu tablo ekleme), aynı kaynak tablodan birden fazla hedef tabloya ekleme
yapılacaksa kullanılır. Koşullu veya koşulsuz olabilir. Koşullu olanlarda ALL veya FIRST kullanılır.
All kullanılırsa (varsayılan olarak), diğer when ifadelerinden bağımsız olarak her when ifadesini
değerlendirir. Her True döndüren when ifadesinde karşılık gelen INTO ifadesini yürütür.
First kullanılırsa, ifadede göründüğü sırayla her when ifadesini değerlendirir. İlk True döndüren when
ifadesi için karşılık gelen INTO ifadesini yürütür ve o satır için sonraki when ifadelerini atlar.
Else kullanılırsa, verilen satır için eğer hiçbir when ifadesi True olmaz ise ELSE ifadesi ile
ilişkilendirilen INTO ifadesini yürütür. Eğer else kullanılmazsa o satır için işlem yapılmaz.
INSERT ALL INTO clause VALUES clause SUBQUERY
INSERT ALL INSERT ALL
INTO my_employees WHEN call_ format IN ('tlk','txt','pic') THEN
VALUES (hire_date, first_name, INTO all_calls
last_name) VALUES (caller_id, call_timestamp, call_duration,
INTO copy_my_employees call_format)
VALUES (hire_date, first_name, WHEN call_ format IN ('tlk','txt') THEN
last_name) INTO police_record_calls
SELECT hire_date, first_name, last_name VALUES (caller_id, call_timestamp, recipient_caller)
FROM employees; WHEN call_duration < 50 AND call_type = 'tlk' THEN
INTO short_calls
VALUES (caller_id, call_timestamp, call_duration)
WHEN call_duration > = 50 AND call_type = 'tlk' THEN
INTO long_calls
VALUES (caller_id, call_timestamp, call_duration)
SELECT caller_id, call_timestamp, call_duration, call_format,
recipient_caller)
FROM calls
WHERE TRUNC(call_timestamp ) = TRUNC(SYSDATE);

DATA DEFINITION LANGUAGE (DDL),


Veri tabanı şema nesneleri, veri tabanı farklı tiplerde nesneler bulundurabilir.
Table, Index, Constraint, View, Sequence, Synonym
Bazıları yer kaplarken bazıları yer kaplamaz. Önemli bir depolama alanı kaplayanlar “Segments” olarak
adlandırılır tablolar ve indexler buna örnektir. Views, constraints, sequences ve synonymler ihtiyaç duyduğu
alan sadece tanımlanmalarıdır, herhangi bir veri satırı ile ilişkileri yoktur.
Bütün veri tabanı nesne tanımları Data Dictionary’de saklanır.
Tablo oluşturmak, ilişkisel veri tabanlarında bütün veriler tablolarda saklanır. Sütun ve tablo isimleri
kuralları: mutlaka harf ile başlamalı, 1 ila 30 karakter uzunluğunda (A – Z, a – z, 0 – 9, _, $ ve #), aynı kullanıcı
tarafından sahip olunan başka bir nesne ile aynı isime ve oracle sunucusu tarafından ayrılan kelime olamaz.
Tablo ve diğer nesneler için açıklayıcı isim kullanmak daha iyidir. Tablo isimler büyük küçük harf
duyarlı değildir. Tablo isimlerinin çoğul olması daha iyidir.
Tablo oluşturmak DDL’in parçasıdır ve ALTER, DROP, RENAME ve TRUNCATE içerir.
CREATE TABLE, bu komutu kullanmak için ayrıcalığa ve yeterli alana sahip olmak gerekir. Diğer
kullanıcılara ait tabloları kullanamazsınız. Kullanmak için tablo sahibinin adını tablo isminin başına eklemek
gerekir.
SELECT * FROM [Link]; Bunu yapabilmek için izniniz olmalıdır.
CREATE TABLE table CREATE TABLE my_cd_collection
(column data type [DEFAULT expression], (cd_number NUMBER(3),
(column data type [DEFAULT expression], title VARCHAR2(20),
(……[ ] ); artist VARCHAR2(20),
purchase_date DATE DEFAULT SYSDATE);

External Tables (Harici tablolar), veri satırları veri tabanı içinde tutulmaz veri tabanı dışında düz dosyada
bulunur. Genellikle saklanan veriler veri tabanın eski sürümleridir. Sıklıkla kullanılmayan ve sadece okuma
erişimi olan veriler de tutulabilir. Burada tutulan veriler bir kez yedeklenir ve dosya içeriği değişmedikçe
yedeklenmez.
İtalik olan ifadeler standart sql tablo oluşturma CREATE TABLE emp_load
ifadelerinde yoktur. (…)
Harici tablo oluştur ORGANIZATION EXTERNAL
Oracle loader tipi (TYPE ORACLE_LOADER
Dizinin adı DEFAULT DIRECTORY def_dir1
Dosya nasıl okunacak ACCESS PARAMETERS
Yeni satır başlangıcı tanımı (RECORDS DELIMITED BY NEWLINE
Field adı ve veri tipi özellikleri FIELDS (…)
Veriyi içeren dosyanın adı LOCATION ('[Link]'));

Data Dictionary (Veri sözlüğü), bütün sözlük tabloları özel bir oracle kullanıcısı olan SYS’e aittir ve sadece
Select ifadeleri kullanılmalıdır. Herhangi bir kullanıcı bu tablolara ekleme, değiştirme, silme yaparsa bu işlem
bütün veri tabanın bütünlüğünün bozulmasına sebep olabileceğinden izin verilmez.
SELECT * SELECT * FROM DICTIONARY
FROM user_indexes; Bütün viewlerin ismini döndürür.
SELECT *
FROM user_objects Nesne tipinin başına USER veya ALL koyarak
WHERE object_type = 'SEQUENCE'; isimler belirtilebilir.
VERİ TİPLERİNİ KULLANMAK
Bir değerin veri tipi belirlenmiş özellik kümesi ile ilişkilendirilir. Bu özellikler veri tabanının farklı veri
tiplerine farklı davranmasını sağlar. Farklı veri tiplerinin avantajları tek tipli sütunlar tutarlı sonuçlar verir ve
yanlış veri tipinin girilmesine izin vermez bu sebeplerden dolayı ilişkisel veri tabanlarında her sütun sadece tek
bir veri tipi tutabilir. En çok kullanılan veri tipleri
CHAR, sabit boyut, max. 2000 karakter
VARCHAR2, değişken boyut, max. 4000 karakter
CLOB, değişken boyut, max. 128 terabayt
NUMBER, değişken boyut, max. Hassasiyet 38 hane
DATE, zaman ve saat, yüzyıldan saniyeye kadar hassaslık kesirler yok
TIMESTAMP, zaman ve saat, saniyenin kesirlerine izin verir
INTERVAL, zaman ve saat saniyeden sonra alınan parametre kadar milisaniye hassaslık, geçen zamanı
veya iki tarih arasındaki aralığı tutar.
RAW, değişken boyut, max. 2000 bayt
BLOB, değişken boyut, max. 128 terabayt
CREATE TABLE time_ex1 CREATE TABLE time_ex3
(exact_time TIMESTAMP); (first_column TIMESTAMP WITH TIME ZONE,
TIMESTAMP yerel saatler ile kullanılabilir. second_column TIMESTAMP WITH LOCAL TIME
ZONE);
INTERVAL YEAR … TO MONTH, INTERVAL YEAR [(year_precision)] TO MONTH yıl_hassasiyeti (2)
CREATE TABLE time_ex4 SELECT SYSDATE + loan_dur1 AS "120
(loan_duration1 INTERVAL YEAR(3) TO months from now",
MONTH, SYSDATE + loan_dur2 AS "3 years 6 months
loan_duration2 INTERVAL YEAR(2) TO from now"
MONTH); FROM time_ex4;
INSERT INTO time_ex4 (loan_dur1, loan_dur2)
VALUES (INTERVAL '120' MONTH(3),
INTERVAL '3-6' YEAR TO MONTH);
Yıl hassasiyeti kaç hane olacağını belirtiyor.
INTERVAL DAY … TO SECOND INTERVAL DAY [day_precision)] TO SECOND
[(fraction_s_precision)]
İki zaman arasında daha hassas ölçüm gerekirse kullanılır. Hassasiyet day (2) second (6) kaç hane olacağı.
CREATE TABLE time_ex5
(day_duration1 INTERVAL DAY(3) TO SECOND, day_duration2 INTERVAL DAY(3) TO
SECOND);
INSERT INTO time_ex5 (day_duration1, day_duration2)
VALUES (INTERVAL '25' DAY(2), INTERVAL '4 10:30:10' DAY TO SECOND);
SELECT SYSDATE + day_duration1 AS "25 Days from now",
TO_CHAR(SYSDATE + day_duration2, 'dd-Mon-yyyy hh:mi:ss')
AS "precise days and time from now" FROM time_ex5;
11-Aug-2017 21-Jul-2017 01:13:17
There is nothing permanent except change. -Değişmeyen tek şey değişimin kendisidir.
TABLOYU DEĞİŞTİRMEK, tabloları değiştirmek için DDL komutları kullanılır.
ALTER TABLE, yeni sütun eklemek için, var olan sütunda değişiklik yapmak için, sütuna varsayılan
değer atamak için ve sütunu bırakmak (silmek) için kullanılır. Sütunların sırasını değiştiremez ve yeni eklenen
sütunlar her zaman sona eklenir. Eğer tabloda satırlar varsa ve yeni sütun eklerseniz o satırlar null değer alır.
ALTER TABLE table ADD (column name data type, Yeni sütun ekleme
column name data type DEFAULT
0,
ALTER TABLE table MODIFY (column name data Sütunun veri tipini, boyutunu, ve varsayılan
type, değerini ayarlama
Column name data type DEFAULT
0,
ALTER TABLE table DROP COLUMN column Sütun silme (sildikten sonra en az 1 sütun kalmalı,
name geri alınamaz)
ALTER TABLE table SET UNUSED (column name) Silinecek tabloları işaretlemek
ALTER TABLE table DROP UNUSED COLUMNS İşaretlenen tabloları siler.

DROP TABLE, tablonun tanımını kaldırır. Tablodaki indexler ve veriler kaybedilir ve data
dictionary’dem tablonun açıklaması (description) kaldırılır. Oracle sunucusu kararınızı sorgulamaz ve anında
tabloyu bırakır. Sadece ayrıcalığı olan kullanıcılar tablo bırakabilir.
ALTER SESSION SET RECYCLEBIN=ON; FLASHBACK TABLE tablename TO BEFORE
DROP TABLE table name; DROP;
Kazara silinen tablolar flashback komutu ile kurtarılabilir. RECYCLEBIN çöp kutusu görevi görür.
DROP TABLE table name PURGE; tamamen silmek için kullanır PURGE çöp kutusunda kullanılabilir.
RENAME, tablonun ismini değiştirmek için kullanılır. Nesne sahibi veya DBA tarafından kullanılabilir.
RENAME old_name to new_name;
TRUNCATE, tablodaki bütün satırları siler ve depolama alanını bırakır. Satır slime işlemi geri
alınamaz. DELETE ifadesi satırları silmek için kullanılabilir fakat depolama alanını bırakmaz ayrıca truncate
daha hızlı çalışır çünkü geri alma bilgisi oluşturmaz.
TRUNCATE TABLE tablename;

COMMENT ON TABLE, 2000 karaktere kadar yorum yapılabilir.


COMMENT ON TABLE employees COMMENT ON TABLE employees IS ' ' ;
IS 'Western Region only'; SELECT table_name, comments FROM user_tab_comments;
Yorum oluşturma, silme ve yorumları görüntüleme sorguları.
FLASHBACK SORGUSU, tabloda uygun olmayan değişiklikler fark edebilirsiniz neyseki bunu çözmek için o
satırdaki verinin farklı versiyonlarını görüntüleyebilirsiniz. FLASHBACK QUERY kullanarak değişiklikler
yapılmadan önce nasıl olduğuna bakabilirsiniz.
Oracle veri değiştirildiğinde her zaman değiştirilmiş verinin kopyasını tutar ve bu kopyalar UNDO tablo
alanında saklanır. SELECT ile VERSION ifadesi kullanarak eski versiyonlara bakılabilir.
SELECT employee_id,first_name ||' '|| last_name AS "NAME", versions_operation AS
"OPERATION",
versions_starttime AS "START_DATE", versions_endtime AS "END_DATE", salary
FROM employees
VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
WHERE employee_id = 1;
SCN = System Change Number, ardışık bir değerdir ve veri tabanı tarafından arttılır ve yönetilir.

KISITLAMALAR (CONSTRAINTS)’A GİRİŞ


Constraintler, veri tabanı kuralları olarak düşünülebilir ve veri sözlüğünde saklanan tanımlardır. Eğer bir
tablonun başka tablo ile bağları varsa silinmesini engeller. Bir satır eklendiğinde, değiştirildiğinde veya
silindiğinde veriler üzerinde kuralları uygular. İsimlendirmek önemlidir.
CREATE TABLE kullanarak tablodaki her sütu için kısıtlama oluşturulabilir sütun seviyesinde
kısıtlama isim ve veri tipinin yanına koymak veya tablo seviyesinde kısıtlama bütün sütun adlarından sonra.
CREATE TABLE clients column level –
sütun seviyesi
(client_number NUMBER(4) CONSTRAINT clients_client_num_pk PRIMARY KEY,
first_name VARCHAR2(14) NOT NULL,
last_name VARCHAR2(13));
CREATE TABLE clients ( table level – tablo
seviyesi
client_number NUMBER(6) NOT NULL,
first_name VARCHAR2(20),
last_name VARCHAR2(20),
phone VARCHAR2(20),
email VARCHAR2(10) NOT NULL,
CONSTRAINT clients_phone_email_uk UNIQUE (email,phone));
İsimlerdirme yapılmaz ise rastgele bir değer atanır, daha sonradan hatırlayabilmek için isimlendirmek
önemlidir. Kısıtlama isminin sonuna türü eklenebilir pk uk nn gibi.
Kurallar,
Birden fazla sütuna etki eden kısıtlamalar (composite key gibi) tablo seviyesinde
tanımlanmalıdır.
NOT NULL kısıtlaması sadece sütun seviyesinde tanımlanabilir.
UNIQUE, PRIMARY KEY, FOREIGN KEY ve CHECK kısıtlamaları hem satır hem sütun
seviyesinde olabilir.
Eğer CONSTRAINT ifadesi kullanıldıysa isimlendirmek zorunludur. (Tablo seviyesindeki
kısıtlamalar ifadeyi kullandığından isim vermek zorunludur.)
CREATE TABLE clients( // Hataları bulun.
client_number NUMBER(6),
first_name VARCHAR2(20),
last_name VARCHAR2(20),
phone VARCHAR2(20) CONSTRAINT phone_email_uk
UNIQUE(email,phone),
email VARCHAR2(10) CONSTRAINT NOT NULL,
CONSTRAINT emailclients_email NOT NULL,
CONSTRAINT clients_client_num_pk PRIMARY KEY (client_number));
NOT NULL Constraints, tabloya girilen satırlarda tanımlanan sütun için mutlaka değer olmalıdır.
UNIQUE Constraints, sütundaki veya sütun kümesindeki (composite key) değerlerin benzersiz olması
gerekir. Unique olarak tanımlanan sütun veya sütun kümesi unique key olarak adlandırılır.
CONSTRAINT clients_phone_email_uk UNIQUE(email,phone)
Null ifadeler her zaman unique kısıtlamasını karşılar.
Tablo oluşturulurken NOT NULL kısıtlaması eklenirse veri tabanı otomatik olarak check
constraint oluşturur. Bu oracle tarafından yapılır kullanıcıya gözükmez.
PRIMARY KEY Constraints, bir veya birden fazla sütundaki veri kombinasyonlarının her satır için
benzersiz olmasını sağlar. Hiçbir PK değeri bir tabloda bir satırdan daha fazla yerde görünmez.
Kurallar,
PK olan sütun Null değer içeremez ve bir table sadece bir PK’e sahip olabilir. NOT: PK, birden
çok sütun birleştirilerek yapılabilir ve bu composite PK olarak adlandırılır.
PK sütun ve tablo seviyesinde tanımlanabilir. Eğer composite PK oluşturulduysa tablo
seviyesinde tanımlanmalıdır.
CREATE TABLE clients column level – sütun seviyesi
(client_number NUMBER(4) CONSTRAINT clients_client_num_pk PRIMARY KEY,
first_name VARCHAR2(14),
last_name VARCHAR2(13));
CREATE TABLE clients table level – tablo seviyesi
(client_number NUMBER(4),
first_name VARCHAR2(14),
last_name VARCHAR2(13),
CONSTRAINT clients_client_num_pk PRIMARY KEY (client_number));
CREATE TABLE copy_job_history table level – composite PK
tanımlama
(employee_id NUMBER(6,0),
start_date DATE,
job_id VARCHAR2(10),
department_id NUMBER(4,0),
CONSTRAINT copy_jhist_id_st_date_pk PRIMARY KEY(employee_id, start_date));
FOREIGN KEY (REFERENTIAL INTEGRITY) Constraints, FK referans tutarlılığı olarak da
adlandırılır. Sütun veya sütunların kombinasyonu FK olarak atanabilir. FK başka tablodaki pk (veya UK)’e
bağlanır ve bu bağ tablolar arasındaki ilişkiyi temel alır. FK içeren tablo child, referans tablo parent.
Referans tutarlılığını sağlamak için, FK değeri parent tabloda var olan bir değerle eşleşmeli veya null
olmalıdır. PK FK olmadan var olabilir ama FK mutlaka bir PK’e karşılık gelmelidir.
Kurallar, child tabloda referans tutarlılığı tanımlanmadan önce, referans olacak UK veya PK
tanımlanmış olmalıdır. Yani FK oluşturmadan önce PK’e sahip olmalısınız.
CREATE TABLE copy_employees column level – sütun seviyesi
(employee_id NUMBER(6,0) CONSTRAINT copy_emp_pk PRIMARY KEY,
first_name VARCHAR2(20),
last_name VARCHAR2(25),
department_id NUMBER(4,0) CONSTRAINT c_emps_dept_id_fk
REFERENCES departments(department_id), email VARCHAR2(25));
CREATE TABLE copy_employees table level – tablo seviyesi
(employee_id NUMBER(6,0) CONSTRAINT copy_emp_pk PRIMARY KEY,
first_name VARCHAR2(20),
last_name VARCHAR2(25),
department_id NUMBER(4,0),
email VARCHAR2(25),
CONSTRAINT c_emps_dept_id_fk FOREIGN KEY (department_id)
REFERENCES departments(department_id));
NOT: Tablo seviyesinde FK tanımlanırken “FOREIGN KEY” ifadesi tablo ve sütun isminden önce dahil edilir.
ON DELETE CASCADE – Maintaining Referential Integrity (referans tutarlılığını sürdürmek), FK tanımlarken
on delete cascade kullanılırsa parent tablodan silinen satır child tabloda alakalı kısımlardan da silinir. Eğer
kullanılmazsa referanslanan tablolar silinemez diğer bir deyişle bu ifade parent’in satırları silmesine izin verir.
Aşağıdaki örnekte departmant_id’lerden biri silinirse ilişkili olan çalışanlarda silinir.
CREATE TABLE copy_employees
(employee_id NUMBER(6,0) CONSTRAINT copy_emp_pk PRIMARY KEY,
first_name VARCHAR2(20),
last_name VARCHAR2(25),
department_id NUMBER(4,0),
email VARCHAR2(25),
CONSTRAINT cdept_dept_id_fk FOREIGN KEY (department_id)
REFERENCES copy_departments (department_id) ON DELETE CASCADE);
ON DELETE CASCADE kullanılmazsa HATA-KODU: Integrity constraint … violated – child record found
ON DELETE SET NULL, satırları silmek yerine Null değer koyar kullanımı aynıdır.
CHECK Constraints, açıkça (explicitly) karşılanması gereken koşulu tanımlar. Bu kısıtlamanın
karşılanması için her satır mutlaka koşulu True veya Unknown (Null değerlerden dolayı) yapmalıdır. Eğer iki
sütun ile check kullanılacaksa tablo seviyesinde tanımlanmalıdır.
Check kısıtlaması fonksiyon çağrısı (UID, SYSDATE, USER, USERENV …) ve sözde sütun
(CURRVAL, NEXTVAL, LEVEL veya ROWNUM) kullanamaz. Kısıtlama yoktur istenildiği kadar koşul
eklenebilir.
CREATE TABLE copy_job_history
(employee_id NUMBER(6,0), start_date DATE, end_date DATE,
job_id VARCHAR2(10),
department_id NUMBER(4,0),
CONSTRAINT cjhist_emp_id_st_date_pk PRIMARY KEY(employee_id, start_date),
CONSTRAINT cjhist_end_ck CHECK (end_date > start_date));

salary NUMBER(8,2) CONSTRAINT employees_min_sal_ck CHECK (salary > 0) sütun seviyesi


CONSTRAINT employees_min_sal_ck CHECK (salary > 0) tablo seviyesi

Managing constraints (Kısıtlamaları yönetmek), ALTER TABKE ifadesi var olan tablolardaki kısıtlamaları
değiştirmek için kullanılabilir. Kurallar,
Ekleme, bırakma, aktifleştirme, devre dışı bırakma yapabilir fakat yapısını değiştirmezsiniz. NOT
NULL kısıtlaması MODIFY (ALTER TABLE) kullanarak eklenebilir. Modify, sütun seviyesinde değiştirme
yapar. Eğer tablo boşsa veya her satır için veri mevcutsa kullanılabilir.
ALTER ifadesi, kullanmak için tablo adı, kısıtlama adı, kısıtlama tipi, etkilenen sütun adı gerekir.
ALTER TABLE employees ADD CONSTRAINT emp_id_pk PRIMARY KEY (employee_id);
Eğer foreign key kullanılacaksa tablo seviyesinde olduğu gibi “foreign key” kullanılmalıdır.
ALTER TABLE employees MODIFY (email CONSTRAINT emp_email_nn NOT NULL);
Bazı durumlarda performansı arttırmak için kısıtlamalar devre dışı bırakılabilir. Özellikle fk kısıtlamaları çok
zaman kaybettirir. Bu yüzden DBA (Veri tabanı yöneticisi) büyük hacimli toplu işlemlerde kısıtlamaları devre
dışı bırakarak zaman kazandırır.
Kısıtlamaları bırakmak, isimini bildiğiniz kısıtlamaları kaldırabilirsiniz. CASCADE özelliği DROP ile
birlikte kullanıldığında ilişkili olan kısıtlamalarda bırakılır. Örneğin PK kısıtlaması bırakılacağı zaman cascade
kullanıldığında child tablodaki FKda bırakılır.
ALTER TABLE table_name DROP CONSTRAINT name [CASCADE}
Kısıtlamaları devre dışı bırakmak, DISABLE gelen veriyi kısıtlamayı karşılasın veya karşılamasın kabul
eder. Child tabloya parent tabloda karşılık gelen değerler olmasa bile veri eklenmesine izin verir. Tablo
oluşturulurken kısıtlamanın sonuna eklenir.
Tablo değiştirilirken ALTER TABLE copy_employees DISABLE CONSTRAINT
c_emp_dept_id_fk;
Cascade bağımlı bütünlülüğü engeller. Yani kısıtlama sonradan etkinleştirilse dahi bağlı olan
kısıtlamalar otomatik olarak etkinleştirilmez.
UK veya PK devre dışı bırakmak unique indexi kaldırır.
Kısıtlamaları etkinleştirmek, kullanımı DISABLE ile aynıdır. ENABLE. Kısıtlama etkinleştirildiği
zaman tablodaki bütün veriye uygulanır. Tablodaki bütün veriler kısıtlamaya uygun olmalıdır. UK veya PK
etkinleştirmek indexlerini otomatik olarak oluşturur. Cascade seçeneği ile devre dışı bırakılan PK etkinleştirmek
ilgili FK’leri etkinleştirmez.
Cascading constraints (basamaklı kısıtlamalar), DROP COLUMN ile birlikte kullanılır. Bırakılan
sütünlarda PK VE UK’yi gösteren refereans bütünlüğü kısıtlamalarının hepsini kaldırır. Ayrıca tanımlanan
bütün çoklu sütun kısıtlamalarınıda bırakır.
ALTER TABLE table_name Cascade constraint içermeyen, pk veya çokjlu
DROP(column name(s)) CASCADE sütün bırakmaları hataya sebep olur. Child değere
CONSTRAINTS; sahip parent silinemez.
Eğer bir sütüna referans eden bütün sütunlar bırakıldıysa cascade kullanmaya gerek yoktur.
Tablo oluşturulduktan sonra describe kullanarak tabloyu inceleyebilirsiniz.
Describe ile kontrol edebileceğiniz tek kısıtlama NOT NULL’dır. NOT NULL veri sözlüğünde check
kısıtlaması olarak gözükür. USER_CONSTRAINTS tablosu kısıtlamaları tutar.
SELECT constraint_name, table_name, constraint_type, status FROM USER_CONSTRAINTS
WHERE table_name ='COPY_EMPLOYEES';
Kısıtlama tipleri P – PRIMARY KEY R – REFERENCES (FOREIGN KEY) C – CHECK (NOT NULL dahil)
U – UNIQUE
VIEWS (GÖRÜNTÜLEME), viewler tablolar gibi birer veri tabanı nesnesidir. Fakat viewler gerçek bir tablo
değildir. Var olan tabloların mantıksal gösterimidir, kendileri veri saklamaz.
CREATE VIEW view_employees SELECT * FROM view_employees;
AS SELECT employee_id,first_name, last_name, email Viewlerin oluşturuldupu tablo “base” olarak
FROM employee adlandırılır.
WHERE employee_id BETWEEN 100 and 124;
Neden view kullanılır? Base tabloya erişimi engeller. Sorguların karmaşıklığını azaltır. Örneğin viewi oluşturan
kişi birçok tabloadan veri çekmek için join sorgusu yazmış olabilir view kullanmak aynı sorguyu yazmayı
engeller. Viewi kullanan kişi kodu ve nasıl oluşturulduğunu görmez.
OR REPLACE Mevcut viewi yeniden oluşturur.
FORCE Base tablo olmasa bile view oluşturur.
NOFORCE Base tablo mevcutsa view oluşturur.
view_name Viewin adını belirtir.
alias View sorgusundan seçilen her ifadeye isim belirtir.
subquery Karmaşık select ifadeleri yazılabilir ve alias (takma ad) kullanılabilir.
WITH CHECK Insert,update işlemlerinden sonra satırların erişilebilir kalacağını belirtir.
OPTION
CONSTRAINT CHECK OPTION kısıtlamasına atanan isimdir.
WITH READ ONLY View için DML operasyonlarına izin vermez.
Viewi tanımlayan alt sorgu order by kullanmamalıdır. Order by viewden veri çekerken kullanılabilir.
Simple views tek tablo kullanılır fonskiyon ve veri grupları içermez dml operasyonu gerçekleştirilebilir.
Complex views bir veya daha fazla tablo fonksiyon ve veri grupları var dml her zaman izin verilmez.
Aliaslar create view ifadesinden sonra yazılabilir.
CREATE OR REPLACE VIEW view_euro_countries ("ID", "Country", "Capitol City")
AS SELECT country_id, country_name, capitol FROM wf_countries WHERE location LIKE
'%Europe';
DML işlemleri simple viewler için kullanılabilir. WITH CHECK OPTION kullanılmadan oluşturulan bir view,
viewe dahil edilmeyen bir satırın bilgisini değiştirebilir kullanılırsa DML işlemleri view sınırları içerisinde
yapılır. Herhangi bir verinin değiştirilmesine izin vermez çünkü WITH CHECK OPTION CONSTRAINT
kullanılmıştır.
WITH READ ONLY, DML işlemlerinin yapılmasını engeller.
DML Restrictions(Kısıtlama, constraint daha çok sınırlama anlamında)
İşlemler View bunlardan birini içeriyorsa view üzerinden işlem yapılamaz
Satır silmek Grup fonksiyonlar, group by, distinct, rownum (pseudocolumn)
Veri değiştirmek … + Sütunlar tarafından tanımlanan ifadeler
Veri eklemek … + Temel tablolarda NOT NULL sütunları içermez
Alttaki kısıtlara üstündekilerde dahildir.
Viewleri silmek, artık kullanılmıyorsa silinebilir veri tutmadıklarından altlarında yatan base tablonun verilerini
etkilemezler. Eğer DML işlemleri için kullanıldıysa yapılan değişiklikler base tabloda kalır. Viewi silmek
tanımını veri tabanından kaldırır. HATIRLATMA Viewler SELECT ifadeleri olarak saklanır.
DROP VIEW viewname; Oluşturan kişi veya yetkisi olan kullanabilir.
INLINE VIEW, from idafesindeki alt sorgularla ilişkilidir. Karmaşıklığı azaltmak için kullanılır.
SELECT e.last_name, [Link], e.department_id, [Link] FROM employees e,
(SELECT department_id, max(salary) maxsal
FROM employees
GROUP BY department_id) d
WHERE e.department_id = d.department_id
AND [Link] = [Link];
Inline view mutlaka bir takma ada sahip olmalıdır.
TOP-N-ANALYSIS, sonuçları rütbelendirmek (rank) için kullanılır.
SELECT ROWNUM AS "Longest employed", SELECT ROWNUM AS "Longest employed", …
last_name, hire_date FROM (SELECT last_name, hire_date
FROM employees FROM employees
WHERE ROWNUM <=5 ORDER BY hire_date)
ORDER BY hire_date; WHERE ROWNUM <=5;
Soldaki sorguda sonuçlar beklendiği gibi sıralı olmayabilir bunun sebebi numaralandırıldıktan sonra sıralanır
çünkü order by her zaman en son çalışır bunu çözmek için sağdaki gibi inline view kullanılabilir.
Working with Sequences (Sıralar), SQL otomatik olarak benzersiz sayılar oluşturabilir ve bu işlem SEQUENCE
veri tabanı nesnesi tarafından yürütülür. Paylaşılabilen (shareable) bir nesnedir ve genellikle PK için kullanılır.
CREATE SEQUENCE Sequence ismi
sequence Sayılar arasındaki aralık varsayılan olarak 1
[INCREMENT BY n] Hangi sayıdan başlanacağı varsayılan olarak 1
[START WITH n] Max. atanabilecek değer
[{MAXVALUE n | Varsayılan olarak azalan için -1 artan için 10^27
NOMAXVALUE}] Min. atanabilecek değer
[{MINVALUE n | Varsayılan olarak artan için 1 azalan için –(10^26)
NOMINVALUE}] NOCYLE varsayılan, max ve mine ulaşıldığında devam etsin mi
[{CYCLE | NOCYCLE}] Oracle sunucusunun kaç tane değerin hafızada yer ayırıp tutacağını
[{CACHE n | NOCACHE}]; belirtir. Varsayılan 20. Sistem çökerse bu değerler kaybedilir.
SELECT sequence_name, min_value, max_value, increment_by, last_number FROM user_sequences;
Oluşturulan sequenceları görmek için kullanılır.
NEXTVAL ve CURRVAL sözde sütunları, nextval ardışık sequence sayılarını ayıklamak için kullanılır,
mutlaka sequence ismi verilmelidir. Geçerli sequence sayısı currval oluşturulan sayı nextval’a yerleştirilir.
Currval kullanılmadan önce nextval yeni sequence sayısını oluşturmak için kullanılmalıdır.
INSERT INTO employees (employee_id, department_id, ...)
VALUES (employees_seq.NEXTVAL, dept_deptid_seq.CURRVAL, ...);
Kullanılabilen yerler Kullanılamayan yerler
Alt sorgu parçası olmayan Select Viewin select kısmında
Alt sorgunu select kısmında Insert Distinct kullanılan select
VALUES ifadesinde Insert Group by, having, order by içeren select
SET ifadesinde Update SELECT, DELETE veya UPDATE alt sorgularında
Create table veya Alter table varsayılan ifadesinde
INSERT INTO runners (runner_id, first_name, SELECT runner_id_seq.CURRVAL
last_name) FROM dual;
VALUES (runner_id_seq.NEXTVAL, 'Adam', 'Curtis');
Hafızada önbelleklenmiş sequence daha hızlı bir erişim sunar. Önbellek sequence ilk kullandığınızda
doldurulur. Sonraki sequence için her erişim önbellekten sağlanır. Son sequence kullanıldığında yeni bir
önbellek çekilir.
Sıralı olmayan sarılar (nonsequential numbers), sequence oluşturucu atlamadan sayıları oluşturabilir fakat sıralı
olmama durumu veri tabanında commit ve rollback işlemlerinden bağımsız şekilde oluşur. Gaps (nonsequential
numbers)’a sequence içeren bir ifadeye rollback yapılması, sistem arızası veya aynı sequence’ın birden fazla
tabloda kullanılması sebep olur.Eğer sequnce NOCACHE ile oluşturulmuşsa sonraki değer sequenceı
arttırmadan USER_SEQUENCES tablosundan görüntülenebilir.
Alter kullanılarak sequence değiştirilebilir. Max. değeri şuanki değerken küçük yapamazsınız. Kurallar,
Sequence değiştirmek için sahibi veya ayrıcalığınız olmalı
Sadece gelecek değerler alter kullanılarak etkilenebilir.
START WITH alter kullanılarak değiştirilemez. Bırakılıp yeniden oluşturulması gerekir.
DROP SEQUENCE runner_id_seq;
Indexes (indeks, dizin), pointer kullanarak satırların geri alınmasını hızlarından schema nesnesidir. Eğer bir
sütun için index mevcut değilse bütün tablo aranır. Index doğrudan ve hızlı bir erişim sağlar. Amacı disk I/O
gerekliliğini indexlenmiş bir yol kullanarak azaltmaktır.
ROWID 64 tabanlı satırların row adreslerini temsil eden bir stringtir ve blok tanımlayıcısı, bloktaki
satırın konumu ve veri tabanı dosya tanımlayıcısını içerir. Indexler ROWID kullanır çünkü en hızlı yoldur.
Indexleri bırakmak veya oluşturmak tabloları etkilemez fakat tabloları silmek karşılık gelen indexlerinde
bırakılmasına yol açar.
İki tip index vardır UNIQUE INDEX, tabloda PK veya UK kullanıldığında otomatik olarak oluşturulur
ve ismini constraitten alır. NONUNIQUE INDEX, kullanıcılar tarafından satırlara erişim hızını arttırmak için
oluşturulur. Örneğin join işlemini hızlandırmak için FK indexi oluşturulabilir bu PK ile satır eşleşmesini
hızlandırır.
Index Oluşturmak, Şu koşullardan birini sağlamanız gerekir: tablo kendi şemanıza ait olmalı, INDEX
nesnesi ayrıcalığına sahip olmalısınız, CREATE ANY INDEX sistem ayrıcalığına sahip olmalısınız.
CREATE INDEX wf_cont_reg_id_idx ON wf_countries(region_id);
Indexler ne zaman oluşturulmalı : Sütun geniş aralıklı değerler içeriyorsa, bir sütun çok sayıda null
değer içeriyorsa, bir veya daha fazla sütun sıklıkla where veya join ile kullanılıyorsa, tablo büyük ve çoğu
sorgudan beklenti bütün sütunlar 2-4%’den az ise.
Indexler ne zaman oluşturulmamalı : Her DML işlemi indexlerin güncellenmesini gerektirir ne kadar
çok index oluşturursanız o kadar çok index DML işleminden sonra güncellenmesi gerekir. Tablo küçükse,
sütunlar sıklıkla koşul olarak kullanılmıyorsa, çoğu sorgu beklentisi tablodaki satırların 2-4% fazla dönmesi ise,
tablo sıklıkla güncelleniyorsa, indexlenen sütunlar bir ifadenin parçası ise.
Composite index (concataneted index), çoklu sütunlarda kullanılan index türüdür. Herhangi bir sırada
olabilir ve tabloda komşuluğu olmasına gerek yoktur. Select ifadesinde where cümlesi bütün sütunları veya
önde gelen kısmını içeriyorsa veri geri alımını hızlandırır. Null değerler dahil edilmez. Joinleri optimize etmek
için kullanılabilir. Optimize edici where ifadesinde IS NULL varsa index kullanmaz.
CREATE INDEX emps_name_idx ON employees(first_name, last_name);
Confirming (onaylanan) indexler, USER_INDEXES tablosuna bakılabilir.
SELECT DISTINCT ic.index_name, ic.column_name, ic.column_position, [Link]
FROM user_indexes id, user_ind_columns ic WHERE id.table_name = ic.table_name
AND ic.table_name = 'EMPLOYEES';
Function-based (fonksiyon tabanlı) indexler, indexlenen değerleri saklar ve select ifadesini temel alarak
verileri geri almak için kullanır.
CREATE INDEX upper_last_name_idx Veri tabanında verilerin hangi durumda tutulduğunu
ON employees (UPPER(last_name)); bilmiyorsanız kullanabilirsiniz.
SELECT *
FROM employees Bu sorgu kesinlikle index kullanacaktır fakat burada
WHERE UPPER (last_name) IS NOT NULL where satırı olmasaydı tüm tabloada arama yapacaktı.
ORDER BY UPPER (last_name);
Geçerli olan Oracle yerleşik fonksiyonları kullanılabilir TO_CHAR gibi. Fakat to_char sadece where ifadesinde
değil oluşturulan indextede yer almalıdır. Yukarıdaki örnekte olduğu gibi.
Indexler değiştirilemez değiştirmek için bırakıp yeniden oluşturmalısınız. Tablolar bırakıldığında
indexler ve constraintler otomatik olarak bırakılır fakat viewlar ve sequencelar kalır.
DROP INDEX emps_name_idx;
SYNONYM (eş anlam), SQL, dillerde olduğu gibi başka bir ifade için eş anlamı kabul edebilir.
Synonymler nesnelere erişimi basitleştirmek için başka bir isim oluşturulmasıdır. Viewler için kolaylık sağlar.
CREATE PUBLIC SYNOYM ayrıcalığına sahip olmalısınız.
CREATE [PUBLIC] SYNONYM synonym FOR object;
Nesne paket içinde bulunamaz. Ve özel synonym adı aynı kullanıcın sahip olduğu nesnelerden
farklı olmalıdır.
DROP [PUBLIC] SYNONYM name_of_synonym
Confirming a synonym, USER_SYNONYM tablosuna bakılabilir.
Synonym_name Synoym adı.
Table_name Synonym tarafından gösterilen nesne ismi
Table_owner Synonym tarafından gösterilen nesne sahibi
Db_link Uzak synoynm için veri tabanı bağlantısı

PRIVILEGES AND REGULAR EXPRESSIONS (Ayrıcalıklar ve düzenli ifadeler)


Controlling user access (Kullanıcı erişimini kontrol etmek), çok kullanıcılı bir ortamda veri tabanının güvenliği
sağlanmalıdır. Oracle Server database security ile : veri tabanı erişimi kontrolü, belirli nesnelere erişim vermek,
verilen ve kabul edilen ayrıcalıkların veri sözlüğünde onaylanması, nesnelerinin synonymi oluşturulması
Database security, 2 kategoride sınıflandırılabilir sistem güvenliği (ayrıcalık kuralları) ve veri güvenliği
(nesne güvenliği). CREATE SESSION veri tabanına bağlanmak için.
Privileges and Schemas (ayrıcalıklar ve şemalar), ayrıcalıklar belirli SQL ifadeleri yürütme iznidir. DBA
yüksek seviyeli bir kullanıcıdır ve diğer kullanıcılara yetki verebilir. Şemalar nesnelerin (tablolar, viewler, ve
ssequencelar gibi) koleksiyonudur. Şema veri tabanı kullanıcısına aittir ve isimi kullanıcı ile aynıdır.
System security, bu güvenlik seviyesi sistem düzeyinde veri tabanı erişim ve kullanımını kapsar.
CREATE , USER , DROP USER, DROP ANY TABLE, BACKUP ANY TABLE …
CREATE USER user IDENTIFIED BY password;
GRANT privilege [, privilege...] TO user [, user| role, PUBLIC...];
Object (veri) security, bu güvenlik seviyesi kullanıcıların veri tabanı nesnelerine ve hareketlerine erişimi
ve kullanımını kapsar. Her nesne kendine özgü yetkilendirilebilir ayrıcalıklara sahiptir. Grant ile UPDATE,
REFERENCES, ve INSERT ayrıcalıkları ayrı ayrı sütunlara yetki verilebilir. Select sadece view kullanarak
kısıtlanabilir.
GRANT UPDATE (salary) ON employees TO steven_king
Tablo sahibi PUBLIC kullanarak bğtğn kullanıcalara yetki verebilir (grant) Eğer ifadede nesnenin tam
ismi kullanılmazsa oracle server implicitly (örtük) şekilde geçerli kullanıcının öneke koyar. Eğer tablo veya
view bulunmuyor hatası döndürülürse : tablo bulunmuyor olabilir veya uygun ayrıcalığınız bulunmayan bir
işlem yapmış olabilirsiniz.
GRANT select ON [Link] TO PUBLIC;
Sahip olunan ayrıcalıkları görmek için data dictionary’e bakılabilir. Kullanıcı ayrıcalıkları Security
Reports kısmından bakılabilir.
Roles (roller), Rol kullanıcılara ilişkili ayrıcalıkları sağlayan isimlendirilmiş gruptur. Bu method
ssayesinde yetki vermek ve geri almak daha kolaydır. Bir kullanıcı birkaç role sahip olabilir. Herkese tek tek
ayrıcalık vermek yerine bir rol oluşturup vermek daha kolaydır.
CREATE ROLE manager; GRANT create table, create view TO manager;
GRANT manager TO jennifer_cho;
WITH GRANT OPTION yetki verilen kişi başka birine aynı yetkiyi verebilir.
REVOKE SELECT, INSERT ON clients FROM scott_king;
With grant option ile diğer kullanıcalara yetkiveren kişinin yetkisi alınırsa onun yetki verdiği herkesin
yetkiside alınır. Ayrıcalıklar oracle tarafından, roller kullanıcılar tarafından tanımlanır.
Database links, veri tabanları arasında tek taraflı bir iletişim yolu tanımlayan pointerdır. Pointer linki
veri sözlüğü tablosunda kayıtta tutulur. Linke erişmek için kaydı bulunduran tablonun olduğu veri tabanına
yerel olarak bağlı olmalısınız. Uzaktan bağlantılı nesnelere grant yapılamaz.
CREATE PUBLIC SYNONYM HQ_EMP FOR emp@[Link];
REGULAR EXPRESSIONS, meta karakterlerin kullanımını temel alır. Meta karakter özel anlamı olan
karakterlerdir.
. (dot) Null hariç, desteklenen karakter kümesinde herhangi bir karakter eşleştirir
? 0 veya sadece 1 kez görünenleri eşleştirir
* 0 veya birden fazla görünenleri eşleştirir
+ 1 veya birden fazla görünenleri eşleştirir
() İfadeleri gruplamak, tek bir alf ifade olarak ele alınır
\ Kaçış karakteri
| Alternatif eşleşmeleri belirmek için alternation (nöbetleşme) operatörü
^/$ Satır başını eşleştirir / satır sonunu eşleştirir
[] Eşleşme listesini listede bulunan ifadelerle eşleştirir.
a.c ile eşleşen ve eşleşmeyenler 'ABC', 'abc', 'aqx', 'axc', 'aBc', 'abC' 'Amc' 'amrc'
Bu ifadelerin hepsi regular expressions (düzenli ifadeler) ile kullanılır.
REGEXP_LIKE Like operatörü gibi çalışır
REGEXP_REPLA Şablonu arar ve yerine koyar
CE
REGEXP_INSTR Verilen stringde şablonu arar ve eşleşmenin bulunduğu indexi döndürür
REGEXP_SUBSTR Şablonda verilen stringi bulur ve eşleşen alt stringi döndürür
REGEXP_COUNT Verilen şablonun kaç kez bulunduğunu sayar başlangıç ve eşleşme opsiyonları
verilebilir
SELECT first_name, last_name FROM employees WHERE REGEXP_LIKE(first_name, '^Ste(v|
ph)en$');
REGEXP check constrainler ile kullanılabilir
ALTER TABLE employees (email, '.+@.+\..+'))
ADD CONSTRAINT email_addr_chk CHECK(REGEXP_LIKE(email,'@'));

TCL (Transaction Control Language), işlemler bütün veri tabanı sistemlerinin temel kavramlarıdır. İşlemler
kullanıcılara veriler üzerinde değişiklik yapma ve daha sonra bu işi kaydetme veya atma hakkı tanır. Veri tabanı
işlemleri birçok adımı tek bir mantıksal iş biriminde birleştirir.
Bir işlem aşağıdakilerden birini içerir,
Verilerde tutarlı bir değişiklik oluşturmak için kullanılan DML ifadeleri
INSERT, UPDATE, DELETE ve MERGE içeren DML ifadeleri
1 DDL ifadesi CREATE, ALTER, DROP, RENAME veya TRUNCATE
1 DCL ifadesi GRANT veya REVOKE gibi
İşlemleri kontrol etmek
COMMIT, kullanıcının işi kaydetmeye hazır olduğu ve yapmak istediği değişiklikleri yaptığı noktayı
temsil eder. Commit kullanıldığında geçerli işlem sonlanır ve bekleyen işlemleri kalıcı hale getirir.
ROLLBACK, veritabanında yapılan değişikliklerin geri alınmasını sağlar. Rollback kullanıldığında
bekleyen tüm işlemler atılır (discard).
SAVEPOINT, işlemi küçük parçalara bölerek yönetimi kolaylaştırır.
ROLLBACK TO SAVEPOINT, belirlenen savepoint’e dönülmesini sağlar.
İşlem DML ile başlar ve aşağıdakilerden biri gerçekleştiği zaman biter,
COMMIT veya ROLLBACK kullanıldıysa
DDL kullanıldıysa
DCL kullanıldıysa
Kullanıcı veri tabanından çıkış yaparsa örtük bir şekilde commit edilir.
Veri Tutarlılığı, read consistency kullanmak bütün kullanıcılara her zaman tutarlı görünüm sağlar. Ve değişim
aşamasındaki veriyi görüntüleyemez. Veriyi yazan kişiler tutarlı bir şekilde değişikliklerin yapıldığından emin
olur ve bir yazanın yaptığı değişiklikler diğer bir yazarla çakışamaz veya silemez. Otomatik olarak uygulanır.
Veri tabanının parçalı bir kopyası undo segmentinde tutulur. A kullanıcısı insert, update veya silme
işlemi yaptığında sunucu verilerin kopyasını (snapshot) alır ve bunu undo (rollback) segmentinde saklar. B
kullanıcısı değişikliklerin yapılmadığı snaphotu görüntüler. Değişiklikler işkenmeden (commit) önce sadece
değişikliği yapan görebilir diğer herkes undo segmentinde tutulan snapshotu görüntüleyebilir. Bu veriyi okuyan
kişilerin değişim geçirmekte olan veriyi değil tutarlı olan veriyi görmesini sağlar.
DML işlendiği zaman veri tabanı değişiklikleri herkes tarafından görünür hale gelir. ROLLBACK
yapılırsa snapshot versiyonu geri yüklenir. SAVEPOINTler şema nesnesi olmadığından commit veya rollback
kullanıldığında savepointler kaybedilir.
LOCKING, bir kullanıcıdan fazla kullanıcının değişiklik yapmasını engellemek için kullanılır. Aynı kaynağa
ulaşan işlemleri engeller. Otomatiktir. Select hariç bütün ifadeler örtülü şekilde kilitlenmeye sebep olur.
Kullanıcılar elle lock yapabilir. Commit veya Rollback kullanıldığında kilitler kalkar.

You might also like