Skip to content

SQL Statements ve İleri Seviye SQL

Ders 9: SQL Statements ve İleri Seviye SQL

Section titled “Ders 9: SQL Statements ve İleri Seviye SQL”

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
  1. PRAGMA Komutları
  2. sqlite_master
  3. Pattern Matching
  4. İleri Seviye SQL
  5. Pratik Örnekler

Query planner’ı optimize eder:

PRAGMA optimize;

Kullanım:

// Large import sonrası
await db.exec(`
INSERT INTO users SELECT * FROM temp_users;
PRAGMA optimize;
`);

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 },
// ...
// ]

Foreign key constraints kontrolü:

-- Foreign key'leri aç
PRAGMA foreign_keys = ON;
-- Foreign key'leri kapat
PRAGMA foreign_keys = OFF;

D1’de varsayılan: ON

Foreign key constraints’i erteler:

PRAGMA defer_foreign_keys = ON;
-- DDL işlemleri
ALTER TABLE users ADD COLUMN age INTEGER;
-- Transaction sonunda constraint kontrolü
PRAGMA defer_foreign_keys = OFF;

-- Tüm tabloları listele
SELECT name, sql FROM sqlite_master WHERE type = 'table';
-- Tüm index'leri listele
SELECT name, sql FROM sqlite_master WHERE type = 'index';
-- Tüm view'leri listele
SELECT name, sql FROM sqlite_master WHERE type = 'view';
// Tüm tabloların schema'sını görüntüle
const { 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 COUNT sorgusu
const { 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`);
}

-- Başlayan
SELECT * FROM users WHERE username LIKE 'ah%';
-- Biten
SELECT * FROM users WHERE email LIKE '%@example.com';
-- İçeren
SELECT * FROM posts WHERE content LIKE '%Cloudflare%';
-- Karakter eşleştirme
SELECT * FROM users WHERE username LIKE 'a_hm_t'; % = herhangi bir karakter

Unix wildcard pattern matching:

-- Büyük/küçük harf duyarlı
SELECT * FROM users WHERE username GLOB 'Ahmet*';
-- Karakter seti eşleştirme
SELECT * FROM users WHERE username GLOB '[A-Za-z]*';
// Special karakterleri escape etme
const 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();

INSERT OR REPLACE INTO users (id, email, username)
VALUES (1, 'new@example.com', 'newuser');
-- CASE expression
SELECT
title,
view_count,
CASE
WHEN view_count > 10000 THEN 'Very Popular'
WHEN view_count > 1000 THEN 'Popular'
ELSE 'Normal'
END as popularity
FROM posts;
-- ROW_NUMBER()
SELECT
title,
view_count,
ROW_NUMBER() OVER (ORDER BY view_count DESC) as rank
FROM posts;
-- Running total
SELECT
created_at,
view_count,
SUM(view_count) OVER (
ORDER BY created_at
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) as running_total
FROM posts;

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,
}));
}
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

JSON Sorgulama - JSON verilerini D1’de nasıl sorgulayacağınızı öğreneceksiniz.


Ders Süresi: 60 dakika Zorluk Seviyesi: Orta Ön Koşullar: Ders 8: Return Objects