MySQL veritabanı yönetimi, Konsol komutaları, Veri Türleri, Standart ve Harici Fonksiyonlar, Örnek Uygulamalar…
kısaca MySQL üzerine küçük bir Derscik…
1. Root kullanıcısına şifre vermek
2. Sunucuya Bağlanmak ve Sunucu Yönetimi
2.1. Sunucu Yönetimi, Kullanıcı Oluşturma ve Hakları
4. Konsolda Sorgu Komutları ve Fonksiyon Kullanımı
4.1. Matematiksel Fonksiyonlar
4.2. Tarih ve Zaman Fonksiyonları
4.6. Örnek Veritabanı ve Tabloları Oluşturma
5.4. Magaza veritabanında oluşturulmuş örnek kayıtlar
5.6. Şartsız (koşulsuz) kayıt sorgulama
5.8. Kısıtlı bilgilere göre sorgulama
5.9. Boş ve dolu alanlara göre sorgu
5.10. Sorgu sonucu dönen kayıtların sıralanması
5.12. İki veya daha fazla tablonun beraber sorgulanması (JOIN)
5.13. Tablo adlarına takma ad (Alias) verme
MySQL Veritabanı Yönetimi
MySQL veritabanı sunucusu kurulduktan sonra yapılacak olan işlemlerin başında mysql veritabanına sunucusunu yönetecek “root” kullanıcısına şifre verilmesidir. Daha önce de bahsedildiği gibi mysql sunucusu çalıştırılır.
Arka planda çalışması için
# /usr/local/mysql/bin/safe_mysqld &
komutu verilebilir.
1. Root kullanıcısına şifre vermek
# cd /usr/local/mysql/bin/
# mysqladmin -u root -password ‘<şifre>’
Örnek
# mysqladmin -u root -password Aufen*
Aufen* şifresi açık olarak yazılmaktadır.
2. Sunucuya Bağlanmak ve Sunucu Yönetimi
# mysql -u root -p
komutu sonucunda sizden şifrenin girilmesi için aşağıdaki ileti gelecektir
Enter passwd:
Şifre girilerek sunucuya bağlanılır.
Eğer bağlatı komutu ile şifre aynı anda girilecekse
# mysql -u root -pAufen*
şeklinde yazılmalıdır. Burada dikkat edilmesi gereken husus –p ile şifrenin birleşik olduğudur.
Başka bir makinadaki MySQL sunucusuna bağlanmak için
# mysql -h hostaname -pşifre
şeklinde yazılmalıdır.
2.1. Sunucu Yönetimi, Kullanıcı Oluşturma ve Hakları
MySQL sunucu yönetimi, sunucu kurulduğu anda oluşan mysql veritabanında gerçekleşir. Bu veritabanında 5 adet tablo vardır, bu tablolar erişim haklarını denetlerler.
- user tablosu kullanıcıların sunucuya hangi host makinadan hangi haklarla bağlanabileceğini belirler. Bu tabloda bulunan haklar kullanıcıya global olarak verilir ve verilen haklar istisnasız tüm veritabanları üzerinde etkili olur. Host alanı ise tam tersine bağlanabilecek tüm hostları içermelidir. Diğer tablolarda bunların dışında host alanı girilmesi anlam taşımayacaktır.
- db tablosu kullanıcıların belirli bir veritabanına hangi haklarla erişebileceğini gösterir. Global olarak sahip olunmayan hakları verebilir, ancak global olarak sahip olunan hakları kaldıramaz. Yani user tablosunda kullanıcıya verilen hakları geri alamaz ama belirli bir veritabanına ait olmak üzere yeni haklar verebilir. Burada host alanı user tablosunda verilen host aralığını daraltabilir. Yani bir kullanıcı user tablosundaki host aralığının kapsadığı bir host’tan sunucu bağlantısı kursa da, db tablosunda belirli bir veritabanına kullanıcının bu hosttan erişimine ilişkin bir satır (kayıt) yoksa veritabanına erişemez. Burada host alanı için için tipik olarak ‘%’ kullanılabilir. Böylece sunucu bağlantısı sağlayabilen tüm hostlar veritabanına kabul edilirler.
- host tablosu db tablosundaki ‘host’ alanına değer girilmezse anlam kazanır. Bu durumda ilgili veritabanına bağlanabilecek hostlar host tablosundan taranır ve erişim haklarına bakılır. Burada haklar açısından user ve db tabloları arasındaki ilişkiden farklı br durum vardır. Öyle ki burada db ve host tabloları arasında adeta bir AND işlemi yapılır.
- table-priv tablosu tablo düzeyinde erişim haklarını belirler. (Sadece grant, revoke komutları ile değiştirilmeli)
- column-priv tablosu tablo kolonları düzeyinde erişim haklarını belirler. (Sadece grant, revoke komutları ile değiştirilmeli)
Bu tablolarda kullanıcının bir erişim hakkı varsa daha alt düzey tablolara bakılmaz. Yapılan değişiklikleri etkinleştirmek için flush privileges komutu kullanılır.
# mysqladmin flush-privileges
Veri işleme komutları ile mysql veritabanı üzerinde değişiklik yaparak kullanıcı hakları değiştirilebileceği gibi, daha emniyetli metod olarak grant ve revoke komutları kullanılabilir.
GRANT priv_type [(column_list)] [, priv_type [(column_list)] …]
ON {tbl_name | * | *.* | db_name.*}
TO user_name [IDENTIFIED BY [PASSWORD] ‘password’]
[, user_name [IDENTIFIED BY 'password'] …]
[WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR # |
MAX_UPDATES_PER_HOUR # |
MAX_CONNECTIONS_PER_HOUR #]]
priv_type seçenekleri Açıklama
ALL [PRIVILEGES] Tüm haklar verilir.
ALTER ALTER TABLE komutu kullanma hakkı
CREATE CREATE TABLE komutu kullanma hakkı
DELETE DELETE komutu kullanma hakkı
DROP DROP TABLE komutu kullanma hakkı
FILE SELECT … INTO OUTFILE ve LOAD DATA INFILE.
INDEX CREATE INDEX and DROP INDEX
INSERT INSERT
SELECT SELECT sorgu komutu
RELOAD Allows usage of FLUSH
REPLICATION CLIENT Gives the right to the user to ask where the slaves/masters are.
REPLICATION SLAVE Needed for the replication slaves (to read binlogs from master).
SHOW DATABASES SHOW DATABASES komutu kullanma
UPDATE PDATE komutu kullanma
Bu “priv_type” seçenekleri seçilerek haklar verilebilir.
Kullanıcı Oluşturma ve Hak verme
Kullanıcıların erişim hakları mysql komut satırında SQL komutlarıyla mysql veritabanındaki user, db, host, table-priv ve column-priv tablolarına girilebileceği gibi bu işi otomatik olarak yapan GRANT komutunu kullanmak daha doğru olacaktır.
Örnek1:
mysql>GRANT ALL PRIVILEGES ON *.* TO berfin@localhost IDENTIFIED BY ‘berfin1′ ;
“berfin” kullanıcısı,”localhost” bilgisayardan, “berfin1” sifresiyle tüm haklara sahip olarak oluşturulur. Sadece user tablosunda oluşturulur.
Örnek 2:
mysql>GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON personel.*
TO sena@localhost
IDENTIFIED BY ’sena1′;
sena kullanıcısı, “localhost” bilgisayardan, personel veritabanının tum alanlarında “SELECT,INSERT,UPDATE,DELETE,CREATE,DROP” haklarına “sena1” şifresiyle erişecek şekilde oluşturulur. User tablosu ve db tablosunda yaratılır.
Kullanıcı Haklarını Silme
REVOKE ALL PRIVILEGES ON personel.* FROM sena@localhost;
sena kullanıcısının, “localhost” dan yapacağı bağlantılı, personel tablosundaki tüm haklarını iptal eder. Db tablosundan siler, user tablosunda kalır, fakat hiç bir tabloyu kullanamaz. User tablosundan da silmek için
mysql>Delete From user where user = “sena”
yazılır.
3.3. MySQL Consol Komutları
MySQL sunucusuna bağlanıldıktan sonra artık MySQL özgü komutların ve veritabanı yönetimi için SQL komutlarının verileceği komut satırı (konsol) gelmektedir.
mysql>
mysql>?
Konsolda verilecek komutları görüntüler. Bu komutlar aşağıda verilmiştir.
|
Komut |
Kısa kullanımı |
İşlev |
|
help |
\h |
MySQL de kullanılabilecek komutların listesini görüntüler |
|
? |
\? |
Help komutu ile aynı işlevi görür |
|
connect |
\r |
MySQL sunucusuna yeni bir bağlantı için kullanılır |
|
Ego |
\G |
MySQL sunucusuna gönderilen komutun sonucunu dikey olarak görüntüler (sorgudan dönen alanları alt alta yazar \G de noktalı virgül kullanılmaz). |
|
exit |
\q |
MySQL’den çıkmak için kullanılır (quit komutu ile aynıdır). |
|
|
\p |
Geçerli komutu, dönen sonuçlardan önce görüntüler |
|
rehash |
\# |
MySQL sunucusundaki son yapılan ayarları günceller |
|
source |
\. |
Bir dosya içine yazılmış sql ifadesini çalıştırır |
|
status |
\s |
MySQL Server yapısı hakkında bilgi verir |
|
Tee |
\T |
Bu komuttan sonraki işlemlerin tamamı belirtilen dosyaya yazdırılır. |
|
notee |
\t |
\T ile dosyaya yazdırma işlemi sonlandırılır |
|
Use |
\u |
Başka bir veritabanı seçmeye yarar (Kullanıma hazır hale getirir) |
Örnek
mysql>\u mysql
Database changed
mysql>
Örnek
sorgu.sql (metin) dosyasının içeriği aşağıdaki gibidir.
select count(*) from user;
Bu dosya içerisindeki SQL ifadesi, komut satırında şu şekilde yazılarak çalıştırılır. User tablosundaki kayıt sayısını görüntüler.
mysql>\. sorgu.sql
3.1. Tablo Onarmak
mysql>repair tablo <tabloadi>;
Belirtilen tablodaki bozukluğu giderecektir.
Örnek
mysql>repair tablo personel.
3.1. Tablo Kontrol Etmek
mysql>check table <tabloadi>;
belirtilen tablodnun durumu kontrol edilir.
Örnek
mysql>check tablo personel.
4. Konsolda Sorgu Komutları ve Fonksiyon Kullanımı
Select deyimi: MySQL temel deyimidir. Bu deyim ile bilgi veritabanından alınacağı gibi, hazir bilgiyi kullanıcıya gösterir.
mysql> select “MySQL veritabani”,300;
+——————+—–+
| MySQL veritabani | 300 |
+——————+—–+
| MySQL veritabani | 300 |
+——————+—–+
1 row in set (0.00 sec)
Select deyimi ile Mysql fonksiyonlarıda kullanılabilir.
4.1. Matematiksel Fonksiyonlar
ABS ( x ) : x'in pozitif degerini bulur.
SIGN ( x ) : x pozitif ise 1, negatif ise -1, 0 ise 0 degerini uretir.
MOD ( x, y ) : x y'ye bolunur ve kalan deger fonksiyondan doner.
FLOOR ( x ) : x'e en yakin ve x'den kucuk tamsayiyi bulur.
CEILING ( x ) : x'e en yakin ve x'den buyuk tamsayiyi bulur.
ROUND ( x ) : x'e en yakin tamsayiyi verir.
ROUND ( x, D ) : noktali sayilarda x'e en yakin, noktadan sonra D rakam olan sayiyi verir.
Örnek
mysql> select floor(-5.2), ceiling(-5.2), round(1.16), round(1.16,1);
+-------------+---------------+-------------+---------------+
| floor(-5.2) | ceiling(-5.2) | round(1.16) | round(1.16,1) |
+-------------+---------------+-------------+---------------+
| -6 | -5 | 1 | 1.2 |
+-------------+---------------+-------------+---------------+
1 row in set (0.05 sec)
POW ( x, y ) , POWER ( x, y ) : x'in y'ninci kuvvetini bulur.
SQRT ( x ) : x'in karekokunu bulur.
PI ( ) : Pi sayisini verir.
GREATEST ( x, y, z .. ) : en buyuk veriyi bulur.
TRUNCATE ( x, D ) : noktali x sayisini noktadan sonra D rakamli hale sokar.
Örnek
mysql> select power(3,3),sqrt(25), truncate(Pi(),1);
+————+———-+——————+
| power(3,3) | sqrt(25) | truncate(Pi(),1) |
+————+———-+——————+
| 27.000000 | 5.000000 | 3.1 |
+————+———-+——————+
1 row in set (0.05 sec)
4.2. String Fonksiyonlar
ASCII ( veri ) : veri'nin ascii karsiligini bulur.
CHAR ( m1, m2, … ) : ascii kodlu m1,m2 degerlerini stringe donusturur ve birlestirir.
mysql> select char(77,121,83,81,76);
+-----------------------+
| char(77,121,83,81,76) |
+-----------------------+
| MySQL |
+-----------------------+
1 row in set (0.06 sec)
LENGTH ( m ) : m stinginin karakter sayisini bulur.
LOCATE ( m1, m2 ) : m1'in m2'deki pozisyonunu bulur.
mysql>select locate(“h”,”yahya”);
sonuc:3
LEFT ( m, a ) : m metninin soldan a sayisi kadarini alir.
mysql>select left(“yahya”,3);
sonuc:yah
RIGHT ( m, a ) : m metninin sağdan a sayisi kadarini alir.
SUBSTRING ( m, a ) : m metninin a'ninci karakter ve sonrasini alır.
mysql>select substring(“yahya”,3)
sonuc:hya
SUBSTRING ( m, a, b ) : m' metninin a'ninci karakterden itibaren b karakterlik kismini alır.
TRIM ( BOTH| LEADING| TRAILING ' m ' FROM ' veri ' ) : LEADING ile; veri'nin solundaki ' m ' verileri silinir.
TRAILING ile; veri'nin sagindaki ' m ' verileri silinir.
BOTH ile; veri'nin iki yanindaki ' m' verileri silinir.
mysql> select trim(“ ankara “);
sonuc:ankara
mysql>select trim(both “a” from “ankara”);
sonuc:nkar
SPACE ( a ) : a tane bosluk (space karakteri) uretir.
REPLACE ( veri, n1, n2 ) : veri'deki n1 yerine n2 getirilir.
mysql>select replace(“astroloji”,”loji”,”nomi”);
sonuc:astronomi
REPEAT(veri,a) : Yanyana a tane veri olusturulur.
REVERSE(veri) : veri'yi ters hale getirir.
mysql>select reverse(“Ankara U. Fen Fakültesi”);
sonuc:isetlükaF neF .U araknA
LCASE ( veri ) , LOWER ( veri ) : veri'yi kucuk harfler bicimine sokar.
UCASE ( veri ) , UPPER ( veri ) : veri'yi buyuk harfler bicimine sokar.
4.2. Tarih ve Zaman Fonksiyonları
DAYOFWEEK(tarih) : YYYY-MM-DD formatindaki tarih'in, haftanin kacinci gunu oldugunu bulur
mysql>select dayofweek(“2003-05-21”);
sonuc:4
DAYOFMONTH(tarih) :Ayin kacinci gunu oldugunu bulur.
DAYOFYEAR(tarih) :Yilin kacinci gunu oldugunu bulur.
MONTH(tarih) :Kacinci gun oldugunu bulur.
DAYNAME(tarih) :Gun adini bulur.
mysql>select dayname(“2003-05-21”);
sonuc:wednesday
MONTHNAME(tarih) :Ay adini bulur.
QUARTER(tarih) :Tarihin, yilin kacinci ceyreginde oldugunu bulur.
mysql>select quarter(“2003-05-21”);
sonuç:2
WEEK(tarih) :Yilin kacinci haftasi oldugunu bulur.
YEAR(tarih) :Hangi yil oldugunu bulur.
HOUR(zaman) :HH:MM:SS formatindaki zaman verisinden saat bulunur.
mysql>select hour(“10:15:06”);
sonuc:10
MINUTE(zaman) :Dakikayi bulur.
SECOND(zaman) :Saniyeyi bulur.
TO_DAYS(tarih) :Tarihi sayıya dönüştürür
mysql>select to_days(“2003-05-21”);
sonuc:731721
FROM_DAYS(sayi) :Sayıyı tarihe dönüştürür
mysql>select from_days(731721);
sonuc:731721
DATE_FORMAT(parametreler): Verilecek çeşitli parametrelere karşın farklı bilgiler verir.
mysql>select date_format('2003-05-21 13:23:00', '%W %M %Y');
sonuc:Wednesday May 2003
DATE_FORMAT fonksiyonu ile kullanilabilecek %W %M gibi parametreler :
%M : Ay adi ( January, December )
%W : Gun adi ( Sunday, Saturay )
%D : Gun degeri ve eki ( 1st, 2nd )
%Y : Yil degeri , 4 dijit ( 1993 )
%y : Yil degeri , 2 dijit ( 93 )
%a : Kisaltilmis gun adi ( Sun, Sat )
%d : Gun degeri , 2 dijit ( 00 , 31 )
%e : Gun degeri ( 0 , 31 )
%m : Ay degeri , 2 dijit ( 01 , 12 )
%c : Ay degeri ( 1 , 12 )
%b : Kisaltilmis ay adi ( Jan , Dec )
%j : Yilin gun sayisi ( 001 , 366 )
%H : Saat , 2 dijit ( 00 , 23 )
%k : Saat ( 0 , 23 )
%h : Saat , 2 dijit ( 01 , 12 )
%l : Saat ( 1 , 12 )
%i : Dakika ( 00 , 59 )
%r : Zaman , 12 saatlik ( hh : mm : ss [AP] M )
%T : Zaman , 24 saatlik ( hh : mm : ss )
%S : Saniye ( 00 , 59 )
%p : AM yada PM
%w : Haftanin kacinci gunu oldugu ( 0=Sunday , 6=Saturday )
%U : Yilin kacinci haftasi oldugu ( Sunday haftanin birinci gunu )
%u : Yilin kacinci haftasi oldugu ( Monday haftanin birinci gunu )
%% : Sadece ' % ' karakteri
TIME_FORMAT fonksiyonu da DATE_FORMAT biciminde kullanilir. Ancak sadece saat, dakika, saniye
verileri kullanilir. Aksi halde NULL degeri verir.
CURDATE() , CURRENT_DATE(): O anki tarihi verir.
mysql>select current_date();
sonuc:2003-04-28
CURTIME() , CURRENT_TIME ():O anki saati verir.
NOW(): O anki zamanı
mysql>select curtime();
sonuc:2003-04-29 14:17:53
SEC_TO_TIME (sayi) : sayiyi zamana dönüştürü
TIME_TO_SEC(“saat”) : zamanı sayiya dönüştürür
mysql>select sec_to_time(68);
sonuc 00:01:08
mysql>select time_to_sec(68);
sonuc 00:01:08
4.3. Çeşitli Fonksiyonlar
DATABASE ( ) :Calisilan database ismini verir.
USER ( ) :MySQL kullanıcı ismini verir.
PASSWORD ( “ifade”) :Girilen ifadeyi sifreli forma sokar.
ENCRYPT(“ifade”) :Girilen ifadeyi ' Unix crypt() ' metodu ile sifreli forma sokar.
mysql>select PASSWORD('abc'), ENCRYPT('abc');
sonuc 7cd2b5942be28759, hFcIOF2w.HvvE
VERSION ( ) : MySQL Server versiyonunu bildirir.
SHOW databases : Veritabanları listesini verir .
USE db_adi : Veritabanı seçimi yapar kullanıma hazırlar
SHOW tables : Seçili veritabanı tablolarını listesini verir .
DESC table_adı : Belirtilen tablonun alan listesini verir .
QUIT : MySQL den çıkmaya yarar .
mysql> show databases;
+———–+
| Database |
+———–+
| mysql |
| test |
+———–+
2 rows in set (0.00 sec)
mysql>use test;
test veritabanı seçilmiş olur.
4.4. MySQL Veri Türleri
MySQL de bilgi alanları aşağıdaki türler olabilir.
TINYINT(M) -> Numerik tamsayilar icin. -128, 127 arasinda deger alabilir. UNSIGNED ifadesi kullanilabilir.
SMALLINT(M) -> Numerik tamsayilar icin. -32768, 32767 arasinda deger alabilir. UNSIGNED ifadesi kullanilabilir.
MEDIUMINT(M) -> Numerik tamsayilar icin. -8388608, 8388607 arasinda deger alabilir. UNSIGNED ifadesi kullanilabilir.
INT(M),INTEGER(M) -> Numerik tamsayilar icin. -8388608, 8388607 arasinda deger alabilir. UNSIGNED ifadesi kullanilabilir.
BIGINT(M) -> Numerik tamsayilar icin. -9223372036854775808, 9223372036854775807 arasinda deger alabilir.
FLOAT((M)(D)) -> Ustel tamsayilar icin. -3.402823466E+38, -1.175494351E-38 arasinda deger alabilir.
DOUBLE((M)(D)) -> Ustel tamsayilar icin. -1.7976931348623157E+308, -2.2250738585072014E-308 arasinda deger alabilir.
DECIMAL((M)(D)) -> Noktali sayilar icin.
DATE -> Tarih formatli veri icin. 'YYYY-MM-DD' formundadir.
DATETIME -> Tarih-saat formatli veri icin. 'YYYY-MM-DD HH:MM:SS' formundadir.
TIMESTAMP -> Ozel tarih-saat formatli veri icin.
TIME -> Zaman formatli veri icin. 'HH:MM:SS' formundadir.
YEAR(2|4) -> 2 yada 4 dijitli yil degeri tutan tarih formati. 'YYYY' veya 'YY' formundadir.
CHAR(M) -> Sabit uzunluklu karakter dizisi icin. 1-255 arasinda karakter tutabilir.
VARCHAR(M) -> Degisken uzunluklu karakter dizisi icin. 1-255 arasinda karakter tutabilir.
TEXT -> Degisken uzunluklu karakter dizisi icin. 1-65535 arasinda karakter tutabilir.
MEDIUMTEXT -> Degisken uzunluklu karakter dizisi icin. 1-16777215 arasinda karakter tutabilir.
LONGTEXT -> Degisken uzunluklu karakter dizisi icin. 1-4294967295 arasinda karakter tutabilir.
ENUM(’deger1′..) -> Kullanicinin belirttigi anahtarlari tutar. Anahtar 65535′e kadar olabilir
4.5. Veritabanı SQL Komutları
Burada bahsedilecek komutlar programlama ve veritabanlarında ortak olan SQL komutlarıdır.
CREATE DATABASE :Yeni veritabanı oluşturmak için kullanılır.
mysql>create database fen;
fen isminde bir veritabanı oluşur.
DROP DATABASE :Veritabanını siler .
mysql>drop database fen;
magaza isimli veritabanı silinmiş olur .
CREATE TABLE :Yeni tablo oluşturmak için kullanılır.
Tablo oluşturma işlemi yapılmadan önce mutlaka veritabanı seçili olması gereklidir. Tablo oluşturmak için aşağıdaki komut dizisi yazılır.
CREATE TABLE tablo_adı
alan_adı veri_türü [DEFAULT ifade][alan_kısıtlaması],
…
…
[tablo_kısıtlaması]);
tablo_adı : Tabloya verilecek isim (örnek musteri),
alan_adı : Tabloda yer alacak bilgi alanlarının adı (Örnek, müşteri_no, adı, soyadı gibi)
alan_veri_türü : O alana girilecek bilginin türü (sayı, metin, tarih gibi)
DEFAULT ifade : O alan belirtilmez ise başlangıçta atanacak değer
alan_kısıtlaması : O alanla ilgili kısıtlama (boş olmaması, o alana sadece E veya K girilmesi gibi kısıtlama)
tablo_kısıtlaması : Her kaydın belirli alanlara göre kısıtlanması (kayıtların tek olmasını sağlamak, başka bir tablo ile ilişkilendirmek)
mysql>create table personel (sicil INTEGER NOT NULL, ad CHAR(10), soyad CHAR(10));
personel isimli tablo ve 3 bilgi alanı oluşur.
Tablo adı değiştirme
“Alter” komutu ile tablo yapısı değiştirilir.
Bir tablonun adı da değiştirilebilir.
ALTER TABLE <eski tablo adı> RENAME TABLE <yeni tablo adı>;
Örnek 1.
Urun tablosunun adını urun1 olarak değiştirmek için aşağıdaki ifade yazılır .
mysql> ALTER TABLE urun RENAME urun1;
Query OK, 0 rows affected (0.02 sec)
Not: Eğer tablo adı değiştirilmişse tekrar tablo adını eski haline getirmelisiniz, aksi halde aşağıdaki örnekler hata verecektir.
Tabloya alan ekleme
Tablolara yeni bir alan eklenebilmektedir.
ALTER TABLE <tablo adı> ADD <alan adı> <veri_turu>;
Örnek 1.
Urun tablosuna her üründe yapılabilecek iskonto için bir alan oluşturmak için aşağıdaki ifade yazılır.
mysql> ALTER TABLE urun ADD iskonto BIGINT;
Query OK, 5 rows affected (0.03 sec)
Records: 5 Duplicates: 0 Warnings: 0
Tabloda alan adları değiştirme
Bir tabloya ait alanların da adı değiştirilebilir.
ALTER TABLE <tablo adı> RENAME TABLE <eski alan adı> <yeni alan adı>;
Örnek 1.
mysql> ALTER TABLE urun CHANGE iskonto indirim BIGINT;
Query OK, 5 rows affected (0.02 sec)
Records: 5 Duplicates: 0 Warnings: 0
Tablodan alan silme
Var olan alanlar silinebilir.
ALTER TABLE <tablo adı> DROP <alan adı>;
Örnek 1.
Urun tablosundan indirim alanını silmek için aşağıdaki ifade yazılır.
mysql> ALTER TABLE urun DROP indirim;
Query OK, 5 rows affected (0.03 sec)
Records: 5 Duplicates: 0 Warnings: 0
Tablo Silme
Tablolara ihtiyaç kalmadığı zaman silmek için kullanılır. Silme işlemlerinin geri dönüşü yoktur, bu sebeple silme işlemlerinde son derece dikkatli davranılmalıdır.
DROP TABLE : Tablo silmek için kullanılır.
mysql>drop table personel;
personel tablosu silinir.
4.6. Örnek Veritabanı ve Tabloları Oluşturma
Örneğin spor malzemeleri satan bir mağaza internet üzerinden müşterilerinin siparişlerini almak istemektedir. Bunun için veritabanı yapısı şöyle olmalıdır. MAGAZA isimli veritabanında, siparişi veren müşterinin kişisel bilgilerinin tutulacağı MUSTERI tablosu, mağazada satılan ürünlerin bilgilerinin tutulacağı URUN tablosu ve siparişlerin tutulacağı SIPARIS tablosu oluşturmak gereklidir.
Tablolarda aşağıdaki bilgi alanları oluşturulmalıdır.
MUSTERI tablosu
musteri_no : Her müşteriyi temsil edecek bilgi (her numara bir tane olacak)
adi : Müşterinin adı
soyadi : Müşterinin soyadı
dogum_tarihi : Müşterinin doğum tarihi
cinsiyeti : Müşterinin cinsiyeti bilgisi
adresi : Müşterinin adresi
kart_no : Müşterinin kredi kartı numarası
zaman : Müşterinin kayıt edildiği tarih ve saat
URUN tablosu
urun_kodu : Her ürünü temsil edecek bilgi (her kod bir tane olacak)
urun_markasi : Ürünün markası
urun_adi : Ürünün adı
urun_fiyati : Ürünün satış fiyatı
SIPARIS tablosu
musteri_no : Siparişi yapan müşteriyi belirlemek için kullanılacak bilgi (aynı ada soyada sahip olan müşteriyi ayırt etmek amacıyla tek olan müşteri numarası kullanılır)
siparis_tarihi : Siparişin verildiği tarih
urun_kodu : Siparişi yapılan ürünü temsil eden kod (aynı isme sahip olan ürünleri ayırt etmek için ürün kodu kullanılır)
fiyat : Ürünün sipariş verildiği tarihteki fiyatı
miktar : Kaç adet sipariş verildiği sayı
tutar : Siparişin tutarı (Fiyatı*Miktar)
Örnek uygulama için sırasıyla “musteri”, “urun” ve “siparis” tabloları aşağıdaki SQL ifadeleri oluşturulmalıdır.
Musteri tablosunun oluşturulması:
mysql>CREATE TABLE musteri
(
musteri_no INTEGER(5) ZEROFILL NOT NULL,
adi VARCHAR(20) NOT NULL,
soyadi VARCHAR(20),
dogum_tarihi DATE,
cinsiyeti ENUM(’E',’K') DEFAULT ‘E’,
adres VARCHAR(30),
kart_no BIGINT(16) UNSIGNED,
zaman TIMESTAMP,
CONSTRAINT musteri_no_pk PRIMARY KEY (musteri_no)
);
Urun Tablosunun oluşturulması
mysql>CREATE TABLE urun
(
urun_kodu INTEGER(5) ZEROFILL NOT NULL,
urun_markasi VARCHAR(20) NOT NULL DEFAULT ‘BELiRSiZ’,
urun_turu VARCHAR(20) NOT NULL DEFAULT ‘BELiRSiZ’,
urun_fiyati BIGINT(10) UNSIGNED,
CONSTRAINT urun_kodu_pk PRIMARY KEY (urun_kodu)
);
Siparis Tablosunun oluşturulması
mysql>CREATE TABLE siparis
(
musteri_no INTEGER(5) ZEROFILL NOT NULL,
siparis_tarihi TIMESTAMP,
urun_kodu INTEGER(5) ZEROFILL NOT NULL,
fiyat BIGINT(10) UNSIGNED,
miktar SMALLINT UNSIGNED,
tutar BIGINT(16) UNSIGNED,
CONSTRAINT siparis_pk PRIMARY KEY
(musteri_no,siparis_tarihi,urun_kodu),
CONSTRAINT siparis_musteri_fk FOREIGN KEY
(musteri_no) REFERENCES musteri(musteri_no),
CONSTRAINT siparis_urun_fk FOREIGN KEY
(urun_kodu) REFERENCES urun(urun_kodu)
);
Bu sql ifadeleri bir text dosyaya yazarak da tablolar oluşturulabilir. ”yapi.sql” text dosyasinin içine yazılarak aşağıdaki çalıştırılabilir..
mysql>\. yapi.sql
şeklinde mysql komut satırında yazılarak çalıştırılır. Tablolar oluşturulur.
5. SQL Veri İşleme Komutları
5.1. Kayıt ekleme
INSERT INTO <tablo_adi> VALUES (tablodaki tüm alanların sırasına göre değerleri);
veya
INSERT INTO <tablo_adi> (alan1,alan2,…) VALUES
(deger1,deger2,…);
Örnek 1.
mysql> INSERT INTO musteri VALUES (1,’Yahya’,'Demircan’,'1990/05/26′,’E',’Ankara
Üniversitesi’,'1111222233334444′,’20020927170200′);
Örnek 2.
mysql> INSERT INTO musteri (musteri_no,adi,soyadi)
VALUES (2,’Muhittin’,'Altınkaya’);
Örnek 1 de VALUES dan sonra tablodaki tüm alanların değerleri aynı sırada yazılmalıdır. Eğer değeri yoksa veri türüne göre sayısal ise 0, alfasayısal ise ‘’ (tırnak aç-kapa) yazılır.
Örnek 2 de ise tablo adından sonra girilecek bilgi alanları yazılır, VALUES dan sonrada bu sıraya göre değerleri yazılır.
5.2. Kayıt güncelleme
UPDATE <tablo_adı>
SET alan1 = değer1 [, alan2=değer2, ...]
[WHERE koşul cümlesi] ;
Örnek 1.
mysql>UPDATE musteri SET dogum_tarihi = ‘1977/03/03’;
Örnek 1 uygulandığında tüm müşterilerin doğum tarihleri koşul belirtilmediği için aynı olacaktır.
Örnek 2.
mysql>UPDATE musteri SET dogum_tarihi = ‘1978/04/05’
WHERE musteri_no =2;
Örnek 2 uygulandığında koşul belirtildiği için sadece 2 nolu müşterinin doğum tarihi değiştirilmiş olur.
5.3. Kayıt silme
DELETE FROM <tablo_adı>
[WHERE koşul cümlesi];
Örnek 1.
Bu örnek oldukça tehlikelidir. Çünkü koşul belirtilmediği için musteri tablosundaki tüm kayıtlar silinmiş olacaktır, geri dönüşü olmayacaktır.
mysql>DELETE FROM musteri;
Örnek 2.
mysql>DELETE FROM musteri WHERE adi = ‘Muhittin’;
Örnek 2 uygulandığında koşul belirtildiği için Muhittin adlı müşteri tablodan silinmiş olacaktır.
5.4. Magaza veritabanında oluşturulmuş örnek kayıtlar
Veritabanı sorgulama işlemlerinde yapılan örneklerde aşağıdaki kayıtlar esas alınmıştır.
Musteri Tablosundaki tüm kayıtlar
+————+———-+———–+————–+———–+
| musteri_no | adi | soyadi | dogum_tarihi | cinsiyeti |
+————+———-+———–+————–+———–+
| 00001 | Yahya | Demircan | 1990-05-26 | E |
| 00002 | Muhittin | Altınkaya | 1977-03-03 | E |
| 00003 | Banu | Demirel | 1978-03-15 | K |
| 00004 | Sibel | Demirel | 1979-09-30 | K |
| 00005 | Murat | Köseçavuş | 1972-01-01 | E |
| 00006 | Ethem | Derman | 1948-04-10 | E |
+————+———-+———–+————–+———–+
6 rows in set (0.00 sec)
Urun Tablosundaki tüm kayıtlar
+———–+————–+——————-+————-+
| urun_kodu | urun_markasi | urun_turu | urun_fiyati |
+———–+————–+——————-+————-+
| 00001 | Adidas | Futbol ayakkabı | 100000 |
| 00002 | Adidas | Eşofman | 2750000 |
| 00003 | Reebok | Forma | 500 |
| 00004 | Mert | Pinpon Topu | 100 |
| 00005 | Mert | Masa Tenisi Raket | 175 |
+———–+————–+——————-+————-+
5 rows in set (0.00 sec)
Siparis Tablosundaki tüm kayıtlar
+————+—————-+———–+———+——–+———-+
| musteri_no | siparis_tarihi | urun_kodu | fiyat | miktar | tutar |
+————+—————-+———–+———+——–+———-+
| 00001 | 20020926000000 | 00001 | 100000 | 15 | 1500000 |
| 00001 | 20020926000000 | 00002 | 2750000 | 10 | 27500000 |
| 00002 | 20020930000000 | 00001 | 100000 | 5 | 500000 |
| 00002 | 20020930000000 | 00002 | 2750000 | 5 | 13750000 |
| 00002 | 20020930000000 | 00003 | 500 | 1000 | 500000 |
+————+—————-+———–+———+——–+———-+
5 rows in set (0.00 sec)
5.5. Kayıt sorgulama
Bu kısımda, bir veya birden çok tablodaki kayıtların nasıl sorgulanacağı anlatılacaktır. Yukarıda anlatılan veri işlemleri ile ilgili yapılan uygulamalar çalıştırıldıklarında sadece işlemin yapılıp yapılmadığına ilişkin mesajlar verilir. Buna rağmen, veritabanı işlemlerinde en çok sorgulama işlemleri kullanılır. Sorgulama cümlesine bağlı olarak, tablodaki kayıt sayısı, herhangi bir sayısal işlemin sonucu (toplam, ortalama, en küçük değer, en büyük değer, …) gibi bir veya birden çok tabloya bağlı olarak sorgulamanın sonucu görüntülenir. Sonuç olarak diğer veri işlemlerinden farklı olarak, sorgulama işlemleri sonucunda tablolardaki kayıtlar üzerinde herhangi bir değişiklik olmamaktadır.
SELECT [ALL|DISTINCT] { *|alan_adi_listesi}
[INTO {OUTFILE|DUMPFILE} ‘dosya_adı’ export_options]
FROM tablo-ismi
[WHERE koşul]
[GROUP BY alan_adi1 [ , alan_adi2] …]
[HAVING search-condition]
[ORDER BY siralama_alanlari]
şeklinde genel bir ifadesi vardır.
5.6. Şartsız (koşulsuz) kayıt sorgulama
Herhangi bir tabloya ait bilgi alanlarındaki bilgilerin listesini almak için;
SELECT <alan adı [,alan adı1,...]> FROM <tablo adı>;
ifadesi kullanılır. SELECT ile FROM arasına ekrana görüntülenecek bilgi alanları yazılır. Eğer tüm alanlar görüntülenecekse “*” (yıldız) kullanılır. Kesinlikle hem “*” hem de yanına başka bir bilgi alanı yazılamaz.
Örnek 1.
Sorgulamanın en genel ifadesidir. Siparis tablosundaki bütün bilgi alanlarının içeriğini listeler.
mysql> SELECT * FROM siparis;
+————+—————-+———–+———+——–+———-+
| musteri_no | siparis_tarihi | urun_kodu | fiyat | miktar | tutar |
+————+—————-+———–+———+——–+———-+
| 00001 | 20020926000000 | 00001 | 100000 | 15 | 1500000 |
| 00001 | 20020926000000 | 00002 | 2750000 | 10 | 27500000 |
| 00002 | 20020930000000 | 00001 | 100000 | 5 | 500000 |
| 00002 | 20020930000000 | 00002 | 2750000 | 5 | 13750000 |
| 00002 | 20020930000000 | 00003 | 500 | 1000 | 500000 |
+————+—————-+———–+———+——–+———-+
5 rows in set (0.00 sec);
Örnek 2.
Musteri tablosundaki tüm kayıtların musteri_no, adi ve soyadini görüntüleyen şartsız bir SQL ifadesidir.
mysql> SELECT musteri_no,adi,soyadi FROM musteri;
+————+———-+———–+
| musteri_no | adi | soyadi |
+————+———-+———–+
| 00001 | Yahya | Demircan |
| 00002 | Muhittin | Altınkaya |
| 00003 | Banu | Demirel |
| 00004 | Sibel | Demirel |
| 00005 | Murat | Köseçavuş |
| 00006 | Ethem | Derman |
+————+———-+———–+
6 rows in set (0.00 sec)
Örnek 3.
Tablo sorgulanırken aynı anda alanlar üzerinde hesaplamalar yapılabilir. Fakat yapılan hesaplamalar geçici olarak ekranda görüntülenir, tabloya kayıt edilmez.
mysql> SELECT tutar,tutar*0.25 FROM siparis;
+———-+————+
| tutar | tutar*0.25 |
+———-+————+
| 1500000 | 375000.00 |
| 27500000 | 6875000.00 |
| 500000 | 125000.00 |
| 13750000 | 3437500.00 |
| 500000 | 125000.00 |
+———-+————+
5 rows in set (0.00 sec)
Örnek 4.
Musterilerin ad ve soyadlarını birleştirerek görüntüleyen SQL ifadesidir. Bu birleştirme işlemine geçici olarak “isimsoyad” başlığı verilmiştir.
mysql> SELECT CONCAT(adi,’ ‘,soyadi) isimsoyad FROM musteri;
+——————–+
| isimsoyad |
+——————–+
| Yahya Demircan |
| Muhittin Altınkaya |
| Banu Demirel |
| Sibel Demirel |
| Murat Köseçavuş |
| Ethem Derman |
+——————–+
6 rows in set (0.00 sec)
Örnek 5.
Eğer SQL ifadelerinin sonucunu bir dosyaya yazdırmak gerekiyorsa aşağıdaki gibi bir ifade yazılmalıdır. “rapor.txt” dosyası bilgisayarın “c:\mysql\data\magaza\” klasöründe oluşur.
mysql> SELECT CONCAT(adi,’ ‘,soyadi) isimsoyad
-> INTO OUTFILE ‘rapor.txt’ FROM musteri;
Query OK, 6 rows affected (0.00 sec)
5.7. Şartlı kayıt sorgulama
Genellikle tablolardaki kayıtların tümüne değil, belli koşullara uyanlar görüntülenmek istenir. Bu durumda SQL cümlesine WHERE ifadesi eklenir.
SELECT <alan adı [,alan adı1,...]> FROM <tablo adı> WHERE <koşullar>
Örnek 1.
Musteri tablosundaki erkek müşterilerin adının ve soyadının görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT adi,soyadi FROM musteri WHERE cinsiyeti = ‘E’;
+———-+———–+
| adi | soyadi |
+———-+———–+
| Yahya | Demircan |
| Muhittin | Altınkaya |
| Murat | Köseçavuş |
| Ethem | Derman |
+———-+———–+
4 rows in set (0.00 sec)
Örnek 2.
Soyadı Demirel olan müşterilerin adı ve doğum tarihinin görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT adi,dogum_tarihi FROM musteri WHERE soyadi = ‘Demirel’;
+——-+————–+
| adi | dogum_tarihi |
+——-+————–+
| Banu | 1978-03-15 |
| Sibel | 1979-09-30 |
+——-+————–+
2 rows in set (0.00 sec)
Yukarıdaki örnekten farklı olarak tarih formatını değiştirmek için SQL ifadesinde fonksiyonlarda kullanılabilir.
Örnek 3.
mysql> SELECT adi,DATE_FORMAT(dogum_tarihi,’%d.%m.%Y’) FROM musteri WHERE soyadi = ‘Demirel’;
+——-+————————————–+
| adi | DATE_FORMAT(dogum_tarihi,’%d.%m.%Y’) |
+——-+————————————–+
| Banu | 15.03.1978 |
| Sibel | 30.09.1979 |
+——-+————————————–+
2 rows in set (0.00 sec)
Koşul ifadelerinde birden fazla alan birlikte kullanılabilir. Her koşul ifadesi arasına AND veya OR bağlaçları yazılır.
Örnek 4.
Soyadı Derman ve adı Ethem olan müşterilerin numarasını görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT musteri_no FROM musteri WHERE soyadi=’Derman’ AND adi=’Ethem’;
+————+
| musteri_no |
+————+
| 00006 |
+————+
1 row in set (0.02 sec)
Örnek 5.
Soyadı Demircan veya cinsiyeti K olan müşterilerin adi ve kredi kart numaralarının görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT adi,kart_no FROM musteri WHERE soyadi=’Demircan’ OR cinsiyeti=’K';
+——-+——————+
| adi | kart_no |
+——-+——————+
| Yahya | 5655472757994306 |
| Banu | 1254724545636792 |
| Sibel | 5549602724363892 |
+——-+——————+
3 rows in set (0.00 sec)
Eğer aynı alan için iki veya daha çok değere göre sorgulanacaksa OR bağlacı yerine IN bağlacı kullanmak ifadeyi daha da kısaltacaktır.
Örnek 6.
Adı Yahya veya Muhittin veya Özgü olan müşterilerin adının ve adresinin görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT adi,adres FROM musteri WHERE adi IN (’Yahya’,'Muhittin’,'Özgü’);
+———-+———-+
| adi | adres |
+———-+———-+
| Yahya | Kızılay |
| Muhittin | Beşevler |
+———-+———-+
2 rows in set (0.00 sec)
Örnek 7.
30/09/2002 tarihinde doğan müşterilerin adının ve soyadının görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT adi,soyadi FROM musteri WHERE dogum_tarihi = ‘1979/09/30′;
+——-+———+
| adi | soyadi |
+——-+———+
| Sibel | Demirel |
+——-+———+
1 row in set (0.00 sec)
Yukarıdaki örnekten farklı olarak koşul kısmında fonksiyonlarda kullanılabilir.
Örnek 8.
1975 yılından daha sonra doğan müşterilerin adının ve soyadının görüntülenmesi için aşağıdaki ifade yazılır.
mysql>SELECT adi,soyadi FROM musteri WHERE
YEAR(dogum_tarihi) > 1975;
+———-+———–+
| adi | soyadi |
+———-+———–+
| Yahya | Demircan |
| Muhittin | Altınkaya |
| Banu | Demirel |
| Sibel | Demirel |
+———-+———–+
4 rows in set (0.00 sec)
SQL ifadelerinde koşula uymayan kayıtları görüntülemek için “<>” operatörü kullanılır.
Örnek 9.
Soyadı Demirel olmayan kayıtların adının ve soyadının görüntülenmesi için aşağıdaki ifade yazılır.
mysql>SELECT adi,soyadi FROM musteri WHERE soyadi<>’Demirel’;
+———-+———–+
| adi | soyadi |
+———-+———–+
| Yahya | Demircan |
| Muhittin | Altınkaya |
| Murat | Köseçavuş |
| Ethem | Derman |
+———-+———–+
4 rows in set (0.00 sec)
Bir alan içinde belirli bir aralığı sorgulamak için BETWEEN bağlacı kullanılır.
Örnek 10.
10/02/1960 ile 15/06/1980 yılları arasında doğan müşterilerin adının, soyadının ve doğum tarihinin görüntülenmesi için aşağıdaki ifade yazılır.
mysql>SELECT adi,soyadi,dogum_tarihi FROM musteri WHERE dogum_tarihi BETWEEN ‘19600610′ AND ‘19800610′;
+———-+———–+————–+
| adi | soyadi | dogum_tarihi |
+———-+———–+————–+
| Muhittin | Altınkaya | 1977-03-03 |
| Banu | Demirel | 1978-03-15 |
| Sibel | Demirel | 1979-09-30 |
| Murat | Köseçavuş | 1972-01-01 |
+———-+———–+————–+
4 rows in set (0.00 sec)
5.8. Kısıtlı bilgilere göre sorgulama
Sorgulama işlemlerinde alfasayısal bilgi alanları için koşul yazılırken değerin tamamı yazılmadan sorgulama yapılabilir. Bu durumda koşul cümlesi yazılırken (=,<>,>,>=,<,<=) yerine LIKE operatörü kullanılır. Like operatörü üç farklı yöntem ile kullanılır.
İstenilen değer ile başlayan kayıtları listelemek için tırnak içerisinde değerin başlangıç kısmı yazıldıktan sonra “%” (yüzde) işareti yazılır.
SELECT <alan adı [,alan adı1,...]> FROM <tablo adı> WHERE <alan> LIKE <”değer%”>
Örnek 1.
Soyadı Demir ile başlayan kayıtların adının ve soyadının görüntülenmesi için aşağıdaki ifade yazılır.
mysql>SELECT adi,soyadi FROM musteri WHERE soyadi LIKE ‘Demir%’;
+——-+———-+
| adi | soyadi |
+——-+———-+
| Yahya | Demircan |
| Banu | Demirel |
| Sibel | Demirel |
+——-+———-+
3 rows in set (0.00 sec)
İstenilen değer ile biten kayıtları listelemek için tırnak içerisinde “%” (yüzde) işaretinden sonra değer yazılır.
SELECT <alan adı [,alan adı1,...]> FROM <tablo adı> WHERE <alan> LIKE <”%değer”>
Örnek 2.
Soyadı “an” ile biten kayıtların adının ve soyadının görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT adi,soyadi FROM musteri WHERE soyadi LIKE ‘%an’;
+——-+———-+
| adi | soyadi |
+——-+———-+
| Yahya | Demircan |
| Ethem | Derman |
+——-+———-+
2 rows in set (0.00 sec)
İçerisinde istenilen değer geçen kayıtları listelemek için tırnak içerisinde değerin başlangıç ve son kısmına “%” (yüzde) işareti yazılır.
SELECT <alan adı [,alan adı1,...]> FROM <tablo adı> WHERE <alan> LIKE <”%değer%”>
Örnek 3.
Adının içinde “M” geçen kayıtların adının ve soyadının görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT adi,soyadi FROM musteri WHERE adi LIKE ‘%M%’;
+———-+———–+
| adi | soyadi |
+———-+———–+
| Muhittin | Altınkaya |
| Murat | Köseçavuş |
| Ethem | Derman |
+———-+———–+
3 rows in set (0.00 sec)
Yukarıdaki üç örneğe uymayan kayıtları görüntülemek için LIKE operatöründen önce NOT bağlacı kullanılmalıdır.
Örnek 4.
Adının içinde “M” geçmeyen kayıtların adının ve soyadının görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT adi,soyadi FROM musteri WHERE adi NOT LIKE ‘%M%’;
+——-+———-+
| adi | soyadi |
+——-+———-+
| Yahya | Demircan |
| Banu | Demirel |
| Sibel | Demirel |
+——-+———-+
3 rows in set (0.00 sec)
5.9. Boş ve dolu alanlara göre sorgu
Tablolar yaratılırken bazı alanlara değer işlenmediği taktirde, tabloda yer işgal etmemesi için alan NULL olarak tanımlanır ve bu alanların ilk değerleri NULL dır. Bu tip alanların oluşturulmasının nedeni her zaman bilgi girilmemesinden dolayıdır. Aksi takdirde o alana bilgi girişi yapılmasa bile bilgi alanının veri türüne göre ilk değer atanmış olur.
NULL değere sahip alanlara göre listeleme
SELECT <alan adı> FROM <tablo adı> WHERE <alan adı> IS NULL.
Örnek 1.
Adı NULL olan kayıtların adının ve soyadını görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT adi,soyadi FROM musteri WHERE adi IS NULL;
Empty set (0.00 sec)
Tabloda hiç NULL değer olmadığı için sonuç görüntülenmemiştir.
NULL değere sahip olmayan (dolu) alanlara göre listeleme
SELECT <alan adı> FROM <tablo adı> WHERE <alan adı> IS NOT NULL.
Örnek 2.
Adı NULL olmayan (dolu) kayıtların adının ve soyadını görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT adi,soyadi FROM musteri WHERE adi IS NOT NULL;
+———-+———–+
| adi | soyadi |
+———-+———–+
| Yahya | Demircan |
| Muhittin | Altınkaya |
| Banu | Demirel |
| Sibel | Demirel |
| Murat | Köseçavuş |
| Ethem | Derman |
+———-+———–+
6 rows in set (0.00 sec)
5.10. Sorgu sonucu dönen kayıtların sıralanması
Bir tablo sorgulandığı zaman dönen sonuçlar birincil anahtara (primary key) göre sıralı gelmektedir. Sonuçların sıralamasını değiştirmek mümkündür. ORDER BY bütün SQL ifadelerinde kullanılabilir.
SELECT <alan adı> FROM <tablo adı> [WHERE <koşullar>] [ORDER BY alan1 [,alan2,...] {ASC|DESC}].
Örnek 1.
Müşteri tablosundaki kayıtları adına göre sıralayarak adının ve soyadının görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT adi,soyadi FROM musteri ORDER BY adi;
+———-+———–+
| adi | soyadi |
+———-+———–+
| Banu | Demirel |
| Ethem | Derman |
| Muhittin | Altınkaya |
| Murat | Köseçavuş |
| Sibel | Demirel |
| Yahya | Demircan |
+———-+———–+
6 rows in set (0.00 sec)
Örnek 2.
Müşteri tablosundaki kayıtları adına göre tersten (büyükten küçüğe) sıralayarak adının ve soyadının görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT adi,soyadi FROM musteri ORDER BY adi DESC;
+———-+———–+
| adi | soyadi |
+———-+———–+
| Yahya | Demircan |
| Sibel | Demirel |
| Murat | Köseçavuş |
| Muhittin | Altınkaya |
| Ethem | Derman |
| Banu | Demirel |
+———-+———–+
6 rows in set (0.00 sec)
Örnek 3.
Müşteri tablosundaki kayıtları soyadı ve adına göre sıralayarak adının ve soyadının görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT adi,soyadi FROM musteri ORDER BY soyadi,adi ;
+———-+———–+
| adi | soyadi |
+———-+———–+
| Muhittin | Altınkaya |
| Yahya | Demircan |
| Banu | Demirel |
| Sibel | Demirel |
| Ethem | Derman |
| Murat | Köseçavuş |
+———-+———–+
6 rows in set (0.00 sec)
Örnek 4.
Urun tablosunda fiyatı 500 den küçük olan ürünleri fiyatına göre küçükten büyüğe göre sıralayarak ürün turunun ve fiyatının görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT urun_turu,urun_fiyati FROM urun WHERE urun_fiyati <500 ORDER BY urun_fiyati ;
+——————-+————-+
| urun_turu | urun_fiyati |
+——————-+————-+
| Pinpon Topu | 100 |
| Masa Tenisi Raket | 175 |
+——————-+————-+
2 rows in set (0.00 sec)
5.11. SQL fonksiyonları
Distinct
DISTINCT alan_adi
Belirtilen alana göre farklı olan kayıtların bulur.
Örnek 1.
Musteri tablosundaki birbirinden farklı soyadların görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT DISTINCT soyadi FROM musteri;
+———–+
| soyadi |
+———–+
| Demircan |
| Altınkaya |
| Demirel |
| Köseçavuş |
| Derman |
+———–+
5 rows in set (0.11 sec)
SQL’de SELECT ile FROM arasında kullanılan fonksiyonlar vardır, bu fonksiyonlar ekrana sadece tek değer görüntülerler.
Sum
SUM(alan_adi)
Belirtilen alanın toplamını bulur.(sayısal alanlarda)
Örnek 1.
Siparis tablosundaki toplam tutarın görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT SUM(tutar) FROM siparis;
+————+
| SUM(tutar) |
+————+
| 43750000 |
+————+
1 row in set (0.05 sec)
Count
COUNT(*)
Toplam kayıt sayısını bulur.
Örnek 1.
Musteri tablosundaki kayıt sayısının görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT COUNT(*) FROM musteri;
+———-+
| COUNT(*) |
+———-+
| 6 |
+———-+
1 row in set (0.00 sec)
COUNT(DISTINCT alan_adi)
Belirtilen alana göre farklı olan kayıtların sayısı bulur.
Örnek 2.
Musteri tablosundaki birbirinden farklı soyadların sayısının görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT COUNT(DISTINCT soyadi) FROM musteri;
+————————+
| COUNT(DISTINCT soyadi) |
+————————+
| 5 |
+————————+
1 row in set (0.00 sec)
Max
MAX(alan_adi)
Belirtilen alandaki en büyük değeri bulur.
Örnek 1.
Urun tablosundaki en pahalı ürünün fiyatının görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT MAX(urun_fiyati) FROM urun;
+——————+
| MAX(urun_fiyati) |
+——————+
| 2750000 |
+——————+
1 row in set (0.00 sec)
Min
MIN(alan_adi)
Belirtilen alanda en küçük değeri bulur.
Örnek 1.
Urun tablosundaki en ucuz ürünün fiyatının görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT MIN(urun_fiyati) FROM urun;
+——————+
| MIN(urun_fiyati) |
+——————+
| 100 |
+——————+
1 row in set (0.00 sec)
Avg
AVG(alan_adi)
Belirtilen alandaki ortalama değeri bulur.
Örnek 1.
Siparis tablosundaki ortalama sipariş tutarının görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT AVG(tutar) FROM siparis;
+————–+
| AVG(tutar) |
+————–+
| 8750000.0000 |
+————–+
1 row in set (0.00 sec)
5.12. İki veya daha fazla tablonun beraber sorgulanması (JOIN)
Birden fazla tablodan aynı anda bilgi getirilmesi gerektiğinde, ortak alanlar üzerinden birleştirme işlemleri yapılır. Birleştirme işlemi koşullar bölümünde yapılır, ortak olan alanlar eşleştirilir. SQL ifadelerinde alan isimlerinin önüne tablo adı yazılır. Tablo adı ile alan adı arasına “.” (nokta) konulur.
SELECT alan1[,alan2,...] FROM tablo1,tablo2 [,tablo3,...] WHERE tablo1.alan1 = tablo2.alan1 [AND tablo1.alan2 = tablo2.alan2,...]
Örnek 1.
Müşterilerin adlarının ve sipariş verdikleri ürünlerin kodlarının, fiyatının ve tutarının görüntülenmesi için aşağıdaki ifade yazılır.
mysql>SELECT musteri.adi,siparis.urun_kodu,siparis.fiyat,siparis.tutar
FROM musteri,siparis WHERE musteri.musteri_no=siparis.musteri_no;
+———-+———–+———+———-+
| adi | urun_kodu | fiyat | tutar |
+———-+———–+———+———-+
| Yahya | 00001 | 100000 | 1500000 |
| Yahya | 00002 | 2750000 | 27500000 |
| Muhittin | 00001 | 100000 | 500000 |
| Muhittin | 00002 | 2750000 | 13750000 |
| Muhittin | 00003 | 500 | 500000 |
+———-+———–+———+———-+
5 rows in set (0.00 sec)
Örnek 2.
Yahya adlı müşterinin sipariş verdiği ürünlerin kodlarının, fiyatının ve tutarının görüntülenmesi için aşağıdaki ifade yazılır.
mysql>SELECT musteri.adi,siparis.urun_kodu,siparis.fiyat,siparis.tutar FROM musteri,siparis WHERE musteri.musteri_no=siparis.musteri_no AND musteri.adi = ‘Yahya’;
+——-+———–+———+———-+
| adi | urun_kodu | fiyat | tutar |
+——-+———–+———+———-+
| Yahya | 00001 | 100000 | 1500000 |
| Yahya | 00002 | 2750000 | 27500000 |
+——-+———–+———+———-+
2 rows in set (0.02 sec)
Örnek 3.
Sipariş verilen ürünlerin adlarının ve siparis miktarının görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT urun.urun_markasi,urun.urun_turu,siparis.miktar FROM urun,siparis WHERE urun.urun_kodu = siparis.urun_kodu;
+————–+—————–+——–+
| urun_markasi | urun_turu | miktar |
+————–+—————–+——–+
| Adidas | Futbol ayakkabı | 15 |
| Adidas | Eşofman | 10 |
| Adidas | Futbol ayakkabı | 5 |
| Adidas | Eşofman | 5 |
| Reebok | Forma | 1000 |
+————–+—————–+——–+
5 rows in set (0.00 sec)
5.13. Tablo adlarına takma ad (Alias) verme
SQL ifadelerinde dikkat edilirse tablo isimleri yazıldığı zaman ifadeler biraz daha karmaşık bir hal almaktadır ve ifadeler uzamaktadır. Bu sebeple tablo adını temsil edecek daha kısa bir ad (alias) vermek daha uygundur. Tercihen tablo adlarının ilk harfleri verilir. Takma ad için, FROM dan sonra tablo adı bir boşluk ve takma ad yazılır. Takma ad verildikten sonra bilgi alanları önüne bu takma ad yazılır. Takma ad ile alan adı arasına yine “.” konulur.
Örnek 1.
Müşterilerin adının, vermiş olduğu siparişlerin tarihlerinin ve tutarının görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT m.adi,s.siparis_tarihi,s.tutar FROM musteri m, siparis s
-> WHERE m.musteri_no=s.musteri_no;
+———-+—————-+———-+
| adi | siparis_tarihi | tutar |
+———-+—————-+———-+
| Yahya | 20020926000000 | 1500000 |
| Yahya | 20020926000000 | 27500000 |
| Muhittin | 20020930000000 | 500000 |
| Muhittin | 20020930000000 | 13750000 |
| Muhittin | 20020930000000 | 500000 |
+———-+—————-+———-+
5 rows in set (0.00 sec)
Örnek 2.
Müşterilerin adının, vermiş olduğu siparişlerdeki ürün markasının ve sipariş tutarının görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT m.adi,u.urun_markasi,s.tutar FROM musteri m, siparis s,urun u WHERE m.musteri_no=s.musteri_no AND
s.urun_kodu = u.urun_kodu;
+———-+————–+———-+
| adi | urun_markasi | tutar |
+———-+————–+———-+
| Yahya | Adidas | 1500000 |
| Yahya | Adidas | 27500000 |
| Muhittin | Adidas | 500000 |
| Muhittin | Adidas | 13750000 |
| Muhittin | Reebok | 500000 |
+———-+————–+———-+
5 rows in set (0.00 sec)
5.14 Kayıtları gruplama
Bir tablo içerisinde yer alan kayıtlar kendi içerisinde gruplandırılır. Bu gruplar üzerinde çeşitli işlemler yapılır. Listelenecek bilgi alanları mutlaka GROUP BY ifadesinden sonra belirtilmelidir. SUM, COUNT, AVG, MIN, MAX gibi fonksiyonlarla kullanılan alanlar GROUP BY dan sonra belirtilmez.
SELECT alan1[,alan2,...] FROM tablo1 GROUP BY alan1[,alan2,...];
Örnek 1.
Her müşterinin müşteri numarasının ve yapmış olduğu siparişlerin toplam tutarının görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT musteri_no,SUM(tutar) FROM siparis
-> GROUP BY musteri_no;
+————+————+
| musteri_no | SUM(tutar) |
+————+————+
| 00001 | 29000000 |
| 00002 | 14750000 |
+————+————+
2 rows in set (0.00 sec)
Örnek 2.
Kız ve erkek müşteri sayısının görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT cinsiyeti,count(*) FROM musteri GROUP BY cinsiyeti;
+———–+———-+
| cinsiyeti | count(*) |
+———–+———-+
| E | 4 |
| K | 2 |
+———–+———-+
2 rows in set (0.00 sec)
Örnek 3.
Her marka üründen kaç adet olduğunun görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT urun_markasi,COUNT(*) FROM urun GROUP BY urun_markasi;
+————–+———-+
| urun_markasi | COUNT(*) |
+————–+———-+
| Adidas | 2 |
| Mert | 2 |
| Reebok | 1 |
+————–+———-+
3 rows in set (0.08 sec)
Örnek 4.
Her müşterinin sipariş sayısının görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT COUNT(*) FROM siparis GROUP BY musteri_no;
+———-+
| COUNT(*) |
+———-+
| 2 |
| 3 |
+———-+
2 rows in set (0.01 sec)
Bu örnekte 2 ve 3 sonucu dönmüştür, bu sayıların hangi müşteriye ait olduğunun da bilinmesi gerekirse SQL ifadesi aşağıdaki gibi olmalıdır.
mysql> SELECT musteri_no,COUNT(*) FROM siparis GROUP BY musteri_no;
+————+———-+
| musteri_no | COUNT(*) |
+————+———-+
| 00001 | 2 |
| 00002 | 3 |
+————+———-+
2 rows in set (0.00 sec)
Örnek 5.
Urunler içerisinde her üründen en pahalı olanın fiyatını ve markasını görüntülemek için aşağıdaki ifade yazılır.
mysql>select urun_markasi,max(urun_fiyati) from urun group by urun_markasi ;
+————–+——————+
| urun_markasi | max(urun_fiyati) |
+————–+——————+
| Adidas | 2750000 |
| Mert | 175 |
| Reebok | 500 |
+————–+——————+
3 rows in set (0.01 sec)
Gruplar üzerinde koşullu sorgulama
Gruplanmış veriler içerisinde belli koşula uyanlar sorgulanacaksa SQL cümlesinde, HAVING ifadesi ile koşullar yazılır. Bu tür SQL cümlelerinde WHERE ile yazılan koşullar varsa öncelikle bunlar göz önüne alınır, sonra gruplama işlemi yapılır. Gruplama sonunda da HAVING ile verilen koşullara uygun kayıtlar listelenir. HAVING ile verilecek koşullar mutlaka GROUP BY yanına yazılan alanlar olmalıdır ve ayrıca COUNT, SUM, MAX, MİN,
Örnek 1.
3 ten az siparişte bulunan müşterilerin numarasının görüntülenmesi için aşağıdaki ifade yazılır.
mysql>SELECT musteri_no,COUNT(*) FROM siparis GROUP BY musteri_no HAVING count(*)>2;
+————+———-+
| musteri_no | COUNT(*) |
+————+———-+
| 00002 | 3 |
+————+———-+
1 row in set (0.00 sec)
Örnek 2.
Sipariş tutarı 1.500.000 dan fazla olan her müşterinin müşteri numarasının ve yapmış olduğu siparişlerin toplam tutarının görüntülenmesi için aşağıdaki ifade yazılır.
mysql> SELECT musteri_no,SUM(tutar) FROM siparis
-> GROUP BY musteri_no HAVING SUM(tutar)>1500000;
+————+————+
| musteri_no | SUM(tutar) |
+————+————+
| 00001 | 29000000 |
+————+————+
1 rows in set (0.00 sec)