SQL Statements ve İleri Seviye SQL
Ders 9: SQL Statements ve İleri Seviye SQL
Section titled “Ders 9: SQL Statements ve İleri Seviye SQL”Öğrenme Hedefleri
Section titled “Öğrenme Hedefleri”Bu dersi tamamladıktan sonra:
- SQLite PRAGMA komutlarını kullanabileceksiniz
- sqlite_master sistem tablosunu sorgulayabileceksiniz
- Pattern matching (LIKE, GLOB) yapabileceksiniz
- İleri seviye SQL özelliklerini kullanabileceksiniz
İçerik İçindekiler
Section titled “İçerik İçindekiler”PRAGMA Komutları
Section titled “PRAGMA Komutları”PRAGMA optimize
Section titled “PRAGMA optimize”Query planner’ı optimize eder:
PRAGMA optimize;Kullanım:
// Large import sonrasıawait db.exec(` INSERT INTO users SELECT * FROM temp_users; PRAGMA optimize;`);PRAGMA table_info
Section titled “PRAGMA table_info”Tablo bilgilerini görüntüler:
PRAGMA table_info(users);Kullanım:
const { results } = await db .prepare("PRAGMA table_info(users)") .run();
// Çıktı:// [// { cid: 0, name: 'id', type: 'INTEGER', notnull: 1, dflt_value: null, pk: 1 },// { cid: 1, name: 'email', type: 'TEXT', notnull: 1, dflt_value: null, pk: 0 },// ...// ]PRAGMA foreign_keys
Section titled “PRAGMA foreign_keys”Foreign key constraints kontrolü:
-- Foreign key'leri açPRAGMA foreign_keys = ON;
-- Foreign key'leri kapatPRAGMA foreign_keys = OFF;D1’de varsayılan: ON
PRAGMA defer_foreign_keys
Section titled “PRAGMA defer_foreign_keys”Foreign key constraints’i erteler:
PRAGMA defer_foreign_keys = ON;
-- DDL işlemleriALTER TABLE users ADD COLUMN age INTEGER;
-- Transaction sonunda constraint kontrolüPRAGMA defer_foreign_keys = OFF;sqlite_master
Section titled “sqlite_master”Tablo ve Index Listeleme
Section titled “Tablo ve Index Listeleme”-- Tüm tabloları listeleSELECT name, sql FROM sqlite_master WHERE type = 'table';
-- Tüm index'leri listeleSELECT name, sql FROM sqlite_master WHERE type = 'index';
-- Tüm view'leri listeleSELECT name, sql FROM sqlite_master WHERE type = 'view';Schema İnceleme
Section titled “Schema İnceleme”// Tüm tabloların schema'sını görüntüleconst { results } = await db .prepare(` SELECT name, sql FROM sqlite_master WHERE type = 'table' ORDER BY name `) .run();
results.forEach(table => { console.log(`Table: ${table.name}`); console.log(`SQL: ${table.sql}`);});Dinamik Sorgular
Section titled “Dinamik Sorgular”// Dinamik COUNT sorgusuconst { results: tables } = await db .prepare("SELECT name FROM sqlite_master WHERE type = 'table'") .run();
for (const table of tables) { const { results: counts } = await db .prepare(`SELECT COUNT(*) as count FROM ${table.name}`) .run();
console.log(`${table.name}: ${counts[0].count} rows`);}Pattern Matching
Section titled “Pattern Matching”LIKE Operatörü
Section titled “LIKE Operatörü”-- BaşlayanSELECT * FROM users WHERE username LIKE 'ah%';
-- BitenSELECT * FROM users WHERE email LIKE '%@example.com';
-- İçerenSELECT * FROM posts WHERE content LIKE '%Cloudflare%';
-- Karakter eşleştirmeSELECT * FROM users WHERE username LIKE 'a_hm_t'; % = herhangi bir karakterGLOB Operatörü
Section titled “GLOB Operatörü”Unix wildcard pattern matching:
-- Büyük/küçük harf duyarlıSELECT * FROM users WHERE username GLOB 'Ahmet*';
-- Karakter seti eşleştirmeSELECT * FROM users WHERE username GLOB '[A-Za-z]*';Escape Karakterleri
Section titled “Escape Karakterleri”// Special karakterleri escape etmeconst searchPattern = '%50%OFF%'; // %50%OFF aramasıconst escapedPattern = searchPattern.replace(/%/g, '\\%');
const { results } = await db .prepare("SELECT * FROM products WHERE description LIKE ?") .bind(escapedPattern) .run();İleri Seviye SQL
Section titled “İleri Seviye SQL”UPSERT (INSERT OR REPLACE)
Section titled “UPSERT (INSERT OR REPLACE)”INSERT OR REPLACE INTO users (id, email, username)Conditional Expressions
Section titled “Conditional Expressions”-- CASE expressionSELECT title, view_count, CASE WHEN view_count > 10000 THEN 'Very Popular' WHEN view_count > 1000 THEN 'Popular' ELSE 'Normal' END as popularityFROM posts;Window Functions
Section titled “Window Functions”-- ROW_NUMBER()SELECT title, view_count, ROW_NUMBER() OVER (ORDER BY view_count DESC) as rankFROM posts;
-- Running totalSELECT created_at, view_count, SUM(view_count) OVER ( ORDER BY created_at ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) as running_totalFROM posts;Pratik Örnekler
Section titled “Pratik Örnekler”Örnek 1: Dinamik COUNT
Section titled “Örnek 1: Dinamik COUNT”async function getTableCounts(db: D1Database) { const { results: tables } = await db .prepare("SELECT name FROM sqlite_master WHERE type = 'table'") .run();
const counts = await db.batch( tables.map(table => db.prepare(`SELECT COUNT(*) as count FROM ${table.name}`) ) );
return tables.map((table, i) => ({ table: table.name, count: counts[i].results[0].count, }));}Örnek 2: Search Implementation
Section titled “Örnek 2: Search Implementation”async function searchUsers(db: D1Database, query: string) { const searchTerm = `%${query}%`;
const { results } = await db .prepare(` SELECT * FROM users WHERE username LIKE ? OR email LIKE ? OR first_name LIKE ? OR last_name LIKE ? LIMIT 100 `) .bind(searchTerm, searchTerm, searchTerm, searchTerm) .run();
return results;}Bu derste öğrendikleriniz:
✅ PRAGMA komutları ✅ sqlite_master sorguları ✅ Pattern matching teknikleri ✅ İleri seviye SQL özellikleri ✅ Dinamik sorgu örnekleri
Sonraki Ders
Section titled “Sonraki Ders”JSON Sorgulama - JSON verilerini D1’de nasıl sorgulayacağınızı öğreneceksiniz.
Kaynaklar
Section titled “Kaynaklar”Ders Süresi: 60 dakika Zorluk Seviyesi: Orta Ön Koşullar: Ders 8: Return Objects