SQLite Örneklerle Görünümler, Dizin ve Tetikleyici
⚡ Akıllı Özet
SQLite Görünümler, indeksler ve tetikleyiciler, bir veritabanının sorgulanmasını ve bakımını kolaylaştıran yönetim araçlarıdır: görünümler karmaşık sorguları yeniden kullanır, indeksler aramaları hızlandırır ve tetikleyiciler veriler değiştiğinde önceden tanımlanmış eylemleri otomatik olarak çalıştırır.

Günlük kullanımda SQLiteveritabanınız üzerinde bazı yönetim araçlarına ihtiyacınız olacak. Bunları, dizinler oluşturarak veritabanını sorgulamayı daha verimli hale getirmek veya görünümler oluşturarak daha yeniden kullanılabilir hale getirmek için de kullanabilirsiniz.
SQLite Görüntüle
Görünümler tablolara çok benzer. Ancak Görünümler mantıksal tablolardır; tablolar gibi fiziksel olarak depolanmazlar. Bir görünüm bir select ifadesinden oluşur.
Karmaşık sorgularınız için bir görünüm tanımlayabilir ve sorguları tekrar yazmak yerine istediğiniz zaman görünümü doğrudan çağırarak bu sorguları yeniden kullanabilirsiniz.
CREATE VIEW ifadesi
Bir veritabanında görünüm oluşturmak için CREATE VIEW ifadesini ve ardından görünüm adını kullanabilir ve ardından istediğiniz sorguyu girebilirsiniz.
Örnek: Aşağıdaki örnekte, "TutorialsSampleDB.db" örnek veritabanında "AllStudentsView" adında bir görünüm oluşturacağız:
) 1 Adım Bilgisayarım'ı açın ve "C:\sqlite" dizinine gidin, ardından "sqlite3.exe" dosyasını açın:
) 2 Adım Aşağıdaki komutu kullanarak “TutorialsSampleDB.db” veritabanını açın:
) 3 Adım Aşağıda Görünümü oluşturmak için sqlite3 komutunun temel sözdizimi verilmiştir
CREATE VIEW AllStudentsView AS SELECT s.StudentId, s.StudentName, s.DateOfBirth, d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Komuttan şu şekilde bir çıktı olmamalıdır:
) 4 Adım Görünümün oluşturulduğundan emin olmak için, aşağıdaki komutu çalıştırarak veritabanındaki görünüm listesini seçebilirsiniz:
SELECT name FROM sqlite_master WHERE type = 'view';
"AllStudentsView" görünümünün döndürüldüğünü görmelisiniz:
) 5 Adım Artık görünümümüz oluşturuldu, bunu normal bir tablo olarak şunun gibi kullanabilirsiniz:
SELECT * FROM AllStudentsView;
Bu komut, aşağıdaki ekran görüntüsünde gösterildiği gibi “AllStudents” görünümünü sorgulayacak ve içindeki tüm satırları seçecektir:
Geçici Görünümler
Geçici görünümler, onu oluşturmak için kullanılan geçerli veritabanı bağlantısı için geçicidir. Daha sonra veritabanı bağlantısını kapatırsanız tüm geçici görünümler otomatik olarak silinir. Geçici görünümler aşağıdaki komutlardan biri kullanılarak oluşturulur:
- SICAKLIK GÖRÜNÜMÜ OLUŞTURUN veya
- GEÇİCİ GÖRÜNÜM OLUŞTURUN.
O an için bazı işlemler yapmak istiyorsanız ve bunun kalıcı bir görünüm olmasına gerek duymuyorsanız, geçici görünümler kullanışlıdır. Yani, yalnızca geçici bir görünüm oluşturursunuz, ardından işleminizi bu görünümü kullanarak yaparsınız. Later veritabanıyla bağlantıyı kapattığınızda otomatik olarak silinecektir.
Örnek:
Aşağıdaki örnekte bir veritabanı bağlantısı açacağız, ardından geçici bir görünüm oluşturacağız.
Bundan sonra o bağlantıyı kapatacağız ve geçici görünümün hala mevcut olup olmadığını kontrol edeceğiz.
) 1 Adım Daha önce açıklandığı gibi, “C:\sqlite” dizininden sqlite3.exe dosyasını açın.
) 2 Adım Aşağıdaki komutu çalıştırarak “TutorialsSampleDB.db” veritabanına bağlantı açın:
.open TutorialsSampleDB.db
) 3 Adım Aşağıdaki komutu yazarak "AllStudentsTempView" adında geçici bir görünüm oluşturun:
CREATE TEMP VIEW AllStudentsTempView AS SELECT s.StudentId, s.StudentName, s.DateOfBirth, d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
) 4 Adım Aşağıdaki komutu çalıştırarak "AllStudentsTempView" adlı geçici görünümün oluşturulduğundan emin olun:
SELECT name FROM sqlite_temp_master WHERE type = 'view';
) 5 Adım Sqlite3.exe'yi kapatın ve tekrar açın.
) 6 Adım Aşağıdaki komutu kullanarak “TutorialsSampleDB.db” veritabanına bağlantı açın:
.open TutorialsSampleDB.db
) 7 Adım Veritabanında oluşturulan geçici görünümlerin listesini almak için aşağıdaki komutu çalıştırın:
SELECT name FROM sqlite_temp_master WHERE type = 'view';
Önceki adımda veritabanı bağlantısını kapattığımızda oluşturduğumuz geçici görünüm silindiği için herhangi bir çıktı görmemelisiniz. Aksi takdirde, veritabanıyla bağlantıyı açık tuttuğunuz sürece verilerle geçici görünümü görebileceksiniz.
Notlar:
- Görünümlerle birlikte INSERT, DELETE veya UPDATE ifadelerini kullanamazsınız; yalnızca CREATE View örneğinde adım 5'te gösterildiği gibi “görünümlerden seç” komutunu kullanabilirsiniz.
- Bir GÖRÜNÜMÜ silmek için “DROP VIEW” ifadesini kullanabilirsiniz:
DROP VIEW AllStudentsView;
Görünümün silindiğinden emin olmak için, veritabanındaki görünümlerin listesini veren aşağıdaki komutu çalıştırabilirsiniz:
SELECT name FROM sqlite_master WHERE type = 'view';
Aşağıdaki gibi, görünüm silindiği için hiçbir görünümün geri dönmediğini göreceksiniz:
Görünümlerle karmaşık sorguları yeniden kullanmanın yanı sıra, SQLite Ayrıca indeksler sayesinde eşleşen satırları daha hızlı bulur.
SQLite indeks
Bir kitabınız varsa ve o kitapla ilgili bir anahtar kelime aramak istiyorsanız. Bu anahtar kelimeyi kitabın dizininde arayacaksınız. Daha sonra, söz konusu anahtar kelime hakkında daha fazla bilgi okumak için söz konusu anahtar kelimenin sayfa numarasına gideceksiniz.
Ancak, o kitapta bir dizin veya sayfa numarası yoksa, aradığınız anahtar kelimeyi bulana kadar tüm kitabı baştan sona tarayacaksınız. Ve bu özellikle bir dizininiz ve anahtar kelimeyi aramak için çok yavaş bir süreciniz olduğunda çok zordur.
Dizinler SQLite (ve aynı kavram diğerleri için de geçerlidir) Veritabanı Yönetim Sistemleri de) kitapların arkasında bulunan indekslerle aynı şekilde çalışır.
Bir dizideki bazı satırları aradığınızda SQLite arama kriterlerini içeren tablo, SQLite aradığınız kriterlerle eşleşen satırları bulana kadar tablonun tüm satırlarında arama yapacaktır. Ve daha büyük masalarınız olduğunda bu süreç çok yavaşlar.
Dizinler veri arama sorgularını hızlandıracak ve tablolardan veri alımının gerçekleştirilmesine yardımcı olacaktır. İndeksler tablo sütunlarında tanımlanır.
Dizinlerle performansı artırma:
Dizinler bir tabloda veri arama performansını iyileştirebilir. Bir sütunda bir dizin oluşturduğunuzda, SQLite her alan değerinin, değerin ait olduğu tüm satırı gösteren bir işaretçiye sahip olduğu dizin için bir veri yapısı oluşturacaktır.
Daha sonra, bir dizinin parçası olan bir sütunda arama koşulu içeren bir sorgu çalıştırırsanız, SQLite önce indeksteki değeri arayacaktır. SQLite bunun için tüm tabloyu taramayacağız. Daha sonra tablo satırı için değerin işaret ettiği konumu okuyacaktır. SQLite o konumdaki satırı bulacak ve alacaktır.
Ancak aradığınız sütun bir dizinin parçası değilse, SQLite aradığınız veriyi bulmak için sütun değerlerine yönelik bir tarama gerçekleştirecektir. Dizin yoksa genellikle daha yavaş bir süreç olacaktır.
İçinde dizin bulunmayan bir kitap düşünün ve belirli bir kelimeyi aramanız gerekiyor. O kelimeyi arayarak kitabın tamamını ilk sayfasından son sayfasına kadar tarayacaksınız. Ancak o kitapta bir indeks varsa, önce içindeki kelimeyi arayacaksınız. Bulunduğu sayfa numarasını alın ve ardından ona gidin. Bu, kitabın tamamını kapaktan kapağa taramaktan çok daha hızlı olacaktır.
SQLite ENDEKS OLUŞTUR
Bir sütun üzerinde indeks oluşturmak için CREATE INDEX komutunu kullanmalısınız. Ve bunu şu şekilde tanımlamanız gerekir:
- CREATE INDEX komutundan sonra indeksin ismini belirtmeniz gerekmektedir.
- İndeks adından sonra “ON” anahtar kelimesini ve ardından indeksin oluşturulacağı tablo adını yazmalısınız.
- Daha sonra dizin için kullanılan sütun adlarının listesi.
- Dizin verilerini sıralamak için kullanılan sıralama düzenini belirtmek amacıyla herhangi bir sütun adından sonra “ASC” veya “DESC” anahtar sözcüklerinden birini kullanabilirsiniz.
Örnek:
Aşağıdaki örnekte, “Öğrenciler” veritabanındaki öğrenciler tablosunda şu şekilde “StudentNameIndex” adında bir indeks oluşturacağız:
) 1 Adım Daha önce açıklandığı gibi “C:\sqlite” klasörüne gidin.
) 2 Adım Sqlite3.exe'yi açın.
) 3 Adım Aşağıdaki komutu kullanarak “TutorialsSampleDB.db” veritabanını açın:
.open TutorialsSampleDB.db
) 4 Adım Aşağıdaki komutu kullanarak "StudentNameIndex" adında yeni bir dizin oluşturun:
CREATE INDEX StudentNameIndex ON Students(StudentName);
Bunun için hiçbir çıktı görmemelisiniz:
) 5 Adım Dizinin oluşturulduğundan emin olmak için Students tablosunda oluşturulan dizinlerin listesini veren aşağıdaki sorguyu çalıştırabilirsiniz:
PRAGMA index_list(Students);
Yeni oluşturduğumuz dizinin döndürüldüğünü görmelisiniz:
Notlar:
- Dizinler yalnızca sütunlara göre değil ifadelere göre de oluşturulabilir. Bunun gibi bir şey:
CREATE INDEX OrderTotalIndex ON OrderItems(OrderId, Quantity*Price);
“OrderTotalIndex”, OrderId sütununa ve ayrıca Quantity sütun değeri ile Fiyat sütun değerinin çarpımına dayanacaktır. Dolayısıyla, "Sipariş Kimliği" ve "Miktar*Fiyat" için herhangi bir sorgu, sorgu dizini kullanacağından etkili olacaktır.
- CREATE INDEX ifadesinde bir WHERE ifadesi belirttiyseniz, dizin kısmi bir dizin olacaktır. Bu durumda, dizinde yalnızca WHERE ifadesindeki koşullarla eşleşen satırlar için girişler olacaktır. Örneğin, aşağıdaki dizinde:
CREATE INDEX OrderTotalIndexForLargeQuantities ON OrderItems(OrderId, Quantity*Price) WHERE Quantity > 10000;
(Yukarıdaki örnekte WHERE deyimi belirtildiği için endeks kısmi endeks olacaktır. Bu durumda endeks yalnızca miktar değeri 10000'den büyük olan emirlere uygulanacaktır. Bu endekse kısmi endeks adı verildiğini unutmayın. Üzerinde kullanılan ifadeden değil, WHERE deyiminden dolayı indeksleyebilirsiniz. Ancak ifadeleri normal indekslerle kullanabilirsiniz.)
- Sütunlara çift giriş yapılmasını önlemek için CREATE INDEX yerine CREATE UNIQUE INDEX deyimini kullanabilirsiniz ve böylece indekslenen sütunun tüm değerleri benzersiz olacaktır.
- Bir dizini silmek için DROP INDEX komutunu ve ardından silinecek dizin adını kullanın.
İndeksler okuma işlemlerini hızlandırırken, tetikleyiciler ise daha hızlı okuma imkanı sağlar. SQLite Verilerde herhangi bir değişiklik olduğunda otomatik olarak yanıt verin.
SQLite Tetik
Giriş SQLite Tetik
Tetikleyiciler, bir veritabanı tablosunda belirli bir eylem gerçekleştiğinde yürütülen otomatik önceden tanımlanmış işlemlerdir. Bir tetikleyici, bir tabloda aşağıdaki eylemlerden biri gerçekleştiğinde tetiklenecek şekilde tanımlanabilir:
- Bir tabloya INSERT.
- Bir tablodaki satırları SİLİN.
- Tablo sütunlarından birini GÜNCELLEYİN.
SQLite FOR EACH ROW tetikleyicisini destekler, böylece tetikleyicideki önceden tanımlanmış işlemler, tabloda gerçekleşen eylemlerde (ister ekleme, silme, ister güncelleme olsun) yer alan tüm satırlar için yürütülür.
SQLite TETİKLEYİCİ OLUŞTUR
Yeni bir TRIGGER oluşturmak için CREATE TRIGGER ifadesini aşağıdaki gibi kullanabilirsiniz:
- CREATE TRIGGER'dan sonra bir tetikleyici adı belirtmelisiniz.
- Tetikleyici adından sonra, tetikleyici adının tam olarak ne zaman yürütülmesi gerektiğini belirtmeniz gerekir. Üç seçeneğiniz var:
- BEFORE – tetikleyici, belirtilen INSERT, UPDATE veya delete ifadesinden önce yürütülür.
- Sonra – tetikleyici, belirtilen INSERT, UPDATE veya delete ifadesinden sonra yürütülür.
- YERİNE – Tetiği tetikleyen gerçekleşen eylemi, TRIGGER'da belirtilen ifadeyle değiştirecektir. INSTEAD OF tetikleyicisi tablolar için geçerli değildir, yalnızca görünümler için geçerlidir.
- Daha sonra eylemin türünü belirtmeniz gerekir; eylem gerçekleştiğinde tetikleyici etkinleşecektir. SİL, EKLE veya GÜNCELLE.
- Eylem söz konusu sütunda gerçekleşmediği sürece tetikleyicinin etkinleşmemesi için isteğe bağlı bir sütun adı seçebilirsiniz.
- Daha sonra tetikleyicinin oluşturulacağı tablo adını belirtmeniz gerekir.
- Tetikleyicinin gövdesinin içinde, tetikleyici tetiklendiğinde her satır için yürütülmesi gereken ifadeyi belirtmelisiniz.
Tetikleyiciler yalnızca create tetikleyici komutunda belirtilen ifadenin türüne bağlı olarak etkinleştirilecektir (ateşlenecektir). Örneğin:
- BEFORE INSERT tetikleyicisi herhangi bir ekleme ifadesinden önce etkinleştirilecektir (ateşlenecektir).
- AFTER UPDATE tetikleyicisi herhangi bir güncelleme bildiriminden sonra etkinleştirilecektir (ateşlenecektir), vb.
Tetikleyicinin içinde, yeni eklenen değerlere "new" anahtar sözcüğünü kullanarak başvurabilirsiniz. Ayrıca, silinen veya güncellenen değerlere old anahtar sözcüğünü kullanarak başvurabilirsiniz. Aşağıdaki gibi:
- INSERT tetikleyicilerinin içinde – yeni anahtar kelime kullanılabilir.
- UPDATE tetikleyicilerinin içinde – yeni ve eski anahtar kelimeler kullanılabilir.
- DELETE tetikleyicilerinin içinde – eski anahtar kelime kullanılabilir.
Örnek E-posta
Aşağıda, "Öğrenciler" tablosuna yeni bir öğrenci eklenmeden önce tetiklenecek bir kod oluşturacağız.
Bu işlem, yeni eklenen öğrenciyi, ekleme işleminin gerçekleştiği geçerli tarih ve saate ait otomatik bir zaman damgasıyla birlikte "StudentsLog" tablosuna kaydedecektir. Şöyle:
) 1 Adım "C:\sqlite" dizinine gidin ve sqlite3.exe dosyasını çalıştırın.
) 2 Adım Aşağıdaki komutu çalıştırarak “TutorialsSampleDB.db” veritabanını açın:
.open TutorialsSampleDB.db
) 3 Adım Aşağıdaki komutu çalıştırarak “InsertIntoStudentTrigger” tetikleyicisini oluşturun:
CREATE TRIGGER InsertIntoStudentTrigger BEFORE INSERT ON Students BEGIN INSERT INTO StudentsLog VALUES(new.StudentId, datetime(), 'Insert'); END;
“datetime()” fonksiyonu, ekleme işleminin gerçekleştiği anın geçerli tarih ve saatini verir. Böylece, her işleme otomatik olarak zaman damgaları eklenerek ekleme işlemini kaydedebiliriz.
Komut başarıyla çalışmalı ve çıktı alamazsınız:
“InsertIntoStudentTrigger” tetikleyicisi, öğrenciler tablosuna yeni bir öğrenci eklediğiniz her seferde çalışacaktır. “new” anahtar kelimesi, eklenecek değerleri ifade eder. Örneğin, “new.StudentId” eklenecek öğrenci kimliği olacaktır.
Şimdi yeni bir öğrenci eklediğimizde tetikleyicinin nasıl davrandığını test edeceğiz.
) 4 Adım Students tablosuna yeni bir öğrenci ekleyecek aşağıdaki komutu yazın:
INSERT INTO Students VALUES(11, 'guru11', 1, '1999-10-12');
) 5 Adım Aşağıdaki komut, “StudentsLog” tablosundaki tüm satırları seçecektir:
SELECT * FROM StudentsLog;
Az önce eklediğimiz yeni öğrenci için yeni bir satırın döndürüldüğünü görmelisiniz:
Bu satır, kimliği 11 olan yeni öğrenciyi eklemeden önce tetikleyici tarafından eklendi.
Bu örnekte, oluşturduğumuz "InsertIntoStudentTrigger" tetikleyicisini kullanarak "StudentsLog" tablosuna herhangi bir ekleme işlemini otomatik olarak kaydettik. Aynı şekilde, herhangi bir güncelleme veya silme işlemini de kaydedebilirsiniz.
Tetikleyicilerle istenmeyen güncellemelerin önlenmesi:
Bir tablodaki BEFORE UPDATE tetikleyicilerini kullanarak, bir ifadeye dayalı bir sütundaki güncelleme ifadelerinin engellenmesini sağlayabilirsiniz.
Örnek E-posta
Aşağıdaki örnekte, Students tablosundaki “studentname” sütununu herhangi bir güncelleme ifadesinin güncellemesini önleyeceğiz:
) 1 Adım "C:\sqlite" dizinine gidin ve sqlite3.exe dosyasını çalıştırın.
) 2 Adım Aşağıdaki komutu çalıştırarak “TutorialsSampleDB.db” veritabanını açın:
.open TutorialsSampleDB.db
) 3 Adım Aşağıdaki komutu çalıştırarak "Students" tablosunda "preventUpdateStudentName" adında yeni bir tetikleyici oluşturun.
CREATE TRIGGER preventUpdateStudentName BEFORE UPDATE OF StudentName ON Students FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'You cannot update studentname'); END;
“RAISE” komutu, “Öğrenci adını güncelleyemezsiniz” hata mesajıyla bir hata oluşturacak ve ardından güncelleme ifadesinin yürütülmesini engelleyecektir.
Şimdi tetikleyicinin iyi çalıştığını ve öğrenci adı sütununda herhangi bir güncelleme yapılmasını önlediğini doğrulayacağız.
) 4 Adım Aşağıdaki güncelleme komutunu çalıştırın; bu komut, "Jack" öğrenci adını "Jack1" olarak güncelleyecektir.
UPDATE Students SET StudentName = 'Jack1' WHERE StudentName = 'Jack';
Tetikleyiciye eklediğimiz ve "Öğrenci adını güncelleyemezsiniz" şeklinde belirttiğimiz hata mesajını aşağıdaki gibi almalısınız:
) 5 Adım Öğrenciler tablosundan öğrencilerin isimlerinin listesini seçecek olan aşağıdaki komutu çalıştırın.
SELECT StudentName FROM Students;
Öğrenci adının “Jack”in hala aynı olduğunu ve değişmediğini görmelisiniz:















