İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır
Hüseyin Kaya
hkaya@be.itu.edu.tr

MySQL

özet

Bu belgede bir ilişkisel veritabanı olan MySQL’den bahsedeceğiz. Programın kurulumu ve çalışmaya hazır hale getirilimesi, küçük veri tabanlarından başlamak üzere karmaşık veri tabanı ilişkilerine kadar birçok konuyu irdelemeye çalışacağız. Eksik veya yanlış gördüğünüz noktaları bana elektronik posta ile bildirirseniz sevinirim.

MySQL’e Giriş

Bu bölümde MySQL kullanarak veri tabanı sunucusuna nasıl bağlanılacağını ve küçük veri tabanlarının ne şekilde kurulacağını göreceğiz. MySQL’in kendi komut satırı olmasına rağmen komutları toplu bir şekilde bu komut satırını kullanmadan da işletebilirsiniz. İşletmek istediğiniz komutları bir dosyaya yazmanız yeterli olacaktır. MySQL ile gelen seçenekleri görmek için komut satırında

$ mysql --help

yazmanız yeterli olacaktır.

Sunucuya Bağlanma

MySQL hizmetini veren sunucaya bağlanmanız için komut satırında şu komutu girmeniz gerekmektedir.

$ mysql -h makine_adı -u kullanıcı -p
Enter password *********

Eğer MySQL kurulu makina bulunduğunuzdan farklı bir yerde ise -h parametresini kullanmak zorundasınız. Ayrıca veritabanını kullanmak için bir kullanıcıya ihtiyacınız vardır. Bu kullanıcıyı ve şifresini sistem yöneticinizden temin edebilirsiniz. Bazı sistemlerde MySQL kurulurken kullanıcılara özel bir şifre verilmez ve şifreyi yazmadan sisteme girebilirsiniz. Bu özelliği daha sonra kaldırmanız yani bir şifre koymanız verilerinizin güvenliği açısından yararlı olacaktır .

Komutların İşletilmesi

Hemen tablo oluşturmadan önce tablolardan bilgilerin nasıl çıkarılacağını öğrenelim. S¸imdi MySQL komut satırına girin ve aşağıdaki komutu yazın.

mysql> SELECT VERSION(), CURRENT_DATE;
+--------------+--------------+
| version() | CURRENT_DATE |
+--------------+--------------+
| 3.22.20a-log | 1999-03-19 |
+--------------+--------------+
1 row in set (0.01 sec)
mysql>

Bu örnekle birkaç temel şey açığa çıkıyor:

Komutlar büyük veya küçük karakterler ile yazılabilirler. Dolayısıyla aşağıdaki komutlar eşdeğerlidir.

mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;

Birden fazla komutu aynı satırda ardarda yazabilirsiniz.

mysql> SELECT VERSION(); SELECT NOW();
+--------------+
| version() |
+--------------+
| 3.23.24a-log |
+--------------+
+---------------------+
| NOW() |
+---------------------+
| 2001-09-22 00:15:33 |
+---------------------+

Eğer komut çok uzun ise ve birkaç satırı kullanarak yazılması gerekiyorsa aşağıdaki gibi yapılabilir. Satır yetmiyorsa enter tuşuna basın ve alt satırdan devam edin. Komutu yazmayı bitirdiğinizde “;” yazmanız ve enter’a basmanız yeterli olacaktır. Böylece komutun bittiği bildirilmiş olur.

mysql> SELECT
-> USER()
-> ,
-> CURRENT_DATE;
+------------------------------+--------------+
| USER() | CURRENT_DATE |
+------------------------------+--------------+
| mercan@localhost.localdomain | 2001-09-22 |
+------------------------------+--------------+

Yazmaya başlamış olduğunuz bir komutu iptal etmek için nc yazmanız yeterlidir.

mysql> SELECT
-> USER()
-> \c
mysql>

Bazı Temel Komutlar

Bu bölümde en sık kullanılan komutları bir örnek üzerinde inceleyece ğiz. S¸imdi MySQL’i komut satırından bir veritabanı ile başlatalım. Henüz kendiniz bir veritabanı oluşturmamış iseniz, bir çok sistemde kurulumdan gelen test isimli veritabanını kullanabilirsiniz. Bunun için aşağıdaki komutu kullanın.

$ mysql veritabı_ismi

Şimdi aşağıdaki gibi örnek bir tablo oluşturalım.

CREATE TABLE shop (
article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
dealer CHAR(20) DEFAULT '' NOT NULL,
price DOUBLE(16,2) DEFAULT '0.00' NOT NULL,
PRIMARY KEY(article, dealer));
INSERT INTO shop VALUES
(1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),(3,'C',1.69),
(3,'D',1.25),(4,'D',19.95);

Bunları yazdıktan sonra tablonun son halini görmek için aşağıdaki komutu kullanın.

mysql> SELECT * FROM shop;
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
| 0001 | A | 3.45 |
| 0001 | B | 3.99 |
| 0002 | A | 10.99 |
| 0003 | B | 1.45 |
| 0003 | C | 1.69 |
| 0003 | D | 1.25 |
| 0004 | D | 19.95 |
+---------+--------+-------+
article sütunundaki en yüksek rakamı bulmak için şu komut yazılır.
SELECT MAX(article) AS article FROM shop
+---------+
| article |
+---------+
| 4 |
+---------+

En pahalı article ile ilgili satırı çıkarmak istersek iki yok kullanabiliriz. İlk önce fiyatların maximumunu buluruz. Ardından o satırı yazdırırız. Şöyle

SELECT MAX(article) AS

Uygulama

.

mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql |
| test |
| tmp |
+----------+

Normal şartlarda üç tane veritabanının standart olarak kurulu olması gerekir. Veri tabanlarının kendileri ile ilgili dosyalar /var/lib/mysql/ dizininde bulunur.

İlk önce mysqld programını arka planda çalışmasını sağlamalıyız. Bunun için şunu yazın:

$ /etc/init.d/mysql start

Biz bu üç veritabanı haricinde bir tane daha oluşturacağız. ’root’ kullanıcısı olarak mysqladmin komutunu kullanabilirsiniz.

$ mysqladmin create rehber

Böylece rehber isimli bir veritabanı daha oluşturuldu. İşi şansa bırakmamak için mysqld programını tekrar başlatalım.

$ /etc/init.d/mysql restart

Bu aşamadan sonra root olarak çalışmanın anlamı yok. Normal kullanıcı olarak devam edelim. Aslında veritabanı açmanın daha kolay bir yolu var. Normal kullanıcı olarak da veritabanı kurabilirsiniz. MySQL komut satırında şunları yazın:

mysql> CREATE DATABASE rehber;

Veritabanları arasında geçiş yapmak isterseniz USE komutunu kullanın. Noktalı virgül kullanmak zorunda değilsiniz.

mysql> USE rehber

Herhangi bir veritabanında kayıtlı tabloları görmek için şu komut kullanılır.

mysql> SHOW TABLES
Empty set (0.00 sec)

Veritabanımıza henüz bir tablo eklemediğimiz için bize hiçbir tablonun olmadığını belirtti. Veritabanı ile uğraşmanın en zor yanı hangi tabloların kullanılacağı ve içeriklerinin ne olacağına karar vermektir. Bu mesele çok iyi düşünülmez ve tablolarda eksik birtakım bilgiler olursa sonradan zorluklarlda karşılaşabilirsiniz. Bir telefon rehberinde neler olması gereklidir. İlk önce her kayıt için bir numara olması gereklidir. Bu numara negatif sayı olmamalı ve kesinlikle tamsayı olmalıdır. Sonra isim ve soyisim kısmı muhakkak olmalıdır. Telefon numarası ve şehirlerarası kodu. Bence bu ikisinin ayrı olması bitişik yazılmasından daha mantıklı. Cinsiyet yazılabilir. Adres ve konum bilgileri de bu tabloya eklenebilecek sütunlardan birkaçı.

Şimdi tablomuzu oluşturalım.

mysql> CREATE TABLE rehber (
-> sıra char(4), isim VARCHAR(20), soyisim VARCHAR(20),
-> lakap VARCHAR(10), konum VARCHAR(5), kod CHAR(4),
-> telefon CHAR(7), adres VARCHAR(30));

İsim, soyisim gibi değişkenler için VARCHAR değişkenini kullanmamız çok yerinde çünkü herkesin ismi aynı uzunlukta tabii ki olmayacaktır. Program tabloları listelerken bu sütunlara en uygun genişliği verecektir. Tabloyu oluşturduktan sonra kontrol etmek için şunu yazın:

mysql> SHOW TABLES
+------------------+
| Tables in rehber |
+------------------+
| rehber |
+------------------+

Tablonun genel yapısını kontrol etmek için ise DESCRIBE komutunu kullanabilirsiniz.

mysql> DESCRIBE rehber
+---------+-------------+------+-----+---------+-------+----------------------------| Field | Type | Null | Key | Default | 
Extra | Privileges +---------+-------------+------+-----+---------+-------+----------------------------| sıra | varchar(4) | 
YES | | NULL | | select,insert,update,refere| isim | varchar(20) | YES | | NULL | | select,insert,update,refere| soyisim | 
varchar(20) | YES | | NULL | | select,insert,update,refere| lakap | varchar(10) | YES | | NULL | | 
select,insert,update,refere| konum | varchar(5) | YES | | NULL | | select,insert,update,refere| kod | varchar(4) | YES | | 
NULL | | select,insert,update,refere| telefon | varchar(7) | YES | | NULL | | select,insert,update,refere| adres | 
varchar(30) | YES | | NULL | | 
select,insert,update,refere+---------+-------------+------+-----+---------+-------+----------------------------DESCRIBE 

komutunu tablolardaki sütun isimlerini veya tablonun genel yapısını unuttuğunuz zamanlar kullanabilirsiniz. Şimdi tabloya veri girişi yapmamız gerekecek. Verileri MySQL komut satırından tek tek girmek çok uzun olacağından ilk önce bir tabloya yazacağız. Sonra bu tabloda okutacağız. Mesela girmek istediğimiz veriler şöyle olsun.

sıra isim soyisim lakap konum kod telefon adres

1 Halil Akman Halo ev 0212 6532220 Yenibosna
2 Ahmet Tekin Kabadayı ev 0212 2561000 Kasımpaşa
3 Hüseyin Kaya Doktor iş 0216 3286848 ümraniye

Bu bilgileri “rehber.txt” adlı bir dosyaya her bilgi arasında bir tab’lık boşluk olacak şekilde kaydedin. Eğer herhangi bir bilgi yok ise “n N” yazın.

1 Halil Akman Halo ev 0212 6532220 Yenibosna
2 Ahmet Tekin Kabadayı ev 0212 2561000 Kasımpaşa
3 HÜseyin Kaya Doktor iş 0216 3286848 Ümraniye

Şimdi şu komutu yazın:

mysql> LOAD DATA LOCAL INFILE "rehber.txt" INTO TABLE rehber;

Sonucu test ederseniz şöyle bir sonuç göreceksiniz.

mysql> SELECT * FROM rehber;
+------+---------+---------+----------+-------+------+---------+-----------+
| sıra | isim | soyisim | lakap | konum | kod | telefon | adres |
+------+---------+---------+----------+-------+------+---------+-----------+
| 1 | Halil | Akman | Halo | ev | 0212 | 6532220 | Yenibosna |
8
| 2 | Ahmet | Tekin | Kabadayı | ev | 0212 | 2561000 | Kasımpaşa |
| 3 | HÜseyin | Kaya | Doktor | iş | 0216 | 3286848 | Ümraniye |
+------+---------+---------+----------+-------+------+---------+-----------+

Tabloya yeni bir giriş yapmak için INSERT komutu kullanılır.

mysql> INSERT INTO rehber
-> VALUES (4, 'Dilek', 'Kaynar', 'Rehber' ,'cep','0535','7805024','ÜskÜdar');

Eğer herhangi bir sütuna bilgi girmeyecekseniz o kısma NULL yazmanız yeterli. Fakat n N yazamassınız. Tablodan bir bilgi çekmek için SELECT komutu kullanılır. Genel kullanılış şeklini söyle özetlenebilir.

SELECT seçilecek_bölüm
FROM hangi_tabloda_seçilece¸gi
WHERE hangi_şartların_sağlanacağı
Bütün tabloyu görmek için şu kombinasyonu kullanabilirsiniz.
mysql> SELECT * FROM rehber;
+------+---------+---------+----------+-------+------+---------+-----------+
| sıra | isim | soyisim | lakap | konum | kod | telefon | adres |
+------+---------+---------+----------+-------+------+---------+-----------+
| 1 | Halil | Akman | Halo | ev | 0212 | 6532220 | Yenibosna |
| 2 | Ahmet | Tekin | Kabadayı | ev | 0212 | 2561000 | Kasımpaşa |
| 3 | HÜseyin | Kaya | Doktor | iş | 0216 | 3286848 | Ümraniye |
| 4 | Dilek | Kaynar | Rehber | cep | 0535 | 7805024 | ÜskÜdar |
+------+---------+---------+----------+-------+------+---------+-----------+

Tabloda hatalı herhangi bir yeri düzeltmek için iki seçenek var. Birincisi tablonun bütün içeriğini silmek ve doğru tabloyu yeniden yüklemek.

mysql> SET AUTOCOMMIT=1; # bu satır olayı hızlandırmak i»cin
mysql> DELETE FROM rehber;
mysql> LOAD DATA LOCAL INFILE "rehber.txt" INTO TABLE rehber;

Diğer yol ise UPDATE komutu:

mysql> UPDATE rehber SET lakap = "Kor" WHERE isim = "Huseyin";

Görüldüğü üzere tablonun tamamını görmek çok kolay. İstediğimiz bir satırı görmek için SELECT komutunun bazı varyasyonlarını kullanaca ğız. Mesela Ahmet isimli şahsın bilgilerini görmek istiyoruz.

mysql> SELECT * FROM rehber WHERE isim = "Ahmet";
+------+-------+---------+----------+-------+------+---------+-----------+
| sıra | isim | soyisim | lakap | konum | kod | telefon | adres |
+------+-------+---------+----------+-------+------+---------+-----------+
| 2 | Ahmet | Tekin | Kabadayı | ev | 0212 | 2561000 | Kasımpaşa |
+------+-------+---------+----------+-------+------+---------+-----------+

Avrupa yakasında telefonu olanları bulmak için

mysql> SELECT * FROM rehber WHERE kod = "0212";
+------+-------+---------+----------+-------+------+---------+-----------+
| sıra | isim | soyisim | lakap     | konum | kod | telefon | adres |
+------+-------+---------+----------+-------+------+---------+-----------+
| 1 | Halil     | Akman | Halo         | ev | 0212 | 6532220 | Yenibosna |
| 2 | Ahmet | Tekin    | Kabadayı | ev | 0212 | 2561000 | Kasımpaşa |
+------+-------+---------+----------+-------+------+---------+-----------+

Telefonu İstanbul’a kayıtlı olanları bulmak için

mysql> SELECT * FROM rehber WHERE kod = "0212" OR kod = "0216";
+------+---------+---------+----------+-------+------+---------+-----------+
| sıra | isim   | soyisim | lakap | konum | kod | telefon | adres |
+------+---------+---------+----------+-------+------+---------+-----------+
| 1 | Halil       | Akman | Halo         | ev | 0212 | 6532220 | Yenibosna |
| 2 | Ahmet    | Tekin   | Kabadayı | ev | 0212 | 2561000 | Kasımpaşa |
| 3 | HÜseyin | Kaya   | Kor            | iş | 0216 | 3286848 | Ümraniye |
+------+---------+---------+----------+-------+------+---------+-----------+

AND ve OR komutları ile daha karmaşık seçme işlemleri yapmak mümkündür. Eğer tablonun bütün sütunlarını görmek istemiyorsanız görmek istediğiniz sütun veya sütunların ismini belirtmeniz yeterli.

mysql> SELECT isim, kod, telefon FROM rehber;
+---------+------+---------+
| isim        | kod    | telefon |
+---------+------+---------+
| Halil        | 0212 | 6532220 |
| Ahmet     | 0212 | 2561000 |
| HÜseyin | 0216 | 3286848 |
| Dilek       | 0535 | 7805024 |
+---------+------+---------+

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır