SQL(Structured Query Language)
Herkese merhaba bu yazımda da sizlere yakın zamanda öğrendiğim SQL i anlatacağım.
Türkçe anlamı sorgulama dili olarak geçer. Bu herhangi programlama dili değildir. Database(veritabanı) işlemleri için kullanılan bir alt dildir. Dağınık olarak yer alan verilerin düzenlenerek depolanması için SQL veritabanı sistemi geliştirilmiştir.
Peki SQL veritabını kullanmanın avantajları nelerdir?
- sql veritabanını kullanarak bilgileri rahatlıkla kategorize edebilirsiniz. Bu sayede bilgiler depolandığı için dağınıklık ortadan kalkar. Ayrıca veri aramada da zorlanma gibi bir durum ortaya çıkmaz. Bu sayede zamandan tasarruf edilir.
- Sql sistemini kullanarak tekrara düşmekten kurtulabilirsiniz.
- Bilgisayar hafızasında dağınık halde bulunan bilgilerin klasöre dönüştürülebilmesine yardımcı olur.
Peki SQL veritabanı kullanarak yapabileceğimiz işlemler nelerdir?
- Yeni veriler çekmek
- Var olan verileri kaydetmek
- Verilerin tamamını güncellemek
- Verilerin sorgulanmasını ve aramasını yapmak
- Silinen verilerin kayıtlarının yeniden oluşturulmasını sağlamak
- Yeni tablolar oluşturmak
Veritabanı uygulamaları iki şekildedir:
• Veritabanı(Database): Bu veritabanlarında tüm kayıtlar tek tabloda tutulmak zorundadır. O yüzden veri tekrarı kaçınılmazdır. Örneğin Excel bu tipte veritabanlarıdır.
• İlişkisel Veritabanı (Relational Database): Bizim ilgileneceğimiz kısım burasıdır.Bu veritabanında birden fazla tablo bulunur ve tablolar arasında belir bir hiyerarşiye göre ilişki bulunur. MSSQL, Oracle, MySQL, PostgreSQL, ilişkisel veritabanlarına örnek veritabanlarıdır.
Relational Database Management Systems(RDBMS)
(İlişkisel veri tabanı yönetim sistemi)
İlişkisel veritabanı yönetim sistemi (RDBMS), ilişkisel bir veritabanı oluşturmanıza, güncellemenize ve yönetmenize izin veren bir programdır.
İlişkisel veri tabanı sisteminde veriler tablolar halinde tutulurlar ve bu tablolar kendi aralarında ilişkisel anlamda birbiri ile bağlantılı olabilirler. İlişkisel veri tabanını çeşitli tablolar arasında organize edilmiş verilerden oluşan veri tabanı olarak açıklayabiliriz. Bu farklı tablolar arasındaki veriler, çeşitli anahtarlar vasıtası ile birbirlerine bağlanırlar.
RDBMS, SQL’in ve MS SQL Server, IBM DB2, Oracle, MySQL ve Microsoft Access gibi tüm modern veritabanı sistemleri için temel oluşturur. Çoğu ilişkisel veritabanı yönetim sistemi, veritabanına erişmek için SQL dilini kullanır.
Popular Relational Database Management Systems
- MySQL :
MySQL, en popüler açık kaynaklı SQL veritabanıdır. Genellikle web uygulaması geliştirme için kullanılır . MySQL’in başlıca avantajları, kullanımı kolay, ucuz, güvenilir ve soruları yanıtlamaya yardımcı olabilecek geniş bir geliştirici topluluğuna sahip olmasıdır. Geliştiricisi Oracle’dır.
- PostgreSQL:
PostgreSQL, herhangi bir şirket tarafından kontrol edilmeyen açık kaynaklı bir SQL veritabanıdır. Genellikle web uygulaması geliştirme için kullanılır. PostgreSQL, MySQL’in aynı avantajlarının çoğunu paylaşır. Kullanımı kolaydır, ucuzdur, güvenilirdir ve geniş bir geliştirici topluluğuna sahiptir.
- Oracle DB:
Oracle açık kaynak kodlu değildir. En güçlü veritabanı yazılımı olarak bilinir ve büyük firmalarda ve uygulamalarda kullanılır. Geliştiricisi Oracle’dır. Oracle , özellikle bankacılık sektöründeki büyük uygulamalar içindir. Dünyanın önde gelen bankalarının çoğu, Oracle uygulamalarını çalıştırıyor çünkü Oracle, özellikle bankalar için oluşturulmuş temel işlevler de dahil olmak üzere, teknoloji ile kapsamlı, önceden entegre edilmiş iş uygulamalarının güçlü bir kombinasyonunu sunuyor.
- SQL Server:
Microsoft, SQL Server’ın sahibidir. Büyük kurumsal uygulamalar çoğunlukla SQL Server kullanır.
- SQLite:
SQLite, popüler bir açık kaynaklı SQL veritabanıdır. Tüm bir veritabanını tek bir dosyada saklayabilir. Bunun sağladığı en önemli avantajlardan biri, tüm verilerin veritabanınızı bir sunucuya bağlamanıza gerek kalmadan yerel olarak depolanabilmesidir.
Şimdi gelelim sql de bir tablo oluşturduğumuzda bilmemiz gereken bazı temel kavramlara.
Aşağıdaki resimde ;
- 1 numaralı yer satır(row)
- 2 ,3, 4 numaralı yerler sütun(column)
- 6 numaralı yerler null(boş) değerler
- 5 numaralı yer hücre(cell)
Primary key(birincil anahtar):Primary key kullanım amacı aslında her bir satırın farklı olmasını garantilemektir. Genelde tablolarda nümerike değerler primary key olur. Primary key olarak tasarladığımız kolon;
- unique olmalı,
- not null(boş) geçilmemeli
- başka tablolarla bağlantıya geçebilecek bir alan oluşturması beklenir.
Aşağıdaki resimde 2 numaralı yer Primary key olmalı.
Foreign key(İkincil anahtar): İlişkisel veri tabanı tasarımında bir başka tablo ile ilişkilendirilecek olan tablonun diğer tabloda bir nevi kısıtlanmasıdır. İlişkilendirilecek olan tablonun Primary key alanı ile diğer tablonun Foreign key alanı birbiri ile bağlanır. Foreign key olarak tasarladığımız kolon;
- Null (boş) değerler olabilir
- Birbirini tekrar eden değerler olabilir.
Aşağıdaki resimde 4numaralı yer Foreign key olmalı.
Şimdi sizlerde isterseniz https://livesql.oracle.com/apex/f?p=590:1000 buradaki linkten live SQL üzerinden bir hesap açıp çalışabilirsiniz. Bence öğrenmek için burası oldukça faydalı.
Buradan Start Coding Now diyerek anlatacağım kodları deneyebilirsiniz.
SQL Komutları
SQL bir insan gibi düşünebilirsiniz mantığa uyan her şey SQL de de geçerlidir.
Data Manipulation Language :Data Manipulation Language (DML) tabloları şema nesneleri içinde verileri yönetmek için kullanılır.
Bunlardan bazıları;
SELECT →Veritabanından kayıt okur.
INSERT →Tabloya kayıt ekler.
UPDATE →Tablodaki kayıdı günceller.
DELETE →Tablodan kayırları siler ancak kapladığı alan kalır.
MERGE →UPSERT işlemi (ekleme veya güncelleme)
Data Definition Language(DDL):Data Definition Language (DDL) tabloları veritabanı yapısı veya şema tanımlamak için kullanılır.
Bunlardan bazıları;
CREATE →Veritabanında nesne yaratır.
ALTER →Veritabanının yapısını değiştirir.
DROP →Veritabanından obje siler.
TRUNCATE →Tablodaki kayıtları içerdikleri alan ile birlikte siler.
COMMENT →Yorum ekler.
RENAME →Nesnenin asını değiştirir.
Data Control Language(DCL):Data Control Language (DCL) işlemleri.
Bunlardan bazıları;
GRANT →Kullanıcıya veritabanı erişim yetkisi verir.
REVOKE →GRANT ile verilen yetkiyi geri alır.
Transaction Control(TC):Transaction Control (TCL) işlemleri DML ile yapılanları yönetmeye yarar.
Bunlardan bazıları;
COMMIT →Yapılanları kayıt eder.
SAVEPOINT →Daha sonra geri dönülecek bir dönüş noktası belirler.
ROLLBACK →Son COMMIT’e kadar olan yeri geri alır.
SELECT
SELECT
Veri çekmek için ilk komutumuzdur .
İlk olarak employees tablomuzdaki tüm kayıtları getirelim .
select * from hr.employees
Peki şimdi de sadece EMPLOYEE_ID ve FIRST_NAME olan kayıtları getirelim.
select EMPLOYEE_ID,FIRST_NAME from hr.employees
Yani istediğimiz kayıtları getirmek istediğimizde select den sonra * işereti koyduğumuz yere kolon isimlerini yazmamız yeterli. * demek tüm kayıtlar anlamına gelir.
Peki mesela FIRST_NAME kolonunu getirirken orayı “dı “ şeklinde değiştirmek istersek ne yapmalıyız?
select FIRST_NAME as "adı" from hr.employees
VEYA (as ) kullanmadan da olurselect FIRST_NAME "adı" from hr.employees
desc
desc [tablo adı]
Tablomuzdaki kolonların isimlerini ve onların türleri hakkında bilgi almak istediğimizde kullanırız. Yani tablonun genel hali ile ilgili detaylı bilgiye ulaşırız..
desc hr.employees
Peki bu tabloda kaç kayıt var acaba desem?
count
select count (*) from [tablo adı]
count bize tablomuzda kaç adet kayıt olduğu bilgisini verir.
WHERE
select * from [tablo adı] where [istenen]
WHERE komutu veritabanından belirli şartlara göre sorgu yapmamızı sağlar. Böylelikle veritabanından çekeceğimiz verileri dilediğimizce filtreleyebiliriz.
Örneğin EMPLOYEE_ID si 100 olan kayıtları getirelim
select EMPLOYEE_ID,FIRST_NAME FROM hr.employees where EMPLOYEE_ID=100
NOT: İki veri tipine çok dikkat edelim!!
String ve date
String veya date olan bir kayıt arayacağımız zaman (‘ ’) tek tırnak arasına yazıp aratırız.
Eğer kolon isimlerini değiştiriyorsak o zaman (“ “)çift tırnak arasında yazarız.
Malesef SQL,, python gibi değil hangi tırnaklar arasına yazdığınız çok önemli!
Şimdi bunları birer örnekle göstereyim;
select salary "Maaş", last_name FROM hr.employees LAST_NAME='King'
Gördüğünüz gibi Salary kolonunun ismini maaş olarak değiştirip soy adı King olanları getirdim.
Şimdi istenen tarihte ki kayıtları getirmek için;
select employee_id,hire_date,salary from hr.employees where hire_date='03-JAN-06'
Peki bugünün tarihini getirmek istediğimizde;
select sysdate from dual
DUAL tablosuda nedir ?
Oracle ve bazı veritabanı yönetim sistemleri tarafından varsayılan olarak oluşturulan özel tek kolonlu ve tek satırlık veri içeren tablodur. Dual tabloları çok kullanışlı her türlü işlemi yaptırabilmemizi sağlar.
select 9*19 from dual
WHERE komutunu kullanırken karşılaştırma ve mantıksal operatörlerinden yardım alabiliriz. Karşılaştırma ve Mantıksal operatörler aşağıda verilmiştir;
Karşılaştırma Operatörleri :
- Eşittir Operatörü (=)
- Eşit Değildir Operatörü (<> ya da !=)
- Büyüktür Operatörü (>)
- Küçüktür Operatörü (<)
- Büyük ya da Eşittir Operatörü (>=)
- Küçük ya da Eşittir Operatörü (<=)
- IS NULL Opratörü (IS NULL)
Mantıksal Operatörler :
- AND (VE) Operatörü (AND) ; Her iki şartta doğru ise
- OR (VEYA) Operatörü (OR) ; Şartların en az biri doğru ise
- NOT (DEĞİL) Operatörü (NOT) ; Şart doğru değilse
LİKE
SELECT * FROM [tablo adı] where [istenen ifade] like [özel olarak istenen]
Like ifadesi ile daha çok bir alan içerisinde arama yapılmaktadır. Örnek olarak bu bloğun arama kısmını gösterebiliriz. Herhangi bir makalenin içerisinde geçen bir kelimeyi ya da harfi yazdığınızda eşleşen tüm sonuçları listeleyecektir.
Tablomuzda last_name içinde a harfi geçen kayıtları getirelim.
select last_name FROM hr.employees where last_name like '%a%'
ORDER BY
SELECT*FROM [tablo adı] where[istenen koşul] ORDER BY [Sıralı olması istenen ] ASC/DESC
ORDER BY ifadesi kayıtları belirtilen alanda büyükten küçüğe veya küçükten büyüğe göre sıralar. ASC (ascending) parametresi ile küçükten büyüğe, DESC (descending) parametresi ile büyükten küçüğe göre sıralar. Burada sadece sayısal alanlar değil metinsel alanlarda alfabetik olarak sıralanabilir.
select salary,department_id FROM hr.employees where SALARY > 10000 and department_id=60 or department_id=80 order by salary
LOWER AND UPPER
LOWER AND UPPER
UPPER fonksiyonu ile string bir verinin tüm harflerini büyük harfe çevirebilirken,
LOWER fonksiyonu ile de string bir verinin tüm harflerini küçük harfe çevirebiliriz. Kullanımı oldukça basittir
Örneğin last_name i King olanları hepsini küçüğe çevirerek getirelim sonrada büyük harfe çevirerek bulalım.
küçük harf
select *FROM hr.employees where lower (last_name)='king'büyük harf
select *FROM hr.employees where upper (last_name)='KING'
Şimdi örneklerle açıklayalım;
1-) Employees tablosundaki işe giriş tarihi 5000 den fazla olan kayıtların adını , soyadını getirin.
select FIRST_NAME , LAST_NAME , HIRE_DATE
FROM hr.employees where sysdate - hire_date >= 5000
2-) Maaşı 5000 ile 15000 arasında olan kayıtları getirin.
select employee_id,salary,hire_date
FROM hr.employees where between 5000 and 15000
3-) Maaşı 5000 ,10000, 24000 olanların kayıtlarını getirin.
DİKKAT= Birden fazla eşittirin karşılığı “in”
select employee_id,salary,hire_date
FROM hr.employees where salary in (5000,10000,24000)
4-) Maaşı 5000 ,10000, 24000 dışında olan kayıtları bulalım.
select employee_id,salary,hire_date
FROM hr.employees where salary not in (5000,10000,24000)
5-) Soaydı “z” harfi ile başlayanların kayıtlarını getirin.
select last_name FROM hr.employees
where last_name like 'Z%'
6-) Soyadının 3. karakteri “n” olan kayıtları getirin.
select last_name FROM hr.employees where last_name like '__n%'
NOT: and or dan baskındır. Aşağıda ki 2 örneği lütfen dikkatli inceleyin.
7-)Maaşı 5000 den büyük ve 10000 den küçük olan kayıtları getirin.
select salary, employee_id FROM hr.employees
where salary >= 5000 and salary<= 10000
8-) Maaşı 5000 den büyük veya 10000 den küçük olan kayıtları getirin.
select salary, employee_id FROM hr.employees
where salary >= 5000 or salary<= 10000
9-) İlk 5 satır ve son 5 satırdaki tüm kayıtları employee_id ye göre sıralı bir biçimde getirin.
ilk 5 satır
select *FROM hr.employees order by
employee_id fetch first 5 rows only
son 5 satır
select *FROM hr.employees order by employee_id
offset 5 rows fetch next 5 rows only