Sizlere bu makalemde SQL dili ilgili çok makale var fakat ben bu makalemde SQL tarafında kullanılan komutlarıyla sizlere giriş olarak örnekleriye anlatmaya çalışacağım, SQL bir programlama dili değil sorgu dilidir ve kısaca SQL nedir diye bahsedecek olursak sorgulama dili diyebiliriz yani önümüzde bir veritabanı var ve bir sürü veri var bu verileri belirli kriterler doğrultusunda SQL sayesinde sorgulayabilir üzerinde işlemler yapabiliriz. SQL’in açılımı Structured Query Language’dir, Türkçesi ‘ Yapılandırılmış Sorgulama Dili’ bu dil sayesinde veriler üzerinde yönetim sağlayabiliriz.
Belli veri tabanlı dilleri aşağıda ki gibidir.
- SQL
- T-SQL
- TCL
- PL/SQL
Ben anlatımımı Oracle DB üzerinden anlatacağım. Oracle üzerinden sizde örnek alıştırmalar yapmak isterseniz bir önceki makalemde bahsetmiş olduğum HR veritabanı üzerinden yapabilirsiniz. Bu konu hakkında daha önce yayınlamış olduğum makale bu linkten erişebilirsiniz
Diğer veritabanlarındada bu tarz hazır örneklerde mevcuttur. ( MSSQL – Northwind gibi)
- SELECT
Select veritabanı üzerinde ki tablolarlardan veriyi seçmek için kullanılır. İlk başta select ile başlıyorum, gördüğünüz üzere sahip olduğum tüm tablolaları listelemek için
select * from countries, departments, employees, job_history, jobs, locations, regions;
komutunu yazdım ve bahsi geçen tablolarda from dan önce * diyerek tüm sütunları listelemiş oldum
Resim-1
Resim-2
Select ile daha küçük bir sorgu yazalım. Departments tablosunda ki department_name sütunu listelemek istiyorum o yüzden from dan önce listelemek istediğim sütunun adını yazıyoruz.
select department_name from departments
Resim-3
Eğer birden çok sütun belirtmek istiyorsak sütun isimlerinin aralarına virgül eklemek gerekmektedir.
Not :
Boşluk olan kısımlarda köşeli parantez kullanılır. [ Oracle Database]
Karakter kullandığımız kısımlarda ise tek tırnak işareti kullanılır ‘Oracle’ gibi fakat bazı editörlerde sayısal kısımlardada tek tırnak geçerlidir.
- WHERE
Where ile belirleyeceğimiz komuta uyan kayıtları listeleyebiliriz yani buna koşul belirlemek diyebiliriz.
Örnek : employess tablosunda salary sütununda maaşları 4800 olanları listelemek istiyoruz.
select * from employees where salary=’4800′
Resim-4
Where ile beraber kullanabileceğimiz farklı operatörler de mevcuttur, bu operatörleri yukarıdaki örneğe istinanden aşağıda belirtilmiştir.
- = : Eşit ( 4800 maaş alanları listeler)
- > : Büyüktür ( 4800 den büyük olanları listeler)
- < : Küçüktür ( 4800 den küçük olanları listeler)
- <> Eşit olmayan ( 4800 e eşit olmayanları listeler)
- >= Büyük eşit olan (4800 e eşit ve büyük olanları listeler)
- <= Küçük eşit olan ( 4800 e eşit ve küçük olanları listeler)
- IN
Birden fazla olası değerler için kullanılır.
Örnek : 4800 ve 2600 maş alanları listelemek istiyorum.
select * from employees where salary IN (‘4800′,’2600’)
Resim-5
- LIKE
Karakter bazlı arama yapmak için kullanılır, burda önemli olan LIKE ‘dan sonra arayacağımız karakteri yazıp % işaretini kullanmalıyız.
Örnek: Salary sütununda 4 ile başlayanları listelemek istiyorum.
select * from employees where salary LIKE ‘4%’
Not: 4 ile biteni aramak isteseydik % ifadesi 4’ün soluna gelecektir.
Resim-6
LIKE ile ilgili diğer parametreler ise;
Abc harfleriyle başlayan kayıtları listelemek isterseniz ‘[abc]%’
Abc ile başlamayan kayıtları listelemek isterseniz ‘[!abc]%’
Tablonuzun içindeki kayıtlarda bazı karakterleri bilmiyor ama arama yapmak istiyorsanız ‘ ms_ _to’ diyerek arama gerçekleştirebilirisiniz, ben burda mshowto yu aramak istedim.
- BETWEEN
Belirtilen aralıktaki kayıtları listelemek için kullanılır ve belirteceğimiz aralık 2000 – 5000 arası ise araya AND ile aralığı belirlemelisiniz.
Örnek : 2000 ve 5000 arası maaş alanları listelemek istiyorum.
select * from employees where salary BETWEEN 2000 AND 5000
Resim-7
Rakamsal alanlarda tırnak işareti kullanılmaz( yukarıda belirttiğim notta bazı editörler kabul etmektedir.) eğer burada karakter bazlı bir arama gerçekleştirmiş olsaydık
( select * from employees where salary BETWEEN ‘A’ AND ‘B’) olarak yazmalıydık.
2000 ve 5000 arasında olmayan maaşları listelemek isteseydik eğer NOT BETWEEN diyerek listeleyebilirsiniz.
Resim-8
- DISTINCT
Tablolardaki belirteceğimiz sütünlarda tekrar eden kayıtlardan sadece bir tanesini alır ve tekrar etmeyen kayıtlarla beraber listeler.
Örnek : Departments tablomdaki location_id sütununu listeledim ve distinct örneğini bu tablo üzerinden anlatacağım.
Resim-9
select distinct location_id FROM departments
Resim-10
Yukarıdaki tablo ile karşılaştırdığımızda aynı değerleri çıkararak tek bir değermiş gibi bize listeledi.
DISTINCT ile ilgili önemli 2 örnek daha vermek istiyorum.
- select DISTINCT location_id, manager_id FROM departments
Burada iki alanıda tek bir alan gibi bize listeledi.
Resim-11
- select DISTINCT location_id, manager_id,department_id FROM departments
Burada ise dikkat etmemiz gereken durum yukarıdaki sorgularda location_id ve manager_id de aynı olan değerleri tekrarlamıyordu fakat burada tekrarlıyor nedeni ise department_id ksımında ki değerlerin farklı olmasından kaynaklıdır.
Resim-12
- AND – OR
AND operatörünü 2 koşul belirlemek için kullanabiliriz ( Sadece 2 koşul değil birden fazla koşulda belirleyebilirsiniz ben örneklerimde 2 koşul üzerinden ilerledim.)
Örnek : employess tablosunda job_id si ‘IT_PROG’ olanları listeledim.
Resim-13
IT_PROG içinde salary 9000 alanı listelemek istersem eğer
select * FROM employees WHERE job_id=’IT_PROG’ AND salary=’9000′
Resim-14
OR operatörüde AND gibi 2 koşul belirlemek için kullanabiliriz.
Örnek : employess tablosunda job_id si ‘IT_PROG’ ve FI_ACCOUNT ları listelemek istiyorum.
select * FROM employees WHERE job_id=’IT_PROG’ OR job_id=’FI_ACCOUNT’
Resim-15
Bu iki operatörü beraberde kullanabiliriz.
Örnek: employess tablosunda job_id IT_PROG olanların salary kısmı 4800 ve 9000 olanları listele dediğimizde
select * FROM employees WHERE job_id=’IT_PROG’ AND (salary=’4800′ OR salary=’9000′)
Resim-16
- ORDER BY
Order by veritabanımızdaki kayıtları büyükten küçüğe ve küçükten büyüğe sıralamamızda yardımcı olur. Sadece rakam olarak değil alfabetik olarakta sıralama yapabiliriz, bu sıralamayı 2 parametre ile gerçekleştiriyoruz.
ASC ( Asceding) : Küçükten büyüğe ( Alfabetik olarak A-Z)
DESC (Descending) : Büyükten küçüğe ( Alfabetik olarak Z-A)
Bu parametreleri sorgunun sonuna ekliyoruz.
Örnek:
Küçükten büyüğe;
select * from employees order by employee_id asc
Resim-16
Büyükten küçüğe;
select * from employees order by employee_id desc
Resim-17
Where kullanarakta sadece seçeceğimiz alana dairde sıralama gerçekleştirebiliriz.
select * from employees where salary=’4800′ order by employee_id asc
Resim-18
Gelin biraz daha karmaşık bir duruma getirelim bu sorguyu
select * from employees order by salary asc, first_name desc
Yukarıdaki sorguda salary küçükten büyüğe olacak fakat first_name i büyükten küçüğe olarak listelensin istedim.
Resim-19
Yukarıda gördüğünüz üzere salary kısımları aynı olanlarda first_name bakarak büyükten küçüğe doğru sıraladı.
Bir diğer örnek iste sorgumuz;
select * from employees order by first_name desc, salary
Resim-20
Bu sorguda first_name i büyükten küçüğe doğru sıralamak istedim fakat dikkatinizi çekerse salary kısmına herhangi bir parametreyi eklemedim burda first_name e göre sıralama yaptı fakat aynı olan isimlerden kaynaklı salary kısmına bakar sıralamayı gerçekleştirdi.
- SELECT INTO
Select into tablomuzdaki kayıtı alıp yeni bir tablo yaratıp içine kopyalamak için kullanılır.
Not: Bu sorguyu kullanacak kullanıcının db üzerinde tablo oluşturma yetkisi olmalıdır. Employees tablosunda ki first_name sütununu aynı db üzerine koplayamak istiyorum.
SELECT first_name INTO isim_yedek FROM employees
Oracle üzerinde test yapanlar burada missing keyword hatası alacaksınızdır
Resim-21
Yukarıda yazdığım sorguyu MSSQL üzerinde çalıştırabilirisiniz. Oracle üzerinde ise CREATE TABLE isim_yedek AS SELECT first_name FROM employees Diyerek aşağıda ki sonucu elde edebilirsiniz.
Resim-22
Bellir bir kritere göre bu işlemi gerçekleştirmek istersek Where kullanabiliriz ve farklı bir veritabanına ya da path e kopyalamak istersek eğer IN kullanmalıyız.
Yukarıda first_name olarak kopyaladığım tabloyu farklı bir isimle kopyalamak istersekte AS kullanırız.
Örnek: first_name AS ilk_isim
- INSERT INTO
Insert into yu tablomuza yeni bir kayıt eklemek için kullanırız ve eklemede 2 yöntem bulunur.
- Tablo adını belirtip sadece ekleyeceğimiz değerleri belirtebiliriz, burada önemli olan gireceğimiz değerleri tablo içindeki sütun sırasına göre eklemeliyiz çünkü rakamsal alana alfabetik bir veri eklemek istersek hata ile karşılaşabiliriz ya da veriler yanlış alanlara eklenebilir.
INSERT INTO employees VALUES (208,’Emre Ferit’,’Aslantaş’)
- Bu yöntemde ise ekleyeceğimiz sütun adlarını belirleyerek işlemi gerçekleştirebiliriz.
INSERT INTO employees (employees_id,first_name,last_name) VALUES (208,’Emre Ferit’,’Aslantaş’)
Not: HR user ı ile bağlandıysanız hata alabilirsiniz yetkili user (sys/sysdba) ile test edebilirsiniz.
- UPDATE
Update ifadesinde ise tablolarımızda bulunan kayıtları güncellemek için kullanırız.
Örnek: Aşağıda ki sorguda önemli olan kısım güncellemek istediğimiz kayıdı id’si ile belirleyebilirsiniz.
Ben id 100 olan kayıdın first_name ve salary sütununu güncellemek istedim.
UPDATE employees SET first_name=’Emre’,salary=5500 Where employee_id=100
Resim-23
Eğer sadece UPDATE employees SET salary=5500 kodunu kullansaydım eğer Where ifadesini kullanmadığım için tablo içerisinde ki tüm salary kayıtları 5500 olarak değişecekti.
- DELETE
Delete ifadesini kayıtları silmek için kullanırız.
Örnek: Departments tablosunda bulunan department_name sütunun daki payroll değerini silmek istiyoruz.
delete from departments where department_name=’payroll’
Resim-24
Eğer komple bir alanı silmek isteseydik o alanın id sini yazmamız yeterlidir ve employees tablosunda department_name i payroll olanları silmek isteseydik ise;
Delete from employees where department_id=27 kodunu çalıştırarak silebilirdik.
(Örnek tabloda employees tablosunun içinde department_id mevcuttur ondan kaynaklı örnek bu şekildedir.)
Not: Bir tablo içerisinde sadece kayıtları silmek istersek eğer TRUNCATE_TABLE employees diyerek employees tablosu içerisinde ki kayıtları silmiş olurduk. Truncate de silme işlemi yaparsak id atamaya 1 den başlar fakat DELETE ise kaldığı yerden id atamaya devam eder.
- SELECT TOP (ROWNUM)
Select top ifadesi listelemek istediğimiz kayıtları sınırlamak için kullanırız. Select top ifadesi Oracle da farklı ifade edilir.
MSSQL : SELECT TOP 10 ( yüzde olarak sorgulamak istersek PERCENT *) first_name, last_name FROM employees
ORACLE: select first_name, last_name, salary from employees where ROWNUM <=10
Resim-25
ALIASES
Yukarıda bir örnekte bahsettiğim üzere ALIASES tablo veya sütunlara geçici olarak isim verilmek için kullanılır.
Örnek: SELECT jobs _title AS unvan FROM jobs AS is
Not: Geçiçi isim tanımlarken Where ifadesini kullanabiliriz ve where kullandıktan sonra verilen ad tanımlanır.
- JOIN
Join ifadesini Inner Join (sadece join olarakta yazabiliriz)i Left Join, Right Join ve Full Join olarak bu kısımda anlatacağım. Farklı tabloları birleştirmek için INNER JOIN kullanılır belirttiğim üzere JOIN olarakta yazabiliriz.
Örnek : Employees ve Departments tablolarını birleştirmek istiyorum.
select * from departments JOIN employees ON employees.department_id = departments.department_id
Resim-26
Tablo birleştirmede önemli olan kısım iki tablo için ortak bir değer belirlemek buda id kısımları oluyor ondan kaynaklı ON parametresinden sonra id leri eşitledik. From’dan önce * kaldırıp sütun adlarını belirlersek daha bize filtrelenmiş olarak tabloyu bize sunar.
LEFT JOIN : Bu ifadede kayıtları listelerken birinci tabloyu baz alır ve ikinci tablodan sadece aynı olan kayıtları bize listeler birinci tablo ile aynı olmayan değerler null olarak gelir.
RIGHT JOIN: Left join’in tam tesi olan ifade listelerken ikinci tabloyu baz alır ve birinci tablodan sadece bize ikinci tabloda olan kayıtları listeler
Not: JOIN olarak yazdığımız kısma sadece LEFT,RIGHT ve FULL JOIN olarak değiştirmeliyiz.
Resim-27
FULL JOIN: Diğer join parametrelerine nazaran belirlediğimiz tablolardaki tüm kayıtları değerleri ile listeler.
Resim-28
UNION
Union iki adet tablodaki seçeceğimiz kayıtları birleştirerek tek tablo gibi bize listeler ve listelerken aynı olan kayıtlar bir kere alınır eğer aynı olan kayıtları listelemek istiyorsak UNION ALL komutunu kullanmalıyız. Departments tablosunda Departments_name sütununu ve Employees tablosunda ise first_name tablosunu birleştirmek istiyorum, ilk başta department_name i belirttiğim için o tablo altında kayıtlar listelenecektir.
select department_name from departments UNION ALL SELECT first_name FROM employees
Resim-29
- VIEW
View, yazmış olduğumuz sql kodlarını bir tabloda toplamamıza yarar, gerçek bir tablo gibidir fakat sanal tablo olarak adlandırabiliriz. Yukarıda o kadar kod yazdık en sona view oluşturmak ile makalemi sonlandırmak istedim.
View oluşturmak,güncellemek ve silme işlemlerini anlatacağım.
CREATE VIEW
CREATE VIEW personel AS SELECT first_name, last_name FROM employees
Resim-30
View’imiz oluştu view i çağırmak için ise ‘ Select * FROM personel’ diyoruz.
Resim-31
View üzerinde güncelleme yapmak istiyorum ve salary sütunun ekliyorum.
CREATE OR REPLACE VIEW personel AS SELECT first_name,last_name,salary FROM employees
Resim-32
View imi güncelledin tekrardan ‘Select * From personel’ dediğimde ise ;
Resim-33
Salary kısmıda view’e eklenmiş oldu. View’ı silmek istiyorsak eğer ‘DROP VIEW personel’ diyerek silebiliriz.
Resim-34
Sizlere elimden geldiğince giriş olarak işimize yarayacak SQL komutlarını örnekleriyle anlatmaya çalıştım bir sonraki makalemde SQL Fonksiyonlarını anlatmayı hedefliyorum.
Bu konuyla ilgili sorularınızı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.
Referanslar
TAGs: SQL,T-SQL,TCL,PL/SQL, T-SQL komutları, temel SQL komutları, Oracle DB, sql komtularını öğren