Kurs
MySQL'in neredeyse her veritabanı ile ilgili iş ilanında arandığını hiç fark ettiniz mi? Bunun iyi bir nedeni var — MySQL, favori sosyal medya platformlarınızdan 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, üst düzey rollerin gerektirdiği karmaşık konulara kadar tüm başlıkları ele alacağım. Ayrıca, bir sonraki veri odaklı mülakatlarınızda kendinizden emin görünmenize yardımcı olacak bazı ipuçlarını da paylaşacağım.
MySQL nedir?
MySQL, verileri yapılandırılmış tablolarda düzenleyen, SQL üzerine kurulmuş açık kaynaklı bir RDBMS'dir (ilişkisel veritabanı yönetim sistemi). Oracle Corporation tarafından geliştirilmiştir.
Daha fazla işletme verilerini MySQL'e taşıdığı için 2024'ün en popüler DBMS'i olarak sıralandı. Bu nedenle bir veritabanı işi planlıyorsanız, MySQL ve ilişkisel veritabanları konusunda bilgi sahibi olmanız çok önemlidir.

Haziran 2024 itibarıyla MySQL, 1061 sıralama puanıyla dünyanın en popüler açık kaynak veritabanı yönetim sistemi (DBMS)'dir. Kaynak: Statista.
Temel MySQL Mülakat Soruları
İlk mülakat aşamasında, mülakatçı temel veritabanı ve MySQL kavramlarına hâkimiyetinizi ölçmek için temel sorular sorabilir.
1. Veritabanı nedir ve DBMS'den 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ğenen kişilere ilişkin verileri veritabanlarında saklar.
DBMS (Database Management System), kullanıcılar oluşturup erişimlerini yöneterek bu verilerle etkileşim kurmamızı ve verileri yönetmemizi sağlayan yazılımdır. MySQL en popüler DBMS seçeneklerinden biridir. Diğer örnekler arasında PostgreSQL, MongoDB ve Microsoft SQL Server bulunur.
2. MySQL, diğer ilişkisel veritabanı yönetim sistemlerinden nasıl farklıdır?
MySQL, verileri yönetmek için SQL kullanan açık kaynaklı bir ilişkisel veritabanı yönetim sistemidir (RDBMS). Kullanım kolaylığı, hızı ve web tabanlı uygulamalarla uyumluluğuyla bilinir.
MySQL'in diğer RDBMS'lerden farkları şunlardır:
- Sadelik ve performans: MySQL, sadeliği ve optimize edilmiş performansı nedeniyle sıklıkla övülür; bu da onu web geliştiricileri ve start-up’lar için başvurulan bir seçenek yapar.
- Gelişmiş özellikler: MySQL kullanım kolaylığında başarılı olsa da, PostgreSQL gibi diğer RDBMS'lerde bulunan daha kapsamlı ACID işlem desteği, gelişmiş indeksleme ve daha geniş veri türü seti gibi ileri seviye özelliklerde eksik kalabilir.
- Depolama motorları: MySQL, tablolar için farklı depolama motorları (ör. InnoDB, MyISAM) seçmenize olanak tanır ve belirli kullanım senaryoları için esneklik sağlar.
MySQL, hız ve ölçeklenebilirliğin gerektiği senaryolar için idealdir; ancak daha karmaşık veya kurumsal düzeyde özellikler için PostgreSQL daha iyi bir seçenek olabilir.
3. MySQL’de mevcut başlıca veri türleri nelerdir?
MySQL, şu kategorilerde çeşitli veri türlerini destekler:
- Sayısal:
INT,DECIMAL,FLOAT,DOUBLEvb. - Metin:
CHAR,VARCHAR,TEXT,BLOB. - Tarih/saat:
DATE,DATETIME,TIMESTAMP,TIME. - JSON: JSON nesnelerini depolamak için.
4. INT ve DECIMAL veri türleri arasındaki fark nedir?
INT, ondalık basamak içermeyen tam sayıları saklar. Kesirlere ihtiyaç yoksa kullanabiliriz. Buna karşılık, DECIMAL finansal değerleri saklayabilir ve ondalıklı hassas hesaplamalar için uygundur.
5. MySQL’de DATE ile DATETIME arasındaki fark nedir?
DATE işlevi, tarihi yıl, ay ve gün biçiminde saklar:
YYYY-MM-DD
Buna karşın DATETIME, tarihi saat ile 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 tablodaki bir alanın başka bir tablonun birincil anahtarına bağlanmasıdır.
Örneğin, müşteri bilgilerini saklayan 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 alımı customers tablosundaki belirli bir müşteriye bağlar.
SQL'de bu şu şekilde 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 göre 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ğ tablodaki 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 şekilde, sağ tablodaki tüm satırları ve sol tablodaki eşleşen satırları döndürür. - FULL JOIN:
LEFT JOINveRIGHT JOINsonuçlarını birleştirir; her iki tablodan eşleşmeyen satırlar da dâhildir.
8. MySQL’de DELETE, TRUNCATE ve DROP arasındaki fark nedir?
DELETE, TRUNCATE ve DROP gibi komutlar benzer gelebilir ancak davranışları farklıdır:
- DELETE: Bir koşula bağlı olarak tablodan satırları siler. Bir işlemin (transaction) içindeyse geri alınabilir. Örnek:
DELETE FROM employees WHERE department_id = 5;
- TRUNCATE: Tablodaki tüm satırları siler ancak tablo yapısı kalır.
DELETE'ten daha hızlıdır ve geri alınamaz. Örnek:
TRUNCATE TABLE employees;
- DROP: Tablo yapısını ve verilerini, 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şturma:
CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), department VARCHAR(50));
- Sütun eklemek için değiştirme:
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üresince var olur. Oturumu kapattığımızda tablo silinir. Bu tablo türü, ara sonuçları geçici olarak depolayabilir. 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 (nested query olarak da bilinir), başka bir sorgunun içine gömülüdür. Karmaşık veritabanı işlemlerini daha yönetilebilir adımlara böler. Örneğin, ortalamanın üzerinde kazanan çalışanları bulmak için bir alt sorgu oluşturabilirsiniz:
SELECT first_name, last_name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);
Bunu şöyle parçalayalım:
- İç sorgu
SELECT AVG(salary) FROM employeesönce ortalama maaşı hesaplar. - Dış sorgu daha sonra 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ı?
INSERT() ifadesini bir tabloya veri eklemek için kullanabiliriz. Temel sözdizimi şöyledir:
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
INSERT() ifadesini kullanırken izleyebileceğiniz 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ı daha sonra değişirse hataları önler.
AUTO_INCREMENTgibi kimlik sütunları için, bunlarıINSERT()ifadesinde atlayın. MySQL, yinelenen kimlikleri önlemek için bunları otomatik olarak yönetir.- Dize tırnaklarında tutarlı olun. Kişisel olarak tek tırnak tercih ederim, ancak her ikisi de çalışır.
- Birden çok satır ekliyorsanız, performans için tek bir ifadede 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, artan sayılar üretir.
İşte AUTO_INCREMENT sütunu olan bir 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 tablo gibi çalışan kaydedilmiş bir sorgudur. Bununla, karmaşık bir sorguyu alıp ona bir ad verebilir ve gelecekteki sorgular için bir tablo gibi kullanabiliriz. Böylece her seferinde tüm sorguyu yeniden yazmanız gerekmez.
Örneğin, çalışan detaylarını departman 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;
employee_details görünümünü artık bir tablo gibi sorgulayabilirsiniz:
SELECT * FROM employee_details;
Ancak görünümleri verileri eklemek ve güncellemek için kullanamayız. Çoğu salt okunur seçeneği destekler ve kullanıcıların veritabanına erişimini sınırlandırarak veri güvenliğini artırır. Görünümler, her erişildiğinde alttaki sorguyu çalıştırdıkları için bazen sorguları yavaşlatabilir.
Orta Düzey MySQL Mülakat Soruları
Bu bölümde orta seviye konuları ele alacağız. Bu sorular, ağırlıklı olarak MySQL veri türleri ve yapısına ilişkin bilginizi test etmek amacıyla sorulur.
15. Sistem sürümlü (system-versioned) tablolar nedir ve nasıl çalışır?
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.
Çalışma şekilleri; her satırın geçerli olduğu zamanı kaydetmek için iki ek sütun — StartTime ve EndTime — eklemektir. Veri eklediğimizde, güncellediğimizde veya sildiğimizde bu zaman damgaları güncellenir:
- Insert: Yeni bir satır eklenir;
StartTimemevcut zaman damgasına,EndTimeise9999-12-31 23:59:59(veya “sonsuz”u temsil eden benzer bir değere) ayarlanır. Bu, satırın şu anda geçerli olduğunu gösterir. - Update: Orijinal satırın
EndTime'ı, 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;StartTimemevcut zaman damgasına,EndTimeise “sonsuz”a ayarlanır. - Delete: Mevcut satırın
EndTime'ı, 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 durumunu veya bir zaman aralığı içindeki durumunu sorgulayabilirsiniz. Örneğin:
FOR SYSTEM_TIME AS OF '2024-01-01': Tablonun 1 Ocak 2024 tarihindeki durumunu 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ü garanti ederler.
Kullanımları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ça bir değer sağlanmadığında bir sütuna varsayılan bir değer atar. Bu, kullanıcı veri girişi sırasında sütunu atlamış olsa bile sütunun geçerli olmasını sağlar.
İşte varsayılan değere sahip bir tablo oluşturma örneği:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
status VARCHAR(10) DEFAULT 'active'
);
Daha sonra, 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ı ayrıca ele alma ihtiyacını ortadan kaldırarak sorguları basitleştirir.
Sonuç:
|
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 şu açılardan faydalıdır:
- Geliştiricilerin sorgu yazmadan önce tablo şemasını anlamalarına yardımcı olur.
- Özellikle yabancı olduğunuz veritabanlarıyla çalışırken hata ayıklama için kullanılabilir.
- Birincil anahtarlar veya varsayılanlar gibi kısıtları hızlıca belirler.
19. SQL’de metin yönetimi için dize (string) işlevlerini nasıl kullanırsınız?
SQL’de farklı dize işlevleri, isimler 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 veya küçük harfe dönüştürür.CONCAT()işlevi, ad ve soyadı tek bir sütunda birleştirir.SUBSTRING(), metnin belirli kısımlarını çıkarır. Örneğin, doğum tarihinden ay bilgisini ayırmak için kullanabiliriz.
İşte bir örnek 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ı tam ada birleştirir.
birthdatesütunundan doğum ayını çıkarır.- Soyadlardan boşlukları kırpar.
- Adlarda geçen "a" harflerinin tümünü "@" ile değiştirir.
20. SQL ile veritabanındaki belirli bir satırı nasıl güncellersiniz?
UPDATE ifadesini ve değiştirilecek kaydı belirlemek 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 koşulu başlığı “Inception”, yılı “2010” olan satırı hedefler.
İleri Düzey MySQL Mülakat Soruları
İleri düzey sorular, karmaşık MySQL senaryolarını yönetme becerinizi test eder ve mülakatçıya 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 eylemler bütünüdür. INSERT, UPDATE veya DELETE gibi olaylardan önce veya sonra çalışacak şekilde yapılandırılabilirler.
Örneğin, yeni siparişlerin eklendiği bir orders tablosu olduğunu varsayalım. Her yeni siparişi 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?
İndeks yoksa, veritabanı belirli bir kaydı bulmak için her satırı taramak zorunda kalır. İndeks, bir içindekiler tablosu gibi davranarak veritabanının ilgili satırlara doğrudan erişmesini sağlar. Dolayısıyla, indeks eklemek arama süresini kısaltır ve sorguların daha hızlı çalışmasını sağlar.
İndeksler genellikle B-tree veya hash tabloları gibi veri yapıları kullanılarak uygulanır; bu sayede veritabanı aramaları, bakış (lookup) işlemlerini ve aralık taramalarını verimli şekilde gerçekleştirebilir.
İndeks oluşturma örneği:
-- İndeks olmadan:
SELECT * FROM employees WHERE last_name = 'Smith';
-- last_name sütununda indeks ekleme:
CREATE INDEX idx_last_name ON employees(last_name);
-- İndeks ile, veritabanı last_name sütununda 'Smith' olan satırları hızla bulabilir.
İndekslerin bazı dezavantajları 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ürlerini kullanırız ve neden?
Ağırlığı saklamak için FLOAT veya REAL veri türünü kullanırız; çünkü ağırlık genellikle ondalık değerler içerir ve küçük bir hata payını tolere eder. Bu veri türleri yaklaşık değerleri depolayabildiği için ağırlık sütunları için daha uygundur.
DECIMAL veri türü, fiyatları depolamak için yaygın olarak kullanılır; çünkü fiyat gibi finansal değerler, en küçük yuvarlama hatasını bile kabul etmez. Bu hassasiyet sadece ondalık veri türüyle sağlanır (ör. on basamaklı, ondalıktan sonra 2 basamak için DECIMAL(10, 2)).
24. SQL’de bir pencere işlevi (window function) ile yinelenen satırları nasıl bulursunuz?
ROW_NUMBER() pencere işlevini kullanarak yinelenenleri şu şekilde 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;
Bu nasıl çalışır, açıklayalım:
1. ROW_NUMBER() sonuç kümesindeki 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 yineleneni 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 olan 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 hâle getirebiliriz. Parametrelerle nasıl oluşturup kullanacağımızı pratik bir örnekle görelim.
Diyelim ki bir öğrenci veritabanımız var ve öğrencileri yaşa göre filtreleyen bir yordam oluşturmak istiyoruz. 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ş ile CALL ederiz:
CALL get_student_info(21);
Çıktı parametreleri kullanarak yordamlarımızı daha da gelişmiş hâle 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 yordamdan sonuç 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. Yabancı anahtar oluşturduğumuzda, bir tablodaki değerlerin başvurulan tablodaki benzersiz değerle eşleşmesini güvence altına alır.
Pratik bir örnek: Bir e-ticaret veritabanı yönettiğinizi varsayalım. Bir Customers tablonuz ve bir Orders tablonuz var. Her siparişin gerçek bir müşteriye ait olması gerekir. Yabancı anahtarlarla uygulanan başvuru bütünlüğü, şu kuralları dayatarak bu ilişkiyi sağ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ı özel olarak yapılandırmadığınız sürece).
- Siparişleri olan bir müşterinin kimliğini (ID) güncelleyemezsiniz.
Dolayısıyla şu şekilde 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 bulunmak zorundadı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 bilgileri eksik raporlar gibi ciddi sorunlara yol açabilecek veri tutarsızlıklarını önler.
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 burada.
27. Büyük bir uygulama neden veritabanı parçalama (sharding) kullanır? Ayrıca bunun zorluklarından bahsedin.
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 bölümünü içerir. Veri yükünü dağıttığı için üst düzey donanıma ihtiyaç kalmaz. Hız ve ölçeklenebilirlik de artsa da bazı zorlukları 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üklenip sıcak noktalar (hotspot) oluşturabilir ve performansı düşürebilir.
28. MySQL çökme (crash) kurtarmasında redo log’ların rolünü açıklayın.
MySQL’de veriler her değiştirildiğinde diske yazılması gerekir. Ancak doğrudan veri dosyalarına yazmak yavaş ve risklidir. Bu nedenle MySQL, herhangi bir veri dosyasını değiştirmeden önce ne yapacağını önce redo log’a yazar. Bu, veri dosyalarını rastgele güncellemekten daha güvenlidir.
Diyelim ki bir müşterinin adresini güncellediniz:
- MySQL önce bu değişikliği redo log’a yazar.
- Daha sonra işleminizin (transaction) onaylandığını bildirir.
- Son olarak değişikliği gerçek veri dosyalarına uygular.
Çökme kurtarma, MySQL adım 1 veya 2’den sonra ama 3’ten önce çökerse önemlidir. MySQL yeniden başlatıldığında redo log’larına bakar ve redo log’larda kaydedilen değişiklikleri yeniden oynatarak yarım kalan işleri tamamlar. Bu, MySQL en uygunsuz anda çökse bile onaylanmış işlemlerin kaybolmamasını garanti eder.
29. MySQL’de mevcut farklı depolama motorları nelerdir ve nasıl ayrışı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 |
Özellikler |
Kullanım alanları |
|
InnoDB |
- Varsayılan depolama motoru. - ACID uyumlu. - Satır düzeyinde kilitleme. - İşlemler ve yabancı anahtar desteği. |
E-ticaret platformları veya finansal sistemler gibi yüksek veri bütünlüğü gerektiren uygulamalar. |
|
MyISAM |
- Okuma ağırlıklı işlemlerde hızlı. - Tablo düzeyinde kilitleme. - İşlem veya yabancı anahtar desteği yok. |
Veri bütünlüğünden çok hızın kritik olduğu okuma yoğun uygulamalar. |
|
Memory |
- Verileri RAM’de saklar. - Son derece hızlı. - Yeniden başlatmada veri kaybı olur. - Sınırlı boyut. |
Geçici veri depolama, önbellekleme veya oturum yönetimi. |
|
CSV |
- Verileri düz CSV dosyalarında saklar. - Harici araçlarla kolay entegrasyon. - İndeks desteği yok. |
Uygulamalar arası veri alışverişi veya karmaşık sorgu ihtiyacı olmayan basit veri depolama. |
|
Archive |
- Yüksek sıkıştırma için optimize edilmiştir. - Yalnızca INSERT ve SELECT destekler. - İndeks yok. |
Veriye seyrek erişilen tarihsel veya günlük verilerinin depolanması. |
|
NDB (Clustered) |
- MySQL Cluster için dağıtık depolama. - Yüksek erişilebilirlik ve hata toleransı. - İş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çici olarak mevcut oturum için varsayılan motoru değiştirmek isterseniz ş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ş tabloları (corrupted tables) nasıl onarırsınız?
Önce tüm veritabanlarını şu komutla kontrol edebilirsiniz:
mysqlcheck --check --all-databases -u root -p
Bu komut tüm tabloları tarar ve bir bozulma varsa raporlar. Ardından tabloyu onarmak için şu komutu ç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, verileri yedeklediğinizden emin olun.
Senaryo Tabanlı ve Problem Çözme MySQL Mülakat Soruları
Bu sorular, gerçek dünyadaki karmaşık senaryolara dair deneyiminizi ve problem çözme yeteneklerinizi ö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ı bu analizi gerçekleştirmek için alt sorgular kullanmayı gerektiriyordu.
Bunu çözmek için geliştirdiğim SQL sorgusu şudur:
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;
Önce, satış tablosundan AVG(sales_amount) hesaplayan bir alt sorgu ile tüm ürünler için ortalama satış tutarını hesaplayarak bir referans değeri belirledim. Bu alt sorgu, her ürünün performansının ölçülebileceği 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 satışlara sahip ürünleri filtreledi.
Sorguyu bu şekilde yapılandırarak, birden çok ayrı sorgu çalıştırmak yerine tek bir veritabanı işlemiyle yüksek performanslı ürünleri belirleyebildim.
33. SQL join’lerini kullanarak birden çok tablodan verileri birleştirdiğiniz bir durumu açıklayabilir misiniz?
Yukarıdaki soruya örnek bir cevap şudur:
Yakın zamanda, birinde ürün satış verileri, diğerinde ürün detayları bulunan iki ana tabloyla çalıştığım bir projedeydim. 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ına bağlamak amacıyla ortak sütun olan 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ış sundu ve paydaşların hangi ürün kategorilerinin iyi performans gösterdiğini, hangilerinin ise ilgi gerektirdiğini 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ı tetikleyicileri konusunda 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ı değiştiğinde fiyat geçmişini otomatik olarak kaydeden bir tetikleyici oluşturdum. Geliştirdiğim SQL betiği şöyledir:
CREATE TRIGGER tr_AuditPriceChanges
ON Products
AFTER UPDATE AS
BEGIN
-- Yalnızca fiyat gerçekten değiştiyse çalışsın
IF UPDATE(UnitPrice)
BEGIN
INSERT INTO PriceAudit (
ProductID,
OldPrice,
NewPrice,
ChangedBy,
ChangeDate,
PercentageChange
)
SELECT
i.ProductID,
d.UnitPrice AS OldPrice,
i.UnitPrice AS NewPrice,
SYSTEM_USER,
GETDATE(),
ROUND(((i.UnitPrice - d.UnitPrice) / d.UnitPrice * 100), 2)
FROM INSERTED i
JOIN DELETED d ON i.ProductID = d.ProductID
WHERE i.UnitPrice <> d.UnitPrice;
END
END;
Bu çözümü özellikle etkili kılan unsurlar şunlardı:
- Yalnızca gerçekten fiyat değişikliği olduğunda tetiklenmesi.
- Değişikliği yapan kullanıcıyı
SYSTEM_USERile yakalaması. - Raporlama amacıyla yüzde değişimini hesaplaması.
- Diğer sütun güncellemelerinden kaynaklanan sahte “değişiklikleri” hariç tutmak için bir
WHEREkoşulu içermesi.
Ayrıca, NULL fiyatlarla ilgili bazı uç durumları fark ettiğimizde hata yönetimi ve günlükleme 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’in temel kavramlarında ustalaşın: Veritabanı temellerini indeksleme, işlemler ve sorgu iyileştiriciye kadar öğ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 kazanın: Bilgisayarınıza MySQL’i kurun ve düzenli olarak pratik yapın. Test veritabanları oluşturun, farklı türde sorgular yazın ve bunları optimize etmeye çalışın. Gerçek pratik, işlerin nasıl yürüdüğünü öğrenmenin ve mülakat için güven inşa etmenin 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ını öğrenin: Veritabanı yönetimi ve temel izleme için MySQL Workbench veya diğer araçlara aşina olun. Ayrıca MySQL’in Python ile nasıl çalıştığını ve ilgili çerçeveleri keşfederek gerçek bir geliştirme ortamında çalışabileceğinizi gösterin.
Sonuç
İşte bu kadar! Bir sonraki işinizi almanıza yardımcı olmak için en popüler 34 MySQL mülakat sorusunu ele aldım. İster başlangıç seviyesinde bir role, ister ileri düzey bir veri yöneticisi pozisyonuna başvuruyor olun, öne çıkmak için MySQL temellerine, sorgu optimizasyonuna ve veritabanı yönetimine sağlam bir şekilde hâkim olmalısınız.
Diğer veritabanı yönetim sistemleri hakkındaki bilginizi 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.

