Kurs
MySQL'in neredeyse her veri tabanı ile ilgili iş ilanında yer aldığını hiç fark ettiniz mi? Bunun iyi bir nedeni var — MySQL, sevdiğiniz sosyal medya platformlarından her gün kullandığınız uygulamalara kadar pek çok şeyi çalıştırıyor.
MySQL mülakat sorularının üstesinden gelmenize yardımcı olmak için bu rehberi hazırladım. Junior geliştiricilerin bilmesi gereken temellerden, senior rollerin gerektirdiği karmaşık konulara kadar her şeyi ele alacağım. Ayrıca, bir sonraki veri odaklı mülakatlarınızda kendinizi özgüvenli bir aday olarak göstermenize yardımcı olacak bazı ipuçları da paylaşacağım.
MySQL Nedir?
MySQL, verileri yapılandırılmış tablolara düzenleyen, SQL üzerine kurulu açık kaynaklı bir İVTYS’dir (ilişkisel veritabanı yönetim sistemi). Oracle Corporation tarafından geliştirilmiştir.
2024 yılında en popüler DBMS olarak sıralandı. Ancak 2025 Stack Overflow Geliştirici Anketi, PostgreSQL’in profesyonel geliştiriciler arasında en yaygın kullanılan veritabanı olarak ilk kez MySQL’i geride bıraktığını gösterdi.
Yanlış anlaşılmasın: MySQL hâlâ son derece popüler — 2025’te geliştiriciler arasında %40,5 kullanım oranına ulaştı — ve sayısız web uygulaması, içerik yönetim sistemi ve kurumsal aracı çalıştırmaya devam ediyor. Özellikle web uygulamaları veya LAMP yığını ile çalışıyorsanız, MySQL sahip olunması gereken üst düzey bir beceridir.

2024’te MySQL, 1061 puanla dünyanın en popüler açık kaynak DBMS’iydi. Kaynak: Statista.
Temel MySQL Mülakat Soruları
İlk mülakat aşamasında, görüşmeci temel veritabanı ve MySQL kavramlarını anlama düzeyinizi ölçmek için temel sorular sorabilir.
1. Veritabanı nedir ve DBMS’ten farkı nedir?
Veritabanı, erişebildiğimiz, değiştirebildiğimiz ve analiz edebildiğimiz verileri tutan bir depolama kabıdır. Örneğin, sosyal medya platformları, gönderilerimizi beğenenler hakkındaki verileri veritabanlarında saklar.
DBMS (Veritabanı Yönetim Sistemi), kullanıcılar oluşturup erişimlerini yöneterek bu verilerle etkileşime geçmemizi ve onları yönetmemizi sağlayan yazılımdır. MySQL, en popüler DBMS seçeneklerinden biridir. Diğer örnekler aralarında PostgreSQL, MongoDB ve Microsoft SQL Server bulunur.
2. MySQL diğer ilişkisel veritabanı yönetim sistemlerinden nasıl ayrılır?
MySQL, verileri yönetmek için SQL kullanan açık kaynaklı bir ilişkisel veritabanı yönetim sistemidir (İVTYS). Kullanım kolaylığı, hızı ve web tabanlı uygulamalarla uyumluluğu ile bilinir.
MySQL’in diğer İVTYS’lerden farkları şöyledir:
- Basitlik ve performans: MySQL sıklıkla basitliği ve optimize edilmiş performansı için övülür; bu da onu web geliştiricileri ve girişimler için başvurulan bir tercih yapar.
- Gelişmiş özellikler: MySQL kullanım kolaylığında başarılı olsa da, PostgreSQL gibi diğer İVTYS’lerdeki daha kapsamlı ACID işlem desteği, gelişmiş indeksleme ve daha geniş veri türü seti gibi bazı gelişmiş özellikler bakımından eksik kalabilir.
- Depolama motorları: MySQL, tablolarda farklı depolama motorları (ör. InnoDB, MyISAM) seçmenize olanak tanır; bu da belirli kullanım senaryoları için esneklik sağlar.
MySQL, hız ve ölçeklenebilirlik gerektiren senaryolar için idealdir; ancak daha karmaşık veya kurumsal düzeydeki özellikler için PostgreSQL daha iyi bir tercih olabilir.
3. MySQL’de mevcut başlıca veri türleri nelerdir?
MySQL, şu kategorilere ayrılan çeşitli veri türlerini destekler:
-
Sayısal:
INT,DECIMAL,FLOAT,DOUBLEvb. -
Metin:
CHAR,VARCHAR,TEXT,BLOB. -
Tarih/zaman:
DATE,DATETIME,TIMESTAMP,TIME. -
JSON: JSON nesnelerini saklamak için.
4. INT ve DECIMAL veri türleri arasındaki fark nedir?
INT ondalık nokta olmadan tam sayıları saklar. Kesirlere ihtiyaç yoksa kullanabiliriz. Buna karşılık DECIMAL finansal değerleri saklayabilir ve ondalık hassasiyet gerektiren hesaplamalar için uygundur.
5. MySQL’de DATE ile DATETIME arasındaki fark nedir?
MySQL’de DATE işlevi tarihi yıl, ay ve gün formatında saklar:
YYYY-MM-DD
Buna karşılık DATETIME tarihi saatle birlikte saklar ve şu şekilde görünür:
YYYY-MM-DD HH:MM:SS
6. Yabancı anahtar (foreign key) nedir ve veritabanlarında nasıl kullanılır?
Yabancı anahtar, bir tabloda yer alan ve başka bir tablonun birincil anahtarına bağlanan alandır.
Örneğin müşteri bilgilerini tutan bir customers tablosunda her müşterinin benzersiz bir customer_id’si vardır — satın alma kayıtlarını tutan transactions adlı başka bir tabloda, customer_id’yi yabancı anahtar olarak kullanırız. Transactions tablosundaki customer_id, her satın alma işlemini customers tablosundaki belirli bir müşteriye bağlar.
SQL’de bu şöyle görünür:
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);
CREATE TABLE transactions (
transaction_id INT PRIMARY KEY,
customer_id INT,
amount DECIMAL(10,2),
date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
7. INNER JOIN, LEFT JOIN, RIGHT JOIN ve FULL JOIN arasındaki farklar nelerdir?
Join’ler, ilişkili sütunlara dayanarak iki veya daha fazla tablodan satırları birleştirir. Aralarındaki farklar şunlardır:
-
INNER JOIN: Her iki tabloda da eşleşme olan satırları döndürür.
-
LEFT JOIN: Sol tablodaki tüm satırları ve sağ tablodan eşleşen satırları döndürür. Eşleşme yoksa sağ tablonun sütunları için
NULLdöner. -
RIGHT JOIN:
LEFT JOIN’e benzer; sağ tablodaki tüm satırları ve soldan eşleşen satırları döndürür. -
FULL JOIN:
LEFT JOINveRIGHT JOINsonuçlarını birleştirir; her iki tablodan da eşleşmeyen satırları içerir. Not: MySQL, yerel olarakFULL JOINsöz dizimini desteklemez. Aynı sonucu elde etmek için birLEFT JOINile birRIGHT JOIN’inUNION’ını kullanın.
8. MySQL’de DELETE, TRUNCATE ve DROP arasındaki fark nedir?
DELETE, TRUNCATE ve DROP gibi komutlar benzer görünebilir, ancak aslında farklı davranışlara sahiptir:
DELETE: Bir koşula göre bir tablodan satırları kaldırır. Bir işlem (transaction) içindeyse geri alınabilir. Örnek:
DELETE FROM employees WHERE department_id = 5;
TRUNCATE: Bir tablodaki tüm satırları siler, ancak tablo yapısı olduğu gibi kalır. DELETE’ten daha hızlıdır ve geri alınamaz. Örnek:
TRUNCATE TABLE employees;
DROP: Tablo yapısını ve verileri, indeksler gibi bağımlılıklarla birlikte tamamen kaldırır. Örnek:
DROP TABLE employees;
9. MySQL’de tablo nasıl oluşturulur ve değiştirilir? Örnek verin.
Tablo oluşturmak için CREATE TABLE, değiştirmek için genellikle ALTER TABLE ifadesini kullanabilirsiniz. İşte bazı örnekler:
Tablo oluştur:
CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), department VARCHAR(50));
Sütun eklemek için değiştir:
ALTER TABLE employees ADD COLUMN salary DECIMAL(10, 2);
10. SQL’de geçici tablo (temporary table) nedir?
Geçici tablo yalnızca mevcut veritabanı oturumu sırasında var olur. Oturumu kapattığımızda tablo silinir. Bu tip tablolar ara sonuçları geçici olarak saklayabilir. Kalıcı bir tabloya eklemeden önce verileri test etmek, filtrelemek veya hazırlamak için kullanabiliriz.
İşte bir örnek:
CREATE TEMPORARY TABLE temp_employees (
id INT,
name VARCHAR(50)
);
INSERT INTO temp_employees VALUES (1, 'John Doe');
SELECT * FROM temp_employees;
11. MySQL’de alt sorgu (subquery) nedir? Bir örnekle açıklayın.
Alt sorgu (iç içe sorgu olarak da bilinir), başka bir sorgunun içinde yer alır. Karmaşık veritabanı işlemlerini daha yönetilebilir adımlara ayırır. Örneğin, ortalamanın üzerinde kazanan çalışanları bulmak için alt sorgu oluşturabilirsiniz:
SELECT first_name, last_name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);
Bunu adım adım inceleyelim:
-
İç sorgu
SELECT AVG(salary) FROM employeesönce ortalama maaşı hesaplar. -
Dış sorgu ardından bu ortalamayı kullanarak üzerinde kazanan çalışanları bulur.
12. MySQL’de bir tabloya veri eklemek için INSERT ifadesini nasıl kullanırsınız? Ayrıca bunun için en iyi uygulamalarınız var mı?
Bir tabloya veri eklemek için INSERT ifadesini kullanabiliriz. Temel sözdizimi şöyledir:
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
INSERT ifadesini kullanırken izlenecek birkaç iyi uygulama şunlardır
-
Sütunlarınızı açıkça listeleyin. Bu, kodu daha anlaşılır kılar ve tablo yapısı sonradan değişirse hataları önler.
-
AUTO_INCREMENTgibi kimlik sütunları için, bunlarıINSERTifadesinde atlayın. MySQL, yinelenen kimlikleri önlemek için bunları otomatik olarak yönetir. -
Metinlerde alıntı işaretlerinde tutarlı olun. Ben tek tırnakları tercih ederim, ancak her ikisi de çalışır.
-
Birden fazla satır ekleyecekseniz, performans için bunu tek bir ifadeyle yapabilirsiniz.
13. MySQL’de AUTO_INCREMENT özniteliğinin önemi nedir?
AUTO_INCREMENT özniteliği, genellikle bir tablonun birincil anahtarı olan bir sütun için benzersiz ve artan sayılar üretir.
Bir AUTO_INCREMENT sütunla tablo oluşturma örneği:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
department VARCHAR(50)
);
Ve buna satır eklemek için:
INSERT INTO employees (name, department) VALUES ('John Doe', 'Sales');
INSERT INTO employees (name, department) VALUES ('Jane Smith', 'Marketing');
14. MySQL’de görünüm (view) nedir?
Görünüm, sanal bir tablo gibi çalışan kaydedilmiş bir sorgudur. Bununla karmaşık bir sorguyu alır, ona bir ad verir ve gelecekteki sorgular için tablo gibi kullanırız. Böylece her seferinde tüm sorguyu yeniden yazmanız gerekmez.
Örneğin, çalışan detaylarını bölüm adlarıyla birlikte sorgulamayı basitleştirmek için bir görünüm oluşturabilirsiniz:
CREATE VIEW employee_details AS
SELECT
e.id,
e.name,
d.department_name,
e.salary
FROM
employees e
JOIN
departments d ON e.department_id = d.department_id;
Artık employee_details görünümünü bir tablo gibi sorgulayabilirsiniz:
SELECT * FROM employee_details;
Ancak, görünümleri veri eklemek ve güncellemek için kullanamayız. Çoğu salt okunurdur ve kullanıcıların veritabanına doğrudan erişmesini engelleyerek veri güvenliğini artırır. Görünümler bazen sorguları yavaşlatabilir; çünkü her erişildiğinde altta yatan sorgu yeniden çalışır.
Orta Düzey MySQL Mülakat Soruları
Bu bölümde orta düzey konuları ele alacağız. Bu sorular, ağırlıklı olarak MySQL veri türleri ve yapısı hakkındaki bilginizi ölçmek için sorulur.
15. Sistem sürümlü tablolar (system-versioned tables) nedir ve nasıl çalışırlar?
Sistem sürümlü tablolar, bir tabloda yapılan değişikliklerin tam geçmişini tutar. Her satırın önceki sürümlerini sakladıkları için denetim ve veri kurtarma amacıyla kullanılabilirler.
Bunu, her satırın geçerli olduğu zamanı kaydetmek için iki ek sütun — StartTime ve EndTime — ekleyerek yaparlar. Veri eklediğimizde, güncellediğimizde veya sildiğimizde bu zaman damgaları güncellenir:
-
Ekleme: Yeni bir satır,
StartTimemevcut zaman damgasına ayarlanmış veEndTime9999-12-31 23:59:59— MySQL’in en büyükDATETIMEdeğeri, ‘bu satır şu anda aktif’ anlamına gelen bekçi değer — ile eklenir. -
Güncelleme: Orijinal satırın
EndTimedeğeri, artık geçerli olmadığını işaretlemek için mevcut zaman damgasına güncellenir. Ardından, güncellenmiş verilerle yeni bir satır oluşturulur; bununStartTimedeğeri mevcut zaman damgasıdır veEndTime‘sonsuz’dur. -
Silme: Mevcut satırın
EndTimedeğeri, satırın artık geçerli olmadığını göstermek için mevcut zaman damgasına güncellenir.
SQL’in FOR SYSTEM_TIME ifadesini kullanarak tablonun belirli bir zamandaki ya da bir zaman aralığındaki durumunu sorgulayabilirsiniz. Örneğin:
-
FOR SYSTEM_TIME AS OF '2024-01-01': Tabloyu 1 Ocak 2024’teki haliyle getirir. -
FOR SYSTEM_TIME BETWEEN '2024-01-01' AND '2024-12-31': Bu tarih aralığında geçerli olan tüm satırları gösterir.
16. MySQL işlemleri (transactions) nedir ve nasıl kullanılır?
İşlemler, tek bir birim olarak yürütülen işlem kümeleridir. Tüm işlemlerin birlikte başarılı olmasını veya birlikte başarısız olmasını sağlayarak veri bütünlüğünü korur.
Kullanımına bir örnek:
START TRANSACTION;
UPDATE accounts SET balance = balance - 500 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 500 WHERE account_id = 2;
COMMIT; -- Değişiklikleri kalıcı olarak kaydeder
-- veya
ROLLBACK; -- Değişiklikleri geri alır
17. MySQL’de varsayılan kısıt (default constraint) nedir? Bir sütun için varsayılan değer nasıl ayarlanır?
MySQL’de varsayılan kısıt, bir INSERT işlemi sırasında açık bir değer verilmediğinde bir sütuna varsayılan bir değer atar. Bu, kullanıcı veri girişinde o sütunu atlamış olsa bile sütunun geçerli olmasını sağlar.
Varsayılan değerli bir tabloyu şöyle oluşturabilirsiniz:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
status VARCHAR(10) DEFAULT 'active'
);
Ardından, status belirtmeden bir satır ekleyebilirsiniz:
INSERT INTO employees (name) VALUES ('John Doe');
Bu yaklaşım, kritik sütunlarda NULL veya geçersiz veri olasılığını azaltır ve varsayılan durumları açıkça ele alma ihtiyacını kaldırarak sorguları basitleştirir.
|
Alan |
Tür |
Null |
Anahtar |
Varsayılan |
Ekstra |
|
id |
INT |
HAYIR |
PRI |
NULL |
AUTO_INCREMENT |
|
name |
VARCHAR(50) |
EVET |
NULL |
||
|
status |
VARCHAR(10) |
EVET |
active |
Bu komut yararlıdır çünkü:
- Geliştiricilerin sorgu yazmadan önce tablo şemasını anlamasına yardımcı olur.
- Özellikle yabancısı olduğunuz veritabanlarında hata ayıklama için kullanılabilir.
- Birincil anahtarlar veya varsayılanlar gibi kısıtları hızla belirler.
18. MySQL’de CHAR ile VARCHAR arasındaki fark nedir?
Her ikisi de metin veri saklar, ancak depolamayı farklı ele alırlar:
-
CHAR(n)her zaman tam olaraknkarakter saklar; değer daha kısaysa boşlukla doldurur. Sabit uzunluktur; ülke kodu veya durum bayrağı gibi tüm değerlerin aynı uzunlukta olduğu sütunlarda biraz daha hızlıdır. -
VARCHAR(n)yalnızca girilen gerçek karakterleri, en fazlan’e kadar saklar. Değişken uzunluklu veri için daha az depolama kullanır ancak uzunluğu izlemek için küçük bir ek yükü vardır.
CREATE TABLE example (
country_code CHAR(2), -- Always 2 chars, e.g. 'US', 'UK'
email VARCHAR(255) -- Variable length up to 255 chars
);
Genel kural: sabit uzunluklu değerler için CHAR, diğer her şey için VARCHAR kullanın.
19. SQL’de metni yönetmek için dize (string) işlevlerini nasıl kullanırsınız?
SQL’deki farklı dize işlevleri, adlar ve diğer metin verileriyle çalışır. Örneğin:
-
LENGTH()işlevi bir isimdeki karakter sayısını gösterir. -
UPPER()veLOWER()işlevleri metni tamamen büyük/küçük harfe dönüştürür. -
CONCAT()işlevi, bir sütunda ad ve soyadı birleştirir. -
SUBSTRING(), metnin belirli kısımlarını çıkarır. Örneğin, doğum tarihinden ay bilgisini ayırmak için kullanabiliriz.
Örnek bir sorgu:
SELECT
UPPER(first_name) AS upper_name,
CONCAT(first_name, ' ', last_name) AS full_name,
SUBSTRING(birthdate, 6, 2) AS birth_month,
TRIM(last_name) AS trimmed_last_name,
REPLACE(first_name, 'a', '@') AS replaced_name
FROM employees;
Bu sorgu:
-
İsimleri büyük harfe dönüştürür.
-
Ad ve soyadı birleştirerek tam ad oluşturur.
-
birthdatesütunundan doğum ayını çıkarır. -
Soyadlardaki boşlukları kırpar.
-
Adlarda geçen "a" harfini "@" ile değiştirir.
20. SQL ile veritabanındaki belirli bir satırı nasıl güncellersiniz?
UPDATE ifadesini ve değiştirmek istediğiniz kaydı belirtmek için WHERE koşulunu kullanabilirsiniz.
Örneğin, 2010 yapımı “Inception” filminin türünü “Sci-fi” olarak güncellemek isterseniz, şu sorguyu kullanabilirsiniz:
UPDATE movies
SET genre = 'Sci-Fi'
WHERE movie_title = 'Inception' AND year = 2010;
Burada, UPDATE movies güncellemek istediğimiz tabloyu belirtir ve WHERE ifadesi başlığı “Inception” ve yılı “2010” olan satırı hedefler.
İleri Düzey MySQL Mülakat Soruları
İleri düzey mülakat soruları, karmaşık MySQL senaryolarını yönetme becerinizi test eder ve görüşmeciye karar verme yetenekleriniz hakkında fikir verir.
21. MySQL’de tetikleyici (trigger) nedir? Nasıl uygulanır?
MySQL’de tetikleyici, bir veritabanı olayı gerçekleştiğinde çalışan işlem setidir. Tetikleyiciler, INSERT, UPDATE veya DELETE gibi olaylardan önce veya sonra çalışacak şekilde yapılandırılabilir.
Örneğin, yeni siparişlerin eklendiği bir orders tablosu olduğunu varsayalım. Her yeni siparişi bir order_history tablosuna kaydeden bir tetikleyici oluşturabiliriz:
CREATE TRIGGER after_order_insert
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
INSERT INTO order_history (order_id, action, timestamp)
VALUES (NEW.order_id, 'inserted', NOW());
END;
Tetikleyici çalıştıktan sonra order_history tablosu otomatik olarak güncellenir:
|
history_id |
order_id |
action |
timestamp |
|
1 |
1 |
inserted |
2024-12-24 10:00:00 |
|
2 |
2 |
inserted |
2024-12-24 11:00:00 |
22. Neden bir indeks eklemek SQL sorgularını hızlandırır?
Herhangi bir indeks yoksa, veritabanı belirli bir kaydı bulmak için her satırı taramak zorunda kalır. Bir indeks, bir içindekiler tablosu gibi davranır, veritabanının ilgili satırlara doğrudan erişmesine olanak tanır. Bu nedenle indeks eklemek arama süresini kısaltır ve sorguların daha hızlı çalışmasını sağlar.
İndeksler genellikle veritabanının arama, bakma ve aralık taramalarını verimli şekilde gerçekleştirmesini sağlayan B-tree veya hash tablo gibi veri yapıları kullanılarak uygulanır.
Bir indeksin nasıl oluşturulacağına örnek:
-- İndeks olmadan:
SELECT * FROM employees WHERE last_name = 'Smith';
-- last_name sütununa indeks ekleme:
CREATE INDEX idx_last_name ON employees(last_name);
-- İndeksle birlikte veritabanı, last_name sütununda 'Smith' olan satırları hızlıca bulabilir.
İndekslerin bazı dezavantajları da vardır, örneğin:
-
Daha yavaş yazma işlemleri:
INSERT,UPDATEveDELETEişlemleri daha yavaştır çünkü veri her değiştiğinde indeksin de güncellenmesi gerekir. -
Depolama maliyeti: İndeksler ek depolama alanı gerektirir.
23. Bir SQL tablosunda ürünün ağırlığı ve fiyatı için hangi veri türünü kullanırız ve neden?
Ağırlık için genellikle DECIMAL daha güvenli bir seçimdir. FLOAT ve REAL ondalık değerleri saklayabilse de kayan noktalı aritmetik kullanırlar ve küçük yuvarlama hataları oluşturabilirler.
Doğruluğun önemli olduğu (ör. gönderim hesapları, envanter) ürün ağırlıkları için DECIMAL(8, 3) üç ondalık basamakla hassas kontrol sağlar ve yuvarlama sürprizleri olmaz. FLOAT yalnızca küçük bir hata payının kabul edilebilir olduğu durumlarda uygundur.
24. SQL’de pencere işlevi (window function) ile yinelenen satırları nasıl bulursunuz?
Yinelenenleri ROW_NUMBER() pencere işleviyle şöyle bulabilirsiniz:
WITH DuplicateCheck AS (
SELECT product_name,
category,
ROW_NUMBER() OVER(
PARTITION BY product_name, category
ORDER BY id
) AS row_num
FROM sales
)
SELECT *
FROM DuplicateCheck
WHERE row_num > 1;
Nasıl çalıştığını açıklayalım:
1. ROW_NUMBER(), sonuçtaki her satıra bir numara atar.
2. PARTITION BY, satırları product_name ve category’ye göre gruplar.
3. Her grup içinde satırlar 1’den başlayarak numaralandırılır.
4. row_num değeri 1’den büyük olanlar yinelenenleri gösterir.
Örneğin şu kayıtlar varsa:
- Ürün A, Kategori X, row_num = 1
- Ürün A, Kategori X, row_num = 2 (yinelenen)
- Ürün B, Kategori Y, row_num = 1
Sorgu, row_num değeri 1’den büyük olduğu için ikinci satırı gösterecektir.
25. MySQL’de parametreli saklı yordam (stored procedure) nasıl oluşturulur ve kullanılır? Bir örnekle açıklayın.
Saklı yordamlarla karmaşık sorguları kaydedip yeniden kullanarak veritabanı işlemlerini daha verimli ve sürdürülebilir hale getirebiliriz. Parametrelerle nasıl oluşturulup kullanılacağını pratik bir örnek üzerinden görelim.
Bir öğrenci veritabanımız olduğunu ve öğrencileri yaşa göre filtreleyen bir yordam oluşturmak istediğimizi varsayalım. Bunu şöyle yapabiliriz:
Önce, yaş parametresi alan basit bir saklı yordam oluşturalım:
CREATE PROCEDURE get_student_info(IN age INT)
BEGIN
SELECT * FROM student WHERE student.age = age;
END;
Bu yordamı kullanmak için istediğimiz yaşla CALL ederiz:
CALL get_student_info(21);
Çıkış parametreleri kullanarak yordamlarımızı daha gelişmiş hale getirebiliriz. Örneğin, belirli yaştaki öğrencileri sayan bir yordam oluşturalım:
CREATE PROCEDURE count_students_by_age(IN age INT, OUT student_count INT)
BEGIN
SELECT COUNT(*) INTO student_count FROM students WHERE students.age = age;
END;
Bu yordama ait sonucu almak için:
SET @count = 0;
CALL count_students_by_age(21, @count);
SELECT @count AS total_students;
26. Bir veritabanında başvuru bütünlüğü (referential integrity) neden önemlidir?
Başvuru bütünlüğü, tablolar arasındaki ilişkilerin doğru kalmasını sağlar. Bir yabancı anahtar oluşturduğumuzda, bir tablodaki değerlerin başvurulan tablodaki benzersiz değerlere karşılık gelmesini güvence altına alır.
Somut bir örnek: Bir e-ticaret veritabanı yönettiğinizi varsayalım. Bir Customers tablonuz ve bir Orders tablonuz var. Her sipariş gerçek bir müşteriye ait olmalıdır. Yabancı anahtarlar aracılığıyla uygulanan başvuru bütünlüğü, şu kuralları zorunlu kılar:
- Var olmayan bir müşteri için sipariş oluşturamazsınız.
- Mevcut siparişleri olan bir müşteriyi silemezsiniz (siparişlere ne olacağını özellikle yapılandırmadığınız sürece).
- Siparişleri olan bir müşterinin kimliğini güncelleyemezsiniz.
Dolayısıyla şöyle bir yabancı anahtar kısıtı oluşturduğunuzda:
ALTER TABLE Orders
ADD FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID);
Veritabanı bu kuralları otomatik olarak uygular:
-
Orderstablosundaki herCustomerID,Customerstablosunda var olmalıdır. -
Bu kuralları ihlal etmeye yönelik girişimler (örneğin geçersiz bir
CustomerIDeklemek) reddedilir.
Bu, gerçek müşterilere bağlanamayan siparişler veya müşteri bilgilerinin eksik olduğu raporlar gibi ciddi problemlere yol açabilecek tutarsızlıkları engeller.
Veritabanı Yöneticileri için MySQL Mülakat Soruları
Özellikle veritabanı yöneticisi rolüne başvuruyorsanız, işe alım uzmanlarının sorabileceği bazı sorular şunlardır.
27. Büyük bir uygulama neden veritabanı parçalamayı (sharding) kullanır? Bunun zorlukları nelerdir?
Büyük bir uygulama, büyük veriyi birden fazla sunucuya bölmek için veritabanı parçalamayı kullanır. Her parça (shard) verinin küçük bir kısmını içerir. Veri yükünü dağıttığı için üst düzey donanıma ihtiyaç kalmaz. Hız ve ölçeklenebilirlik de iyileşir; ancak bazı zorlukları da vardır:
- Join gibi bazı sorgular çalışmayabilir; bu da veri yönetimini karmaşıklaştırabilir.
- Veri büyüdüğünde parçalar aşırı yüklenebilir ve performansı yavaşlatan sıcak noktalar oluşabilir.
28. MySQL çökme kurtarmasında (crash recovery) redo log’ların rolünü açıklayın.
MySQL’de her veri değişikliğinin diske yazılması gerekir. Ancak doğrudan veri dosyalarına yazmak yavaş ve risklidir. Bu yüzden MySQL, herhangi bir veri dosyasını değiştirmeden önce yapacağı işlemleri önce redo log’a yazar. Bu, veri dosyalarını rastgele güncellemekten daha güvenlidir.
Diyelim ki bir müşterinin adresini güncelliyorsunuz:
- MySQL önce bu değişikliği redo log’a yazar.
- Ardından işleminizin gerçekleştiğini (commit) onaylar.
- Son olarak değişikliği gerçek veri dosyalarına uygular.
Çökme kurtarma, MySQL adım 1 veya 2’den sonra ama adım 3’ten önce çökerse önemlidir. MySQL yeniden başlatıldığında redo log’lara bakar ve orada kaydedilen değişiklikleri yeniden oynatarak tamamlanmamış işleri bitirir. Bu, MySQL en uygunsuz anda çökmüş olsa bile onaylanmış işlemlerin kaybolmamasını garanti eder.
29. MySQL’de mevcut farklı depolama motorları nelerdir ve nasıl farklılaşırlar?
MySQL birden fazla depolama motorunu destekler; her biri farklı kullanım senaryoları için optimize edilmiştir. En yaygın olanların karşılaştırması şöyledir:
| Depolama Motoru | Temel Özellikler | En Uygun |
|---|---|---|
| InnoDB | Varsayılan motor. ACID uyumlu, satır düzeyinde kilitleme, işlemler ve yabancı anahtarlar. | E-ticaret, finansal sistemler, veri bütünlüğü gerektiren her şey. |
| MyISAM | Hızlı okuma, tablo düzeyinde kilitleme. İşlemler veya yabancı anahtarlar yok. | Okuma ağırlıklı ve hızın bütünlükten daha önemli olduğu uygulamalar. |
| Memory | Veri RAM’de saklanır. Son derece hızlıdır ancak yeniden başlatmada kaybolur. | Önbellekleme, oturum yönetimi, geçici veriler. |
| CSV | Verileri düz CSV dosyaları olarak saklar. İndeks yok. | Uygulamalar arasında veri alışverişi veya basit düz dosya depolama. |
| Archive | Yüksek sıkıştırma. Yalnızca INSERT ve SELECT. İndeks yok. | Nadiren sorgulanan günlük verileri veya tarihsel kayıtlar. |
| NDB (Clustered) | Dağıtık depolama, yüksek erişilebilirlik, hata toleransı, işlem desteği. | Gerçek zamanlı performans gerektiren büyük ölçekli dağıtık uygulamalar. |
30. MySQL’de varsayılan bir depolama motoru nasıl ayarlanır?
Önce, mevcut varsayılan depolama motorunu kontrol edebilirsiniz:
SHOW ENGINES;
InnoDB, şu önemli özellikleri desteklediği için varsayılan motor olarak önerilir:
- ACID uyumlu işlemler
- Yabancı anahtar kısıtları
- Çökme kurtarma
- Satır düzeyinde kilitleme
Geçerli oturumum için varsayılan motoru geçici olarak değiştirmek için şunu kullanabilirsiniz:
SET default_storage_engine = 'InnoDB';
Kalıcı bir değişiklik için, MySQL yapılandırma dosyasında [mysqld] bölümüne şu satırı ekleyebilirsiniz:
default-storage-engine = InnoDB
31. MySQL’de bozulmuş (corrupted) tablolar nasıl onarılır?
Önce tüm veritabanlarını şu komutla kontrol edebilirsiniz:
mysqlcheck --check --all-databases -u root -p
Bu komut tüm tabloları tarar ve herhangi bir bozulma varsa raporlar. Ardından tabloyu onarmak için şu sorguyu çalıştırabilirsiniz:
mysqlcheck --repair database_name table_name -u root -p
Ağır bozulma durumlarında onarım veri kaybına yol açabileceğinden mutlaka yedek alınız.
Senaryo Tabanlı ve Problem Çözme MySQL Mülakat Soruları
Bu sorular, gerçek dünyadaki karmaşık senaryolarla deneyiminizi ve problem çözme becerilerinizi ölçer.
32. MySQL’de alt sorguları kullandığınız bir senaryoyu açıklayın.
Bu tür bir soruya şöyle yanıt verebilirsiniz:
Son işimde bir e-ticaret mağazası veritabanını yönettim ve bir ürün raporu hazırlamam gerekiyordu. Amaç, ortalamanın üzerinde satış üreten ürünleri bulmaktı; bu da çok adımlı bir analizi gerçekleştirmek için alt sorgular kullanmayı gerektiriyordu.
Bunu çözmek için geliştirdiğim SQL sorgusu:
SELECT
p.product_id,
p.product_name,
s.sales_amount
FROM products p
JOIN sales s ON p.product_id = s.product_id
WHERE s.sales_amount > (
SELECT AVG(sales_amount)
FROM sales
)
ORDER BY s.sales_amount DESC;
Öncelikle tüm ürünlerdeki ortalama satış tutarını hesaplayarak bir temel belirledim. Bunu yapmak için, satış tablosundan AVG(sales_amount) hesaplayan bir alt sorguyu WHERE koşulunda kullandım. Bu alt sorgu, her ürünün performansını ölçmek için dinamik bir eşik görevi gördü.
Ana sorgu daha sonra ürün ve satış tablolarını birleştirerek ilgili ürün detaylarını çekti; WHERE koşulu ise hesaplanan ortalamanın altındaki ürünleri filtreledi.
Sorguyu bu şekilde yapılandırarak, birden fazla ayrı sorgu çalıştırmak yerine tek bir veritabanı işlemiyle yüksek performanslı ürünleri belirleyebildim.
33. Birden fazla tablodan veriyi birleştirmek için SQL join’lerini kullandığınız bir durumu açıklayabilir misiniz?
Yukarıdaki soruya örnek bir yanıt:
Yakın zamanda üzerinde çalıştığım bir projede iki ana tablo vardı — biri ürün satış verilerini, diğeri ürün detaylarını içeriyordu. Görevim, sales, product name, category ve price bilgilerini gösteren bir rapor oluşturmaktı.
İlgili verileri birleştirmek için, satış işlemlerini ürün detaylarıyla ilişkilendirmek üzere ortak sütun product_id üzerinde INNER JOIN kullandım:
SELECT
s.sales_date,
p.product_name,
p.category,
s.quantity_sold,
p.price
FROM
sales s
INNER JOIN
products p
ON
s.product_id = p.product_id;
Rapor, satış eğilimlerine net bir bakış sağladı ve paydaşların hangi ürün kategorilerinin iyi performans gösterdiğini, hangilerinin ilgiye ihtiyaç duyduğunu belirlemesine yardımcı oldu.
34. Tetikleyicilerle ilgili deneyiminiz var mı? Nasıl kullandığınızı açıklayın.
Yukarıdaki soruya örnek bir yanıt:
Evet, veritabanı tetikleyicileriyle kapsamlı deneyimim var. Son görevimde, fiyat değişikliği denetimi için bir AFTER UPDATE tetikleyicisi uyguladım.
Spesifik uygulamayı anlatayım: Bir ürünün fiyatı her değiştiğinde fiyat geçmişini otomatik olarak kaydeden bir tetikleyici oluşturdum. Geliştirdiğim SQL betiği şöyleydi:
CREATE TRIGGER tr_AuditPriceChanges
AFTER UPDATE ON Products
FOR EACH ROW
BEGIN
-- Only log if the price actually changed
IF OLD.UnitPrice <> NEW.UnitPrice THEN
INSERT INTO PriceAudit (
ProductID,
OldPrice,
NewPrice,
ChangedBy,
ChangeDate,
PercentageChange
)
VALUES (
NEW.ProductID,
OLD.UnitPrice,
NEW.UnitPrice,
CURRENT_USER(),
NOW(),
ROUND(((NEW.UnitPrice - OLD.UnitPrice) / OLD.UnitPrice * 100), 2)
);
END IF;
END;
Bu çözümü özellikle etkili kılanlar şunlardı:
- Yalnızca gerçekten fiyat değişikliği olduğunda tetiklenmesi.
SYSTEM_USERkullanılarak değişikliği yapan kullanıcının yakalanması.- Raporlama amacıyla yüzde değişimin hesaplanması.
- Diğer sütun güncellemelerinden kaynaklanabilecek değişiklik dışı durumları elemek için
WHEREkoşulu içermesi.
Ayrıca, NULL fiyatlarla ilgili bazı uç durumlar fark ettiğimizde hata yönetimi ve günlüklemeyi ekledim.
MySQL Mülakatına Hazırlık İpuçları
Kariyerinize yeni başlıyorsanız, yaklaşan mülakatınızı başarıyla geçmenize yardımcı olacak birkaç ipucu:
MySQL çekirdek kavramlarında ustalaşın: Veri tabanı temellerini indeksleme, işlemler ve sorgu eniyileyici ile birlikte öğrenin. MySQL’in sorguları nasıl işlediğini ve veri depolamayı nasıl yönettiğini anlayın. Bu, verimli sorgular yazmanıza ve mülakatta çözümlerinizi açıklamanıza yardımcı olur.
Uygulamalı deneyim edinin: MySQL’i bilgisayarınıza kurun ve düzenli olarak pratik yapın. Test veritabanları oluşturun, farklı türde sorgular yazın ve bunları eniyilemeye çalışın. Gerçek pratik, her şeyin nasıl çalıştığını öğrenmenin ve mülakat için özgüven kazanmanın en iyi yoludur.
Bilginizi tazelemek için DataCamp’in kaynaklarına göz atın:
- SQL’e giriş için: Introduction to SQL Course
- SQL pratiği için: Applying SQL to real-world problems
MySQL araçları ve entegrasyonları hakkında bilgi edinin: MySQL Workbench veya diğer veritabanı yönetimi ve temel izleme araçlarına aşina olun. Ayrıca MySQL’in Python ile nasıl çalıştığını ve ilgili çerçeveleri keşfedebilir, böylece gerçek bir geliştirme ortamında çalışabileceğinizi gösterebilirsiniz.
Sonuç
İşte bu kadar! Bir sonraki işinizi kazanmanıza yardımcı olmak için en popüler 34 MySQL mülakat sorusunu ele aldım. İster giriş seviyesi bir role ister ileri düzey bir veri yöneticisi pozisyonuna başvuruyor olun, öne çıkmak için MySQL temellerine, sorgu eniyilemeye ve veritabanı yönetimine sağlam bir şekilde hâkim olmanız gerekir.
Diğer veritabanı yönetim sistemleri konusundaki bilginizi daha da genişletmek için DataCamp’in SQL kurslarına göz atın.
Karmaşık konuları basitleştirmeyi seven bir içerik stratejistiyim. Splunk, Hackernoon ve Tiiny Host gibi şirketlerin hedef kitleleri için ilgi çekici ve bilgilendirici içerikler üretmelerine yardımcı oldum.

