6 min read

SQL SELECT ile kayıt sorgulama

Bu yazıda yeni başlayanlar veya tekrar yapmak isteyenler için SQL ile çeşitli sorgulama örnekleri yazıyoruz.
SQL SELECT ile kayıt sorgulama

SQL, ilişkisel veritabanlarını kullanırken (Oracle, MSSQL Server, MySQL gibi) okuma/yazma işlemleri yapmamızı sağlayan sorgulama dilinin adıdır.

SQL yazılım yapan herkesin bir gün bir yerde takılacağı bir noktadır diye düşünüyorum. Dilin kullanımına tam anlamıyla hakim olmak, mantığını kavramak başta biraz zaman aldığından, ve bazı detayları da unutulabildiğinden, iyi biliyorum diyenlerin dahi zaman zaman tekrar etmesi gerekebiliyor.

Lafı fazla uzatmadan en temelden başlayarak SQL sorguları yazıp, neler yapabileceğimizi görelim.

0. Northwind veritabanı ve MySQL Workbench

Bu yazıda ben MySQL Workbench programını arayüz olarak kullanıyorum. Genelde eğitim amaçlı kullanılan Northwind veritabanındaki bilgiler üzerinden örnekleri veriyorum. Bu yazıyı aynen takip etmek isterseniz bunları kurabilirsiniz.

MySQL Workbench

https://dev.mysql.com/downloads/workbench/

Northwind veritabanı

Northwind veritabanını import etmek için buradaki sql dosyalarını import edebilirsiniz:

https://github.com/jpwhite3/northwind-MySQL

1.Kayıt okuma: SELECT

Bir ilişkisel veritabanında kayıtlar tablolar halinde saklandığından, yapabileceğimiz en temel sorgu bir tablodaki bütün kayıtları getirmektir. Bunun için SELECT kelimesini kullanırız.

SQL SELECT'in formülü

SQL'de kayıt getireceğimiz zaman her zaman önce neyi istediğimizi, sonra da hangi tablodan istediğimizi belirtiriz. En sona da ekstra şartlar, koşullar, sıralama gibi istekler ilave ederiz. Yani sql'in formülünü yazmak istersek:

SELECT [Ne istiyorum] 
FROM [Nereden istiyorum] 
WHERE [Hangi şartlara uyan kayıtları istiyorum] 
ORDER BY/GROUP BY [Bunlar hangi düzende sıralansın istiyorum]

Bütün kayıtları okuma

Bir tablodaki bütün kayıtları okumak için SELECT kelimesi ile * kullanırız.

SELECT * FROM customers;

Bu örnekte customers tablosundaki bütün kayıtları listeliyoruz.

Kayıtların belirli kısımlarını okuma

Bu formülü uygulayarak aynı tablodan sadece belirli sütunları seçebiliriz. Örneğin müşterilerin sadece adı, soyadı ve telefon numaralarını getirelim:

SELECT first_name,last_name,business_phone FROM northwind.customers;

Sütun adı değiştirme: AS kelimesi

Bir sütunun adını değiştirerek kayıtları getirmek için AS kelimesi kullanırız. Örneğin telefon sütunu "telephone" adıyla getirilsin.

Sütunları birleştirme : CONCAT() fonksiyonu

Bazen ad, soyad gibi sütunları birleştirerek yeni bir sütun halinde getirmek isteriz. Bunun için CONCAT() fonksiyonu kullanılır.

Kayıtlarda seçim yapma : WHERE

Bütün kayıtları değil de, sadece belirli şartları sağlayanları getirmek için WHERE ile koşul belirtiriz. Örneğin bu defa sadece iş yeri sahibi olan kişileri isteyelim.

SELECT * FROM northwind.customers 
WHERE job_title = "Owner";

Sadece numarası 10'a kadar olan kayıtları isteyelim.

Kayıtların sayısını getirme: COUNT() fonksiyonu

Bazen kayıtların kendisiyle değil de sayısıyla ilgileniriz. Örneğin kayıtlarımızda kaç adet iş yeri sahibi varmış, görelim.

SQL yazarken comment ekleme: /* */

Diğer dillerde olduğu gibi sql'de de comment yazarak bilgi notları ilave edebilirsiniz.

Seçim yaparken birden fazla koşul ekleme: AND kelimesi

Bazen birden fazla şartı yerine getiren kayıtları getirmek isteriz. Örneğin iş yeri sahibi olup aynı zamanda Seattle şehrinde ikamet eden kişileri isteyelim.

Seçim yaparken "veya" şartı ekleme: OR kelimesi

Eğer hem iş yeri sahipleri, hem de satın alma müdürlerini birlikte görmek istiyorsak, OR ile "veya" şartı ekleyebiliriz.

Seçim yaparken "olmasın" şartı ekleme: NOT kelimesi

Bazı durumlarda WHERE ile bir koşul belirtirken onu hariç tutmak isteriz. Örneğin iş yeri sahibi olan değil, aksine olmayan müşterileri seçmek için iş yeri sahiplerine ait olan kayıtları NOT ile hariç tutmamız gerekir.

String'lerde benzerlik arama: LIKE kelimesi

Diyelim ki soyadı A harfi ile başlayan kişileri getirmek istiyoruz. Bu durumda LIKE kelimesi ile bir regex ifadesi kullanarak bunu tanımlamamız gerekir.

Tablo birleştirme: JOIN kelimesi

Bazen istediğimiz bilgiler birden fazla tabloya bölünmüş durumdadır. Bu durumda bu tabloları birleştirerek işlem yapmamız gerekir. Bunun için JOIN kelimesi kullanırız.

Müşteri tablosu
Sipariş tablosu

Örneğin şimdiye kadar yapılan siparişleri ve bunları veren müşterilerin adlarını görelim. Yalnız bildiğiniz gibi sipariş ve müşteri detayları ayrı tablolarda bulunuyor. Bunları birbirine bağlayan tek şey, FOREIGN KEY dediğimiz, başka tabloda bulunan bir kayda atılan referanstır. Yani sipariş tablosunda müşteri adı yazmaz, fakat müşteri numarası bulunur; bu numara da müşteri tablosundaki bir kayıtta bulunan id değeri ile eşleşir.

Foreign key ile sipariş ve müşteri tablosu arasındaki eşleşmeyi görüyoruz

Şimdi bu iki tabloyu JOIN kullanarak ve ON ile bir anahtar üzerinden eşleyerek istediğimiz sütunları getirelim.

Müşteri ve sipariş tabloları birleştirilip hangi müşterinin hangi siparişi verdiği listeleniyor

FOREIGN KEY ile başka tablo kayıtlarına referans verme

Sipariş tablosunda müşterilerin ismi yerine kayıt numarasının atıldığını görmüştük. Şimdi tablo ilk kez oluşturulurken bunun nasıl tanımlandığına bakalım.

CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `employee_id` int(11) DEFAULT NULL,
  `customer_id` int(11) DEFAULT NULL,
  `order_date` datetime DEFAULT NULL,
  `shipped_date` datetime DEFAULT NULL,
  `shipper_id` int(11) DEFAULT NULL,
  `ship_name` varchar(50) DEFAULT NULL,
  `ship_address` longtext,
  `ship_city` varchar(50) DEFAULT NULL,
  `ship_state_province` varchar(50) DEFAULT NULL,
  `ship_zip_postal_code` varchar(50) DEFAULT NULL,
  `ship_country_region` varchar(50) DEFAULT NULL,
  `shipping_fee` decimal(19,4) DEFAULT '0.0000',
  `taxes` decimal(19,4) DEFAULT '0.0000',
  `payment_type` varchar(50) DEFAULT NULL,
  `paid_date` datetime DEFAULT NULL,
  `notes` longtext,
  `tax_rate` double DEFAULT '0',
  `tax_status_id` tinyint(4) DEFAULT NULL,
  `status_id` tinyint(4) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `customer_id` (`customer_id`),
  KEY `employee_id` (`employee_id`),
  KEY `id` (`id`),
  KEY `shipper_id` (`shipper_id`),
  KEY `tax_status` (`tax_status_id`),
  KEY `ship_zip_postal_code` (`ship_zip_postal_code`),
  KEY `fk_orders_orders_status` (`status_id`),
  CONSTRAINT `fk_orders_customers` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`),
  CONSTRAINT `fk_orders_employees` FOREIGN KEY (`employee_id`) REFERENCES `employees` (`id`),
  CONSTRAINT `fk_orders_orders_status` FOREIGN KEY (`status_id`) REFERENCES `orders_status` (`id`),
  CONSTRAINT `fk_orders_orders_tax_status` FOREIGN KEY (`tax_status_id`) REFERENCES `orders_tax_status` (`id`),
  CONSTRAINT `fk_orders_shippers` FOREIGN KEY (`shipper_id`) REFERENCES `shippers` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=82 DEFAULT CHARSET=utf8;
SELECT * FROM northwind.orders;

Burada en sondaki CONSTRAINT ifadelerinin her biri bir anahtar tanımlıyor. Bu anahtarlar REFERENCES ile işaret edilen tablodaki ilgili sütun ile eşleşiyor.

Bizim bir önceki örnekte kullandığımız foreign key şöyle tanımlanmış:

 CONSTRAINT `fk_orders_customers` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`)

Son söz.

Bu yazıda SQL diline bir giriş yaparak SELECT ile değişik şekillerde sorgulama yaptık.

Devam yazısında INSERT,UPDATE ve DELETE kelimelerini kullanarak kayıt ekleme, güncelleme ve silme işlemleri yapabilen daha ileri seviyede sorgular yazacağız.

Siz de başta aklınızdaki sorguları sql diline dökmeye çalışırken biraz zorlanacaksınız. Ama bu egzersiz sayesinde sorgulama mantığına hakim olarak bundan sonra önünüze gelen en karmaşık sorgulama problemlerine bile sade, basit çözümler getirebilirsiniz.

Bir sonraki yazıya devam etmek için:

SQL ile kayıt düzenleme : INSERT, UPDATE, DELETE
Bu yazıda veritabanına yeni kayıt ekleme, kayıt güncelleme ve kayıt silme işlemleri yapıyoruz.