programlamadunyasi
İleri Düzey SQL
İLERİ DÜZEY SQL
Birden Fazla Tablo Sorgulama
NOT: Eğer bir önceki bölümdeki dersler yararlı geldiyse ve sorun yaşamadan komut kullanımını öğrendiyseniz bu konular MySQL'de çok daha geniş bilgiler edinmenizi sağlayacaktır.
Tablolarımız birbiriyle ortaklaşa sonuç üretmek zorunda kalabilir. Örneğin bir forumda üyeler ve mesajlar adlı iki tablomuz olsaydı mesaj hangi üye tarafından atılmış bilgisini direkt mysql'den almamız gerekebilirdi. Eğer bu iki tablo arasında bir bağlantıdan yararlanabiliyorsak (benzerlik içeren bir sütun) bunu yapmamız mümkün.
İşte böyle durumlar için sütunları adlandırdığımız gibi tabloları adlandırıp birden fazla tablo üzerinde işlem yapabilme şansına sahibiz. Bunu ayrıca bir sonraki derste göreceğiniz INNER/LEFT/RIGHT JOIN komutu ile de yapabilirsiniz.
Şimdi tabloları adlandırarak aşağıdaki iki tabloyu tek bir sorguda kullanalım:
SELECT * FROM uyeler; +----+-------+ | id | isim | +----+-------+ | 1 | Seda | | 2 | Merve | | 3 | Cemil | +----+-------+ SELECT * FROM mesajlar; +----+--------+---------------+ | id | uye_id | mesaj | +----+--------+---------------+ | 1 | 1 | Selamlar | | 2 | 3 | Nabersiniz? | | 3 | 3 | Kimse var mı? | | 4 | 2 | Merhaba | +----+--------+---------------+
Görüldüğü üzere "mesajlar" tablosunda mesajın hangi üye tarafından gönderildiği "uye_id" sütununda sayısal olarak belirtilmiş. Şimdi sorguların üye adı - mesaj eşleştirmesiyle gelmesini sağlayalım:
SELECT t1.isim, t2.mesaj FROM uyeler t1, mesajlar t2 WHERE t1.id = t2.uye_id; +-------+---------------+ | isim | mesaj | +-------+---------------+ | Seda | Selamlar | | Cemil | Nabersiniz? | | Cemil | Kimse var mı? | | Merve | Merhaba | +-------+---------------+
Sonucun yukarıdaki şekilde geldiğini göreceğiz. Burada FROM tablolar kısmında uyeler adlı tabloyu t1 adıyla, mesajlar adlı tabloyu t2 adıyla nitelendirdiğimizi sunucuya bildirmiş olduk. Böylelikle ilgili tablonun sütunlarını sanki tek tabloymuş gibi işleme aldık. FROM tablolar kısmında kullanacağımız tabloların yanına onu temsilen bir kelime yazarız ve aralara virgül koyarak bunlara yer veririz.
WHERE koşul kısmında benzerliğe yer verdik. Çünkü bu iki tablo temelde birbirinden ilgisiz tablolar olabilir. Bu durumda bir özelliğe göre eşleştirme yapmamız gerekli. İşte mesajlar kısmında uye_id'e yer vermemizin sebebi de bu.
Bu tarz sorgularda sütun adlarından önce mutlaka tablonun adını getirin, çünkü bir benzerlik durumunda istenilen sonucu alamayabilirsiniz. Örneğin: t1.isim (uyeler tablosunun isim sütunu).
NOT: Adlandırma yaparken FROM uyeler as t1, mesajlar as t2 yapısını da kullanabilirsiniz.
Sonuca Başka Bir Tabloyu Katmak
Birden fazla tablo ile sorgulama yapmanın diğer bir yolu JOIN kullanmaktır. Bu komutla birlikte ayrıca INNER JOIN, OUTER JOIN, LEFT JOIN ve RIGHT JOIN komutları da bu derste anlatılacaktır.
Bu sayfadaki tüm örneklerde aşağıdaki tablo dikkate alınacaktır:
SELECT * FROM demo_people; +------------+--------------+------+ | name | phone | pid | +------------+--------------+------+ | Mr Brown | 01225 708225 | 1 | | Miss Smith | 01225 899360 | 2 | | Mr Pullen | 01380 724040 | 3 | +------------+--------------+------+ SELECT * FROM demo_property; +------+------+----------------------+ | pid | spid | selling | +------+------+----------------------+ | 1 | 1 | Old House Farm | | 3 | 2 | The Willows | | 3 | 3 | Tall Trees | | 3 | 4 | The Melksham Florist | | 4 | 5 | Dun Roamin | +------+------+----------------------+
Yukarıda yer alan ilk tablo "demo_people" adındadır ve müşterileri içerir. Alttaki tablo ise "demo_property" adında olup satış ilanlarını içerir.
İlk olarak sadece JOIN kullanarak müşteri - telefon numarası - sattığı emlak sütunlarını bir araya getirelim:
select name, phone, selling from demo_people join demo_property on demo_people.pid = demo_property.pid; +-----------+--------------+----------------------+ | name | phone | selling | +-----------+--------------+----------------------+ | Mr Brown | 01225 708225 | Old House Farm | | Mr Pullen | 01380 724040 | The Willows | | Mr Pullen | 01380 724040 | Tall Trees | | Mr Pullen | 01380 724040 | The Melksham Florist | +-----------+--------------+----------------------+
JOIN tablo_adı ON koşul şeklinde bir kullanım dikkatinizi çekmiştir. Burada bir önceki derste olduğu gibi müşteri numarası (pid) benzerliğinden yola çıkarak iki tabloyu birleştirdik.
LEFT JOIN kullanarak bu örneği yapsaydık fazladan 1 sonuç çıktığını görecektik:
select name, phone, selling from demo_people left join demo_property on demo_people.pid = demo_property.pid; +------------+--------------+----------------------+ | name | phone | selling | +------------+--------------+----------------------+ | Mr Brown | 01225 708225 | Old House Farm | | Miss Smith | 01225 899360 | NULL | | Mr Pullen | 01380 724040 | The Willows | | Mr Pullen | 01380 724040 | Tall Trees | | Mr Pullen | 01380 724040 | The Melksham Florist | +------------+--------------+----------------------+
Bu örnekte eşleşmeyen kayıtlarda en soldaki tabloda görülmektedir (Miss Smith).
RIGHT JOIN kullandığımızda bu kez sağ taraftaki tabloda eşleşmeyen kayıtları göreceğiz:
select name, phone, selling from demo_people right join demo_property on demo_people.pid = demo_property.pid; +-----------+--------------+----------------------+ | name | phone | selling | +-----------+--------------+----------------------+ | Mr Brown | 01225 708225 | Old House Farm | | Mr Pullen | 01380 724040 | The Willows | | Mr Pullen | 01380 724040 | Tall Trees | | Mr Pullen | 01380 724040 | The Melksham Florist | | NULL | NULL | Dun Roamin | +-----------+--------------+----------------------+
INNER JOIN, LEFT JOIN örneğinde yaptığımız gibi bir sonuç verecekti. OUTER JOIN ise LEFT ve RIGHT kullanarak oluşturduğumuz sorgudan sonra istemediğimiz verileri ayıklamak için kullandığımız komuttur.
Matematiksel İşlemler
Bir matematiksel işlem yapmak için SELECT islem yapılabilir. Örnekte geçen % mod anlamına gelmektedir ve bölümden kalanı gösterir:
SELECT 87 % 9; /* Sonuç 6 çıkacaktır */
Yukarıdaki mod işlemini MOD(x, y) fonksiyonunu kullanarak da yapabiliriz.
SELECT MOD(37, 13); /* Sonuç 11 çıkacaktır */
Mutlak değer sorgusu için ABS(x) fonksiyonunu kullanırız:
SELECT ABS(-4.5); /* Sonuç 4.5 çıkacaktır */
Bir sayının pozitif, negatif ya da sıfır olduğunu SIGN(x) fonksiyonu ile bulabiliriz:
SELECT SIGN(-34); /* Sonuç -1 çıkacaktır */
Bir sayının üslü değerini bulmak için POWER(x, y) kullanılabilir:
SELECT POWER(4, 3); /* 4 üssü 3 = sonuç 64 çıkacaktır */
Bir sayının kare kökü için SQRT(x) kullanılabilir:
SELECT SQRT(9); /* Sonuç 3 çıkacaktır */
Ondalıklı bir sayıyı yuvarlamak için ROUND(x) kullanılır:
SELECT ROUND(12.4);
/* Sonuç 12 çıkacaktır, 12.51 olsaydı 13 olurdu. */
/* Sonuç 12 çıkacaktır, 12.51 olsaydı 13 olurdu. */
Ondalıklı bir sayının alt tam sayısı için FLOOR(x), üst tam sayısı için CEILING(x) kullanılabilir.
SELECT FLOOR(36.6); /* Sonuç 36 çıkacaktır */
SELECT CEILING(36.6); /* Sonuç 37 çıkacaktır */
Genel olarak 3 veri türünden bahsedebiliriz:
- Integer (Sayısal)
- Text (Alfasayısal)
- Date (Tarih)
TINYINT, 0 ile 255 arasında sayı barındırabilirler. Eğer UNSIGNED özelliği belirtilmişse -128 ile 127 arasında değerleri depolarlar.
SMALLINT, 0 ile 65535 arasında sayı değerlerini barındırabilirler. Eğer UNSIGNED belirtilmişse -32768 ile 32767 arasındaki değerleri alırlar.
MEDIUMINT, 0 ile 16777215 arasındaki sayı değerlerini barındırabilirler. Eğer UNSIGNED belirtilmişse -8388608 ile 8388607 arasındaki değerleri alırlar.
INT, 0 ile 4294967295 arasındaki sayıları depolarlar. UNSIGNED kullanılmışsa -2147683648 ile 2147683647 arasındaki değerler alt ve üst limitleri olur.
BIGINT, -9223372036854775808 ile 9223372036854775807 arasındaki sayıları depolayabilirler.
FLOAT, pozitif ondalık sayıları depolar.
DOUBLE, negatif ve pozitif ondalık sayıları depolar.
DECIMAL, 10'luk değerleri depolar.
İhtiyaca göre sayısal değer içerek sütunlarda bu veri türleri kullanılabilir.
CHAR(x), x kadar karakter barındırır (x en fazla 255 olabilir).
VARCHAR(x), x kadar karakter barındırır (x en fazla 255 olabilir).
TINYTEXT, kısa yazılar.
MEDIUMTEXT, orta uzunlukta yazılar.
TEXT, uzun yazılar.
LONGTEXT, çok uzun yazılar.
DATE, YYYY-AA-GG formatıyla tarihi depolar.
TIME, hh:mm:ss formatıysa saati depolar.
DATETIME gün önce başlamak üzere tarih ve saati depolar.
TIMESTAMP sayısal bir değer olarak saati işler.
YEAR yılı depolar.
Bu konu ayrıca Tarihlerle İşlem sayfasında anlatılmıştır.
SQL programlama dilinde kullanılan tüm kodlar aşağıda listelenmiştir:
Veri Türleri
Sütunlar çeşitli veri türlerine bağlı olarak veri saklarlar. Örneğin sayısal bir değer olabileceği gibi harflerden oluşan bir değere de sahip olabilirler. İşte MySQL'in veri türleri de bir tablo oluştururken ya da daha sonradan tablonun sütun türünü değiştirirken kullandığımız kodlardır.Genel olarak 3 veri türünden bahsedebiliriz:
- Integer (Sayısal)
- Text (Alfasayısal)
- Date (Tarih)
Sayısal Değer İçerenler (INTEGER)
Bunlar sadece rakamdan oluşan sayısal değerler barındırabilirler. Hepsi UNSIGNED ve AUTO_INCREMENT özelliği alabilirler. Bunları tanıyalım:TINYINT, 0 ile 255 arasında sayı barındırabilirler. Eğer UNSIGNED özelliği belirtilmişse -128 ile 127 arasında değerleri depolarlar.
SMALLINT, 0 ile 65535 arasında sayı değerlerini barındırabilirler. Eğer UNSIGNED belirtilmişse -32768 ile 32767 arasındaki değerleri alırlar.
MEDIUMINT, 0 ile 16777215 arasındaki sayı değerlerini barındırabilirler. Eğer UNSIGNED belirtilmişse -8388608 ile 8388607 arasındaki değerleri alırlar.
INT, 0 ile 4294967295 arasındaki sayıları depolarlar. UNSIGNED kullanılmışsa -2147683648 ile 2147683647 arasındaki değerler alt ve üst limitleri olur.
BIGINT, -9223372036854775808 ile 9223372036854775807 arasındaki sayıları depolayabilirler.
FLOAT, pozitif ondalık sayıları depolar.
DOUBLE, negatif ve pozitif ondalık sayıları depolar.
DECIMAL, 10'luk değerleri depolar.
İhtiyaca göre sayısal değer içerek sütunlarda bu veri türleri kullanılabilir.
Alfasayısal (Sözel) Veriler (VARCHAR, TEXT)
Barındıracağı harf/veri uzunluğuna göre belirlenirler. Bunlar karakterleri depolarlar. Aşağıda parantez ile belirtilen yere bir sayı gelir. Örneğin VARCHAR(10) dersek bu 10 karakter barındırabileceğini anlatır, (abcdefghij) gibi..CHAR(x), x kadar karakter barındırır (x en fazla 255 olabilir).
VARCHAR(x), x kadar karakter barındırır (x en fazla 255 olabilir).
TINYTEXT, kısa yazılar.
MEDIUMTEXT, orta uzunlukta yazılar.
TEXT, uzun yazılar.
LONGTEXT, çok uzun yazılar.
Tarih İçeren Veriler (DATE)
Format hiçbir zaman değişmemekle birlikte veriler tıpkı alfasayısal veriymiş gibi işlenir ve ancak belli fonksiyonlarla sorgulanabilir.DATE, YYYY-AA-GG formatıyla tarihi depolar.
TIME, hh:mm:ss formatıysa saati depolar.
DATETIME gün önce başlamak üzere tarih ve saati depolar.
TIMESTAMP sayısal bir değer olarak saati işler.
YEAR yılı depolar.
Bu konu ayrıca Tarihlerle İşlem sayfasında anlatılmıştır.
Tüm Komutlar
Bu sitede yer verdiğimiz tüm komutlar aşağıda listelenmiştir:SQL programlama dilinde kullanılan tüm kodlar aşağıda listelenmiştir:
| Komut | Açıklama |
| # açıklama | Açıklama eklemek. |
| -- açıklama | Açıklama eklemek. |
| /* açıklama */ | Açıklama eklemek. |
| CREATE DATABASE | Veritabanı oluşturmak. |
| CREATE TABLE | Tablo oluşturmak. |
| DROP DATABASE | Veritabanı silmek. |
| DROP TABLE | Tablo silmek. |
| SELECT | Bir sorgu gerçekleştirmek. |
| DELETE FROM | Veri silmek. |
| INSERT INTO | Veri eklemek. |
| UPDATE | Veri güncellemek. |
| DESCRIBE | Tablo detaylarını öğrenmek. |
Bugün 18 ziyaretçikişi burdaydı!
Sanal Alemin çocukları..
Link Takas
Son Guncelleme Tarihleri
- Pazar, 19 Ekim, 2014Site Guncellemesi
- ..., Ekim, 2014Html kodları Eklenecek
- ??, Kasım, 2014Yeni tasarlanmış CSS tasarımlar Eklenecek
- ..., ... , ...Eklenecek
- ..., ..., ...Eklenecek



