Skip to content

3. SQL Diline Giriş

Bu bölümde, tek bir tablo oluşturmaya ve kullanmaya olanak tanıyan ilk SQL komutlarını tanıtıyoruz. Genellikle bunların basitleştirilmiş bir versiyonunu veriyoruz. Tam sözdizimi Firebird referans kılavuzlarında bulunabilir (bkz. paragraf 2.2).

Bir veritabanı, çeşitli becerilere sahip kişiler tarafından kullanılır:

  • veritabanı yöneticisi genellikle SQL dilini ve veritabanlarını iyi bilen bir kişidir. Tabloları o oluşturur, çünkü bu işlem genellikle sadece bir kez yapılır. Zaman içinde tablonun yapısını değiştirmek zorunda kalabilir. Bir veritabanı, ilişkilerle birbirine bağlanmış tabloların bir bütünüdür. Bu ilişkileri tanımlayan kişi veritabanı yöneticisidir. Ayrıca, veritabanının farklı kullanıcılarına yetki veren de yine veritabanı yöneticisidir. Böylece, belirli bir kullanıcının bir tablonun içeriğini görüntüleme hakkına sahip olduğunu, ancak değiştirme hakkına sahip olmadığını belirler.
  • Veritabanı kullanıcısı, verileri işlevsel hale getiren kişidir. Veritabanı yöneticisi tarafından verilen yetkilere göre, veritabanındaki farklı tablolara veri ekler, değiştirir ve siler. Ayrıca bu verileri, işletmenin veya idarenin düzgün işleyişi için yararlı bilgiler elde etmek amacıyla da kullanır...

2.6 numaralı paragrafta, [IB-Expert] aracının SQL düzenleyicisini tanıtmıştık. Kullanacağımız araç işte budur. Birkaç noktayı hatırlatalım:

  • SQL düzenleyicisine, [Tools/SQL Editor] menü seçeneği aracılığıyla veya [F12] tuşuyla ulaşılabilir

Image

Böylece, [SQL Editor] adlı bir pencere açılır ve bu pencerede SQL komutunu girebiliriz:

Image

Yukarıdaki ekran görüntüsü genellikle aşağıdaki metinle gösterilir:

SQL> select * from BIBLIO

3.1. Firebird veri türleri

Bir tablo oluştururken, tablo sütunlarının içerebileceği veri türlerini belirtmemiz gerekir. Burada, Firebird'de en yaygın olarak kullanılan veri türlerini tanıtıyoruz. Bu veri türlerinin SGBD'ten diğerine göre değişiklik gösterebileceğini belirtmek isteriz.

SMALLINT
[-32768, 32767] aralığındaki tamsayı: 4
INTEGER
[–2 147 483 648, 2 147 483 647] alanında bir tamsayı: -100
NUMERIC(n,m)
DECIMAL(n,m)
n basamaklı, m basamağı virgülden sonra gelen gerçek sayı
NUMERIC(5,2): -100,23, +027,30
FLOAT
7 anlamlı basamakla yaklaştırılmış gerçek sayı: 10.4
DOUBLE PRECISION
15 anlamlı basamakla yaklaştırılmış gerçek sayı: -100.89
CHAR(N)
CHARACTER(N)
tam olarak N karakterden oluşan dize. Kaydedilen dize N karakterden azsa, boşluklarla tamamlanır.
CHAR(10): 'ANGERS ' (sonunda 4 boşluk)
VARCHAR(N)
CHARACTER VARYING(N)
en fazla N karakterden oluşan dize
VARCHAR(10): 'ANGERS'
DATE
bir tarih: '2006-01-09' (YYYY-MM-DD biçimi)
TIME
bir saat: '16:43:00' (HH:MM:SS biçimi)
TIMESTAMP
hem tarih hem saat: '2006-01-09 16:43:00' (biçim YYYY-MM-DD HH:MM:SS)

CAST() işlevi, gerektiğinde bir türden diğerine dönüştürme imkanı sağlar. T1 türü olarak tanımlanmış bir V değerini T2 türüne dönüştürmek için şu kod yazılır: CAST(V,T2). Aşağıdaki tür dönüşümleri gerçekleştirilebilir:

  • sayıdan karakter dizisine. Bu tür değişikliği örtük olarak gerçekleşir ve CAST işlevinin kullanılmasını gerektirmez. Dolayısıyla 1 + '3' işlemi, '3' karakterinin dönüştürülmesini gerektirmez. Sonuç, 4 sayısını verir.
  • DATE, TIME, TIMESTAMP'ten karakter dizilerine ve tersi. Dolayısıyla
  • TIMESTAMP'i TIME veya DATE'e dönüştürür ve bunun tersi de geçerlidir

Bir tabloda, bir satırın değeri olmayan sütunları olabilir. Bu durumda sütunun değeri NULL sabiti olarak kabul edilir. Bu değerin varlığı, aşağıdaki operatörler kullanılarak test edilebilir:

IS NULL / IS NOT NULL

3.2. Tablo Oluşturma

Bir tablo oluşturmayı öğrenmek için, önce [Design] modunda IBExpert ile bir tablo oluşturacağız. Bunun için 2.3. paragrafında açıklanan yöntemi izleyeceğiz. Böylece aşağıdaki tabloyu oluşturacağız:

Image

Bu tablo, bir kütüphane tarafından satın alınan kitapları kaydetmek için kullanılacak. Alanların anlamları şu şekildedir:

Name
Tür
Kısıtlama
Anlam
ID
INTEGER
Primary Key
Identifiant du livre
 TITRE
VARCHAR(30)
NOT NULL UNIQUE
Titre du livre
 AUTEUR
VARCHAR(20)
NOT NULL
Son auteur
 GENRE
VARCHAR(30)
NOT NULL
Son genre (Roman, Poésie, Policier, BD, ..)
 ACHAT
DATE
NOT NULL
Date d'achat du livre
 PRIX
NUMERIC6,2)
NOT NULL
Son prix
 DISPONIBLE
CHAR(1)
NOT NULL
Est-il disponible ? O (oui), N (non)

IBEXPERT aracı kullanılarak oluşturulan bu tablo, doğrudan SQL komutlarıyla da oluşturulabilirdi. Bu komutları öğrenmek için, tablonun [DDL] sekmesine bakmanız yeterlidir:

Image

[BIBLIO] tablosunun oluşturulmasını sağlayan SQL kodu şöyledir:

SET SQL DIALECT 3;

SET NAMES ISO8859_1;


CREATE TABLE BIBLIO (
    ID INTEGER NOT NULL,
    TITRE VARCHAR(30) NOT NULL,
    AUTEUR VARCHAR(20) NOT NULL,
   GENRE VARCHAR(30) NOT NULL,
   ACHAT DATE NOT NULL,
   PRIX NUMERIC(6,2) NOT NULL,
   DISPONIBLE  CHAR(1) NOT NULL
);

ALTER TABLE BIBLIO ADD CONSTRAINT UNQ1_BIBLIO UNIQUE (TITRE);
ALTER TABLE BIBLIO ADD CONSTRAINT PK_BIBLIO PRIMARY KEY (ID);
  • 1. satır: Firebird sahibi - kullanılan SQL lehçesinin seviyesini gösterir
  • 2. satır: Firebird sahibi - kullanılan karakter ailesini belirtir
  • satır 6 - 14: SQL standardı: her bir sütunun adını ve türünü tanımlayarak BIBLIO tablosunu oluşturur.
  • 16. satır: SQL standardı: TITRE sütununda yinelenen değerlerin kabul edilmediğini belirten bir kısıtlama oluşturur
  • 17. satır: standart SQL: [ID] sütununun tablonun birincil anahtarı olduğunu belirtir. Bu, tablodaki iki satırın aynı ID değerine sahip olamayacağı anlamına gelir. Burada, [TITRE] sütunundaki [UNIQUE NOT NULL] kısıtlamasına benziyoruz ve aslında TITRE sütunu birincil anahtar olarak kullanılabilirdi. Güncel eğilim, anlamı olmayan ve SGBD tarafından üretilen birincil anahtarlar kullanmaktır.

[CREATE TABLE] komutunun sözdizimi şöyledir:

syntaxe
CREATE TABLE tablo (nom_colonne1 type_colonne1 contrainte_colonne1, nom_colonne2 type_colonne2 contrainte_colonne2, ..., nom_colonnen type_colonnen contrainte_colonnen, diğer kısıtlamalar)
action
belirtilen sütunlara sahip table tablosunu oluşturur
nom_colonnei
oluşturulacak i sütununun adı
type_colonnei
i sütununun veri türü:
char(30) numeric(6,2) date timestamp ...
contrainte_colonnei
i sütunundaki verilerin uyması gereken kısıtlamalar. İşte bunlardan bazıları:
PRIMARY KEY: Sütun birincil anahtardır. Bu, tablodaki iki satırın bu sütunda asla aynı değere sahip olamayacağı ve ayrıca bu sütunda bir değerin zorunlu olduğu anlamına gelir. Birincil anahtar, esas olarak bir satırı benzersiz bir şekilde tanımlamak için kullanılır.
NOT NULL : Bu sütunda sıfır değeri kabul edilmez.
UNIQUE : Sütunda hiçbir değer birden fazla kez görünemez.
CHECK (koşul): Sütundaki değer, koşulu karşılamalıdır.
autres contraintes
buraya şunlar yerleştirilebilir
- birden fazla sütuna kısıtlamalar: check(col1>col2)
- yabancı anahtar kısıtlamaları

[BIBLIO] tablosu, aşağıdaki SQL sıralamasıyla da oluşturulabilirdi:

1
2
3
4
5
6
7
8
9
CREATE TABLE BIBLIO (
    ID INTEGER NOT NULL PRIMARY KEY,
    TITRE VARCHAR(30) NOT NULL UNIQUE,
    AUTEUR VARCHAR(20) NOT NULL,
   GENRE VARCHAR(30) NOT NULL,
   ACHAT DATE NOT NULL,
   PRIX NUMERIC(6,2) NOT NULL,
   DISPONIBLE  CHAR(1) NOT NULL
);

Bunu gösterelim. Bu sırayı bir düzenleyicide SQL (F12) olarak kullanarak, [BIBLIO2] adını vereceğimiz bir tablo oluşturalım:

Image

Yürütme işleminden sonra, sonucu veritabanında görebilmek için işlemi onaylamanız gerekir:

Image

Bu işlem tamamlandığında, tablo veritabanında görünür:

Image

Tablonun adına çift tıklayarak yapısına erişilebilir:

Image

[BIBLIO2] tablosu için yaptığımız tanımın doğru bir şekilde yansıtıldığını görebiliriz

3.3. Tablo silme

Bir tabloyu silmek için SQL komutu şu şekildedir:

syntaxe
DROP TABLE table
action
Supprime [table]

Az önce oluşturduğumuz [BIBLIO2] tablosunu silmek için şimdi şu SQL komutunu çalıştırıyoruz:

Image

ve [Commit] komutuyla onaylıyoruz. [BIBLIO2] tablosu silinir:

Image

3.4. Tablonun doldurulması

Az önce oluşturduğumuz [BIBLIO] tablosuna bir satır ekleyelim:

Image

[Commit] ile satırın eklenmesini onaylayalım ve ardından eklenen satıra sağ tıklayalım:

Image

ve yukarıda gösterildiği gibi, eklenen satırı SQL INSERT komutu biçiminde panoya kopyalamayı isteyelim. Ardından herhangi bir metin düzenleyicisini açalım ve az önce kopyaladığımız içeriği yapıştıralım (Yapıştır / Paste). Şu SQL kodunu elde ederiz:

INSERT INTO BIBLIO (ID,TITRE,AUTEUR,GENRE,ACHAT,PRIX,DISPONIBLE) VALUES (1,'Candide','Voltaire','Essai','18-OCT-1985',140,'o');

Bir SQL insert komutunun sözdizimi şöyledir:

syntaxe
insert into table [(colonne1, colonne2, ..)] values (değer1, değer2, ....)
action
table tablosuna (değer1, değer2, ..) satırını ekler. Bu değerler, varsa colonne1, colonne2,... tablolarına atanır; yoksa, tanımlandıkları sırayla tablonun sütunlarına atanır.

[BIBLIO] tablosuna yeni satırlar eklemek için, SQL düzenleyicisine aşağıdaki INSERT komutlarını gireceğiz. Bu komutları tek tek çalıştırıp onaylayın. Bir sonraki komuta geçmek için [New Query] düğmesini kullanın.

1
2
3
4
5
6
7
insert into biblio(id,titre,auteur,genre,achat,prix,disponible) values (2,'Les fleurs du mal','Baudelaire','Poème','01-jan-78',120,'n');
insert into biblio(id,titre,auteur,genre,achat,prix,disponible) values (3,'Tintin au Tibet','Hergé','BD','10-nov-90',70,'o');
insert into biblio(id,titre,auteur,genre,achat,prix,disponible) values (4,'Du côté de chez Swann','Proust','Roman','08-dec-78',200,'o');
insert into biblio(id,titre,auteur,genre,achat,prix,disponible) values (5,'La terre','Zola','roman','12-jun-90',50,'n');
insert into biblio(id,titre,auteur,genre,achat,prix,disponible) values (6,'Madame Bovary','Flaubert','Roman','12-mar-88',130,'o');
insert into biblio(id,titre,auteur,genre,achat,prix,disponible) values (7,'Manhattan transfer','Dos Passos','Roman','30-aug-87',320,'o');
insert into biblio(id,titre,auteur,genre,achat,prix,disponible) values (8,'Tintin en Amérique','Hergé','BD','15-may-91',70,'o');

[Commit] ve SQL emirlerini onayladıktan sonra aşağıdaki tablo elde edilir:

3.5. Bir tabloyu görüntüleme

3.5.1. Giriş

SQL düzenleyicisinde şu komutu yazalım:

Image

ve komutu çalıştıralım. Aşağıdaki sonucu elde ederiz:

Image

SELECT komutu, veritabanındaki tabloların içeriğini görüntülemeye olanak tanır. Bu komutun çok zengin bir sözdizimi vardır. Burada, tek bir tabloyu sorgulamaya yarayan komutu ele alacağız. Birden fazla tablonun aynı anda sorgulanmasına daha sonra değineceğiz. SQL ve [SELECT] komutlarının sözdizimi şöyledir:

syntaxe
SELECT [ALL|DISTINCT] [*|expression1 alias1, expression2 alias2, ...]
FROM table
action
tüm tablo satırları için expressioni değerlerini görüntüler. expressioni bir sütun veya daha karmaşık bir ifade olabilir. * sembolü, tüm sütunları ifade eder. Varsayılan olarak, tüm tablo satırları (ALL) görüntülenir. DISTINCT varsa, seçilen özdeş satırlar yalnızca bir kez görüntülenir. expressioni değerleri, başlığı expressioni olan bir sütunda görüntülenir; eğer aliasi kullanılmışsa, bu sütunda görüntülenir.

Örnekler:

SQL > select titre, auteur from biblio

Image

SQL> select titre,prix from biblio

Image

SQL> select titre TITRE_DU_LIVRE, prix PRIX_ACHAT from biblio

Image

Yukarıda, istenen sütunlara takma adlar (TITRE_DU_LIVRE, PRIX_ACHAT) atadık.

3.5.2. Bir koşulu karşılayan satırların görüntülenmesi

syntaxe
SELECT ....
WHERE condition
action
Yalnızca condition koşulunu karşılayan satırlar görüntülenir

Örnekler

SQL> select titre,prix from biblio where prix>100

Image

SQL> select titre,prix,genre from biblio where genre='Roman'

Image

Kitaplardan birinin türü 'roman'dır, 'Roman' değildir. Tüm romanları elde etmek için bir karakter dizisini büyük harfe dönüştüren upper işlevini kullanıyoruz.

SQL> select titre,prix,genre from biblio where upper(genre)='ROMAN'

Image

Mantıksal operatörler yardımıyla koşulları birleştirebiliriz

AND
ET logique
OR
OU logique
NOT
Mantıksal olumsuzluk
SQL> select titre,prix,genre from biblio where upper(genre)='ROMAN' and prix<100

Image

SQL> select titre,genre from biblio

Image

SQL> select titre,genre from biblio where upper(genre)='ROMAN' or upper(genre)='BD'

Image

SQL> select titre,genre from biblio where not( upper(genre)='ROMAN' or upper(genre)='BD')

Image

SQL> select titre,achat from biblio

Image

SQL>select titre,achat from biblio where achat>'31-dec-1987'
SQL> select titre,prix from biblio where prix between 100 and 150

Image

3.5.3. Satırları belirli bir sıraya göre görüntüleme

Yukarıdaki sözdizimlerine, istenen görüntüleme sırasını belirten bir ORDER BY cümlesi eklenebilir:

syntaxe
SELECT ....
ORDER BY expression1 [asc|desc], expression2 [asc|dec], ...
action
Seçim sonucu elde edilen satırlar şu sırayla görüntülenir:
1: expression1'in artan (asc / ascending; varsayılan değer) veya azalan (desc / descending) sırasına göre
2: expression1 değerlerinin eşit olması durumunda, görüntüleme expression2 değerlerine göre yapılır
vb.

Örnekler:

SQL>select titre, genre,prix,achat from biblio order by achat desc

Image

SQL>select titre, genre,prix,achat from biblio order by prix

Image

SQL>select titre, genre,prix,achat from biblio order by genre desc

Image

SQL >select titre, genre,prix,achat from biblio order by genre desc, prix

Image

SQL>select titre, genre,prix,achat from biblio order by genre desc, prix desc

Image

3.6. Tablodaki satırların silinmesi

syntaxe
DELETE FROM table [WHERE condition]
action
table satırlarını siler ve condition'i kontrol eder. Eğer bu satır yoksa, tüm satırlar silinir.

Örnekler:

SQL> select titre from biblio

Image

Aşağıdaki iki komut arka arkaya verilir:

SQL> delete from biblio where titre='Candide'
SQL> select titre from biblio

Image

3.7. Tablonun içeriğinin değiştirilmesi

syntaxe
update table set sütun1 = ifade1, sütun2 = ifade2, ...
[where condition]
action
table satırları, condition'i kontrol eder (koşul yoksa tüm satırlar); colonnei, expressioni değerini alır.

Örnekler:

SQL> select genre from biblio

Tüm türler büyük harfle yazılır:

Image

SQL> update biblio set genre=upper(genre)

Doğrulama:

SQL> select genre from biblio

Image

Fiyatları görüntülüyoruz:

SQL> select genre,prix from biblio;

Image

Romanların fiyatı %5 artıyor:

SQL> update biblio set prix=prix*1.05 where genre='ROMAN';

Kontrol ediliyor:

SQL> select genre,prix from biblio

Image

3.8. Bir tablonun kalıcı olarak güncellenmesi

Bir tabloya değişiklik yapıldığında, Firebird bu değişiklikleri aslında tablonun bir kopyasında oluşturur. Bu değişiklikler daha sonra COMMIT ve ROLLBACK komutlarıyla kalıcı hale getirilebilir veya iptal edilebilir.

syntaxe
COMMIT
action
son COMMIT işleminden bu yana tablolarda yapılan güncellemeleri kalıcı hale getirir.
syntaxe
ROLLBACK
action
son COMMIT işleminden bu yana tablolarda yapılan tüm değişiklikleri iptal eder.
Remarque
Aşağıdaki durumlarda bir COMMIT işlemi örtük olarak gerçekleştirilir:
a) Firebird'den çıkış yapıldığında
b) Tabloların yapısını etkileyen her komutun ardından: CREATE, ALTER, DROP.

Örnekler

SQL düzenleyicisinde, son COMMIT veya ROLLBACK komutundan bu yana yapılan tüm işlemleri onaylayarak veritabanını bilinen bir duruma getiririz:

SQL> commit

Başlık listesi istenir:

SQL> select titre from biblio

Image

Bir başlığın silinmesi:

SQL> delete from biblio where titre='La terre'

Doğrulama:

SQL> select titre from biblio

Image

Başlık başarıyla silindi. Şimdi, son COMMIT / ROLLBACK işleminden bu yana yapılan tüm değişiklikleri geçersiz kılıyoruz:

SQL> rollback

Doğrulama:

SQL> select titre from biblio

Image

Silinen başlık geri geldi. Şimdi fiyat listesini isteyelim:

SQL> select prix from biblio

Image

Diyelim ki tüm fiyatlar sıfırlandı.

SQL> update biblio set prix=0

Fiyatları kontrol edelim:

SQL> select prix from biblio

Image

Veritabanında yapılan değişiklikleri silelim:

SQL> rollback

ve fiyatları tekrar kontrol edelim:

SQL> select prix from biblio

Image

Eski fiyatlara geri döndük.

3.9. Bir tablodan başka bir tabloya satır ekleme

Yapıları uyumlu olduğunda, bir tablodaki satırları başka bir tabloya eklemek mümkündür. Bunu göstermek için, öncelikle [BIBLIO] ile aynı yapıya sahip [BIBLIO2] tablosunu oluşturalım.

IBExpert veritabanı gezgininde, [BIBLIO] tablosuna çift tıklayarak [DDL] sekmesine erişelim:

Image

Bu sekmede, SQL tablosunu oluşturmaya yarayan komutların listesi bulunur. Bu kodun tamamını panoya kopyalayalım (CTRL-A, CTRL-C). Ardından, SQL komut listesini çalıştırmaya yarayan [Script Executive] adlı aracı çağıralım:

Image

Bir metin düzenleyici açılır; buraya daha önce panoya kopyaladığımız metni (CTRL-V) yapıştırabiliriz:

Image

SQL komut listesi genellikle SQL komut dosyası olarak adlandırılır. [Script Executive], bu tür bir komut dosyasını çalıştırmamızı sağlarken, SQL düzenleyicisi ise bir seferde yalnızca tek bir komutun çalıştırılmasına izin veriyordu. Mevcut SQL betiği, [BIBLIO] tablosunu oluşturmaya olanak tanır. Bunun yerine, [BIBLIO2] adlı bir tablo oluşturmasını sağlayalım. Bunun için [BIBLIO] ifadesini [BIBLIO2] olarak değiştirmemiz yeterlidir:

SET SQL DIALECT 3;

SET NAMES ISO8859_1;

CREATE TABLE BIBLIO2 (
    ID          INTEGER NOT NULL,
    TITRE       VARCHAR(30) NOT NULL,
    AUTEUR      VARCHAR(20) NOT NULL,
    GENRE       VARCHAR(20) NOT NULL,
    ACHAT       DATE NOT NULL,
    PRIX        NUMERIC(6,2) DEFAULT 10 NOT NULL,
    DISPONIBLE  CHAR(1) NOT NULL
);

ALTER TABLE BIBLIO2 ADD CONSTRAINT UNQ1_BIBLIIO2 UNIQUE (TITRE);

ALTER TABLE BIBLIO2 ADD CONSTRAINT PK_BIBLIIO2 PRIMARY KEY (ID);

Aşağıdaki [Run Script] düğmesiyle bu komut dosyasını çalıştıralım:

Image

Komut dosyası çalıştırıldı:

Image

ve veritabanı gezgininde yeni tablo görülebilir:

Image

İçeriğini kontrol etmek için [BIBLIO2]'e çift tıklandığında, tablonun boş olduğu görülür; bu normaldir:

Image

SQL INSERT komutunun bir varyantı, bir tabloya başka bir tablodan gelen satırları eklemeye olanak tanır:

syntaxe
INSERT INTO table1 [(colonne1, colonne2, ...)]
SELECT sütun a, sütun b, ... FROM table2 WHERE condition
action
table2'in condition'i doğrulayan satırları, table1'e eklenir. table2 dosyasındaki colonnea, colonneb, ... sütunları, sırasıyla table1 dosyasındaki colonne1, colonne2, ... sütunlarına atanır ve bu nedenle uyumlu türde olmalıdır.

SQL düzenleyicisine geri dönelim:

Image

ve şu SQL komutunu verelim:

SQL> insert into BIBLIO2 select * from BIBLIO where upper(genre)='ROMAN'

Bu komut, [BIBLIO2] dosyasına, [BIBLIO] dosyasındaki bir romana ait tüm satırları ekler. SQL komutunu çalıştırdıktan sonra, [Commit] komutuyla onaylayalım:

SQL> commit

Bu işlem tamamlandıktan sonra, [BIBLIO2] tablosundaki verileri inceleyelim:

SQL> select * from BIBLIO2

Image

3.10. Bir tablonun silinmesi

syntaxe
DROP TABLE table
action
supprime table

Örnek: BIBLIO2 tablosu silinir

SQL> drop table BIBLIO2

Değişikliği onaylıyoruz:

SQL> commit

Veritabanı gezgininde, tabloların görüntülenmesini yenileyin:

Image

[BIBLIO2] tablosunun silindiğini görüyoruz:

Image

3.11. Tablonun yapısını değiştirme

syntaxe
ALTER TABLE table
[ ADD nom_colonne1 type_colonne1 contrainte_colonne1]
[ALTER nom_colonne2 TYPE type_colonne2]
[DROP nom_colonne3]
[ADD contrainte]
[DROP CONSTRAINT nom_contrainte]
action
ile tablo sütunları eklenebilir (ADD), değiştirilebilir (ALTER) ve silinebilir (DROP). nom_colonnei, type_colonnei ve contrainte_colonnei komutlarının sözdizimi, CREATE ve TABLE komutlarınınkiyle aynıdır. Ayrıca tablo kısıtlamaları da eklenebilir veya silinebilir.

Örnek: SQL düzenleyicisinde aşağıdaki iki SQL komutunu sırayla çalıştıralım

SQL > alter table biblio add nb_pages numeric(4), alter genre type varchar(30)
SQL> commit

Veritabanı gezgininde, [BIBLIO] tablosunun yapısını kontrol edelim:

Image

Değişiklikler yansıtıldı. Tablonun içeriğinin nasıl değiştiğine bir göz atalım:

SQL> select * from biblio

Image

Yeni [NB_PAGES] sütunu oluşturuldu ancak herhangi bir değeri yok. Bu sütunu silelim:

SQL> alter table biblio drop nb_pages
SQL> commit

[BIBLIO] tablosunun yeni yapısını kontrol edelim:

Image

[NB_PAGES] sütunu gerçekten de kaldırılmış.

3.12. Görünümler

Bir tablonun veya birden fazla tablonun kısmi bir görünümüne sahip olmak mümkündür. Bir görünüm, bir tablo gibi davranır ancak veri içermez. Verileri diğer tablolardan veya görünümlerden alınır. Bir görünümün birçok avantajı vardır:

  1. Bir kullanıcı, belirli bir tablonun yalnızca belirli sütunları ve satırlarıyla ilgilenebilir. Görünüm, kullanıcının yalnızca bu satırları ve sütunları görmesini sağlar.
  2. Bir tablonun sahibi, diğer kullanıcılara yalnızca sınırlı erişim izni vermek isteyebilir. Görünüm, bunu yapmasına olanak tanır. İzin verdiği kullanıcılar, yalnızca tanımladığı görünüme erişebilir.

3.12.1. Bir görünümün oluşturulması

syntaxe
CREATE VIEW nom_vue
AS SELECT sütun1, sütun2, ... FROM table WHERE condition
[ WITH CHECK OPTION ]
action
nom_vue görünümünü oluşturur. Bu görünüm, table'in sütun1, sütun2, ... yapısına sahip bir tablodur ve satırları, table'in condition koşulunu karşılayan satırlarından oluşur (koşul yoksa tüm satırlar).
WITH CHECK OPTION
Bu isteğe bağlı koşul, görünüm üzerindeki ekleme ve güncelleme işlemlerinin, görünümün seçemeyeceği satırlar oluşturmaması gerektiğini belirtir.

Not CREATE VIEW sözdizimi, aslında yukarıda sunulan sözdiziminden daha karmaşıktır ve özellikle birden fazla tablodan bir görünüm oluşturulmasına olanak tanır. Bunun için SELECT sorgusunun birden fazla tabloyu kapsaması yeterlidir (bkz. sonraki bölüm).

Örnekler

biblio tablosundan, yalnızca romanları içeren (satır seçimi) ve başlık, yazar, fiyat sütunlarını içeren (sütun seçimi) bir görünüm oluşturulur:

SQL> create view romans as select titre,auteur,prix from biblio where upper(genre)='ROMAN';
SQL> commit

Veritabanı gezgininde, görünümü (F5) yenileyelim. Bir görünüm belirir:

Image

Bu görünüme ait SQL sipariş numarasını öğrenebiliriz. Bunun için [ROMANS] görünümüne çift tıklayalım:

Image

Bir görünüm, bir tablo gibidir. Bir yapısı vardır:

Image

ve bir içeriği vardır:

Image

Bir görünüm, bir tablo gibi kullanılır. Üzerinde sorgular SQL çalıştırılabilir. İşte SQL düzenleyicisinde deneyebileceğiniz birkaç örnek:

SQL> select * from romans

Image

SQL> insert into biblio values (10,'Le père Goriot','Balzac','Roman','01-sep-91',200,'o')

Yeni roman, [ROMANS] görünümünde görünüyor mu?

SQL> select * from romans

Image

[BIBLIO] tablosuna roman dışında başka bir şey ekleyelim:

SQL> insert into biblio(id,titre,auteur,genre,achat,prix,disponible) values (11,'Poèmes saturniens','Verlaine','Poème','02-sep-92',200,'o');

[BIBLIO] tablosunu kontrol edelim:

SQL> select titre, auteur from BIBLIO

Image

[ROMANS] görünümünü kontrol edelim:

SQL> select titre, auteur from ROMANS

Image

Eklenen kitap, upper(genre)='ROMAN' değeri olmadığı için [ROMANS] görünümünde yer almıyor.

3.12.2. Bir görünümün güncellenmesi

Bir tablo için yapıldığı gibi bir görünümü de güncellemek mümkündür. Görünümün verilerinin alındığı tüm tablolar bu güncellemeden etkilenir. İşte birkaç örnek:

SQL> insert into biblio(id,titre,auteur,genre,achat,prix,disponible) values (13,'Le Rouge et le Noir','Stendhal','Roman','03-oct-92',110,'o')
SQL> select * from romans

Image

SQL> select titre, auteur from biblio

Image

[ROMANS] görünümünden bir satır siliniyor:

SQL> delete from ROMANS where titre='Le Rouge et le Noir'
SQL> select * from romans

Image

SQL> select auteur, titre from BIBLIO

Image

[ROMANS] görünümünden silinen satır, [BIBLIO] tablosundan da silinmiştir. Şimdi [ROMANS] görünümündeki kitapların fiyatını artırıyoruz:

SQL> update romans set prix=prix*1.05

[ROMANS]'te kontrol ediyoruz:

SQL> select * from romans

Image

[BIBLIO] tablosu üzerinde ne gibi bir etki oldu?

SQL> select titre, auteur, prix from biblio

Image

Romanlar, [BIBLIO] tablosunda da %5 oranında artırıldı.

3.12.3. Bir görünümü silme

syntaxe
DROP VIEW nom_vue
action
adlı görünümü siler

Örnek

SQL> drop view romans
SQL> commit

Veritabanı gezgininde, (F5) görünümünü yenileyerek [ROMANS] görünümünün kaybolduğunu görebilirsiniz:

Image

3.13. Grup işlevlerinin kullanımı

Tablonun her satırı üzerinde çalışmak yerine, satır grupları üzerinde çalışan fonksiyonlar mevcuttur. Bunlar temel olarak, bir sütundaki verilerin ortalamasını, standart sapmasını vb. hesaplamamızı sağlayan istatistiksel fonksiyonlardır.

syntaxe1
SELECT f1, f2, .., fn FROM table
[ WHERE condition ]
action
tablo satırlarının tamamı üzerinde istatistiksel fonksiyonları hesaplar ve olası condition durumunu kontrol eder.
syntaxe2
SELECT f1, f2, .., fn FROM table
[ WHERE condition ]
[ GROUP BY expr1, expr2, ..]
action
GROUP BY anahtar sözcüğü, tablo satırlarını gruplara ayırır. Her grup, expr1, expr2, ... ifadelerinin aynı değere sahip olduğu satırları içerir.
Örnek: GROUP BY tür, aynı türe sahip kitapları aynı gruba yerleştirir. GROUP BY yazar,tür koşulu, aynı yazara ve aynı türe sahip kitapları aynı gruba yerleştirir. WHERE koşulu ise öncelikle koşulu karşılamayan satırları tablodan eler. Ardından, GROUP BY cümlesi ile gruplar oluşturulur. Daha sonra her satır grubu için fi fonksiyonları hesaplanır.
syntaxe3
SELECT f1, f2, .., fn FROM table
[ WHERE condition ]
[ GROUP BY expression]
[ HAVING condition_de_groupe]
action
HAVING cümlesi, GROUP ve BY cümleleriyle oluşturulan grupları filtreler. Dolayısıyla bu madde her zaman GROUP ve BY maddelerinin varlığıyla bağlantılıdır. Örnek: GROUP BY tür HAVING tür!='ROMAN'

Kullanılabilir fi istatistik fonksiyonları şunlardır:

AVG(expression)
ifade ortalaması
COUNT(expression)
ifadenin bir değere sahip olduğu satır sayısı
COUNT(*)
tablodaki toplam satır sayısı
MAX(expression)
ifadenin maksimum değeri
MIN(expression)
ifadenin minimum değeri
SUM(expression)
ifadenin toplamı

Örnekler

SQL> select prix from biblio

Image

Ortalama fiyat? En yüksek fiyat? En düşük fiyat?

SQL> select avg(prix), max(prix), min (prix) from biblio

Image

SQL> select titre, prix,genre from biblio

Image

Bir romanın ortalama fiyatı nedir? En yüksek fiyat nedir?

SQL> select avg(prix) moyenne, max(prix) prix_maxi from biblio where upper(genre)='ROMAN'

Image

Kaç tane BD?

SQL> select count(*) from biblio where upper(genre)='BD'

Image

100 F'den az olan kaç tane roman var?

SQL> select count(*) from biblio where upper(genre)='ROMAN' and prix<100

Image

SQL> select genre, prix from biblio

Image

Aynı türdeki kitapların sayısı ve ortalama fiyatı nedir?

SQL> select upper(genre) GENRE,avg(prix) PRIX_MOYEN,count(*) NOMBRE from biblio group by upper(genre)

Image

Aynı soru, ancak roman olmayan kitaplar için:

SQL>
select upper(genre) GENRE,avg(prix) PRIX_MOYEN,count(*) NOMBRE
from biblio
group by upper(genre)
having upper(GENRE)!='ROMAN'

Image

Aynı soru, ancak sadece 150 F'den daha ucuz kitaplar için:

SQL> 
select upper(genre) GENRE,avg(prix) PRIX_MOYEN,count(*) NOMBRE
from biblio
where prix<150
group by upper(genre)
having upper(GENRE)!='ROMAN'

Image

Aynı soru, ancak ortalama kitap fiyatı >100 F olan gruplar dikkate alınacak

SQL> 
select upper(genre) GENRE, avg(prix) PRIX_MOYEN,count(*) NOMBRE
from biblio
group by upper(genre)
having avg(prix)>100

Image

3.14. Bir tablodan SQL komut dosyası oluşturma

SQL dili, birçok SGBD ile kullanılabilen standart bir dildir. Bir SGBD'ten diğerine geçebilmek için, bir veritabanını veya sadece veritabanının belirli öğelerini bir SQL komut dosyası biçiminde dışa aktarmak faydalıdır; bu komut dosyası başka bir SGBD'te çalıştırıldığında, komut dosyasına dışa aktarılan öğeleri yeniden oluşturabilir.

Burada [BIBLIO] tablosunu dışa aktaracağız. [Extract Metadata] seçeneğini ele alalım:

Image

Yukarıda görüldüğü gibi, öğeleri dışa aktarmak istediğiniz veritabanında konumlanmanız gerekir. Seçenek bir sihirbazı başlatır:

1
SQL komut dosyasının oluşturulacağı yer:
  • bir dosyaya (File)
  • Pano'ya (Clipboard)
  • Script Executive aracında
2
[File] seçeneği seçildiğinde dosya adı
3
ne dışa aktarılacak
4
Dışa aktarılacak nesneleri seçmek (->) veya seçimini kaldırmak (<-) için düğmeler

Veritabanının tamamını dışa aktarmak istersek, yukarıdaki [Extract All] seçeneğini işaretleriz. Sadece BIBLIO tablosunu dışa aktarmak istiyoruz. Bunu yapmak için, [4] ile [BIBLIO] tablosunu seçeriz ve [2] ile bir dosya belirleriz:

Image

Burada durursak, yalnızca [BIBLIO] tablosunun yapısı dışa aktarılacaktır. İçeriğini dışa aktarmak için [Data Tables] sekmesini kullanmamız gerekir:

[1]'i kullanarak [BIBLIO] tablosunu seçelim:

[2]'i kullanarak SQL komut dosyasını oluşturalım:

Image

Teklifi kabul edelim. Böylece, [biblio.sql] dosyasında oluşturulan komut dosyasını görebiliriz:

/******************************************************************************/
/****          IBExpert tarafından oluşturuldu 17.06.2004 22        /01/2006 15:06:13 ****/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES ISO8859_1;

CREATE DATABASE 'D:\data\serge\travail\2005-2006\polys\sql\DBBIBLIO.GDB'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 16384
DEFAULT CHARACTER SET ISO8859_1;



/******************************************************************************/
/****                                                                 Tablolar ****/
/******************************************************************************/



CREATE TABLE BIBLIO (
ID          INTEGER NOT NULL,
TITRE       VARCHAR(30) NOT NULL,
AUTEUR      VARCHAR(20) NOT NULL,
GENRE       VARCHAR(30) NOT NULL,
ACHAT       DATE NOT NULL,
PRIX        NUMERIC(6,2) DEFAULT 10 NOT NULL,
DISPONIBLE  CHAR(1) NOT NULL
);

INSERT INTO BIBLIO (ID, TITRE, AUTEUR, GENRE, ACHAT, PRIX, DISPONIBLE) VALUES (2, 'Les fleurs du mal', 'Baudelaire', 'POèME', '1978-01-01', 120, 'n');
INSERT INTO BIBLIO (ID, TITRE, AUTEUR, GENRE, ACHAT, PRIX, DISPONIBLE) VALUES (3, 'Tintin au Tibet', 'Hergé', 'BD', '1990-11-10', 70, 'o');
INSERT INTO BIBLIO (ID, TITRE, AUTEUR, GENRE, ACHAT, PRIX, DISPONIBLE) VALUES (4, 'Du côté de chez Swann', 'Proust', 'ROMAN', '1978-12-08', 220.5, 'o');
INSERT INTO BIBLIO (ID, TITRE, AUTEUR, GENRE, ACHAT, PRIX, DISPONIBLE) VALUES (5, 'La terre', 'Zola', 'ROMAN', '1990-06-12', 55.13, 'n');
INSERT INTO BIBLIO (ID, TITRE, AUTEUR, GENRE, ACHAT, PRIX, DISPONIBLE) VALUES (6, 'Madame Bovary', 'Flaubert', 'ROMAN', '1988-03-12', 143.33, 'o');
INSERT INTO BIBLIO (ID, TITRE, AUTEUR, GENRE, ACHAT, PRIX, DISPONIBLE) VALUES (7, 'Manhattan transfer', 'Dos Passos', 'ROMAN', '1987-08-30', 352.8, 'o');
INSERT INTO BIBLIO (ID, TITRE, AUTEUR, GENRE, ACHAT, PRIX, DISPONIBLE) VALUES (8, 'Tintin en Amérique', 'Hergé', 'BD', '1991-05-15', 70, 'o');
INSERT INTO BIBLIO (ID, TITRE, AUTEUR, GENRE, ACHAT, PRIX, DISPONIBLE) VALUES (10, 'Le père Goriot', 'Balzac', 'Roman', '1991-09-01', 210, 'o');
INSERT INTO BIBLIO (ID, TITRE, AUTEUR, GENRE, ACHAT, PRIX, DISPONIBLE) VALUES (11, 'Poèmes saturniens', 'Verlaine', 'Poème', '1992-09-02', 200, 'o');

COMMIT WORK;



/******************************************************************************/
/****                                                     Benzersiz Kısıtlamalar ****/
/******************************************************************************/

ALTER TABLE BIBLIO ADD CONSTRAINT UNQ1_BIBLIO UNIQUE (TITRE);


/******************************************************************************/
/****                                                           Birincil Anahtarlar ****/
/******************************************************************************/

ALTER TABLE BIBLIO ADD CONSTRAINT PK_BIBLIO PRIMARY KEY (ID);
  • 1. ile 3. satırlar yorumdur
  • 5. ile 12. satırlar Firebird'e ait SQL kodudur
  • diğer satırlar, SQL standardına aittir ve SGBD içinde yeniden çalıştırılabilmelidir; bu durumda veri türleri BIBLIO tablosunda tanımlanmalıdır.

Bu komut dosyasını Firebird içinde yeniden çalıştırarak, BIBLIO tablosunun bir kopyası olacak BIBLIO2 tablosunu oluşturalım. Bunun için [Script Executive] (Ctrl-F12) komutunu kullanalım:

Image

Az önce oluşturduğumuz [biblio.sql] komut dosyasını yükleyelim:

Image

Tablonun oluşturulması ve satırların eklenmesi kısımlarını tutacak şekilde komut dosyasını düzenleyelim. Tablonun adı [BIBLIO2] olarak değiştirilir:

CREATE TABLE BIBLIO2 (
    ID          INTEGER NOT NULL,
    TITRE       VARCHAR(30) NOT NULL,
    AUTEUR      VARCHAR(20) NOT NULL,
    GENRE       VARCHAR(30) NOT NULL,
    ACHAT       DATE NOT NULL,
    PRIX        NUMERIC(6,2) DEFAULT 10 NOT NULL,
    DISPONIBLE  CHAR(1) NOT NULL
);

INSERT INTO BIBLIO2 (ID, TITRE, AUTEUR, GENRE, ACHAT, PRIX, DISPONIBLE) VALUES (2, 'Les fleurs du mal', 'Baudelaire', 'POèME', '1978-01-01', 120, 'n');
...

COMMIT WORK;

Bu komut dosyasını çalıştıralım:

Veritabanı gezgininde, [BIBLIO2] tablosunun başarıyla oluşturulduğunu ve beklenen yapıya ve içeriğe sahip olduğunu kontrol edebiliriz: