SQL Notlar
SQL Notlar
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’);
UPDATE departments
SET name = ‘marketing’
WHERE deptno = 123
İLK KISIM SADECE VERİ TABANI OLUŞTURMA SÜRECİ İÇİN ÖRNEK OLMASI AMACIYLA
KONULMUŞTUR.
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;
KOŞULLU İFADELER
CASE – If else gibi çalışır. Kullanılacak ifadelerin veri tipleri aynı olmalıdır.
DECODE – Case ile aynı syntaxları farklı.
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
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.
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);
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
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);
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);
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;
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ı
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.