Diğer dersleri https://selimkaratas.com.tr/oracle-11g-r2-egitimi-ders-notlari adresinden bulabilirsiniz.
10. Using DDL Statements to Create and Manage Tables ( DDL ifadeleri kullanarak Tablo Oluşturma ve Yönetme)
DATABASE OBJELERİ
- TABLOLAR: KALICI DATA TUTAN OBJELERDİR
- VIEW: IÇINDE DATA TUTMAZ SADECE GÖRÜNÜMDÜR
- SEQUENCE: UNIQ SAYI ÜRETEN MAKINALARDIR. GENELLIKLE ID ALANLARI IÇIN KULLANILIR.
- INDEX: PERFORMANSTAN BAHSEDILIYORSA BİRİNCİ SIRADA AKLA GELIR.
- SYNONYM: YARATTIĞINIZ DB OBJELERİNE VERDİĞİNİZ ALTERNATİF İSİMLERDİR. ASIL KULLANIM AMACI VE YERİ FARKLI DB’LERE ERISIM SAGLAMA YETKIMIZ OLDUGUNDA KULLANIRIZ.
İsimlendirme Kuralları (Names Rules)
- Karakterler başlamalısınız
- 30 karakteri geçmemelisiniz
- A–Z, a–z, 0–9, _, $, ve # kullanabilirsiniz
- Bir isimlendirmeyi sadece bir yerde kullanabiliriz. Employees diye tablo varsa employees diye view oluşturamayız
- Oracle’ın kendine ayırdığı reserved’ları kullanamayız. Mesela ‘Select’ diye bir tablo ismi yapamayız
CREATE TABLE Statement
- TABLONUN OLUŞTURACAK ADAMIN YETKİNLİĞİ YETKINLIGI ( CREATE TABLE)
- TABLONUN ALANI ( A storage area )
- TABLO ADINDAN ÖNCE ŞEMA ADI YAZILMALI. şemaadi.tabloadi şeklinde olmalıdır. (KULLANICI = SEMA)
- BASKA KULLANICININ BILGILERINI GÖRÜNTÜLEMEK ISTERSEK ONA AIT SEMA ADINI GIRMELIYIZ.
- Tablo içi boş yaratılsa bile bir alana ihtiyaç duyar.
CREATE TABLE tabloadi ( ID NUMBER)
CREATE TABLE HR.tabloadi ( ID NUMBER)
ile hangi kullanıcıya ait şema olduğunu belirtmemiz gerekmektedir. Eğer HR kullanıcısından HR içindeki bir tabloyu çağırıyor isek sıkıntı yaratmaz ama SYS ile bağlandığımızda hr şemasından bir tablo çağırmak istiyorsak mutlak suretle kullanıcının adını tablonun önüne eklememiz gerekmektedir.
CREATE TABLE hire_dates (id NUMBER(8), hire_date DATE DEFAULT SYSDATE); /*şeklinde girdiğimizde id alanı number tipinde olacak ve 8 karakter olacaktır diyoruz. Ve eğer boş geçilirse default olarak SYSDATE ile doldur diyoruz. */
insert into hire_dates(id) values (1); /* sadece id alanını doldurduk. default kısmı sysdate yapmıp yapmadığına bakıyoruz */
select * from hire_dates; -- ile tablomuzu görüntülediğimizde aşağıdaki çıktıyı verir
CREATE TABLE dept (deptno NUMBER(2), dname VARCHAR2(14), loc VARCHAR2(13), create_date DATE DEFAULT SYSDATE); -- data tipleri ayrı başlık altında detaylı incelenecektir
DESCRIBE dept; -- kolonların data tipleri ile alaklı çıktıyı alıyoruz
DATA TİPLERİ
Karakter Formatı için kullanılanlar:
- varchar2 (değişken uzunluğu kadar)
- char (belirli uzunluk sabit)
- long ( eski versiyonlarda vardır pek kullanılmaz)
- clob ( 4gb kadar karakteri formatlı dataları tutar)
varchar2 ve char farkı
Char daha performanslı çalışır ( Update, delete vb işlemler varsa) Ayırdığı yeri bildiği için ayırdığı yere datayı yazar. Diğer tarafta değişimler olduğundan performans kaybı olur. Yer önemli diyorsanız varchar2 kullanmalıyız.
create table namess ( lname varchar2(30), fname char(30));
insert into namess values ('karatas', 'selim');
select length(lname), length(fname) from namess;
Resimler için (binary formatlı datalar)
- raw and lon raw (pek kullanilmaz)
- blob ( size olarak bfile ile farkı yok. Resimleri veritabanı storage’ından kullanır. )
- bfile ( c’nin altinda folder oluşturup resimleri oraya atar.)
Number ( p,s)
number (5,2) : 5 kaç basamaklı olduğunu 2 ise kaç basamağının , olduğunu söyler. 999,99 gibi.
Date: DD-RR
timestamp : date alanın tuttukları + sa + dk +sn tutar
interval year to month: yıl ve sadece ay( 05-03) 5 yıl 3 ay (dayanma süresi olan ürünler için)
interval day to second: günü saati dakikayı saniye 5 gün 15 sa. 3 dk 2 sn (deneysel çalışma)
ROWID:
select last_name, salary, department_id from employees where employee_id = 105;
select rowid,last_name, salary, department_id from employees where employee_id = 105;
F6 ile baktığımızda:
select rowid,last_name, salary, department_id from employees where rowid= 'AAAR7dAAEAAAADMAAF'; -- daha performanslı çalışır. -- direkt tabloya gider.
F6 ile baktığımızda:
- F6 ile oracle arka planda ne yapıyor diye bakarız
- hepsinin fiziksel birer adresleri var hepsi ve uniq hiç biri tekrar edemez
- biz görmeyiz ama her tablonun her satiri için row id vardir.
AAAR7dAAEAAAADMAAF
- AAAR7d ilk 6 karakteri hangi objenin id’si olduğunu
- AAE file id. hangi dosyada olduğu
- AAAADM blogun idsi
- Son AAF için kaçıncı satır olduğunu verir.
Including Constraints
create table test (id number(5) constraint test_id_pk primary key, lname char(30) constraint test_name_nn not null, email varchar2(50) constraint test_mail_uq unique, salary number(8,2) constraint test_sal_ch check(salary >1000), mid number(5) constraint test_mid_fk references test(id));
- primary key: iliski halinde çalistiginin göstergesidir. unique ve not null bunu kontrol etmez. her tablo da bir tane olur.
- foreign key: bağlı olduğu primary key haricinde başka değer alamaz. her tabloda birden fazla olabililir.
desc test;
insert into test values(2, 'karatas', 'selim@msn.com', 10000, null);
insert into test (id,lname, email, salary,mid) values(3,'cabuk','fcabuk',5000,2)
select * from test;
diğer bir syntax
create table test (id number(5) , lname char(30) , email varchar2(50), salary number(8,2), mid number(5) constraint test_id_pk primary key(id), constraint test_name_nn not null(lname), constraint test_mail_uq unique(email), constraint test_sal_ch check(salary >1000), constraint test_mid_fk foreign(mid) references test(id))
Şu şekilde de tablo yaratabiliriz
create table test1 (emp_id, last_name, email, salary) as select id, lname, email, salary from test;
desc test1; -- kopya yaratılırken sadece not null kısmı transfer olur. -- veriler de transfer olur.
select * from test1;
alter komutu daha detaylı daha sonra anlatılacaktır ancak ufak bir örnekte kullanacağız şimdi.
alter table test1 read only; -- sadece sorgulama insert into test1 values(4,'aaa','bbb',10000); -- yazmamıza izin vermez.
alter table test1 read write;
sonrasında yazma işlemine izin verir.
drop table test1; drop table test; /* tablolari kaldirir. ve otocommit komuttur. geri gelme işlemi rollback ile yapılamaz. */