
MYSQL DERSLERİ ANASAYFA ÖNCEKİ DERS SIRADAKİ DERS
Konu başlığına tıklayarak detayları görebilirsiniz!!!
WHERE belki de MySQL içerisinde hemen hemen her sorguda kullanacağımız bir ifade. O nedenle daha anlaşılabilmesi için örneğimiz üzerinden ilerleyecek olursak; tablomuzda yoksa eğer film_tur adında yeni bir kolon ekleyip VARCHAR türünden tanımlıyoruz. Sonrasında konunun daha anlaşılır olabilmesi ve daha fazla kayıt olması için yeni filmler ekliyoruz. INSERT INTO kısmında da yeni yeni bir tırnak açıp içerisine listemizdeki filmlerin türlerini ekliyoruz. Bu örneğimizde aynı türe sahip filmleri ayıklayıp bize göstermesini isteyeceğiz.
Türlerimizi ekleyip run ettiğimizde herhangi bir problem çıkmadıktan sonra örneğimiz üzerinde COMEDY türüne sahip filmleri sorgulayacağız. Bunun için aşağıdaki kodu yazıyoruz ve sonuç olarak örneğimizde olduğu gibi bize sadece türü COMEDY olan filmleri döndürür;
SELECT * FROM filmler WHERE film_tur = 'COMEDY'

Eğer SELECT ifadesinden sonra * (yıldız) değil de film_ad deseydik mesela bize tüm kolonları değil sadece film adını gösteren tek kolonu gösterecekti. Daha önce de değindiğimiz üzere * (yıldız) MySQL'de herşey, tümü gibi anlamlara gelebilir.
LIKE ile bir bakıma kriter içerisinde kriter sorgulama gibi bir durum oluşuyor. Örneğimiz üzerinden gidecek olursak mesela filmlerimizden THE ile başlayanları sorgulayalım.
Bunun için SELECT * FROM filmler WHERE film_ad LIKE 'THE%' kodumuzu yazıyoruz ve çalıştırdığımızda bize 'THE' ile başlayan filmleri listelediğini görüyoruz.

Burada LIKE dışında dikkat etmemiz gereken % (yüzde) işaretinin yeridir. Eğer % (yüzde) işaretini sona koyarsak bize THE + şeklinde bir gösterim sağlar. Ama son harflerini sorgulamak istiyorsak % (yüzde) işaretini başa koymamız gerekiyor. Bazı durumlarda % (yüzde) işaretini her iki tarafta kullanarak, %AR% gibi bir kullanımlar herhangi bir yerinde 'AR' olan kayıtları sorgulayabiliyiriz. Belirttiğim gibi burada önemli % (yüzde) işaretinin nereye konulduğudur.
LIKE kullanımını bir de _ (alt tire) işareti ile yapabiliyoruz. Belirli harflerini bildiğimiz bir kaydı sorgulamak için bilmediğimiz harflerin yerine _ (alt tire) işareti koyuyoruz. SELECT * FROM filmler WHERE film_ad LIKE 'Y_S M_N' dediğimizde bize filmler tablomuzdan 'YES MAN' adlı kaydı getirecektir.

Konumuza geçmeden önce tablomuza yayin_tarihi ve ulke gibi iki alan daha ekleyelim. Alanları ekledikten sonra INSERT INTO kısmında da filmlerimize gerekli bilgileri ekleyelim. Bilgiler doğru olmak zorunda değil sallayabilirsiniz.
IN komutu ile yine belirli kriterlerin sorgulamasını yapabiliyoruz. Örneğimiz üzerinde yeni eklediğimiz alan olan ulke üzerinde bir sorgulama yaparak belirli ülkeler tarafında geliştirilen filmleri bulmayı çalışacağız. Amerikan (USA) ve İtalyan (ITALY) yapımı filmleri bulmak için aşağıdaki şekilde kodumuzu yazıyoruz;
Bunun için SELECT * FROM filmler WHERE ulke IN 'USA', 'ITALY' kodumuzu yazıyoruz ve çalıştırdığımızda bize istediğimiz filmleri listelediğini görüyoruz.

Sorguladığımız şartların data içerisinde olması gerekir. Eğer hiçbir şart data içerisinde yoksa sorgu boş döner ama size hata vermez.
BETWEEN yapı olarak biraz IN'e benzer ama genel olarak rakamsal mantığa sahip sorgularda kullanılır. Mesela belirli tarih aralığındaki kayıtlar için sorgu yapmak istediğimizde kullanabiliriz. Sorgulanan tarihler arasına da AND bağlacı kullanılır.Yine örneğimiz üzerinden gidecek olursak belirli tarihte yayınlanan filmleri bulmak için SELECT * FROM filmler WHERE yayin_tarihi '20050101' AND '20180101' şeklinde sorgulamamızı gerçekleştiriyoruz.

Burada dikkat etmemiz gereken iki husus vardır, birincisi tarihleri Amerika Formatında yani YIL/AY/GÜN şeklinde yazmaktır. İkincisi işe önce küçük tarihi sonra büyük tarihi yazmamız gerektiğidir. Yoksa bize boş döner.
Günümüzden geçmişe doğru bir kullanım yapmak istiyorsak CURDATE() yani current date ifadesini kullanıyoruz. SELECT * FROM filmler WHERE yayin_tarihi BETWEEN '20110101' AND CURDATE() şeklinde kodumuzu yazdığımızda bize bulunduğumuz günle 2011 yılları arasındaki kayıtları gösterir. Bulunduğumuz günün tarihi sistemimizdeki tarih olarak algılanır. Bulunduğumuz günün tarihini öğrenmek istiyorsak SELECT CURDATE() diyoruz.

Bir başka kullanım şeklimiz ise yıl olarak sorgulamak yapmaktır. Bulunduğumuz günden 3 yıl öncesine kadar olan kayıtları sorgulamak için SELECT FROM filmler WHERE yayin_tarihi BETWEEN (CURDATE() - INTERVAL 3 YEAR) AND CURDATE() ifadesini kullanıyoruz. YEAR ifadesinden önce kullandığımız rakam kaç yılı sorgulayacağımızı gösteriyor.

REGEXP ve LIKE biraz birbirine benzerler ama REGEXP ile daha detaylı kriterler belirleyerek sorgulama yapabiliriz. Yani daha gelişmiş bir yapıya sahiptir.
Bir örnek çalışma yapacak olurska SELECT * FROM filmler WHERE film_ad REGEXP 'O' kodunu yazak olursak bize 'O' içerisinde 'O' harfi olan filmleri gösterecektir.

LIKE'da yaptığımız şekilde REGEXP ile bir filmin baş harflerini yazıp sorgulama yapmak için '^' üst üçgen (upper triangle) işaretini kodumuzun başına tırnakların arasına yazıyoruz. SELECT * FROM filmler WHERE film_ad REGEXP('^T') şeklinde kodumuzu yazdığımızda bize 'T' harfi ile başlayan filmleri gösterecektir..

Bunun tam tersi olarak REGEXP ile bitiş harfini sorgulamak için $ (dolar) işaretini kullanıyoruz. Örneğimiz üzerinde son harfi 'S' ile biten filmleri sorgulamak istediğimizde SELECT * FROM filmler WHERE film_ad REGEXP 'S$' şeklinde bir kod yazıyoruz.

REGEXP ile hem başlangıç hem de bitiş harflerini sorgulamak istediğimizde ise; SELECT * FROM filmler WHERE film_ad REGEXP '^A[A-Z]*S$' şeklinde bir kod yazmamız bize 'A' ile başlayıp 'S' ile biten filmlerin listesini verecektir.

Köşeri parantezin için büyük/küçük harflere duyarlıdır. Yani [a-z] yazarsanız küçük harf sorgular, [A-Z] yazarsanız büyük harf sorgular ve size ona göre sonuçlar döner. Eğer küçük harfle kodumuzu yazmış olsaydık bize hiç birşey dönmezdi. Ama büyük harf yazdığımız için bize 'AVENGERS' sonucunu dönecektir. Rakamlar arasında sorgu yapabilmek için [0-9]şeklinde bir yazım kullanabiliriz. Eğer herşeye bakmasını istersek kçşeli parantez içerisinde: [A-Za-z0-9] şeklinde bir kullanımla bunu sağlayabiliriz.
Şu ana kadar yaptığımız çğrendiğimiz herşeyi pekiştirmek adına SELECT * FROM filmler WHERE ulke LIKE 'I%' OR film_ad REGEXP '^A' şeklinde bir kod yazarsak bize ülke adı 'I' ile başlayan veya film adı 'A' ile başlayan kaytıları göseterecektir. Eğer bir kayıt belirttiğimiz kriterlerden iki üç tanesine bile hakimse bize sadece o kayda ait tek bir satır gösterecektir. Böylelikle bilgi kirliliği veya tekrarı olmayacaktır.

AND ile belirlediğimiz şartların hepsini sağlayan kayıtları sorgulayabiliyoruz. OR ile ise şartlarımızdan herhangi birinin sağlanması yeterli oluyor.
Örneğimizde bize ülkesi 'USA' veya 'ITALY' olan kayıtları vermesi için SELECT * FROM filmler WHERE ulke = 'USA' OR ulke = 'ITALY' gibi bir kod yazıyoruz. Bize her ikisinide olduğu kayıtları gösteriyor.

Aynı işlemi IN komutu ile de yapabiliyoruz. Tek fark IN ile sadece aynı sütunlar içerisinde sorgulama yapabiliyor olmamız. OR sayesinde farklı sütunlardan da sorgulama yapabiliyor olmamız.
