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

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

Yukarıdaki ekran görüntüsü genellikle aşağıdaki metinle gösterilir:
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.
[-32768, 32767] aralığındaki tamsayı: 4 | |
[–2 147 483 648, 2 147 483 647] alanında bir tamsayı: -100 | |
n basamaklı, m basamağı virgülden sonra gelen gerçek sayı NUMERIC(5,2): -100,23, +027,30 | |
7 anlamlı basamakla yaklaştırılmış gerçek sayı: 10.4 | |
15 anlamlı basamakla yaklaştırılmış gerçek sayı: -100.89 | |
tam olarak N karakterden oluşan dize. Kaydedilen dize N karakterden azsa, boşluklarla tamamlanır. CHAR(10): 'ANGERS ' (sonunda 4 boşluk) | |
en fazla N karakterden oluşan dize VARCHAR(10): 'ANGERS' | |
bir tarih: '2006-01-09' (YYYY-MM-DD biçimi) | |
bir saat: '16:43:00' (HH:MM:SS biçimi) | |
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:

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 |
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:

[BIBLIO] tablosunun oluşturulmasını sağlayan SQL kodu şöyledir:
- 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:
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) | |||||||||
belirtilen sütunlara sahip table tablosunu oluşturur
|
[BIBLIO] tablosu, aşağıdaki SQL sıralamasıyla da oluşturulabilirdi:
Bunu gösterelim. Bu sırayı bir düzenleyicide SQL (F12) olarak kullanarak, [BIBLIO2] adını vereceğimiz bir tablo oluşturalım:

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

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

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

[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:
DROP TABLE table | |
Supprime [table] |
Az önce oluşturduğumuz [BIBLIO2] tablosunu silmek için şimdi şu SQL komutunu çalıştırıyoruz:

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

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

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

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:
insert into table [(colonne1, colonne2, ..)] values (değer1, değer2, ....) | |
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.
[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:

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

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:
SELECT [ALL|DISTINCT] [*|expression1 alias1, expression2 alias2, ...] FROM table | |
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:



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
SELECT .... WHERE condition | |
Yalnızca condition koşulunu karşılayan satırlar görüntülenir |
Örnekler


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.

Mantıksal operatörler yardımıyla koşulları birleştirebiliriz
ET logique | |
OU logique | |
Mantıksal olumsuzluk |



![]()

![]() |

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:
SELECT .... ORDER BY expression1 [asc|desc], expression2 [asc|dec], ... | |
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:





3.6. Tablodaki satırların silinmesi
DELETE FROM table [WHERE condition] | |
table satırlarını siler ve condition'i kontrol eder. Eğer bu satır yoksa, tüm satırlar silinir. |
Örnekler:

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

3.7. Tablonun içeriğinin değiştirilmesi
update table set sütun1 = ifade1, sütun2 = ifade2, ... [where condition] | |
table satırları, condition'i kontrol eder (koşul yoksa tüm satırlar); colonnei, expressioni değerini alır. |
Örnekler:
Tüm türler büyük harfle yazılır:

Doğrulama:
![]()
Fiyatları görüntülüyoruz:

Romanların fiyatı %5 artıyor:
Kontrol ediliyor:

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.
COMMIT | |
son COMMIT işleminden bu yana tablolarda yapılan güncellemeleri kalıcı hale getirir. |
ROLLBACK | |
son COMMIT işleminden bu yana tablolarda yapılan tüm değişiklikleri iptal eder. |
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:
Başlık listesi istenir:

Bir başlığın silinmesi:
Doğrulama:

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:
Doğrulama:

Silinen başlık geri geldi. Şimdi fiyat listesini isteyelim:
![]()
Diyelim ki tüm fiyatlar sıfırlandı.
Fiyatları kontrol edelim:
![]()
Veritabanında yapılan değişiklikleri silelim:
ve fiyatları tekrar kontrol edelim:
![]()
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:

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:

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

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:
Aşağıdaki [Run Script] düğmesiyle bu komut dosyasını çalıştıralım:

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

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

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

SQL INSERT komutunun bir varyantı, bir tabloya başka bir tablodan gelen satırları eklemeye olanak tanır:
INSERT INTO table1 [(colonne1, colonne2, ...)] SELECT sütun a, sütun b, ... FROM table2 WHERE condition | |
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:

ve şu SQL komutunu verelim:
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:
Bu işlem tamamlandıktan sonra, [BIBLIO2] tablosundaki verileri inceleyelim:

3.10. Bir tablonun silinmesi
DROP TABLE table | |
supprime table |
Örnek: BIBLIO2 tablosu silinir
Değişikliği onaylıyoruz:
Veritabanı gezgininde, tabloların görüntülenmesini yenileyin:

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

3.11. Tablonun yapısını değiştirme
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] | |
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
Veritabanı gezgininde, [BIBLIO] tablosunun yapısını kontrol edelim:

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

Yeni [NB_PAGES] sütunu oluşturuldu ancak herhangi bir değeri yok. Bu sütunu silelim:
[BIBLIO] tablosunun yeni yapısını kontrol edelim:

[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:
- 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.
- 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ı
CREATE VIEW nom_vue AS SELECT sütun1, sütun2, ... FROM table WHERE condition [ WITH CHECK OPTION ] | |
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). | |
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:
Veritabanı gezgininde, görünümü (F5) yenileyelim. Bir görünüm belirir:

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

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

ve bir içeriği vardır:

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:

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

[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:

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

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')


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


[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:
[ROMANS]'te kontrol ediyoruz:

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

Romanlar, [BIBLIO] tablosunda da %5 oranında artırıldı.
3.12.3. Bir görünümü silme
DROP VIEW nom_vue | |
adlı görünümü siler |
Örnek
Veritabanı gezgininde, (F5) görünümünü yenileyerek [ROMANS] görünümünün kaybolduğunu görebilirsiniz:

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.
SELECT f1, f2, .., fn FROM table [ WHERE condition ] | |
tablo satırlarının tamamı üzerinde istatistiksel fonksiyonları hesaplar ve olası condition durumunu kontrol eder. |
SELECT f1, f2, .., fn FROM table [ WHERE condition ] [ GROUP BY expr1, expr2, ..] | |
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. |
SELECT f1, f2, .., fn FROM table [ WHERE condition ] [ GROUP BY expression] [ HAVING condition_de_groupe] | |
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:
ifade ortalaması | |
ifadenin bir değere sahip olduğu satır sayısı | |
tablodaki toplam satır sayısı | |
ifadenin maksimum değeri | |
ifadenin minimum değeri | |
ifadenin toplamı |
Örnekler
![]()
Ortalama fiyat? En yüksek fiyat? En düşük fiyat?
![]()

Bir romanın ortalama fiyatı nedir? En yüksek fiyat nedir?
![]()
Kaç tane BD?
![]()
100 F'den az olan kaç tane roman var?
![]()

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)

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'
![]()
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'
![]()
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
![]()
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:

Yukarıda görüldüğü gibi, öğeleri dışa aktarmak istediğiniz veritabanında konumlanmanız gerekir. Seçenek bir sihirbazı başlatır:
![]() |
SQL komut dosyasının oluşturulacağı yer:
| |
[File] seçeneği seçildiğinde dosya adı | |
ne dışa aktarılacak | |
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:

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:

Teklifi kabul edelim. Böylece, [biblio.sql] dosyasında oluşturulan komut dosyasını görebiliriz:
- 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:

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

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:
![]() | ![]() |








