PDA

View Full Version : Mysql Hakkinda PekÇok Şey....



monoklinik
11-11-2005, 20:37
ÖNCELİKLE BU YAZIYI HAZIRLAMAMIZA YARDIMCI OLAN TÜM ODTÜLÜ ARKADAŞLARIN ELLERİNE SAĞLIK....



3 Özel MySQL Dersi

Bu bölüm, basit bir veritabanı oluşturmak ve kullanmak için mysql istemci programının nasıl kullanılacağını göstererek MySQL'e giriş tarzında bir özel ders vermektedir. (Bazen uçtaki monitör yada sadece monitör olarak anılan) mysql, bir MySQL sunucusuna bağlanmanıza, sorgu gerçekleştirmenize ve sonuçları görmenize olanak sağlayan, iki yönlü etkileşen bir programdır. mysql yığın modunda da kullanılabilir: sorgularınızı önceden bir dosyaya yerleştirirsiniz, sonra mysql'e dosyanın içindekileri çalıştırmasını söylersiniz. Burada mysql'i kullanmanın her iki yolundan da bahsedilmektedir.
mysql'in size sunduğu seçeneklerin bir listesini görmek için mysql'i --help seçeneğiyle çalıştırın:
kabuk> mysql --help
Bu bölüm, mysql'in makinanızda kurulu olduğunu ve kullanabileneceğiniz bir MySQL sunucusunun mevcut olduğunu farzetmektedir. Eğer bağlanabileceğiniz bir sunucu yoksa MySQL yöneticinizle temasa geçin (eğer yönetici siz iseniz, bu kılavuzun diğer bölümlerine bakmanız gerekecektir).
Bu bölüm, bir veritabanının oluşturulması ve kullanılması işleminin tamamını anlatmaktadır. Eğer siz sadece önceden var olan bir veritabanına ulaşmakla ilgileniyorsanız, veritabanı ve içindeki tabloların nasıl oluşturulacağını anlatan kısımları es geçmek isteyebilirsiniz.
Bu bölüm, içerik itibariyle özel bir ders niteliğinde olduğundan zorunlu olarak birçok ayrıntının üzerinde durulmadı. Burada bahsi geçen konular hakkında daha fazla bilgi için kılavuzun diğer bölümlerine göz atın.

monoklinik
11-11-2005, 20:37
3.1 Sunucuya Bağlanma ve Sunucuyla Bağlantının Kesilmesi

Sunucuya bağlanmak için mysql'i çalıştırdığınız zaman genellikle bir MySQL kullanıcı adı ve, büyük bir ihtimalle, bir de şifre vermeniz gerekecektir. Eğer sunucu, sizin bağlandığınız makina dışında bir makinada çalışıyorsa, bir sunucu makina adı da belirtmeniz gerekecektir. Sunucuya bağlanmak amacıyla hangi bağlantı parametrelerini kullanmanız gerektiğini öğrenmek (yani hangi sunucu makina adı, kullanıcı adı ve şifreyi kullanmak) için yöneticinizle temasa geçin. Uygun parametreleri öğrendikten sonra şu şekilde bağlanabilmeniz gerekir:
kabuk> mysql -h sunucu_makina_adı -u kullanıcı_adı -p
Enter Password: ********

******** sizin şifrenizi temsil eder; mysql, Enter password: promptunu gösterdiği zaman şifrenizi girin.
Eğer bu çalışırsa, mysql> promptundan önce giriş niteliğinde biraz bilgi görmeniz gerekmektedir:
kabuk> mysql -h sunucu_makina_adı -u kullanıcı_adı -p
Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 459 to server version: 3.22.20a-log
Type 'help' for help.
mysql>

Bazı MySQL kurulumları, kullanıcıların yerel bilgisayarda çalışan sunucuya anonim (isimsiz) kullanıcı olarak bağlanmasına izin vermektedir. Eğer sizin makinanızda da durum böyleyse, mysql'i herhangi bir seçenek (parametre) vermeksizin çalıştırarak sunucuya bağlanabilmeniz gerekmektedir:
kabuk> mysql
Başarılı bir şekilde bağlantıyı sağladıktan sonra, herhangi bir zamanda mysql> promptunda QUIT tuşlayarak bağlantıyı kesebilirsiniz:
mysql>QUIT
Bye

Control-D tuşuna basarak ta bağlantıyı kesebilirsiniz.
İlerleyen bölümlerdeki örneklerin çoğu bir sunucuya bağlı olduğunuzu farzetmektedir. Örneklerde bu, mysql> promptuyla gösterilmiştir.

monoklinik
11-11-2005, 20:37
3.2 Sorguların Girilmesi

Önceki bölümde anlatıldığı şekilde sunucuya bağlandığınızdan emin olun. Bu şekilde bağlanmış olmanız üzerinde çalışabileceğiniz herhangi bir veritabanını seçmeyecektir ancak şimdilik tamamdır. Şu an için nasıl sorgu yapılacağına dair birşeyler öğrenmek, direkt atlayıp tablolar oluşturmak; içlerinde veri depolamak ve tablolardan veri çekmekten daha önemlidir. Bü bölüm mysql'e komut girmenin temel prensiplerini anlatmaktadır. Çeşitli sorguları kullanarak kendinizi mysql'in nasıl çalıştığına alıştırmayı deneyebilirsiniz.
İşte size sunucudan sürüm numarasını ve o anki tarihi söylemesini isteyen basit bir komut. Komutu aşağıda gösterildiği gibi mysql promptundan sonra yazın ve ENTER tuşuna bası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 sorgu mysql hakkında birkaç şeyi açıklamaktadır:

Bir komut, normal olarak, noktalı virgülün izlediği bir SQL cümleciğinden oluşmaktadır. (Noktalı virgülün gerekmediği birkaç istisna komut vardır. Daha önce bahsi geçen QUIT bunlardan biridir. Diğerlerine sonra geleceğiz.)
Bir komutu girdiğinizde, mysql, komutu çalıştırması için sunucuya yollar ve sonucu görüntüler; sonra başka bir komutun girilebilmesi için hazır olduğınu belirtmek amacıyla ekrana başka bir mysql> yazar.
mysql, sorgu sonucunu tablo olarak görüntüler (satır ve sütunlarla). İlk satır sütunlar için etiketleri içerir. Takip eden satırlarda sorgu sonuçları yer alır. Normalde sütun etiketleri (adları), veritabanı tablolarından çektiğiniz sütunların isimleridir. Eğer (az önceki örnekte olduğu gibi) bir tablo sütunu yerine bir ifadenin değerini alıyorsanız, mysql, ifadenin kendisini kullanarak sütunu etiketler.
mysql, kaç tane satırın dönderildiğini ve sunucu performansı hakkında kabaca bir fikir veren sorgunun gerçekleştirilme süresini de gösterir. Bu değerler kesin değildir çünkü duvar saati zamanını (wall clock time) gösterirler (CPU yada makine zamanını göstermezler) ve sunucudaki yük ile ağdaki belirsizlik gibi faktörlerden etkilenirler. (Gereksiz uzatmadan kaçınmak için bu bölümdeki geri kalan örneklerde "rows in set" (gruptaki satir sayısı) satırı gösterilmemektedir.)
Anahtar sözcükler büyük-küçük harf sırası gösterilmeksizin girilebilmektedir. Aşağıdaki sorguların hepsi birbiriyle denktir:
mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;

mysql'i basit bir hesap makinesi olarak kullanabileceğiniz başka bir sorgu:
mysql> SELECT SIN(PI()/4), (4+1)*5;
+-------------+---------+
| SIN(PI()/4) | (4+1)*5 |
+-------------+---------+
| 0.707107 | 25 |
+-------------+---------+

Buraya kadar gösterilen komutlar göreceli olarak kısa, tek-satırlı cümleciklerdi. Birden fazla cümleciği tek satırda da girebilirsiniz. Her cümleciğin sonuna bir noktalı virgül eklemeniz yeterlidir:
mysql> SELECT VERSION(); SELECT NOW();
+--------------+
| version() |
+--------------+
| 3.22.20a-log |
+--------------+
+---------------------+
| NOW() |
+---------------------+
| 1999-03-19 00:15:33 |
+---------------------+

Bir komutun tamamiyle tek bir satırda girilmesi zorunlu değildir; bu sayede birkaç satırda girilmesi gereken uzun komutlar herhangi bir sorun oluşturmazlar. mysql, cümleciğinizin nerede bittiğini girdi satırının sonuna bakarak değil de, cümleciği sonlandıran noktalı virgüle bakarak belirler. (Başka bir deyişle mysql, girdiyi biçimden bağımsız bir şekilde kabul eder: girdi satırlarını biriktirir ancak noktalı virgülü görene kadar onları çalıştırmaz.)
İşte size çoklu-satırdan oluşan basit bir sorgu:
mysql> SELECT
-> USER()
-> ,
-> CURRENT_DATE;
+--------------------+--------------+
| USER() | CURRENT_DATE |
+--------------------+--------------+
| joesmith@localhost | 1999-03-18 |
+--------------------+--------------+

Bu örnekte çoklu-satırdan oluşan bir sorgunun ilk satırını girdikten sonra promptun nasıl mysql'den ->'ine dönüştüğüne dikkat edin. Bu, tamamlanmış bir cümlecik bulamayıp devamını beklerken, mysql'in bunu nasıl gösterdiğini anlatmaktadır. Prompt sizin yardımcınızdır çünkü size değerli bir geribildirim sunar. Bu geribildirimi kullanırsanız her zaman için mysql'in neyi beklediğinin farkında olursunuz.
Eğer yazmakta olduğunuz komutu çalıştırmak istemediğinize karar verirseniz \c tuşlayarak cümleciği iptal edin:
mysql> SELECT
-> USER()
-> \c
mysql>

Burada, yine, prompta dikkat edin. Prompt, siz \c tuşladıktan sonra, mysql'in yeni bir komut için hazır olduğunu belirtmek amacıyla, geribildirim sağlayacak şekilde, mysql>'ne geri dönmektedir.
Aşağıdaki tablo görebileceğiniz promptların her birini göstermekte ve mysql'in bulunduğu durum hakkında ne anlama geldiklerini özetlemektedir:
Prompt Anlamı
mysql> Yeni bir komut için hazır
-> Çoklu-satırdan oluşan bir komutun sonraki satırını bekliyor
'> Sonraki satırı bekliyor ancak tek tırnakla başlamış bir karakter dizisini okuyor
"> Sonraki satırı bekliyor ancak çift tırnakla başlamış bir karakter dizisini okuyor

Çoklu-satırdan oluşan cümlecikler çoğunlukla tek bir satırda komutu çalıştırmaya niyetlenip, kazara sondaki noktalı virgülü unuttuğunuz zamanlarda ortaya çıkar. Bu durumda mysql daha fazla girdi için bekleyecektir:
mysql> SELECT USER()
->

Eğer bu başınıza gelirse (cümleciği girdiğinizi sanmanıza karşın yanıt sadece -> promptu ise), büyük bir ihtimalle mysql noktalı virgülü beklemektedir. Eğer promptun size ne söylediğine dikkat etmezseniz, ne yapmanız gerektiğini farketmeden önce bir müddet öylece oturmaya devam edebilirsiniz. Cümleciği tamamlamak için bir noktalı virgül ekleyip ENTER tuşuna basın; mysql komutu çalıştıracaktır:
mysql> SELECT USER()
-> ;
+--------------------+
| USER() |
+--------------------+
| joesmith@localhost |
+--------------------+

'> ve "> promptları karakter dizisi okunurken ortaya çıkmaktadır. MySQL'de karakter dizilerini (') ve (") karakterleri arasında girebilirsiniz (örneğin 'merhaba' veya "hoşçakal") ve mysql, birden fazla satıra yayılan karakter dizilerini girmenize izin vermektedir. Bir '> veya "> promptunu gördüğünüz zaman bu, (') veya (") karakteri ile başlayan bir karakter dizisini içeren bir satır girdiğinizi, ancak karakter dizisini bitirecek olan uygun tırnak işaretini henüz girmediğinizi gösterir. Eğer gerçekten çoklu-satırdan oluşan bir karakter dizisi giriyorsanız bu iyi bişeydir; fakat ne kadar sık böylesi birşey girersiniz? Çok değil. Çoğunlukla '> ve "> promptları, farkında olmaksızın tek veya çift tırnak işaretini unuttuğunuzun göstergesidir. Örneğin:
mysql> SELECT * FROM my_table WHERE name = "Smith AND age < 30;
">

Eğer bu SELECT c&#252;mleciğini girer ve ENTER tuşuna basıp sonucu beklerseniz hi&#231;bir şey olmayacaktır. Bu sorgunun neden bu kadar uzun s&#252;rd&#252;ğ&#252;n&#252; merak etmek yerine "> promptunun verdiği ipucuna dikkat edin. Prompt size mysql'in, sonlandırılmamış (bitirilmemiş) bir karakter dizisinin kalan kısmını g&#246;rmek i&#231;in beklediğini s&#246;ylemektedir. (C&#252;mlecikteki hatayı g&#246;rebiliyor musunuz? "Smith karakter dizisinin ikinci &#231;ift tırnağı yok.)
Bu noktada ne yaparsınız? Yapılacak en basit şey komutu iptal etmektir. Ancak bu durumda sadece \c tuşlayamazsınız &#231;&#252;nk&#252; mysql bunu okumakta olduğu karakter dizisinin bir par&#231;ası olarak yorumlayacaktır. Bunun yerine uygun tırnak işaretiyle diziyi sonlandırın (b&#246;ylece mysql karakter dizisini bitirdiğinizi bilecektir), sonra da \c tuşlayın:
mysql> SELECT * FROM my_table WHERE name = "Smith AND age < 30;
"> "\c
mysql>

Prompt, mysql'in yeni bir komut i&#231;in hazır olduğunu g&#246;steren mysql>'ne geri d&#246;necektir. '> ve "> promptlarının ne anlama geldiğini bilmek &#246;nemlidir &#231;&#252;nk&#252; yanlışlıkla sonlandırılmamış bir karakter dizisi girdiğinizde, sonradan gireceğiniz herhangi bir satır, QUIT anahtar s&#246;zc&#252;ğ&#252;n&#252; i&#231;eren bir satır da dahil, mysql tarafından dikkate alınmıyormuş gibi g&#246;r&#252;necektir. Bu hayli kafa karıştırıcı olabilir; &#246;zellikle de halihazırdaki komutu (c&#252;mleciği) iptal edebilmek i&#231;in &#246;nce diziyi sonlandıracak uygun tırnak işaretini girmeniz gerektiğini bilmediğinizde

monoklinik
11-11-2005, 20:38
3.3 Bir Veritabanının Oluşturulması ve Kullanılması

Artık nasıl komut gireceğinizi bildiğinize g&#246;re bir veritabanına ulaşmanın zamanı geldi.
Farzedin ki evinizde (hayvan topluluğunuzda (menagerie de)) bir&#231;ok evcil hayvanınız var ve siz onlarla ilgili &#231;eşitli t&#252;rde bilginin kaydını tutmak istiyorsunuz. Bu işi, verilerinizi tutacak tablolar oluşturup, tablolara arzu ettiğiniz bilgiyi y&#252;kleyerek ger&#231;ekleştirebilirsiniz. Sonra tablolardan veri &#231;ekerek hayvanlarınız hakkında &#231;eşitli t&#252;rde soruları yanıtlayabilirsiniz. Bu b&#246;l&#252;m size:
Bir veritabanı oluşturma
Bir tablo oluşturma
Bir tabloya veri y&#252;kleme
Bir tablodan &#231;eşitli şekillerde veri &#231;ekme
&#199;ok sayıda tabloyu kullanma
işinin nasıl yapılacağını g&#246;stermektedir.
hayvan topluluğu (menagerie) veritabanı (kasten, bilerek) basit olacak ancak benzer t&#252;rde bir veritabanının kullanılabileceği ger&#231;ek durumları d&#252;ş&#252;nmek zor olmayacaktır. &#214;rneğin, bunun gibi bir veritabanı bir &#231;ift&#231;i tarafından &#231;iftlik hayvanlarının yada bir veteriner tarafından hasta hayvan kayıtlarının hesabını tutmak i&#231;in kullanılabilir. İlerleyen b&#246;l&#252;mlerde kullanılan bazı sorguları ve &#246;rnek verileri i&#231;eren bir hayvan topluluğu dağıtımı MySQLin web sayfasından tenim edilebilir. Dağıtım, sıkıştırılmış olarak 'tar' (http://www.mysql.com/Downloads/Cont...enagerie.tar.gz) veya 'Zip' (http://www.mysql.com/Downloads/Cont...s/menagerie.zip) formatında mevcuttur.
Sunucuda halihazırda hangi veritabanlarının bulunduğunu &#246;ğrenmek i&#231;in SHOW c&#252;mleciğini kullanın:
mysql> SHOW DATABASES;
+----------+
| Database|
+----------+
| mysql |
| test |
| tmp |
+----------+

Mevcut veritabanlarının listesi, b&#252;y&#252;k ihtimalle, sizin makinanızda farklılık g&#246;sterecektir ancak mysql ve test veritabanları muhtemelen listede yer alacaktır. mysql veritabanı gereklidir &#231;&#252;nk&#252; kullanıcı erişim haklarını anlatmaktadır. test veritabanı ise &#231;oğunlukla kullanıcıların birşeyler deneyebilecekleri bir &#231;alışma alanı olarak &#246;nceden hazırlanmaktadır.
Eğer test veritabanı mevcut ise ona bağlanmaya &#231;alışın:
mysql> USE test
Database changed

USE'ın da QUIT gibi noktalı virg&#252;le ihtiya&#231; duymadığına dikkat edin. (isterseniz bu tip c&#252;mlecikleri noktalı virg&#252;lle sonlandırabilirsiniz, bir sakıncası olmaz.) USE c&#252;mleciği başka bir y&#246;n&#252;yle de istisnadır: tek bir satırda verilmasi gerekir.
(Erişim hakkınız varsa) izleyen &#246;rnekler i&#231;in test veritabanını kullanabilirsiniz; ancak bu veritabanında oluşturacağınız herhangi birşey, bu veritabanına erişim hakkı olan bir başkası tarafından silinebilir. Bu sebepten dolayı muhtemelen MySQL y&#246;neticinizden kendinize ait bir veritabanını kullanabilmek i&#231;in izin istemeniz gerekecektir. Farzedelim kendi veritabanınızın adının "hayvan_toplulugu" olmasını istiyorsunuz. Bu durumda y&#246;neticinin aşağıdaki gibi bir komutu &#231;alıştırması gerekir:
mysql> GRANT ALL ON hayvan_toplulugu.* TO sizin_mysql_adınız;
Burada sizin_mysql_adınız size atanan MySQL kullanıcı adınızdır.

monoklinik
11-11-2005, 20:38
3.3.1 Bir Veritabanının Oluşturulması ve Se&#231;ilmesi

Eğer y&#246;neticiniz izinlerinizi ayarlarken sizin i&#231;in veritabanınızı oluşturduysa onu kullanmaya başlayabilirsiniz. Aksi takdirde veritabanınızı kendiniz oluşturmalısınız:
mysql> CREATE DATABASE hayvan_toplulugu;
Unix altında (SQL anahtar s&#246;zc&#252;klerinin aksine) veritabanı isimleri b&#252;y&#252;k-k&#252;&#231;&#252;k harf duyarlıdır. Bundan dolayı veritabanınızı her zaman hayvan_toplulugu diye belirtmelisiniz; Hayvan_Toplulugu, HAYVAN_TOPLULUGU yada başka bir &#231;eşitlemeyi kullanmamalısınız. Bu tablo isimleri i&#231;in de doğrudur. (Her ne kadar verilen bir sorgu i&#231;inde vertabanlari ve tablolardan bahsederken harfleri aynı şekilde kullanmanız gerekse de, Windows altında bu sınırlama ge&#231;erli değildir.)
Bir veritabanını oluşturmak, onu kullanmak i&#231;in se&#231;mez; bunu a&#231;ık bir şekilde sizin yapmanız gerekmektedir. hayvan_toplulugu'nu ge&#231;erli veritabanı yapmak i&#231;in şu komutu kullanın:
mysql> USE hayvan_toplulugu
Database changed

Veritabanınızın sadece bir defa oluşturulması gerekir; ancak mysql oturumuna her başlayışınızda veritabanını kullanabilmek i&#231;in se&#231;meniz gerekmektedir. Bunu yukarıda g&#246;sterildiği gibi USE c&#252;mleciğini &#231;alıştırarak yapabilirsiniz. İkinci bir yol olarak, mysql'i &#231;alıştırıken komut satırında veritabanını se&#231;ebilirsiniz. Vermeniz gerekn bağlantı parametrelerinden hemen sonra veritabanının adını belirtin. &#214;rneğin:
kabuk> mysql -h sunucu_makina_adı -u kullanıcı_adı -p hayvan_toplulugu
Enter password: ********

Hemen yukardaki g&#246;sterilen komuttaki hayvan_toplulugu'nun sizin şifreniz olmadığına dikkat edin. Eğer şifrenizi komut satırında hemen -p se&#231;eneğinden sonra vermek istiyorsanız, bunu arada boşluk bırakmaksızın yapmalısınız (mesela, -pbenim_sifrem şeklinde; -p benim_sifrem şeklinde değil). Bununla beraber şifrenizi komut satırına yazmamanız tavsiye edilir, &#231;&#252;nk&#252; bunu yapmanız, şifrenizi makinanıza bağlanan diğer kullanıcılar tarafından g&#246;r&#252;lebilir hale getirir.

monoklinik
11-11-2005, 20:39
3.3.2 Bir Tablonun Oluşturulması

Bir veritabanı oluşturma işin kolay kısmıdır. SHOW TABLES komutunun da g&#246;stereceği gibi veritabanınız hen&#252;z boştur:
mysql> SHOW TABLES;
Empty set (0.00 sec)

İşin zor kısmı veritabanınızın yapısının nasıl olacağına karar vermektir: hangi tablolara ihtiyacınız olacak ve tabloların her birinde hangi s&#252;tunlar bulunacak.
Her bir hayvanınız i&#231;in bir kayıt tutacak bir tablo isteyeceksiniz. Bu tabloya hayvanlar tablosu denebilir ve tablo, olabilecek en k&#252;&#231;&#252;k haliyle, her hayvanın ismini i&#231;ermelidir. İsim tek başına pek te ilgi &#231;ekici olmadığından tabloda başka bilgiler de olmalıdır. Mesela ailede birden fazla insanın hayvanı varsa, her hayvan sahibinin adını da listelemek isteyebilirsiniz. t&#252;r ve cinsiyet gibi bazı temel tasvir edici bilgileri de kaydetmek isteyebilirsiniz.
Yada hayvanların yaşları? İlginizi &#231;ekebilir, ancak yaş, bir veritabanında saklanacak iyi birşey değildir. Bunun yerine doğum tarihi gibi değişmeyen (sabit) bir değeri saklamak daha iyidir. Sonrasında ne zaman bir yaşa ihtiya&#231; duyarsanız, bunu, o g&#252;n&#252;n tarihiyle doğum tarihi arasındaki fark olarak hesaplayabilirsiniz. MySQL , tarih işlemlerinde kullanılmak &#252;zere fonksiyonlar sunar, dolayısıyla bu hesaplama zor bir iş değildir. Yaş yerine doğum tarihini saklamanın başka avantajları da vardır:
Veritabanını, hayvanların yaklaşan doğum g&#252;nlerini hatırlatacak notları oluşturmak gibi işleri yapmada kullanabilirsiniz. (Bu tarz bir sorguyu ger&#231;ekleştirmenin biraz aptalca olduğunu d&#252;ş&#252;n&#252;yorsanız, bunun, bilgisayar yardımıyla kişiye &#246;zel ilgi g&#246;stermek amacıyla yakında doğum g&#252;n&#252; tebriği yollamanız gereken kullanıcıların kimliklerini belirleyeceğiniz iş d&#252;nyasındaki bir veritabanı gibi bir durumda sorma ihtimaliniz bulunan soruyla aynı olduğuna dikkat edin.)
Yaşı, o g&#252;n&#252;n tarihi dışında başka zamanlara g&#246;re hesaplayabilirsiniz. Mesela, veritabanında &#246;l&#252;m tarihlerini de tutarsanız, &#246;ld&#252;ğ&#252; zaman bir hayvanın ka&#231; yaşında olduğunu kolayca hesaplayabilirsiniz.
Hayvan tablosunda faydalı olabilecek başka bilgi tiplerini de d&#252;ş&#252;nebilirsiniz ancak şu ana dek bahsettiklerimiz şimdilik yeterlidir: isim, sahibi, t&#252;r, cinsiyet, doğum ve &#246;l&#252;m.
Tablonuzun d&#252;zenini belirtmek i&#231;in CREATE TABLE c&#252;mleciğini kullanın:
mysql> CREATE TABLE hayvanlar (isim VARCHAR(20), sahibi VARCHAR(20),
-> tur VARCHAR(20), cinsiyet CHAR(1), dogum DATE, olum DATE);

isim, sahibi ve tur s&#252;t&#252;nları i&#231;in VARCHAR iyi bir se&#231;imdir &#231;&#252;nk&#252; s&#252;tunlara kaydedilecek olan değerlerin uzunlukları değişken olacaktır. Bu s&#252;tunların t&#252;m&#252;n&#252;n uzunlukları aynı yada 20 olmak zorunda değildir. 1'den 255'e kadar herhangi bir sayıyı kullanabilirsiniz; hangisi sizin i&#231;in en makul g&#246;r&#252;n&#252;yorsa. (Eğer k&#246;t&#252; bir se&#231;im yaparsanız ve ilerde daha uzun bir alana ihtiya&#231; duyduğunuz ortaya &#231;ıkarsa, MySQL size ALTER TABLE c&#252;mleciğini de sunmaktadır.)
Hayvanlarin cinsiyeti birden fazla şekilde g&#246;sterilebilir; &#246;rneğin: "e" ve "d", veya belki de "erkek" ve "dişi" şeklinde. En kolayı "e" ve "d" tek karakterlerini kullanmaktır.
DATE veri tipinin dogum ve olum s&#252;tunları i&#231;in kullanılması olduk&#231;a belirgin (a&#231;ık, aşikar) bir se&#231;imdir.
Şimdi tabloyu oluşturduğunuza g&#246;re SHOW TABLES biraz &#231;ıktı &#252;retmelidir:
mysql> SHOW TABLES;
+----------------------------+
| Tables in hayvan_toplulugu |
+----------------------------+
| hayvanlar |
+----------------------------+

Tablonuzun tahmin ettiğiniz şekilde oluşturulduğunu sınamak i&#231;in bir DESCRIBE c&#252;mleciği kullanın:
mysql> DESCRIBE hayvanlar;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| isim | varchar(20) | YES | | NULL | |
| sahibi | varchar(20) | YES | | NULL | |
| tur | varchar(20) | YES | | NULL | |
| cinsiyet | char(1) | YES | | NULL | |
| dogum | date | YES | | NULL | |
| olum | date | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+

DESCRIBE c&#252;mleciğini her zaman, mesela tablonuzdaki s&#252;tunların adlarını yada s&#252;tunlardaki veri tiplerini unuttuğunuz zaman, kullanabilirsiniz.

monoklinik
11-11-2005, 20:39
3.3.3 Bir Tabloya Verinin Y&#252;klenmesi

Tablonuzu oluşturduktan sonra i&#231;ine birşeyler doldurmanız gerekecektir. LOAD DATA ve INSERT c&#252;mlecikleri bu işte faydalıdır.
Farzedelim ki, hayvanlarınıza ait kayıtlar aşağıdaki gibi g&#246;sterilebiliyor. (MySQLin tarihleri YYYY-AA-GG bi&#231;iminde beklediğine dikkat edin; bu alışkın olduğunuzdan farklı olabilir.)

isim sahibi tur cinsiyet dogum olum
Fluffy Harold kedi d 1993-02-04
Claws Gwen kedi e 1994-03-17
Bufy Harold k&#246;pek d 1989-05-13
Fang Benny k&#246;pek e 1990-08-27
Bowser Diane k&#246;pek e 1989-08-31 1995-07-29
Chirpy Gwen kuş d 1998-09-11
Whistler Gwen kuş 1997-12-09
Slim Benny yılan e 1996-04-29

Boş bir tabloyla işe başladığınızdan, bu tabloya veri eklemenin en kolay yolu, &#246;nce her hayvanınız i&#231;in bir satır i&#231;eren bir d&#252;zyazı dosyası oluşturup, sonra bu dosyanın i&#231;eriğini tabloya tek bir c&#252;mlecikle y&#252;klemektir.
Her satırda bir kayıt i&#231;eren, değerlerin tab karakterleriyle ayrıldığı ve s&#252;tunlardaki değerlerin CREATE TABLE c&#252;mleciğinde belirtilen sırayla verildiği 'hayvanlar.txt' gibi bir d&#252;zyazı dosyası oluşturabilirsiniz. Olmayan değerler i&#231;in (cinsiyeti bilinmeyen hayvanlar yada yaşamakta olan hayvanların &#246;l&#252;m tarihleri gibi) NULL değerlerini kullanabilirsiniz. Bu değerleri dosyanızda g&#246;stermek i&#231;in '/N'yi kullanın. &#214;rneğin Whistler adlı kuş i&#231;in kaydınız ş&#246;yle g&#246;z&#252;kecektir (değerler arasındaki boşluğun tek bir tab karakteri olduğunu unutmayın):
Whistler Gwen kuş \N 1997-12-09 \N
'hayvanlar.txt' d&#252;zyazı dosyasını hayvanlar tablosuna y&#252;klemek i&#231;in şu komutu kullanın:
mysql> LOAD DATA LOCAL INFILE "hayvanlar.txt" INTO TABLE hayvanlar;
Dilerseniz 's&#252;t&#252;n değeri ayıracı' ve 'satır sonu işaret&#231;isi'ni LOAD DATA c&#252;mleciğinde a&#231;ık&#231;a belirtebilirsiniz ancak siz belirtmediğiniz s&#252;rece varsayılan değerler 'tab' ve 'satır sonu'dur. Bu ikisi, c&#252;mleciğin 'hayvanlar.txt' dosyasını uygun bir şekilde okuması i&#231;in yeterlidir.
Her defasında bir kayıt eklemek istediğiniz durumlarda INSERT c&#252;mleciği daha yararlıdır. INSERT c&#252;mleciğinin en basit kullanılış şeklinde, her s&#252;t&#252;n i&#231;in, CREATE TABLE c&#252;mleciğinde s&#252;tunların belirtildiği sırayla değerleri verirsiniz. Farzedelim ki Diane Puffball adında yeni bir hamster satın aldı. Yeni bir kaydı bir INSERT c&#252;mleciğiyle şu şekilde ekleyebilirsiniz:
mysql> INSERT INTO hayvanlar
-> VALUES ('Puffball','Diane','hamster','d','1999-03-30',NULL);

Burada karakter dizisi ve tarih değerlerinin 'tırnaklı karakter dizileri' (quoted strings) şeklinde belirtildiğine dikkat edin. Ayrıca, olmayan bir değeri g&#246;stermek amacıyla, direkt olarak INSERT'le NULL değerini girebildiğinize de dikkat edin. LOAD DATA'yla yaptığınız gibi '\N'yi kullanmamaktasınız.
Bu &#246;rnek sayesinde, kayıtlarınızı, başlangı&#231;ta tek bir LOAD DATA c&#252;mleciği kullanmak yerine bir&#231;ok INSERT c&#252;mleciği kullanarak bir tabloya girdiğinizde, tuşlamanız gereken &#231;ok daha fazla şeyin olduğunu g&#246;rebilmelisiniz

monoklinik
11-11-2005, 20:39
3.3.4 Bir Tablodan Bilgi &#199;ekilmesi

Bir tablodan bilgi &#231;ekmek i&#231;in SELECT c&#252;mleciği kullanılır. C&#252;mleciğin genel yapısı ş&#246;yledir:
SELECT ne_se&#231;ilecek
FROM hangi_tablo
WHERE sağlanacak_koşullar

ne_se&#231;ilecek g&#246;rmek istediğiniz şeyleri g&#246;sterir. Bu, tablodaki s&#252;tunların isimlerinden oluşan bir liste yada t&#252;m s&#252;tunlar anlamına gelen * olabilir. hangi_tablo, i&#231;inden veriyi &#231;ekmek istediğiniz tabloyu g&#246;sterir. WHERE c&#252;mleciği ise isteğe bağlıdır. sağlanacak_koşullar, verildiği takdirde, s&#252;t&#252;nların tablodan &#231;ekilebilmek i&#231;in sağlamaları gereken şartları belirler.

monoklinik
11-11-2005, 20:40
3.3.4.1 T&#252;m Verinin Se&#231;ilmesi

SELECT c&#252;mleciğinin en basit hali bir tablodaki herşeyi &#231;eker:
mysql> SELECT * FROM hayvanlar;
+----------+--------+---------+----------+------------+------------+
| isim | sahibi | tur | cinsiyet | dogum | olum |
+----------+--------+---------+----------+------------+------------+
| Fluffy | Harold | kedi | d | 1993-02-04 | NULL |
| Claws | Gwen | kedi | e | 1994-03-17 | NULL |
| Buffy | Harold | k&#246;pek | d | 1989-05-13 | NULL |
| Fang | Benny | k&#246;pek | e | 1990-08-27 | NULL |
| Bowser | Diane | k&#246;pek | e | 1998-08-31 | 1995-07-29 |
| Chirpy | Gwen | kuş | d | 1998-09-11 | NULL |
| Whistler | Gwen | kuş | NULL | 1997-12-09 | NULL |
| Slim | Benny | yılan | e | 1996-04-29 | NULL |
| Puffball | Diane | hamster | d | 1999-03-30 | NULL |
+----------+--------+---------+----------+------------+------------+

SELECT'in bu hali, t&#252;m tabloyu g&#246;zden ge&#231;irmek istediğiniz zamanlarda faydalıdır; mesela tabloya başlangı&#231;taki veri k&#252;mesini y&#252;kledikten hemen sonra. Bu arada, yukarıdaki &#231;ıktı veri dosyanızdaki bir hatayı ortaya &#231;ıkardı: Bowser &#246;ld&#252;kten sonra doğmuş gibi g&#246;z&#252;kmekte! Orjinal d&#246;k&#252;manlarınıza baktığınızda g&#246;rd&#252;n&#252;z ki Bowser'ın doğru doğum yılı 1989'muş, 1998 değil.
Bu hatayı d&#252;zeltmnin en az birka&#231; yolu vardır:
Hatayı d&#252;zeltmek i&#231;in 'hayvanlar.txt' dosyasını d&#252;zeltin; sonra DELETE ve LOAD DATA komutlarını kullanarak tabloyu boşaltıp tekrar doldurun:
mysql> SET AUTOCOMMIT=1; # Tablonun hızlı bir şekilde yeniden oluşturulması i&#231;in kullanılır
mysql> DELETE FROM hayvanlar;
mysql> LOAD DATA LOCAL INFILE "hayvanlar.txt" INTO TABLE hayvanlar;

Bunu yapmakla beraber, Puffball'ın kaydını tekrar girmeniz gerekecektir. (Puffball'ı daha &#246;nce INSERT'le girmştiniz.)
Sadece hatalı kaydı, bir UPDATE c&#252;mleciğiyle d&#252;zeltin:
mysql> UPDATE hayvanlar SET dogum = "1989-08-31" WHERE isim = "Bowser";
Yukarıda g&#246;sterildiği gibi, bir tablonun tamamını &#231;ekmek kolaydır. Ancak her zaman bunu yapmak istemeyeceğiniz yeterince a&#231;ıktır; &#246;zellikle de tablonuz &#231;ok b&#252;y&#252;d&#252;ğ&#252;nde. Bunun yerine genellikle istediğiniz bilgi &#252;zerinde belirli sınırlamalar belirleyeceğiniz durumlarla, bazı soruların yanıtlarıyla ilgileneceksiniz. Hayvanlarınız hakkında yanıtladıkları bazı sorulara g&#246;re birka&#231; se&#231;im sorgusuna g&#246;z atalım.

monoklinik
11-11-2005, 20:40
3.3.4.2 Belirli Satırların Se&#231;ilmesi

Tablodan sadece belirli satırları se&#231;ebilirsiniz. &#214;rneğin; Bowser'ın doğum tarihinde yaptığınız değişikliği sınamak istiyorsanız Bawser'ın kaydını şu şekilde se&#231;in:
mysql> SELECT * FROM hayvanlar WHERE isim = "Bowser";
+--------+-------+-------+----------+------------+------------+
| isim | sahibi| tur | cinsiyet | dogum | olum |
+--------+-------+-------+----------+------------+------------+
| Bowser | Diane | k&#246;pek | e | 1989-08-31 | 1995-07-29 |
+--------+-------+-------+----------+------------+------------+

Aldığımız &#231;ıktı, yılın şimdi doğru bir şekilde, 1989 değil de 1998 olarak, kaydedildiğini onaylıyor.
Karakter dizilerinin karşılaştırılması normalde b&#252;y&#252;k-k&#252;&#231;&#252;k harften bağımsızdır; yani siz ismi "BOWSER", "bowser" v.s olarak ta verebilirsiniz. Sorgunun sonucu yine aynı oacaktır.
Sadece isim s&#252;tunu i&#231;in değil, t&#252;m s&#252;tunlar i&#231;in şartlar belirtebilirsiniz. Mesela; hangi hayvanların 1998'den sonra dığduğunu &#246;ğrenmek istiyorsanız dogum s&#252;tununu test edin:
mysql> SELECT * FROM hayvanlar WHERE dogum >= "1998-1-1";
+----------+--------+---------+----------+------------+------+
| isim | sahibi | tur | cinsiyet | dogum | olum |
+----------+--------+---------+----------+------------+------+
| Chirpy | Gwen | kuş | d | 1998-09-11 | NULL |
| Puffball | Diane | hamster | d | 1999-03-30 | NULL |
+----------+--------+---------+----------+------------+------+

Mesela, dişi k&#246;pekleri bulmak i&#231;in şartları birleştirebilirsiniz:
mysql> SELECT * FROM hayvanlar WHERE tur = "k&#246;pek" AND cinsiyet = "d";
+-------+--------+-------+----------+------------+------+
| isim | sahibi | tur | cinsiyet | dogum | olum |
+-------+--------+-------+----------+------------+------+
| Buffy | Harold | k&#246;pek | d | 1989-05-13 | NULL |
+-------+--------+-------+----------+------------+------+

&#214;nceki sorgu AND (VE) mantıksal işlemcisini kullandı. Benzer şekilde OR (VEYA) işlemcisi de vardır:
mysql> SELECT * FROM hayvanlar WHERE tur = "yılan" OR tur = "kuş";
+----------+--------+-------+----------+------------+------+
| isim | sahibi | tur | cinsiyet | dogum | olum |
+----------+--------+-------+----------+------------+------+
| Chirpy | Gwen | kuş | d | 1998-09-11 | NULL |
| Whistler | Gwen | kuş | NULL | 1997-12-09 | NULL |
| Slim | Benny | yılan | e | 1996-04-29 | NULL |
+----------+--------+-------+----------+------------+------+

AND ve OR işlemcileri birbirleriyle karıştırılabilirler. Bunu yaptığınız zaman hangi şartların gruplandırılacağını belirtmek i&#231;in parantezleri kullanmak iyi bir fikirdir.
mysql> SELECT * FROM hayvanlar WHERE (tur = "kedi" AND cinsiyet = "e")
-> OR (tur = "k&#246;pek" AND cinsiyet = "d");
+-------+--------+-------+-----------+------------+------+
| isim | sahibi | tur | cinsiyet | dogum | olum |
+-------+--------+-------+-----------+------------+------+
| Claws | Gwen | kedi | e | 1994-03-17 | NULL |
| Buffy | Harold | k&#246;pek | d | 1989-05-13 | NULL |
+-------+--------+-------+-----------+------------+------+

monoklinik
11-11-2005, 20:43
3.3.4.3 Belirli S&#252;tunların Se&#231;ilmesi

Eğer tablonuzdaki t&#252;m s&#252;tunları g&#246;rmek istemiyorsanız, sadece ilgilendiğiniz s&#252;t&#252;nların isimlerini birbirlerinden virg&#252;lle ayırarak verin. &#214;rneğin; hayvanlarınızın doğduğu zamanı &#246;ğrenmek i&#231;in isim ve dogum s&#252;tunlarını se&#231;in:
mysql> SELECT isim, dogum FROM hayvanlar;
+----------+------------+
| isim | dogum |
+----------+------------+
| Fluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Buffy | 1989-05-13 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
| Puffball | 1999-03-30 |
+----------+------------+

Hayvan sahiplerinin isimlerini &#246;ğrenmek i&#231;in şu sorguyu kullanın:
mysql> SELECT sahibi FROM hayvanlar;
+--------+
| sahibi |
+--------+
| Harold |
| Gwen |
| Harold |
| Benny |
| Diane |
| Gwen |
| Gwen |
| Benny |
| Diane |
+--------+

Ancak bu sorgunun basit&#231;e her kayıttan sahibi alanını &#231;ektiğine ve isimlerden bazısının bir defadan fazla ortaya &#231;ıktığına dikkat edin. &#199;ıktıyı en aza indirmek i&#231;in DISTINCT anahtar s&#246;zc&#252;ğ&#252;n&#252; ekleyerek benzeri olan kayıtları sadece bir defa tablodan &#231;ekin:
mysql> SELECT DISTINCT sahibi FROM hayvanlar;
+--------+
| sahibi |
+--------+
| Benny |
| Diane |
| Gwen |
| Harold |
+--------+

Satır se&#231;imini s&#252;tun se&#231;imiyle birleştirmek amacıyla bir WHERE c&#252;mleciği kullanabilirsiniz. &#214;rneğin; sadece kedi veya k&#246;peklerin doğum tarihlerini &#246;ğrenmek i&#231;in aşağıdaki sorguyu kullanın:
mysql> SELECT isim, tur, dogum FROM hayvanlar
-> WHERE tur = "k&#246;pek" OR tur = "kedi";
+--------+-------+------------+
| isim | tur | dogum |
+--------+-------+------------+
| Fluffy | kedi | 1993-02-04 |
| Claws | kedi | 1994-03-17 |
| Buffy | k&#246;pek | 1989-05-13 |
| Fang | k&#246;pek | 1990-08-27 |
| Bowser | k&#246;pek | 1989-08-31 |
+--------+-------+------------+

monoklinik
11-11-2005, 20:43
3.3.4.4 Satırların Sıralanması

&#214;nceki &#246;rneklerde sonu&#231;ların herhangi bir sıraya g&#246;re dizilmediklerini farketmiş olabilirsiniz. Bununla beraber satırların anlamlı bir şekilde sıralandığı sorgu &#231;ıktılarını incelemek &#231;oğunlukla daha kolaydır. Bir &#231;ıktının sıralı olmasını sağlamak i&#231;in ORDER BY c&#252;mleciğini kullanın.
İşte size hayvanların tarihe g&#246;re sıralanmış doğum tarihler:
mysql> SELECT isim, dogum FROM hayvanlar ORDER BY dogum;
+----------+------------+
| isim | dogum |
+----------+------------+
| Buffy | 1989-05-13 |
| Bowser | 1989-08-31 |
| Fang | 1990-08-27 |
| Fluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Slim | 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy | 1998-09-11 |
| Puffball | 1999-03-30 |
+----------+------------+

Sıralamayı tersine &#231;evirmek i&#231;in sıralamayı ger&#231;ekleştirmek amacıyla kullandığınız s&#252;tunun adına DESC (azalan) anahtar s&#246;zc&#252;ğ&#252;n&#252; ekleyin:
mysql> SELECT isim, dogum FROM hayvanlar ORDER BY dogum DESC;
+----------+------------+
| isim | dogum |
+----------+------------+
| Puffball | 1999-03-30 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
| Claws | 1994-03-17 |
| Fluffy | 1993-02-04 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Buffy | 1989-05-13 |
+----------+------------+

Birden fazla s&#252;tuna g&#246;re sıralama yapabilirsiniz. Mesela; hayvanların t&#252;r&#252;ne g&#246;re sıralama yapmak, sonra da bir t&#252;r i&#231;erisinde, gen&#231; hayvanlar &#246;nce gelecek şekilde doğum tarihine g&#246;re sıralama yapmak i&#231;in aşağıdaki sorguyu kullanın:
mysql> SELECT isim, tur, dogum FROM hayvanlar ORDER BY tur, dogum DESC;
+----------+---------+------------+
| isim | tur | dogum |
+----------+---------+------------+
| Chirpy | kuş | 1998-09-11 |
| Whistler | kuş | 1997-12-09 |
| Claws | kedi | 1994-03-17 |
| Fluffy | kedi | 1993-02-04 |
| Fang | k&#246;pek | 1990-08-27 |
| Bowser | k&#246;pek | 1989-08-31 |
| Buffy | k&#246;pek | 1989-05-13 |
| Puffball | hamster | 1999-03-30 |
| Slim | yılan | 1996-04-29 |
+----------+---------+------------+

DESC anahtar s&#246;zc&#252;ğ&#252;n&#252;n sadece kendisinden hemen &#246;nce gelen s&#252;tun adı i&#231;in (dogum) ge&#231;erli olduğuna; tur değerlerinin hala artacak şekilde sıralandığına dikkat edin.

monoklinik
11-11-2005, 20:43
3.3.4.5 Tarih Hesaplamaları

MySQL, mesela, yaş hesaplamak yada tarihlerin bazı kısımlarını (ay,dakika, v.s.) kullanmak gibi işler i&#231;in tarihler &#252;zerinde hesaplamalar yapmak amacıyla kullanabileceğiniz &#231;eşitli fonksiyonlar sunar.
Hayvanların her birinin ka&#231; yaşında olduğunu belirlemek i&#231;in yaşı, o g&#252;n&#252;n tarih ile doğum tarihi arasındaki fark olarak hesaplayın. Bunu, iki tarihi g&#252;ne &#231;evirip, aradaki farkı alıp 365'e (bir yıldaki g&#252;n sayısına) b&#246;lerek yapın:
mysql> SELECT isim, (TO_DAYS(NOW())-TO_DAYS(dogum))/365 FROM hayvanlar;
+----------+-------------------------------------+
| isim | (TO_DAYS(NOW())-TO_DAYS(dogum))/365 |
+----------+-------------------------------------+
| Fluffy | 6.15 |
| Claws | 5.04 |
| Buffy | 9.88 |
| Fang | 8.59 |
| Bowser | 9.58 |
| Chirpy | 0.55 |
| Whistler | 1.30 |
| Slim | 2.92 |
| Puffball | 0.00 |
+----------+-------------------------------------+

Sorgu &#231;alışmasına karşın iyileştirilebilecek bazı y&#246;nleri bulunmaktadır. &#214;ncelikle satırlar herhangi bir şekilde sıralandığı takdirde sonu&#231; daha iyi incelebilecektir. Sonrasında, yaşın bulunduğu s&#252;tunun başlığı pek te anlamlı değil.
&#199;ıktıyı isme g&#246;re sıralamak i&#231;in bir ORDER BY isim c&#252;mleciği eklenerek ilk sorunun &#252;stesinden gelinebilir. S&#252;tun başlığını halletmek i&#231;inse, s&#252;tuna, &#231;ıktıda farklı bir etiket g&#246;r&#252;necek şekilde bir isim verilebilir (buna 's&#252;tun takma adı)' denir):
mysql> SELECT isim, (TO_DAYS(NOW())-TO_DAYS(dogum))/365 AS yas
-> FROM hayvanlar ORDER BY isim;
+----------+------+
| isim | yas |
+----------+------+
| Bowser | 9.58 |
| Buffy | 9.88 |
| Chirpy | 0.55 |
| Claws | 5.04 |
| Fang | 8.59 |
| Fluffy | 6.15 |
| Puffball | 0.00 |
| Slim | 2.92 |
| Whistler | 1.30 |
+----------+------+

&#199;ıktıyı isim yerine yaş'a g&#246;re sıralamak i&#231;in sadece farklı bir ORDER BY c&#252;mleciği kullanın:
mysql> SELECT isim, (TO_DAYS(NOW())-TO_DAYS(dogum))/365 AS yas
-> FROM hayvanlar ORDER BY yas;
+----------+------+
| isim | yas |
+----------+------+
| Puffball | 0.00 |
| Chirpy | 0.55 |
| Whistler | 1.30 |
| Slim | 2.92 |
| Claws | 5.04 |
| Fluffy | 6.15 |
| Fang | 8.59 |
| Bowser | 9.58 |
| Buffy | 9.88 |
+----------+------+

Benzer bir sorgu, &#246;len hayvanların ka&#231; yaşındayken &#246;ld&#252;klerini bulmak i&#231;in de kullanılabilir. Hangi hayvanların &#246;ld&#252;ğ&#252;n&#252; olum s&#252;tunundaki değerin NULL olup olmadığını kontrol ederek bulabilirsiniz. Daha sonra da bu s&#252;tundaki değerin NULL olmadığı hayvanlar i&#231;in olum ve dogum değerleri arasındaki farkı hesaplayın:
mysql> SELECT isim, dogum, olum, (TO_DAYS(olum)-TO_DAYS(dogum))/365 AS yas
-> FROM hayvanlar WHERE olum IS NOT NULL ORDER BY yas;
+--------+------------+------------+------+
| isim | dogum | olum | yas |
+--------+------------+------------+------+
| Bowser | 1989-08-31 | 1995-07-29 | 5.91 |
+--------+------------+------------+------+

&#214;nceki sorgu olum != NULL yerine olum IS NOT NULL'ı kullanıyor &#231;&#252;nk&#252; NULL &#246;zel bir değerdir. Bu ilerde a&#231;ıklanmaktadır. B&#246;l&#252;m 9.3.4.6 [NULL Değerleriyle &#199;alışılması] kısmına g&#246;z atın.
Gelecek ay doğum g&#252;n&#252; olan hayvanları bilmek isterseniz ne olacak? Bu tip bir hesaplama i&#231;in yıl ve g&#252;n anlamsızdır &#231;&#252;nk&#252; yapmak istediğiniz şey, basit&#231;e dogum s&#252;tununun ay kısmını almaktır. MySQL, tarih değerlerinin bazı kısımlarını alabilmek i&#231;in YEAR(), MONTH() ve DAYOFMONTH() gibi &#231;eşitli tarih b&#246;l&#252;mlerini &#231;ıkarma fonksiyonları sunmaktadır. Burda bizim i&#231;in uygun olan fonksiyon MONTH()'tur. Nasıl &#231;alıştığını g&#246;rmek i&#231;in dogum ve MONTH(dogum) değerlerinin ikisini birden g&#246;stereck olan basit bir sorgu &#231;alıştırın:
mysql> SELECT isim, dogum, MONTH(dogum) FROM hayvanlar;
+----------+------------+--------------+
| isim | dogum | MONTH(dogum) |
+----------+------------+--------------+
| Fluffy | 1993-02-04 | 2 |
| Claws | 1994-03-17 | 3 |
| Buffy | 1989-05-13 | 5 |
| Fang | 1990-08-27 | 8 |
| Bowser | 1989-08-31 | 8 |
| Chirpy | 1998-09-11 | 9 |
| Whistler | 1997-12-09 | 12 |
| Slim | 1996-04-29 | 4 |
| Puffball | 1999-03-30 | 3 |
+----------+------------+--------------+

Gelecek ay doğum g&#252;n&#252; olan hayvanları bulmak ta kolaydır. Şimdi Nisan ayında olduğumuzu farzedelim. &#214;yleyse &#252;&#231;&#252;nc&#252; aydayız ve siz Mayıs ayında (5. ay) doğan hayvanları şu şekilde ararsınız:
mysql> SELECT isim, dogum FROM hayvanlar WHERE MONTH(dogum) = 5;
+-------+------------+
| isim | dogum |
+-------+------------+
| Buffy | 1989-05-13 |
+-------+------------+

Ş&#252;phesiz bulunduğunuz ay Aralık ise biraz karışıklık olacaktır. Kolayca ay numarasına (12) bir ekleyip 13'&#252;nc&#252; ayda doğan hayvanları aramazsınız &#231;&#252;nk&#252; b&#246;yle bir ay yok! Bunun yerine Ocak ayında (1 numaralı ay) doğan hayvanları ararsınız.
Sorguyu, bulunduğunuz ay ne olursa olsun, yine de &#231;alışabilecek bir şekilde bile yazabilirsiniz. Bu şekilde sorgunuzda belli bir ayın numarasını kullanmak zorunda kalmazsınız. DATE_ADD() fonksiyonu, verilen bir tarihe bir zaman aralığını eklemenizi sağlar. MONTH() fonksiyonuyla, NOW() fonksiyonun değerine 'bir ay' eklediğinizde elde ettiğiniz değerin ay kısmını aldığınızda, sonu&#231;, i&#231;inde doğum g&#252;nlerini arayacağınız ayı verir:
mysql> SELECT isim, dogum FROM hayvanlar
-> WHERE MONTH(dogum) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH));

Aynı işi başarmanın farklı bir yolu da sonraki ayı bulmak i&#231;in bulunduğunuz aya 1 eklemektir. (Bulunduğunuz ay 12 ise ay değerinin 0'a d&#246;nmesini sağlamak amacıyla modulo (MOD) fonksiyonunu kullandıktan sonra.)
mysql> SELECT isim, dogum FROM hayvanlar
-> WHERE MONTH(dogum) = MOD(MONTH(NOW()), 12) + 1;

MONTH()'nun 1 ile 12 arasında bir sayı d&#246;nd&#252;rd&#252;ğ&#252;ne ve MOD(herhangi_bir_sayı,12)'nın de 0 ile 11 arasında bir sayı d&#246;nd&#252;rd&#252;ğ&#252;ne dikkat edin. Dolayısıyla toplama işlemi MOD()'dan sonra olmalıdır, aksi takdirde Kasım (11) ayından sonra Ocak (1) ayına ge&#231;eriz.

monoklinik
11-11-2005, 20:44
3.3.4.6 NULL Değerleriyle &#199;alışılması

NULL değeri, siz alışıncaya dek hayli şaşırtıcı olabilir. Kavram olarak NULL, olmayan veya bilinmeyen değer anlamına gelir ve diğer değerlerden farklı bir şekilde değerlendirilir. NULL'ı test ederken =, < veya != gibi aritmetik karşılaştırma işlemcilerini kullanamazsınız. Bunu g&#246;rebilmek i&#231;in aşağıdaki sorguyu deneyin:
mysql> SELECT 1 = NULL, 1 != NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 != NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
| NULL | NULL | NULL | NULL |
+----------+-----------+----------+----------+

A&#231;ık bir şekilde yukarıdaki karşılaştırmalardan anlamlı sonu&#231;lar &#231;ıkaramazsınız. Bunun yerine IS NULL ve IS NOT NULL işlemcilerini kullanın:
mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
| 0 | 1 |
+-----------+---------------+

MySQLde 0 veya NULL yanlış, bunlar dışında herşey doğru demektir. Mantıksal bir işlemin &#246;ntanımlı değeri 1'dir.
NULL'ın bu &#246;zel davranışı, artık yaşamayan hayvanları bulurken neden olum != NULL yerine olum IS NOT NULL'ı kullanmamız gerektiğini g&#246;stermektedir.

monoklinik
11-11-2005, 20:45
3.3.4.7 Kalıpların Eşleştirilmesi

MySQL, vi, grep ve sed gibi Unix yardımcı programları tarafından kullanılanlara benzeyen, geliştirilmiş d&#252;zenli ifadeler &#252;zerine bina edilmiş bir kalıp eşleştirme şekli kadar, standart SQL kalıp eşleştirmesini de kullanmanızı sağlar.
SQL'in kalıp eşleştirmesi, "_" (alt &#231;izgi)yi herhangi bir karakteri, "%" (y&#252;zde işareti)ni de herhangi bir sayıda karakteri (0 sayıda karakter de dahil) eşleştirmek i&#231;in kullanmanıza izin verir. MySQL'de &#246;ntanımlı olarak SQL kalıpları b&#252;y&#252;k-k&#252;&#231;&#252;k harften bağımsızdır. Bazı &#246;rnekler aşağıda gosterilmiştir. SQL kalıplarını kullandığınız zaman = ve != işlemcilerini kullanmadığınıza dikkat edin. Bunun yerine LIKE ve NOT LIKE karşılaştırma işlemcilerini kullanın.
'b' ile başlayan isimleri bulmak i&#231;in:
mysql> SELECT * FROM hayvanlar WHERE isim LIKE "b%";
+--------+--------+---------+----------+------------+------------+
| isim | sahibi | tur | cinsiyet | dogum | olum |
+--------+--------+---------+----------+------------+------------+
| Buffy | Harold | k&#246;pek | d | 1989-05-13 | NULL |
| Bowser | Diane | k&#246;pek | e | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+----------+------------+------------+

'fy' ile biten isimleri bulmak i&#231;in:
mysql> SELECT * FROM hayvanlar WHERE isim LIKE "%fy";
+--------+--------+-------+----------+------------+------+
| isim | sahibi | tur | cinsiyet | dogum | olum |
+--------+--------+-------+----------+------------+------+
| Fluffy | Harold | kedi | d | 1993-02-04 | NULL |
| Buffy | Harold | k&#246;pek | d | 1989-05-13 | NULL |
+--------+--------+-------+----------+------------+------+

İ&#231;inde 'w' olan isimleri bulmak i&#231;in:
mysql> SELECT * FROM hayvanlar WHERE isim LIKE "%w%";
+----------+--------+---------+----------+------------+------------+
| isim | sahibi | tur | cinsiyet | dogum | olum |
+----------+--------+---------+----------+------------+------------+
| Claws | Gwen | kedi | e | 1994-03-17 | NULL |
| Bowser | Diane | k&#246;pek | e | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | kuş | NULL | 1997-12-09 | NULL |
+----------+--------+---------+----------+------------+------------+

Tam beş karakterden oluşan isimleri bulmak i&#231;in, '_' kalıp karakterini kullanın:
mysql> SELECT * FROM hayvanlar WHERE isim LIKE "_____";
+-------+--------+---------+----------+------------+-------+
| isim | sahibi | tur | cinsiyet | dogum | olum |
+-------+--------+---------+----------+------------+-------+
| Claws | Gwen | kedi | e | 1994-03-17 | NULL |
| Buffy | Harold | k&#246;pek | d | 1989-05-13 | NULL |
+-------+--------+---------+----------+------------+-------+

MySQLin sunduğu diğer kalıp eşleştirme tipi geliştirilmiş d&#252;zenli ifadeleri kullanır. Bu tip bir kalıpla eşleştirilen bir şeyi test ederken REGEXP ve NOT REGEXP işlemcilerini (veya eş anlamlıları olan RLIKE ve NOT RLIKE'ı) kullanın.
Geliştirilmiş d&#252;zenli ifadelerin bazı &#246;zellikleri şunlardır:
'.' (nokta) herhangi bir karaktere karşılık gelir.
Bir karakter sınıfı '[...]', k&#246;şeli parantezler i&#231;indeki herhangi bir karakterle eşleştirilebilir. &#214;rneğin '[abc]', 'a', 'b' veya 'c' ye denk gelir. Bir karakter aralığını belirtmek i&#231;in tire (yada eksi) işaretini kullanın. '[0-9]' herhangi bir rakama karşılık gelirken '[a-z]' herhangi bir k&#252;&#231;&#252;k harfle eşleştirilir.
'*' (yıldız) karakteri kendisinden &#246;nce gelen karakterin sıfır veya daha fazla sayıda tekrarıyla eşleştirilir. &#214;rneğin; 'x*', herhangi bir sayıda 'x' karakterine; '[0-9]*', herhangi bir sayıda rakama, '.*' ise herhangi bir sayıda herhangi bir karaktere karşılık gelir.
D&#252;zenli ifadeler b&#252;y&#252;k-k&#252;&#231;&#252;k harfe duyarlıdır ancak isterseniz iki durumda da eşleştirilebilen bir karakter sınıfı kullanabilirsiniz. Mesela '[aA]' hem b&#252;y&#252;k hem de k&#252;&#231;&#252;k 'a'ya denk gelirken '[a-zA-Z]' iki durumda da herhangi bir harfe karşılık gelir.
Kalıbımız, test ettiğimiz değerin herhangi bir yerinde bile ge&#231;se eşleştirme ger&#231;ekleşir. (SQL kalıpları, sadece değerin tamamıyla eşleştirilebiliyorlarsa eşleştirme ger&#231;ekleşir.)
Bir kalıbı, test edilecek değerin başlangıcı veya sonuyla eşleştirilebilecek şekilde sınırlamak i&#231;in kalıbın başında '^' veya sonunda '$' karakterini kullanın.
Geliştirilmiş d&#252;zenli ifadelerin nasıl &#231;alıştıklarını g&#246;stermek i&#231;in yukarıdaki LIKE sorguları, REGEXP kullanacak şekilde tekrar yazıldı.
'b' ile başlayan isimleri bulmak i&#231;in ismin başlangıcıyla eşleştirmek amacıyla '^' karakterini kullanın:
mysql> SELECT * FROM hayvanlar WHERE isim REGEXP "^b";
+--------+--------+-------+----------+------------+------------+
| isim | sahibi | tur | cinsiyet | dogum | olum |
+--------+--------+-------+----------+------------+------------+
| Buffy | Harold | k&#246;pek | d | 1989-05-13 | NULL |
| Bowser | Diane | k&#246;pek | e | 1989-08-31 | 1995-07-29 |
+--------+--------+-------+----------+------------+------------+

MySQL S&#252;r&#252;m 3.23.4'ten &#246;nce REGEXP b&#252;y&#252;k-k&#252;&#231;&#252;k harf duyarlıdır ve yukarıdaki sorgu hi&#231;bir satır d&#246;nd&#252;rmeyecektir. K&#252;&#231;&#252;k veya b&#252;y&#252;k 'b' harfiyle eşleştirmek i&#231;in &#246;nceki sorgu yerine bunu kullanın:
mysql> SELECT * FROM hayvanlar WHERE isim REGEXP "^[bB]";
MySQL S&#252;r&#252;m 3.23.4'ten sonra bir REGEXP karşılaştırmasının b&#252;y&#252;k-k&#252;&#231;&#252;k harf duyarlı olması i&#231;in, karakter dizilerinden birisini ikili karakter dizisi (binary string) yapmak amacıyla BINARY anahtar s&#246;zc&#252;ğ&#252;n&#252; kullanın. Aşağıdaki sorgu, sadece ismin başındaki k&#252;&#231;&#252;k 'b' harfiyle eşleştirecektir:
mysql> SELECT * FROM hayvanlar WHERE isim REGEXP BINARY "^b";
'fy' ile biten isimleri bulmak i&#231;in, ismin sonuyla eşleştirmek amacıyla '$' karakterini kullanın:
mysql> SELECT * FROM hayvanlar WHERE isim REGEXP "fy$";
+--------+--------+-------+----------+------------+------+
| isim | sahibi | tur | cinsiyet | dogum | olum |
+--------+--------+---------+--------+------------+------+
| Fluffy | Harold | kedi | d | 1993-02-04 | NULL |
| Buffy | Harold | k&#246;pek | d | 1989-05-13 | NULL |
+--------+--------+-------+----------+------------+------+

B&#252;y&#252;k veya k&#252;&#231;&#252;k 'w' harfini i&#231;eren isimleri bulmak i&#231;in şu sorguyu kullanın:
mysql> SELECT * FROM hayvanlar WHERE isim REGEXP "w";
+----------+--------+-------+----------+------------+------------+
| isim | sahibi | tur | cinsiyet | dogum | olum |
+----------+--------+-------+----------+------------+------------+
| Claws | Gwen | kedi | e | 1994-03-17 | NULL |
| Bowser | Diane | k&#246;pek | e | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | kuş | NULL | 1997-12-09 | NULL |
+----------+--------+-------+----------+------------+------------+

Bir d&#252;zenli ifade kalıbı, verilen değerin i&#231;inde herhangi bir yerde bile ge&#231;se eşleştirildiğinden, &#246;nceki sorguda SQL kalıpları kullandığımız zaman gerekecekken, verilen değerin tamamıyla eşleştirilebilmesi i&#231;in kalıbın iki yanına joker karakteri koymamız gerekmemektedir.
Tam beş karakterden oluşan isimleri bulmak i&#231;in, ismin başı ve sonuyla eşleştirmek i&#231;in '^' ve '$' karakterlerini, ikisi arasında da beş tane '.' karakterini kullanın:
mysql> SELECT * FROM hayvanlar WHERE isim REGEXP "^.....$";
+-------+--------+-------+----------+------------+------+
| isim | sahibi | tur | cinsiyet | dogum | olum |
+-------+--------+-------+----------+------------+------+
| Claws | Gwen | kedi | e | 1994-03-17 | NULL |
| Buffy | Harold | k&#246;pek | d | 1989-05-13 | NULL |
+-------+--------+-------+----------+------------+------+

&#214;nceki sorguyu '{n}' yani "n-defa-tekrar-et" işlemcisini kullanarak ta yazabilirdiniz:
mysql> SELECT * FROM hayvanlar WHERE isim REGEXP "^.{5}$";
+-------+--------+-------+----------+------------+------+
| isim | sahibi | tur | cinsiyet | dogum | olum |
+-------+--------+-------+----------+------------+------+
| Claws | Gwen | kedi | e | 1994-03-17 | NULL |
| Buffy | Harold | k&#246;pek | d | 1989-05-13 | NULL |
+-------+--------+-------+----------+------------+------+

monoklinik
11-11-2005, 20:45
3.3.4.8 Satırların Sayılması

Veritabanları &#231;oğu kez "Belirli tipte bir veri ne kadar sıklıkla tabloda bulunur?" sorusunu yanıtlamak i&#231;in kullanılırlar. Mesela; ka&#231; tane hayvanınızın olduğunu, veya her hayvan sahibinin ka&#231; tane hayvanının olduğunu bilmek isteyebilir, yada hayvanlarınız &#252;zerinde &#231;eşitli sayımlar ger&#231;ekleştirmek isteyebilirsiniz.
Sahip olduğunuz toplam hayvan sayısını hesaplamak, "hayvanlar tablosunda ka&#231; tane satır var?" sorusunu yanıtlamakla aynıdır &#231;&#252;nk&#252; tabloda her bir hayvan i&#231;in bir kayıt vardır. COUNT() fonksiyonu NULL olmayan sonu&#231;ların sayısını sayar, o y&#252;zden hayvanlarınızı sayacak olan sorgu şuna benzer:
mysql> SELECT COUNT(*) FROM hayvanlar;
+----------+
| COUNT(*) |
+----------+
| 9 |
+----------+

Daha &#246;nce hayvan sahiplerinin isimlerini almıştınız. Her hayvan sahibinin ka&#231; tane hayvana sahip olduğunu bulmak isterseniz COUNT()'u kullanabilirsiniz:
mysql> SELECT sahibi, COUNT(*) FROM hayvanlar GROUP BY sahibi;
+--------+----------+
| sahibi | COUNT(*) |
+--------+----------+
| Benny | 2 |
| Diane | 2 |
| Gwen | 3 |
| Harold | 2 |
+--------+----------+

Her sahibi i&#231;in t&#252;m kayıtları bir arada gruplamak amacıyla GROUP BY'ın kullanımına dikkat edin. GROUP BY olmaksızın alacağınız tek şey bir hata mesajı olacaktır:
mysql> SELECT sahibi, COUNT(sahibi) FROM hayvanlar;
ERROR 1140 at line 1: Mixing of GROUP columns (MIN(),MAX(),COUNT()...)
with no GROUP columns is illegal if there is no GROUP BY clause
(Satır 1 de HATA 1140: GROUP BY c&#252;mleciği olmaksızın GROUP s&#252;tunlarının (MIN(), MAX(), COUNT(),...) GROUP olmayan s&#252;t&#252;nlarla beraber kullanılması illegaldir)


COUNT() ve GROUP BY, verinizi &#231;eşitli şekillerde sınıflandırmak i&#231;in hayli yararlıdır. Sıradaki &#246;rnekler hayvanları sayma işlemlerini ger&#231;ekleştirmenin farklı yollarını g&#246;stermektedir.
Bir t&#252;rdeki hayvan sayısı:
mysql> SELECT tur, COUNT(*) FROM hayvanlar GROUP BY tur;
+---------+----------+
| tur | COUNT(*) |
+---------+----------+
| kuş | 2 |
| kedi | 2 |
| k&#246;pek | 3 |
| hamster | 1 |
| yılan | 1 |
+---------+----------+

Bir cinsiyetteki hayvan sayısı:
mysql> SELECT cinsiyet, COUNT(*) FROM hayvanlar GROUP BY cinsiyet;
+----------+----------+
| cinsiyet | COUNT(*) |
+----------+----------+
| NULL | 1 |
| d | 4 |
| e | 4 |
+----------+----------+

(Bu &#231;ıktıdaki NULL cinsiyetin bilinmediğini g&#246;stermektedir.)
Belli bir t&#252;r ve cinsiyetteki hayvan sayısı:
mysql> SELECT tur, cinsiyet, COUNT(*) FROM hayvanlar GROUP BY tur, cinsiyet;
+---------+----------+----------+
| tur | cinsiyet | COUNT(*) |
+---------+----------+----------+
| kuş | NULL | 1 |
| kuş | d | 1 |
| kedi | d | 1 |
| kedi | e | 1 |
| k&#246;pek | d | 1 |
| k&#246;pek | e | 2 |
| hamster | d | 1 |
| yılan | e | 1 |
+---------+----------+----------+

COUNT() kullanırken bir tablonun tamamını &#231;ekmeniz gerekmez. Mesela; &#246;nceki sorgu, sadece kediler ve k&#246;pekler &#252;zerinde ger&#231;ekleştirilse ş&#246;yle g&#246;r&#252;n&#252;r:
mysql> SELECT tur, cinsiyet, COUNT(*) FROM hayvanlar
-> WHERE tur = "k&#246;pek" OR tur = "kedi"
-> GROUP BY tur, cinsiyet;
+---------+----------+----------+
| tur | cinsiyet | COUNT(*) |
+---------+----------+----------+
| kedi | d | 1 |
| kedi | e | 1 |
| k&#246;pek | d | 1 |
| k&#246;pek | e | 2 |
+---------+----------+----------+

Veya cinsiyetini bildiğiniz hayvanlar arasında, bir cinsiyetteki hayvan sayısını bilmek isterseniz:
mysql> SELECT tur, cinsiyet, COUNT(*) FROM hayvanlar
-> WHERE cinsiyet IS NOT NULL
-> GROUP BY tur, cinsiyet;
+---------+----------+----------+
| tur | cinsiyet | COUNT(*) |
+---------+----------+----------+
| kuş | d | 1 |
| kedi | d | 1 |
| kedi | e | 1 |
| k&#246;pek | d | 1 |
| k&#246;pek | e | 2 |
| hamster | d | 1 |
| yılan | e | 1 |
+---------+----------+----------+

monoklinik
11-11-2005, 20:46
3.3.4.9 Birden Fazla Tablonun Kullanılması

hayvanlar tablosu sahip olduğunuz hayvanların listesini tutar. Eğer hayvanlarınız hakkında veterinere gidiş tarihleri yada yavrularının d&#252;nyaya gelmesi gibi başka bilgileri de kaydetmek isterseniz başka bir tabloya ihtiyacınız olacaktır. Peki bu tablo neye benzemeli? Bu tabloda olması gerekenler:
Hayvan isimleri; b&#246;ylece her olayın hangi hayvanla ilgili olduğunu bilirsiniz,
Olayın ger&#231;ekleştiği zamanı bilmenizi sağlayacak bir tarih,
Olayı anlatacak bir alan (field),
Olayları sınıflandırabilmeyi isterseniz, bir olay tipi alanıdır.
Yukardaki sebeplere dayanarak, olay tablosu i&#231;in CREATE TABLE c&#252;mleciği bunun gibi bir şey olabilir:
mysql> CREATE TABLE olay (isim VARCHAR(20), tarih DATE,
-> tip VARCHAR(15), hatirlatma VARCHAR(255));

hayvanlar tablosunda olduğu gibi, ilk kayıtları tabloya y&#252;klemenin en kolay yolu, verilerin tab tuşuyla birbirinden ayrıldığı, aşağıdaki bilgileri i&#231;eren bir d&#252;zyazı dosyası oluşturmaktadır:

Fluffy 1995-05-15 yavrulama 4 yavru kedi, 3 dişi, 1 erkek
Buffy 1993-06-23 yavrulama 5 yavru k&#246;pek, 2 dişi, 1 erkek
Buffy 1994-06-19 yavrulama 3 yavru k&#246;pek, 3 dişi
Chirpy 1999-03-21 veteriner tedavisi gagasının g&#252;&#231;lendirilmesi gerekiyordu
Slim 1997-08-03 veteriner tedavisi kırık kabuga kemiği
Bowser 1991-10-12 k&#246;pek kl&#252;besi
Fang 1991-10-12 k&#246;pek kl&#252;besi
Fang 1998-08-28 doğum g&#252;n&#252; &#231;iğneyebileceği yeni bir oyuncak verildi
Claws 1998-03-17 doğum g&#252;n&#252; yeni bir pire tasması verildi
Whistler 1998-12-09 doğum g&#252;n&#252; ilk doğum g&#252;n&#252;

Kayıtları şu şekilde tabloya y&#252;kleyin :
mysql> LOAD DATA LOCAL INFILE "olay.txt" INTO TABLE olay;
hayvanlar tablosu &#252;zerinde &#231;alıştırdığınız sorgulardan &#246;ğrendiklerinize dayanarak, olay tablosundaki kayıtlar &#252;zerinde se&#231;me işlemleri ger&#231;ekleştirebilirsiniz; temel kuralar aynıdır. Peki ne zaman olay tablosu, tek başına, sorabileceğiniz soruları yanıtlamakta yetersiz kalır?
Farzedelim ki her hayvanın yavruladığı zaman ka&#231; yaşında olduğunu bulmak istiyorsunuz. olay tablosu bunun ne zaman ger&#231;ekleştiğini s&#246;yler ancak annenin yaşını hesaplayabilmek i&#231;in doğum tarihine ihtiyacınız var. Doğum tarihi hayvanlar tablosunda tutulduğundan bu sorgu i&#231;in iki tabloya da ihtiyacınız var:
mysql> SELECT hayvanlar.isim, (TO_DAYS(tarih) - TO_DAYS(dogum))/365 AS yas, hatirlatma
-> FROM hayvanlar, olay
-> WHERE hayvanlar.isim = olay.isim AND tip = "yavrulama";
+--------+------+--------------------------------+
| isim | yas | hatirlatma |
+--------+------+--------------------------------+
| Fluffy | 2.27 | 4 yavru kedi, 3 dişi, 1 erkek |
| Buffy | 4.12 | 5 yavru k&#246;pek, 2 dişi, 3 erkek |
| Buffy | 5.10 | 3 yavru k&#246;pek, 3 dişi |
+--------+------+--------------------------------+

Bu sorgu hakkında not edilmesi gereken birka&#231; şey bulunmaktadır:
FROM c&#252;mleciği iki tabloyu da i&#231;ermektedir, &#231;&#252;nk&#252; her iki tablodan da bilgi &#231;ekmesi gerekmektedir.
&#199;ok sayıda tablodan alınacak bilgiyi birleştirirken (****ing), bir tablodaki kayıtların diğer tablodaki kayıtlarla nasıl eşleştirilebileceğini belirtmeniz gerekir. İki tablo da isim s&#252;tununa sahip olduğundan bu kolaydır. Sorgu, isim değerlerine dayanarak iki tablodaki kayıtları eşleştirmek i&#231;in WHERE c&#252;mleciğini kullanmaktadır.
isim s&#252;tunu iki tabloda da bulunduğundan, bu s&#252;tunu kullandığınız zaman hangi tabloyu kastettiğinizde net (a&#231;ık) olmalısınız. Bu da tablo adını s&#252;tun adının &#246;n&#252;ne ekleyerek yapılmaktadır.
Birleştirme (****) işlemi i&#231;in iki farklı tablonun olması gerekmez. Bazen bir tabloyu kendisiyle birleştirmek faydalı olabilir; eğer o tablodaki değerleri aynı tablodaki başka değerlerle karşılaştırmak istiyorsanız. Mesela; hayvanlarınızın i&#231;inde yavrulayabilecek &#231;iftleri bulmak i&#231;in aynı t&#252;rden erkek ve dişilerle &#231;iftler oluşturmak amacıyla hayvanlar tablosunu kendisiyle birleştirebilirsiniz:
mysql> SELECT p1.isim, p1.cinsiyet, p2.isim, p2.cinsiyet, p1.tur
-> FROM hayvanlar AS p1, hayvanlar AS p2
-> WHERE p1.tur = p2.tur AND p1.cinsiyet = "d" AND p2.cinsiyet = "e";
+--------+----------+--------+----------+-------+
| isim | cinsiyet | isim | cinsiyet | tur |
+--------+----------+--------+----------+-------+
| Fluffy | d | Claws | e | kedi |
| Buffy | d | Fang | e | k&#246;pek |
| Buffy | d | Bowser | e | k&#246;pek |
+--------+----------+--------+----------+-------+

Bu sorguda, her s&#252;tun referansının tablonun hangi haline (instance) karşılık geldiğini a&#231;ık&#231;a belirtmek ve s&#252;tunlara atıfta bulunmak amacıyla tablo adı i&#231;in takma adlar belirttik.

monoklinik
11-11-2005, 20:46
3.4 Veritabanları ve Tablolar Hakkında Bilgi Alınması

Bir veritabanı veya tablo adını ya da verilen bir tablonun yapısını (&#246;rneğin s&#252;tun isimlerinin ne olduğunu) unutursanız ne olur? MySQL, desteklediği veritabanları ve tablolar hakkında bilgi veren &#231;eşitli c&#252;mlecikleri sayesinde bu sorunu &#231;&#246;zer.
Sunucu tarafından kullanılan veritabanlarının listesini veren SHOW DATABASES komutunu zaten g&#246;rd&#252;n&#252;z. Halihazırda hangi veritabanının se&#231;ildiğini &#246;ğrenmek i&#231;in de DATABASE() fonksiyonunu kullanın:
mysql> SELECT DATABASE();
+------------------+
| DATABASE() |
+------------------+
| hayvan_toplulugu |
+------------------+

Eğer hen&#252;z herhangi bir veritabanını se&#231;mediyseniz yanıt "boş" tur.
Se&#231;tiğiniz veritabanının hangi tabloları i&#231;erdiğini bulmak i&#231;in (mesela; bir tablonun adından emin olmadığınız durumda) şu komutu kullanın :
mysql> SHOW TABLES;
+----------------------------+
| Tables in hayvan_toplulugu |
+----------------------------+
| olay |
| hayvanlar |
+----------------------------+

Bir tablonun yapısı hakkında bilgi almak isterseniz DESCRIBE komutu faydalıdır; tablonun her s&#252;tunu hakkında bilgi verir:
mysql> DESCRIBE hayvanlar;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| isim | varchar(20) | YES | | NULL | |
| sahibi | varchar(20) | YES | | NULL | |
| tur | varchar(20) | YES | | NULL | |
| cinsiyet | char(1) | YES | | NULL | |
| dogum | date | YES | | NULL | |
| olum | date | YES | | NULL | |
+----------+-------------+------+------+--------+-------+

Field s&#252;tun adını; Type, s&#252;tunun veri tipini; Null, s&#252;tunun NULL değeri alıp almayacağını; Key, s&#252;tunun indekslenip indekslenmediğini ve Default'ta s&#252;tunun &#246;ntanımlı değerini g&#246;stermektedir.
Eğer bir tabloda indeksleriniz varsa, SHOW INDEX FROM tablo_adı indeksler hakkında bilgi verir.

monoklinik
11-11-2005, 20:57
3.5 Sık Karşılaşılan Sorgu &#214;rnekleri

Buradakiler sık karşılaşılan bazı problemlerin MySQL ile nasıl &#231;&#246;z&#252;leceğine dair &#246;rneklerdir.
&#214;rneklerin bazıları, belirli satıcıları i&#231;in her eşyanın fiyatını (eşya numarası) tutan magaza tablosunu kullanmaktadır. Her satıcının eşya başına (tek ve) sabit bir fiyat verdiğini farzedersek, (eşya, t&#252;ccar) kayıtlar i&#231;in ana anahtar olacaktır.
Komut satırı aracı olan mysql'i başlatıp bir veritabanı se&#231;in:
kabuk>mysql veritabanınızın_adı
(MySQL kurulumlarının &#231;oğunda 'test' veritabanı adını kullanabilirsiniz).
&#214;rnek tabloyu şu şekilde oluşturabilirsiniz:
CREATE TABLE magaza (
esya INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
satici CHAR(20) DEFAULT '' NOT NULL,
fiyat DOUBLE(16,2) DEFAULT '0.00' NOT NULL,
PRIMARY KEY(esya, satici));
INSERT INTO magaza VALUES
(1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.4 5),(3,'C',1.69),
(3,'D',1.25),(4,'D',19.95);

Bu işlemden sonra &#246;rnek verimiz ş&#246;yledir:
mysql> SELECT * FROM magaza;
+---------+--------+-------+
| esya | satici | fiyat |
+---------+--------+-------+
| 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 |
+---------+--------+-------+

monoklinik
11-11-2005, 20:57
3.5.1 Bir S&#252;tundaki En B&#252;y&#252;k Değer

"En b&#252;y&#252;k eşya numarası nedir?"
SELECT MAX(esya) AS esya FROM magaza
+---------+
| esya |
+---------+
| 4 |
+---------+

monoklinik
11-11-2005, 20:57
3.5.2 Belirli Bir S&#252;tunun En B&#252;y&#252;k Değerini Bulunduran Satırlar

"En pahalı eşyanın numarasını, satıcısını ve fiyatını bulun."
ANSI SQL' de bu bir alt-sorgu (sub-query) ile kolayca yapılmaktadır:
SELECT esya, satici, fiyat
FROM magaza
WHERE fiyat=(SELECT MAX(fiyat) FROM magaza)

(Hen&#252;z alt-se&#231;im (sub-select)'i olmayan) MySQLde bunu iki adımda yapın:
1. Bir SELECT c&#252;mleciğiyle tablodan en y&#252;ksek fiyatın değerini alın.
2. Bu değeri kullanarak asıl sorguyu hazırlayın:
SELECT esya, satici, fiyat
FROM magaza
WHERE fiyat=19.95

Başka bir &#231;&#246;z&#252;m de t&#252;m satırları fiyata g&#246;re azalacak şekilde sıralayıp MySQL'e &#246;zg&#252; LIMIT c&#252;mleciğiyle ilk satırı almaktır:
SELECT esya, satici, fiyat
FROM magaza
ORDER BY fiyat DESC
LIMIT 1

NOT: Eğer en pahalı eşyadan bir taneden fazla varsa (&#246;rneğin; birka&#231; 19.95) LIMIT &#231;&#246;z&#252;m&#252; i&#231;lerinden sadece bir tanesini g&#246;r&#252;nt&#252;ler!

monoklinik
11-11-2005, 20:58
3.5.3 Grup İ&#231;inde Belirli Bir Alanın En B&#252;y&#252;k Değerini Bulunduran Satırlar

"Her bir eşya i&#231;in en y&#252;ksek fiyat nedir?"
SELECT esya, MAX(fiyat) AS fiyat
FROM magaza
GROUP BY esya
+---------+-------+
| esya | fiyat |
+---------+-------+
| 0001 | 3.99; |
| 0002 | 10.99 |
| 0003 | 1.69 |
| 0004 | 19.95 |
+---------+-------+

monoklinik
11-11-2005, 20:59
3.5.4 Bir Grupta Belli Bir Alanın En B&#252;y&#252;k Değerini Bulunduran Satırlar

"Her eşya i&#231;in, en y&#252;ksek fiyatı veren satıcıyı (satıcıları) bulun."
ANSI SQL' de şuna benzer bir alt-sorguyla yapardım :
SELECT esya, satici, fiyat
FROM magaza s1
WHERE fiyat=(SELECT MAX(s2.fiyat)
FROM magaza s2
WHERE s1.esya = s2.esya);

MySQLde bu, en iyi şekilde birka&#231; adımla yapılır:
1. (esya, maxfiyat) listesini alın.
2. Her eşya i&#231;in en y&#252;ksek fiyatı bulunduran satırları alın.
Bu, ge&#231;ici bir tabloyla kolayca yapılabilir:
CREATE TEMPORARY TABLE tmp (
esya INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
fiyat DOUBLE(16,2) DEFAULT '0.00' NOT NULL);
LOCK TABLES magaza read;
INSERT INTO tmp SELECT esya, MAX(fiyat) FROM magaza GROUP BY esya;
SELECT magaza.esya, satici, magaza.fiyat FROM magaza, tmp
WHERE magaza.esya=tmp.esya AND magaza.fiyat=tmp.fiyat;
UNLOCK TABLES;
DROP TABLE tmp;
Eğer TEMPORARY (ge&#231;ici) bir tablo kullanmazsanız, 'tmp' tablosunu da kilitlemeniz gerekir.
"Bu tek bir sorguyla yapılabilir mi?"
Evet, ancak sadece "MAX-CONCAT hilesi" dediğim, olduk&#231;a verimsiz bir hileyle:
SELECT esya,
SUBSTRING( MAX( CONCAT(LPAD(fiyat,6,'0'),satici) ), 7) AS satici,
0.00+LEFT( MAX( CONCAT(LPAD(fiyat,6,'0'),satici) ), 6) AS fiyat
FROM magaza
GROUP BY esya;
+------+--------+-------+
| esya | satici | fiyat |
+------+--------+-------+
| 0001 | B | 3.99 |
| 0002 | A | 10.99 |
| 0003 | C | 1.69 |
| 0004 | D | 19.95 |
+------+--------+-------+

Son &#246;rnek, ş&#252;phesiz, birleştirilen s&#252;tunun kullanıcıda par&#231;alanmasıyla biraz daha verimli hale getirilebilir.

monoklinik
11-11-2005, 21:00
3.5.5 Kullanıcı Değişkenlerinin Kullanılması

Sonu&#231;ları hatırlamak i&#231;in, değerleri istemcide ge&#231;ici değişkenlerde saklamak zorunda kalmaksızın, MySQLin kullanıcı değişkenlerini kullanabilirsiniz. B&#246;l&#252;m 7.2 [Kullanıcı Değişkenleri]'ne g&#246;z atın.
Mesela en d&#252;ş&#252;k ve en y&#252;ksek fiyata sahip eşyaları bulmak i&#231;in şunu yapabilirsiniz:
select @min_fiyat:=min(fiyat),@max_fiyat:=max(fiyat) from magaza;
select * from magaza where fiyat=@min_fiyat or fiyat=@max_fiyat;
+---------+--------+-------+
| esya | satici | fiyat |
+---------+--------+-------+
| 0003 | D | 1.25 |
| 0004 | D | 19.95 |
+---------+--------+-------+

monoklinik
11-11-2005, 21:00
3.5.6 Yabancı Anahtarların Kullanılması

İki tabloyu da birleştirmek (****) i&#231;in yabancı anahtarlara ihtiyacınız yoktur.
MySQLin yapmadığı tek şey, kullandığınız anahtarların ger&#231;ekten atıfta bulunduğunuz (belirttiğiniz) tablolarda bulunduğundan emin olmak i&#231;in KONTROL'd&#252;r ve MySQL yabancı anahtar tanımı olan satırları tablodan otomatik olarak silmez. Eğer anahtarlarınızı normal anahtarlar gibi kullanırsanız ger&#231;ekten iyi &#231;alışacaktır:
CREATE TABLE persons (
no SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
isim CHAR(60) NOT NULL,
PRIMARY KEY (no)
);
CREATE TABLE shirts (
no SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
stil ENUM('t-shirt', 'polo', 'dress') NOT NULL,
renk ENUM('kırmızı', 'mavi', 'turuncu', 'beyaz', 'siyah') NOT NULL,
sahibi SMALLINT UNSIGNED NOT NULL REFERENCES persons,
PRIMARY KEY (no)
);
INSERT INTO persons VALUES (NULL, 'Antonio Paz');
INSERT INTO shirts VALUES
(NULL, 'polo', 'mavi', LAST_INSERT_ID()),
(NULL, 'dress', 'beyaz', LAST_INSERT_ID()),
(NULL, 't-shirt', 'mavi', LAST_INSERT_ID());
INSERT INTO persons VALUES (NULL, 'Lilliana Angelovska');
INSERT INTO shirts VALUES
(NULL, 'dress', 'turuncu', LAST_INSERT_ID()),
(NULL, 'polo', 'kırmızı', LAST_INSERT_ID()),
(NULL, 'dress', 'mavi', LAST_INSERT_ID()),
(NULL, 't-shirt', 'beyaz', LAST_INSERT_ID());
SELECT * FROM persons;
+----+---------------------+
| no | isim |
+----+---------------------+
| 1 | Antonio Paz |
| 2 | Lilliana Angelovska |
+----+---------------------+
SELECT * FROM shirts;
+----+---------+---------+--------+
| no | stil | renk | sahibi |
+----+---------+---------+--------+
| 1 | polo | mavi | 1 |
| 2 | dress | beyaz | 1 |
| 3 | t-shirt | mavi | 1 |
| 4 | dress | turuncu | 2 |
| 5 | polo | kırmızı | 2 |
| 6 | dress | mavi | 2 |
| 7 | t-shirt | beyaz | 2 |
+----+---------+---------+--------+
SELECT s.* FROM persons p, shirts s
WHERE p.isim LIKE 'Lilliana%'
AND s.sahibi = p.no
AND s.renk <> 'beyaz';
+----+-------+---------+--------+
| no | stil | renk | sahibi |
+----+-------+---------+--------+
| 4 | dress | turuncu | 2 |
| 5 | polo | kırmızı | 2 |
| 6 | dress | mavi | 2 |
+----+-------+---------+--------+

monoklinik
11-11-2005, 21:01
3.5.7 İki Anahtar Kullanarak Arama Yapılması

MySQL hen&#252;z OR ile birleştirilmiş iki anahtarı kullanarak arama yaptığınızda, arama işlemini iyileştirmemektedir (farklı OR kısımları olan bir anahtarı kullanarak yapılan aramalar hayli iyileştirilmiştir):
SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1'
OR field2_index = '1'

Sebebi ise, bunu genel durumlarda &#231;alıştırabilecek verimli bir metot geliştirmeye hen&#252;z zamanımız olmadı. (Buna kıyasla AND işlemcisinin ele alınışı şimdilik tamamıyla geneldir ve &#231;ok iyi &#231;alışmaktadır.)
Halihazırda bu sorunu TEMPORARY tablo kullanarak olduk&#231;a verimli bir şekilde &#231;&#246;zebilirsiniz. Bu tip bir iyileştirme, SQL sunucusunun iyileştirmeleri yanlış sırayla yaptığı aşırı karmaşık sorguları kullandığınızda da hayli iyi olacaktır.
CREATE TEMPORARY TABLE tmp
SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1';
INSERT INTO tmp
SELECT field1_index, field2_index FROM test_table WHERE field2_index = '1';
SELECT * from tmp;
DROP TABLE tmp;

Bu sorgunun yukarıdaki şekilde halledilmesi, iki sorgunun UNION'ı (birleştirilmesi) şeklinde kullanılmaktadır.

monoklinik
11-11-2005, 21:01
3.5.8 G&#252;nl&#252;k Ziyaret Edilme Sayısının Hesaplanması

Aşağıdakiler, bir kullanıcının bir web sayfasını ayda ka&#231; defa ziyaret ettiğini hesaplamak amacıyla nasıl grup bit fonksiyonlarını kullanabileceğinize dair fikir vermektedir.
CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL, day INT(2) UNSIGNED ZEROFILL);
INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2 ),(2000,2,23),(2000,2,23);
SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1 GROUP BY year,month;

sorgusu yanıt olarak:
+------+-------+------+
| year | month | days |
+------+-------+------+
| 2000 | 01 | 3 |
| 2000 | 02 | 2 |
+------+-------+------+

sonucunu d&#246;nderir.
Yukarıdaki sorgu, tekrar eden girdileri kaldırarak verilen bir yıl/ay kombinasyonu i&#231;in ka&#231; faklı g&#252;n&#252;n kullanıldığını hesaplar.

monoklinik
11-11-2005, 21:03
3.6 mysql'in Yığın Modunda Kullanılması

&#214;nceki b&#246;l&#252;mlerde mysql'i , sorgu girmek ve sonu&#231;ları g&#246;rmek i&#231;in karşılıklı etkileşimli oarak kullandınız.
mysql'i yığın modunda da kullanabilirsiniz. Bunu yapmak i&#231;in &#231;alıştırmak istediğiniz komutları bir dosyaya yerleştirin, sonra mysql'e girdileri dosyadan okumasını s&#246;yleyin:
kabuk> mysql < yığın_dosyası
Eğer komut satırında bağlantı parametrelerini vermeniz gerekiyorsa, komut şuna benzeyebilir:
kabuk> mysql -h sunucu_makina_adı -u kullanıcı_adı -p < yığın_dosyası
Enter password: ********
mysql'i bu şekilde kullandığınız zaman &#246;nce bir script dosyası oluşturmakta, sonra da scripti &#231;alıştırmaktasınız.
Neden script kulanalım? İşte size kullanmak i&#231;in birka&#231; sebep:
Eğer bir sorguyu defalarca &#231;alıştırmanız gerekiyorsa (diyelim ki herg&#252;n veya her hafta), sorguyu bir script haline getirmek, onu her &#231;alıştırışınızda aynı şeyleri tekrar tuşlamaktan ka&#231;ınmanızı sağlar.
Script dosyalarını kopyalayıp d&#252;zenleyerek eski sorgularınızdan onlara benzeyen yeni sorgular oluşturabilirsiniz.
Yığın modu bir sorguyu hazırlarken de size yardımcı olabilir; &#246;zellikle de &#231;oklu-satırlardan oluşan komutlar yada &#231;ok sayıda c&#252;mleden oluşan komut dizileri i&#231;in. Eğer sorguyu hazırlarken bir hata yaparsanız herşeyi tekrar yazmak zorunda kalmazsınız. Hatayı d&#252;zeltmek i&#231;in sadece scripti d&#252;zeltin ve mysql'e scripti tekrar &#231;aluıştırmasını s&#246;yleyin.
Eğer &#231;ok fazla &#231;ıktı &#252;reten bir sorgunuz varsa, sonu&#231;ları ekranın &#252;st k&#246;şesinden kayıp giderken seyretmek yerine, girdiyi sayfalara b&#246;len bir program (pager) yardımıyla &#231;ıktıyı g&#246;zden ge&#231;irebilirsiniz:
kabuk> mysql < yığın_dosyası | more
("more", Unix/Linux'ta kendisine verilen girdiyi sayfa sayfa g&#246;rmenizi sağlayan bir komuttur.)

Scriptlerinizi diğer insanlara dağıtabilirsiniz; b&#246;ylece onlar da komutları &#231;alıştırabilirler.
kabuk> mysql < yığın_dosyası > mysql.out
Bazı durumlar karşılıklı etkileşebileceğiniz şekilde kullanıma izin vermezler; &#246;rneğin; sorguyu bir cron işiyle &#231;alıştırdığınızda. ( Unix/Linux'ta komutların belli aralıklarla &#231;alıştırılması cron işleriyle yapılmaktadır.) Bu durumda yığın modunu kullanmak zorundasınız.
&#214;ntanımlı &#231;ıktı d&#252;zeni , mysql'i yığın modunda &#231;alıştırdığınızda karşılıklı etkileşecek şekilde &#231;alıştırdığınızdan daha farklıdır (daha kısadır). Mesela; karşılıklı etkileşecek şekilde &#231;alıştırdığınız zaman SELECT DISTINCT tur FROM hayvanlar sorgusunun &#231;ıktısı şuna benzer:
+---------+
| tur |
+---------+
| kuş |
| kedi |
| k&#246;pek |
| hamster |
| yılan |
+---------+

Fakat yığın modunda bunun gibidir:
tur
kuş
kedi
k&#246;pek
hamster
yılan

Yığın modunda karşılıklı etkileşen moddaki &#231;ıktı d&#252;zenini almak istiyorsanız mysql -t'yi kullanın. &#199;alıştırılan komutların &#231;ıktıya yansıması i&#231;in mysql -vvv'yi kullanın.

monoklinik
11-11-2005, 21:07
3.7 İkiz Projesinden Sorgular

Analytikerna ve Lentus'ta b&#252;y&#252;k bir araştırma projesi i&#231;in "sistem ve alan" işlerini y&#252;r&#252;tmekteyiz. Bu proje Karolinska Institutet Stockholm'daki &#199;evresel Tıp Enstit&#252;s&#252; ve G&#252;ney Kaliforniya &#220;niversitesi'ndeki Yaşlanma ve Psikoloji &#220;zerine Klinik Araştırma B&#246;l&#252;m&#252;'nun işbirliğinin sonucudur.
Proje İsve&#231;'teki 65 yaş &#252;zeri t&#252;m ikizlerin telefonla g&#246;r&#252;ş&#252;ld&#252;ğ&#252; bir eleme kısmını i&#231;ermektedir. Belirli kriterlere uyan ikizler sonraki aşamaya ge&#231;mektedirler. Sonraki kısımda katılmak isteyen t&#252;m ikizler bir doktor/hemşire takımı tarafından ziyaret edilmektedirler. İncelemelerin bir kısmı fiziksel ve n&#246;rofiziksel muayene, laboratuar testleri, n&#246;roimajing, psikolojik durum değerlendirmesi ve aile ge&#231;mişi hakkında bilgi toplanmasını i&#231;ermektedir. Bunlara ek olarak tıbbi ve &#231;evresel risk fakt&#246;rleri hakkında da veri toplanmaktadır.
İkizar aştırmaları hakkında daha fazla bilgiye bu adresten ulaşılabilir:

http://www.imm.ki.se/TWIN/TWINUKW.HTM

Projenin sonraki kısmı Perl ve MySQL kullanarak yazılan bir Web aray&#252;z&#252;yle y&#246;netilmektedir.
Her gece g&#246;r&#252;şmelerden elde edilen t&#252;m veriler bir MySQL veritabanına taşınmaktadır

monoklinik
11-11-2005, 21:07
3.7.1 Dağılmamış T&#252;m İkizlerin Bulunması

Projenin ikinci kısmına ge&#231;enleri belirlemek i&#231;in aşağıdaki sorgu kullanılmaktadır:

select
concat(p1.id, p1.tvab) + 0 as tvid,
concat(p1.christian_name, " ", p1.surname) as Name,
p1.postal_code as Code,
p1.city as City,
pg.abrev as Area,
if(td.participation = "Aborted", "A", " ") as A,
p1.dead as dead1,
l.event as event1,
td.suspect as tsuspect1,
id.suspect as isuspect1,
td.severe as tsevere1,
id.severe as isevere1,
p2.dead as dead2,
l2.event as event2,
h2.nurse as nurse2,
h2.doctor as doctor2,
td2.suspect as tsuspect2,
id2.suspect as isuspect2,
td2.severe as tsevere2,
id2.severe as isevere2,
l.finish_date
from
twin_project as tp
/* For Twin 1 */
left **** twin_data as td on tp.id = td.id and tp.tvab = td.tvab
left **** informant_data as id on tp.id = id.id and tp.tvab = id.tvab
left **** harmony as h on tp.id = h.id and tp.tvab = h.tvab
left **** lentus as l on tp.id = l.id and tp.tvab = l.tvab
/* For Twin 2 */
left **** twin_data as td2 on p2.id = td2.id and p2.tvab = td2.tvab
left **** informant_data as id2 on p2.id = id2.id and p2.tvab = id2.tvab
left **** harmony as h2 on p2.id = h2.id and p2.tvab = h2.tvab
left **** lentus as l2 on p2.id = l2.id and p2.tvab = l2.tvab,
person_data as p1,
person_data as p2,
postal_groups as pg
where
/* p1 gets main twin and p2 gets his/her twin. */
/* ptvab is a field inverted from tvab */
p1.id = tp.id and p1.tvab = tp.tvab and
p2.id = p1.id and p2.ptvab = p1.tvab and
/* Just the sceening survey */
tp.survey_no = 5 and
/* Skip if partner died before 65 but allow emigration (dead=9) */
(p2.dead = 0 or p2.dead = 9 or
(p2.dead = 1 and
(p2.death_date = 0 or
(((to_days(p2.death_date) - to_days(p2.birthday)) / 365) >= 65))))
and
(
/* Twin is suspect */
(td.future_contact = 'Yes' and td.suspect = 2) or
/* Twin is suspect - Informant is Blessed */
(td.future_contact = 'Yes' and td.suspect = 1 and id.suspect = 1) or
/* No twin - Informant is Blessed */
(ISNULL(td.suspect) and id.suspect = 1 and id.future_contact = 'Yes') or
/* Twin broken off - Informant is Blessed */
(td.participation = 'Aborted'
and id.suspect = 1 and id.future_contact = 'Yes') or
/* Twin broken off - No inform - Have partner */
(td.participation = 'Aborted' and ISNULL(id.suspect) and p2.dead = 0))
and
l.event = 'Finished'
/* Get at area code */
and substring(p1.postal_code, 1, 2) = pg.code
/* Not already distributed */
and (h.nurse is NULL or h.nurse=00 or h.doctor=00)
/* Has not refused or been aborted */
and not (h.status = 'Refused' or h.status = 'Aborted'
or h.status = 'Died' or h.status = 'Other')
order by
tvid;

Bazı a&#231;ıklamalar:

concat(p1.id,p1.tvab)+0 as tvid
id ve tvab'ın birleştirilmiş halini sayısal sıraya g&#246;re sıralamak istiyoruz. sonuca 0 eklememiz MySQL'in sonuca sayı g&#246;z&#252;yle bakmasını sağlar.
id s&#252;tunu
Bu s&#252;tun bir ikiz &#231;iftini belirler. T&#252;m tablolardam bir anahtar olarak bulunmaktadır.
tvab s&#252;tunu
Bu s&#252;tun bir &#231;ift i&#231;erisindeki ikizleri belirler. 1 veya 2 değerini alır.
ptvab s&#252;tunu
Bu tvab'ın tersidir. tvab 1 iken bu 2'dir ve tersi... Yazımdan ka&#231;ınmak ve MySQL'in sorguyu iyileştirme işini kolaylaştırmak amacıyla vardır.
Bu sorgu, diğer şeylerle beraber, bir tablo &#252;zerinde yine aynı tablodan bir birleştirmeyle (p1 ve p2) nasıl arama yapılacağını g&#246;stermektedir. &#214;rnekteki sorgu ikizlerden birinin 65 yaşından &#246;nce &#246;l&#252;p &#246;lmediğini kontrol etmek i&#231;in kullanılmaktadır. Eğer &#246;ld&#252;yse satır d&#246;nderilmemektedir.
Yukarıdakilerin tamamı ikizlerle ilgili bilgilerle beraber t&#252;m tablolarda bulunmaktadır. Sorguları daha hızlı bir hale getirmek i&#231;in id,tvab (t&#252;m tablolarda) ve id,ptvab(person_data tablosunda)'ın her ikisinde de anahtarımız vardır.
&#220;retim i&#231;in kullandığımız makinamızda (200 MHz'lik UltraSPARC) bu sorgu yaklaşık 150-200 satır d&#246;ndermektedir ve işlem bir saniyeden az bir zaman almaktadır.
Yukarıda kullanılan tablolardaki mevcut kayıtların sayısı aşağıdadır:

monoklinik
11-11-2005, 21:08
Tablo Satırlar
person_data 71074
lentus 5291
twin_project 5286
twin_data 2012
informant_data 663
harmony 381
postal_groups 100

monoklinik
11-11-2005, 21:13
Derslerİn Tamami Şİmdİlİk Buraya Kadar Olup, Zaman Olduk&#199;a Yazmaya Devam EdeceĞİz, Saygilarimizla...

monoklinik
13-11-2005, 19:19
Php DE MYSQL KULLANIMINA İLİŞKİN BASİT BİR KOD ÖRNEĞİ:


<?php
include('tanimlar.php');
include('sessionKontrol.php');


$ad = isset($_POST['ad']) ? $_POST['ad'] : "";
$soyad = isset($_POST['soyad']) ? $_POST['soyad'] : "";
$kayitno = isset($_POST['kayitno']) ? $_POST['kayitno'] : "";
$islem = isset($_POST['islem']) ? $_POST['islem'] : "";

echo "
<html>
<body>
<br>
<center>
";

if ($islem=="")
exit ("Listeyi görmek için <a href='ogrenciListele.php'> buraya tıklayın </a><br>
<form method=post>
<table>
<tr><td>Kayıt No <td> <input type=text name=kayitno size=5>
<tr><td>Adı <td> <input type=text name=ad>
<tr><td>Soyadı <td> <input type=text name=soyad>
<tr><td colspan=2 align=center><input type=submit name=islem value='Kayıt Ekle'>
</table>
</form>
");



if ($islem!='Kayıt Ekle')
exit("<br><br>Eklenecek kayıt bilgilerini giriniz.");

$kayitno=trim($kayitno);

if (strlen($kayitno)==0)
hataSayfasiGoster("Kayıt numarası girmeden öğrenciyi kaydedemezsiniz. Geri dönüp geçerli bir kayıt numarası girin.");

if (eregi("[^0123456789]", $kayitno))
hataSayfasiGoster("Kayıt numarası sadece rakmlardan oluşabilir. Geri dönüp geçerli bir kayıt numarası girin.");

@$baglanti = mysql_connect($sunucuSunucu, $sunucuKullanici, $sunucuSifre);

if(!$baglanti)
hataSayfasiGoster("MySql bağlantı hatası : ".mysql_error());

$sonuc = mysql_query("Insert Into Ders.Ogrenciler Values('$ad','$soyad','$kayitno')");
//$sonuc = mysql_query("Delete From Ders.Ogrenciler");

if (mysql_errno())
echo "<br> MySql Hata No : ". mysql_errno(). "<br> Hata Mesajı : ". mysql_error() . "<br>";
else
echo "<br>Kayıt başarı ile eklendi.<br><br>Listeyi görmek için <a href='ogrenciListele.php'> buraya tıklayın </a> ";
mysql_close($baglanti);

echo "</body></html>";



?>

monoklinik
13-11-2005, 19:22
sunucu adı-parolası v.s.. gibi bilgileri ayrı bir text halinde yazmak, daha kolaydır.

tanimlar.php gibi:



<? php

$sunucuSunucu='localhost';
$sunucuKullanici='root';
$sunucuSifre='STRILYSM';
$veriTabani='xxx';

function hataSayfasiGoster($mesaj="")
{
exit("
<html>
<body>
<center>
<br>
<font color=red>
<h3Hata</h3><br>
$mesaj<br><br>
<input type=button name=onemsiz value='Geri Dön' onclick='history.back();'>
</body>
</html>
");
}

?>

monoklinik
15-11-2005, 17:30
photoshop topici de a&#231;mak isterdim ama bu topicin okunma sayısının bu kadar az olduğunu g&#246;r&#252;nce hi&#231; a&#231;asım gelmiyor :(

artanis
15-11-2005, 17:43
verdiğiniz bilgiler için teşekkürler

AZAZEL
15-11-2005, 19:20
photoshop topici de açmak isterdim ama bu topicin okunma sayısının bu kadar az olduğunu görünce hiç açasım gelmiyor :(
gönderilerin tamamını okudum hatta birkaçını iki defa okudum yinede birşey anlayamadım. bunun sizin anlatımınızdan değil, bu konu hakkındaki bilgisizliğimden kaynaklandığını ayrıca belirtmek isterim. photoshop topici yada bizlerin daha sık kullandığı proramlar la ilgili topicler açarsanız sizi mutlu edecek(insanlara birşeyler katmak anlamında) okuyucu sayısına erişebilirsiniz.

monoklinik
15-11-2005, 19:55
gönderilerin tamamını okudum hatta birkaçını iki defa okudum yinede birşey anlayamadım. bunun sizin anlatımınızdan değil, bu konu hakkındaki bilgisizliğimden kaynaklandığını ayrıca belirtmek isterim. photoshop topici yada bizlerin daha sık kullandığı proramlar la ilgili topicler açarsanız sizi mutlu edecek(insanlara birşeyler katmak anlamında) okuyucu sayısına erişebilirsiniz.

Haklısınız, program kurulu değilse, sadece teorik bilgi işe yaramıyor. Bu nedenle, programın nasıl kurulup, çalıştırılacağıyla ilgili bir kaç resim gönderip resimli anlatım yapmayı planlamaktayım. İlgi gösteren herkese teşekkürlerimi sunuyorum.

BOZOK
15-11-2005, 20:05
bende hicbirsey anlamadim gerci cogunu okumadim okuyamadim *ah tas kafam ah ne demek istediginizi ne ise yaradigini arti ve eksilerini anlayabilecegimziz gibi bir yazarsan seviniriz

monoklinik
15-11-2005, 20:20
bende hicbirsey anlamadim gerci cogunu okumadim okuyamadim *ah tas kafam ah ne demek istediginizi ne ise yaradigini arti ve eksilerini anlayabilecegimziz gibi bir yazarsan seviniriz

Arkadaşlar, daha nasıl anlatayım ki? :d&#252;s&#252;n:
Veritabanı bu, adı &#252;st&#252;nde. Siz, php-asp ya da cpp ile program yazdınız mı hi&#231;? Eğer yazmadıysanız, tabi ki anlamak zor olacaktır....

O zaman dediğiniz gibi yapalım, boş bir vaktimde "mysql nedir, ne işe yarar?" &#252;zerine birka&#231; mesaj daha g&#246;nderelim bakalım. Eleştirileriniz i&#231;in teşekk&#252;r ediyorum...

monoklinik
15-11-2005, 20:29
verdiğiniz bilgiler için teşekkürler

Teşekküre gerek yok, yararlı olabildiysem ne mutlu!

monoklinik
18-11-2005, 14:21
UYGULAMA: ŞİMDİ BU TOPİCE YAZDIĞIM İLK MESAJDAKİ DERSİ UYGULAYALIM:

1) Easy php 1-8'i resmi web sitesinden inidirip kuruyoruz.
2)Start-->Run dedikten sonra pencereye cmd yazıyoruz.
3)Easy php'nin &#231;alıştığından ve minik ışığının yanıp s&#246;nd&#252;ğ&#252;nden emin oluyoruz.

4)İLK DERSTE ANLATTIKLARIMI UYGULAMAYA GE&#199;İREBİLİRİZ ARTIK:

kabuk> mysql -h sunucu_makina_adı -u kullanıcı_adı -p
Enter Password: ********


a) cd "D:\Program Files\EasyPHP1-8\mysql\bin" yazıyoruz, (Easy PHP'nin d:/Program Files'in i&#231;ine kurduğumuzu vasayıyorum) enter
b) mysql -u root -p yazıp enterliyoruz..
c)ilk girişte bizden bir şifre yazmamızı isteyecektir, isterseniz yazabilirsiniz, yada boş ge&#231;ebilirsiniz ,enter
ARTIK MYSQL'E giriş yapmış durumdasınız...

monoklinik
18-11-2005, 14:33
..(DEVAMI)
daha sonra en ilk mesajda belirtilen help komutunu kullanıyoruz..
AŞAĞIDAKİ RESİMDE g&#246;r&#252;len sonu&#231;lar ekrana geliyor...


http://img498.imageshack.us/img498/3497/30bb.jpg (http://imageshack.us)

monoklinik
18-11-2005, 14:36
B&#246;yle mi anlatayım arkadaşlar, isterseniz b&#246;yle anlatmaya devam edelim , ne diyorsunuz?

stakrix
22-11-2005, 22:41
Böyle mi anlatayım arkadaşlar, isterseniz böyle anlatmaya devam edelim , ne diyorsunuz?

Fena değil...:düsün: :) :D