# Temel SQL SQL programlama dilinin iliÅkisel veri tabanı yönetim sistemlerinde veya iliÅkisel formattaki veri tabanlarında veri sorgulama dili olduÄundan bahsetmiÅtik. Åimdi bu sorgulama diliyle yapılabilecekleri yukarıdaki veri tabanını örnek alarak inceleyelim. ## DDL SQL Komutları (Data Definition Language) DDL komutları veri tabanı ve tablolar üzerinde yapısal deÄiÅiklikler yapmayı saÄlar. ### Veri tabanı oluÅturmak ``` CREATE DATABASE mycompany_db; ``` CREATE DATABASE SQL komutu ile yeni bir veri tabanı yaratabilirsiniz. ### Veri tabanını seçmek ``` USE mycompany_db; ``` USE komutu ile çalıÅmak istediÄiniz veri tabanını seçebiliyorsunuz. Biliyorsunuz ki veri tabanı yönetim sistemleri birden fazla veri tabanı içerebilirler. Hangi SQL komutlarının hangi veri tabanında çalıÅtırılacaÄı USE komutu ile belirtilir. ### Tablo oluÅturmak Veri tabanını oluÅturduktan sonra veri tabanı içinde birden fazla tablo oluÅturabiliriz. ``` CREATE TABLE employees ( emp_no INT NOT NULL, birth_date DATE NOT NULL, first_name VARCHAR(14) NOT NULL, last_name VARCHAR(16) NOT NULL, gender ENUM ('M','F') NOT NULL, hire_date DATE NOT NULL, PRIMARY KEY (emp_no) ); ``` Yukarıda CREATE TABLE komutu ile yeni bir tablo oluÅturuyoruz. Bu komuttan hemen sonra tablo isminin ne olacaÄını yazıyoruz. Biz âemployeesâ isminde bir tablo oluÅturduk. Tabloyu oluÅtururken bu iliÅkisel veri formatında hangi sütunlar yer alacak onları belirtiyoruz. Bu sütunlar hatırlayacaksanız ki varlıÄın nitelikleriydi. Bu niteliklere sütun isimleri ve veri tipinin ne olacaÄını veriyoruz. Bu konuda veri tipleri detaylı iÅlenmeyecektir. İlgili veri tipleri veri tabanı yönetim sistemlerinin resmi dokümanlarında bulabilirsiniz. Sütunların isimlerini ve veri tiplerini girdikten sonra artık tabloda hangi sütunun Primary Key olacaÄını belirtmek gerekiyor. Bunun için âPRIMARY KEYâ komutu kullanılır. Bu komuttan hemen sonra () parantezler içinde tekil anahtar olarak kullanmak istediÄiniz sütunun ismini yazarsınız. Bu örnekte âemp_noâ sütunu âemployeesâ tablosunun. PRIMARY KEYâi olacaktır. Foreign Key ile İliÅkili tablolar yaratmak Foreign Key (Yabancı Anahtar) hatırlayacaÄınız üzere bir tablo ile diÄeri arasında iliÅki kurmayı saÄlıyordu. ``` CREATE TABLE salaries ( emp_no INT NOT NULL, salary INT NOT NULL, from_date DATE NOT NULL, to_date DATE NOT NULL, FOREIGN KEY (emp_no) REFERENCES employees (emp_no) ON DELETE CASCADE, PRIMARY KEY (emp_no, from_date) ); ``` Yukarıda âsalariesâ isminde bir tablo oluÅturuyoruz. Yukarıda tablo oluÅturmak için bahsettiÄimiz her Åey burada da geçerlidir. Fakat, bu SQL komutunda bir fark bulunmaktadır. âsalariesâ tablosu ile âemployeesâ tablosu arasında bire-çok iliÅki bulunmaktadır. FOREIGN KEY komutu ile iki tablo arasında bir iliÅki kuruyoruz. Bu komuttan hemen sonra () parantezler arasında âsalariesâ tablosunda hangi sütunun FOREIGN KEY verisini tutacaÄını belirtiyoruz. Böylece, âemployeesâ tablosunda hangi çalıÅan ise onun tekil verisi bu sütunda tutulacaktır. Ardından REFERENCES komutu ile hangi tablo ile iliÅki kurmak istiyorsak onun ismini yazıyoruz. Bu örnekte âemployeesâ tablosu ile iliÅki kuracaÄımız için onun ismini yazdık. İliÅki kurulacak tabloyu belirledikten sonra () içine bu tablonun hangi sütununu kullanacaÄımızı belirtiyoruz. Genellikle iliÅki kurulan tablonun PRIMARY KEY sütunu burada belirtilir. Bizim örneÄimizde âemployeesâ tablosu olduÄu için onun âemp_noâ isimli PRIMARY KEY sütunuyla iliÅki kuruyoruz.  Yukarıda âsalariesâ tablosuna ait kayıtlar görülmektedir. Tablodaki âemp_noâ sütunundaki veriler iliÅki kurduÄumuz âemployeesâ tablosunun PRIMARY KEY alanından gelmektedir. Böylece, her çalıÅana ait ne kadar maaÅ kaydı var bulmak çok kolay oluyor. ### Veri tabanı silmek ``` DROP DATABASE mycompany_db; ``` DROP DATABASE komutundan sonra silinmesini istediÄimiz veri tabanı ismini veririz. Böylece veri tabanı silinmiÅ olur. ### Tablo silmek ``` DROP TABLE salaries; ``` **DROP TABLE** komutundan sonra tümüyle silinmesini istediÄimiz tablonun ismini yazıyoruz. Tablo yapısal olarak içindeki verilerle birlikte silinir. Tablo verilerini tümüyle silmek ``` TRUNCATE TABLE salaries; ``` TRUNCATE TABLE komutu ile tabloyu yapısal olarak koruyarak sadece içindeki verilerin silinmesini saÄlayabiliriz. ### Tabloyu yapısal olarak deÄiÅtirmek Tablolar üzerinde bazen yeni sütun eklemek çıkarmak veya deÄiÅtirmek gerekir. Bu yapısal anlamda tabloyu deÄiÅtirmek demektir. Tabloya yeni bir sütun eklemek ``` ALTER TABLE salaries ADD COLUMN yeni_sutun VARCHAR(10); ``` âsalariesâ tablosuna âyeni_sutunâ isminde bir alan eklemek istediÄimizi düÅünelim. Bu durumda ALTER TABLE komutundan sonra deÄiÅiklik yapılacak tablonun ismi verilir. ADD COLUMN komutundan sonra yeni sütunun ismi verilir. Yeni sütunu tanımlarken veri tipinin ne olacaÄı da mutlaka belirtilmelidir. Bu örnekte maksimum 10 karakter uzunluÄunda yazı tabanlı bir veri tutacaÄımızı söylüyoruz. ### Tablodan bir sütunu silmek ``` ALTER TABLE salaries DROP COLUMN yeni_sutun; ``` DROP COLUMN komutu ile silmek istediÄimiz sütunu tablodan çıkarabiliriz. ### Tablonun bir sütununu deÄiÅtirmek ``` ALTER TABLE salaries MODIFY yeni_sutun INT(10); ``` Tabloda bir sütunun veri tipini veya ismini deÄiÅtirmek isteyebiliriz. Sütun üzerinde deÄiÅiklik yapabilmek için MODIFY komutu kullanılabilir. ## DML SQL Komutları (Data Manipulation Language) DML komutları ile tablolardaki veriler üzerinde sorgulama, deÄiÅtirme ve silme iÅlemleri uygulayabiliriz. ### Tablodan veri çekmek ``` select * from employees; ``` SELECT komutu ile tablodan veri çekeceÄimizi belirtiyoruz. FROM kelimesi ile hangi tablodan bu verinin alınacaÄını belirtiyoruz. * iÅareti tabloda ne kadar sütun varsa hepsini sorgu ve getir demektir. ``` select * from employees where emp_no = 10004; ``` yukarıdaki örnekte ise koÅullu bir sorgulama iÅlemi yapıyoruz. WHERE komutundan sonra sorgunun koÅulunu oluÅturuyoruz. WHEREâden sonra birden fazla sorgulama koÅulu verebilirsiniz. Bu örnekte âemp_noâ sütununda verisi â10004â olan kayıtları getirmiÅiz. ``` select * from salaries where emp_no = 10001 and salary >= 80000; ``` Yukarıdaki örneÄimizde WHERE ifadesinden sonra birden fazla koÅulu bir arada kullanmıÅız. İki koÅulu birbirine AND ifadesi ile baÄlamıÅız. AND ifadesi ve baÄlacı anlamındadır. Javaâdaki && operandı gibi iÅlevi vardır. ÃrneÄin burada 10001 nolu kaydın 80000âden büyük olan maaÅ bilgilerini âsalariesâ tablosundan getiriyoruz. Ãoklu tabloları bir araya getirerek sorgulamak Veri tabanı tablolarını bir araya getirip sorgulama yapabiliriz. ``` select emp.*, s.salary from employees emp inner join salaries s on s.emp_no = emp.emp_no where emp.emp_no = 10004; ``` Bu örneÄimizde INNER JOIN birleÅtirme iÅlemini göreceÄiz. INNER JOIN bir araya getirilen tablolardaki kayıtları bire bir eÅleÅtirerek getirir. EÄer bire bir eÅleÅmiyorsa o kayıt sorgu sonucunda gelmez. INNER JOIN ifadesinden sonra bir arada kullanmak istediÄimiz tablo ismini vermektir. Ardından bu tabloların hangi sütunları üzerinden baÄlantı kurulması gerektiÄi belirtilmelidir. Bunun için ON ifadesinden sonra âsalariesâ tablosundaki âemp_noâ sütunu ile âemployeesâ tablosundaki âemp_noâ sütununu kıyaslıyoruz. Her iki sütunda birbirine eÅit olan kayıtları JOINâlenmiÅ biçimde adeta tek bir tabloymuÅ gibi sorgu sonucunda bir araya getiriyoruz.  ``` select emp.*, dm.* from employees emp left join dept_manager dm on dm.emp_no = emp.emp_no; ``` Yukarıdaki komutta ise yine bir araya getirme örneÄi inceliyoruz. Fakat, LEFT JOIN ile tabloları birleÅtirmek INNER JOINâe göre farklıdır. INNER JOINâde bire bir eÅleÅen kayıtları bir araya getirip tek bir tablo gibi sunmaktadır. LEFT JOINâde ise sol tarafta kalan âemployeesâ tablosunda kayıt olmasına raÄmen eÄer ki saÄdaki âdept_managerâ tablosunda eÅleÅen bir kayıt yoksa da sorgu sonucunda âemployeesââe ait kayıt getirilir. âdept_managerâ tablosunda eÅleÅmeyen kısımlar ise NULL olarak getirilir.  ``` select emp.*, dm.* from dept_manager dm right join employees emp on dm.emp_no = emp.emp_no; ``` RIGHT JOIN ise LEFT JOIN ile aynı sadece yönü tersidir. Yukarıdaki ile aynı sonucu verir. RIGHT ve LEFT JOIN sorgular mülakatlarda gelebilir. İyi kavramakta fayda vardır. Mesela LEFT JOINâin anlamlı bir Åekilde kullanıldıÄı bir örnek verelim. Diyelim ki, Åu anda aktif olarak yönetici olan çalıÅan kiÅileri bulmak istediÄimizde LEFT JOIN iÅimize yarayacaktır. âemployeesâ tablosunu, âdept_managerâ tablosunu ve âdepartmentsâ tablosunu bir araya getirip 3 tabloyu tek bir tablo olarak LEFT JOIN ile bir araya getirdik. Daha sonra âdept_managerâ tablosundaki âto_dateâ sütunu bugünden büyük olan çalıÅanlar halen aktif olarak yöneticilik yapıyor demektir. ``` -- Åuan aktif olarak yönetici olan personel select emp.*, dm.*, dp.* from employees emp left join dept_manager dm on dm.emp_no = emp.emp_no left join departments dp on dp.dept_no = dm.dept_no where dm.to_date >= NOW(); ``` Tekrarlı verileri yalnızca bir kayıt olacak Åekilde sorgulamak. ``` select distinct title from titles ``` DISTINCT anahtar kelimesi ile belirtilen sütunda tekrarlı geçen her ifade bir kayıt Åeklinde gösterilir.  Metin içinde belirtilen ifade ile sorgulama yapabilmek ``` select * from titles where title like '%Senior%'; ``` LIKE komutu ile metin tabanlı sütunlarda aramak istenilen ifade koÅul olarak verilebiliyor. Yukarıdaki örnekte âtitlesâ tablosundaki âtitleâ isimli sütunundaki verilerde âSeniorâ kelimesi geçen kayıtları arıyoruz. % iÅareti aradıÄımız ifadenin önüne gelirse, ki burada âSeniorâ ifadesinin önündedir, aradıÄımız ifadeden önce hangi karakterlerin olduÄunu dikkate almıyoruz. % karakteri ile joker karakter gibi ifadenin önünde veya sonunda ne olduÄundan baÄımsız Åekilde veri içinde âSeniorâ ifadesinin geçip geçmediÄini soruyoruz. ### DeÄer aralıÄında sorgulama yapmak ``` select * from salaries where salary between 80000 and 100000; ``` BETWEEN komutu ile belli bir aralık içinde olan kayıtları bulmaya çalıÅıyoruz. Bu örnekte maaÅı 80000 ile 100000 arasında kalan kayıtları sorgulamıŠolduk. **Sonuçları sıralama** ``` select * from dept_emp order by from_date desc; ``` ORDER BY ifadesi ile gelen sorgu sonucunu büyükten küçüÄe veya küçükten büyüÄe doÄru sıralayabiliriz. DESC ifadesi ile sorgu sonucunu büyükten küçüÄe doÄru sıralayacaÄımızı söylüyoruz. ASC ifadesi ile ise küçükten büyüÄe doÄru sıralayacaktık. Yukarıdaki sorguda departmanda iÅe baÅlayanları günümüze en yakın tarihten en eskiye doÄru sıralamıŠoluyoruz. ``` select * from dept_emp order by from_date asc; ``` ASC komutu ile aynı Åekilde bu sefer de en eski tarihten günümüze doÄru sıralamıŠoluyoruz. **Temel fonksiyonlar** ``` select count(*) from employees where gender = 'M'; select count(*) from employees where gender = 'F'; ``` Yukarıdaki örnekte COUNT fonksiyonu ile tablodaki kadın ve erkek çalıÅan sayılarını bulabiliyoruz. COUNT fonksiyonu ile tabloda istenilen arama koÅulunu saÄlayan kaç kayıt olduÄunu bulabiliyoruz. ``` select avg(salary) from salaries; ``` AVG fonksiyonu ile tablodaki ilgili sütunun ortalamasını alabiliyoruz. ÃrneÄimizde âsalariesâ tablosundaki tüm kayıtların maaÅ ortalamasını bulmuÅ oluyoruz. ``` select sum(salary) from salaries; ``` SUM fonksiyonu ile tablodaki ilgili sütunun toplam deÄerini bulabiliyoruz. ÃrneÄimizde âsalariesâ tablosundaki tüm maaÅ toplamını bulmuÅ oluyoruz. Veri üzerinde deÄiÅiklik yapabileceÄimiz SQL komutları Tablodaki veri üzerinde deÄiÅtirme, silme veya tabloya yeni bir satır kayıt eklemeyi saÄlayan komutları inceleyeceÄiz. Yine sıkça kullanacaÄımız INSERT, UPDATE, DELETE gibi komutlar olacaktır. Tabloya yeni kayıtlar eklemek ``` insert into employees (emp_no, birth_date, first_name, last_name, gender, hire_date) values (10004, '1954-05-01', 'Chirstian', 'Koblick', 'M', '1986-12-01'); ``` **INSERT INTO** komutundan sonra bir tablo ismi verip yeni bir kayıt ekleme yapılabilir. Tablo isminden sonra tablonun sütunları tek tek yazılır ve ardından bu sütunlara karÅılık gelecek olan veri deÄerleri VALUES ifadesinden sonra sırayla yazılır. Tablodaki kayıtları güncellemek ``` update employees set first_name = "Alex" where emp_no = 10004 limit 1; ``` UPDATE SET komutu ile tablodaki kayıtları güncelleyebiliriz. UPDATE ifadesinden hemen sonra güncelleme yapılacak tablo ismi verilir. Ardından SET ifadesi getirilir ve güncellemesi istenilen sütun ismi yazılıp karÅısına deÄeri yazılır. WHERE ifadesinden sonra hangi kayıtların güncelleneceÄine dair koÅul ifadesi yazılır. Mesela örneÄimizde emp_no sütunundaki deÄeri 10004 olan kayıtları güncellemiÅiz. ### Tablodaki kayıtları silmek ``` delete from employees where emp_no = 10004; ``` DELETE FROM ifadesinden hemen sonra kayıt silme iÅlemi yapılacak olan tablonun ismi verilir. Ardından WHERE koÅuluna hangi kayıtların silineceÄi belirtilir.