Bu yazımda MySQL için tasarlanmış örnek amaçlı opensource veritabanı olan Employees kurulumunu ve incelemesini yapacağım. Bu veritabanı nerden gelir neyin nesidir diye soracak olursanız yıllardır Microsoft’un kullandığı örneklerdeki Nortwith Traders tarzı bir çalışmadır.
Hemen bu veritabanını nasıl edineceğimizden bahsedelim. Launchpad denilen Oracle camiasının opensource proje merkezinden edinebilmekteyiz. https://launchpad.net/test-db/ adresinden full sürümünü indirmenizi tavsiye ederim. İndirdiğiniz zip arşivinin içindeki klasörü mysql bin dizinine kopyalayalım.
Ben wamp kullandığım için C:\Wamp\bin\mysql\mysql-versiyon\bin\ klasörü doğru olacaktır. Tabi sizin wamp serveriniz varsa mysql-versiyon da ki versiyonun mysql versiyon numaranız olması gerek, bence sırayla yolu takip ederek bulmanızda fayda var. Her ne ise Komut Satırını çalıştırıp yapıştırdığımız klasörün içine kadar ilerliyoruz. Burada mysql.exe bir üst dizinde olduğu için yazacağımız komut şudur:
..\mysql.exe -u root -p -t < employees.sql
Bu işlemden sonra ekranda şu şekilde bir görüntü oluşması gerek.
Artık datalarımızı içeri almış olduk. Şimdi MySQL adminden girip verileri inceleyelim.
Evet tablolarımızı hemen anlatalım. Bunun için tablo şemasını sunayım.
Tabloların ilki departmanlar (departments) tabosu olacak. Bu tabloda çalışanların departmanlarının listesi bulunmakta.
Tabloda ki verilere şöyle göz atarsak departman no (dept_no) ve depratman adı (dept_name) bulunmakta. Oldukça basit bir tablo.
İkinci ana tablomuz ise çalışanlar (employees) tablosu. Bu tabloda da çalışanların bir listesi bulunmakta.
Tabloda çalışan no (emp_no), doğum tarihi (birth_date), adı (first_name), soyadı (last_name), cinsiyet (gender) ve iş başlangıç tarihleri bulunmakta. Tablomuz yine oldukça basit planlanmış.
Buna paralel olarak birde ünvanlar (titles) tablosu bulunmakta. Bu tablo nedir detaylandırmadan önce biraz içeriğini göstereyim.
Tabloda çalışan no (emp_no), ünvan (title), ünvan başlangıcı (from_date), ünvan bitişi (to_date) alanları bulunmakta. Neden paralel bir tablo olduğunu şöyle anlatayım. Her çalışanın bir ünvanı var bu aslında tek bir tabloda yürütülebilecek bir işlem ancak bir çalışan belirli bir zamandan sonra başka bir ünvana sahip olabilir. Bu durumda çalışanın eski ünvan kaydını ya silmek gerekir yada paralel bir tablo yaparak eşleşmesini sağlamamız gerekir. Şimdi kimler kaç defa ünvan değişmiş bakalım.
SELECT employees.first_name, employees.last_name, count(titles.title) as totaltitles FROM employees INNER JOIN titles ON employees.emp_no = titles.emp_no GROUP BY employees.first_name, employees.last_name
Yukarıda ki sorgu adı ve soyadı alanlarını alarak ünvan tablosundaki herhangi bir alanı referans ederek kim kaç defa ünvan değişmiş bize göstermektedir.
Gördüğünüz gibi verilerin bir kısmında birileri birden fazla ünvan almış durumda. Peki şu anki ünvanlar neler onu nasıl öğreneceğiz hemen sqlimizi oluşturalım.
SELECT employees.first_name, employees.last_name, titles.title FROM employees INNER JOIN titles ON employees.emp_no = titles.emp_no WHERE titles.from_date <= NOW() AND titles.to_date >= NOW()
Yukarıda ki sql kodunda grup işlemi yoktur, çünkü herhangi bir sum, count gibi işlem yapmadık. Where komutundan sonra NOW() fonksiyonuyla from_date ve to_date aralıklarına baktırarak birleştirilmiş iki tablodan tarihi tutanları çekip almış olduk. Sonuç aşağıdaki gibi bir şey.
Burada ad soyad ve şu anki görevler listelenmiş durumda. Bu yapıyı başka bir örnekte şöyle izah edebilirim, ürünler ve kampanyalar olabilir. Ürünler ile belirli tarihler arasında yapılan kampanyaları eşleştirip tarih filtresi kullanarak kampanyalı ürünleri bulabilirsiniz.
Sıradaki tablomuz departmanlardaki çalışanlar (dept_emp) tablosu. Bu tablo iki tabloyu çapraz birleştirmekte. Tablonun içeriğine bir göz atalım.
Tabloda çalışan no (emp_no) ve departman no (dept_no) alanları ile çalışanların departmanlar ile ilişkilendirilmesi sağlanmış. Lakin burada ki ayrıntı yine departmanda çalışma tarihleri. Yani şu anda kim nerede çalışıyor öğrenmek için bu tarih aralığını kullanmak şart.
SELECT employees.first_name, employees.last_name, count(dept_emp.emp_no) AS TotalDept FROM employees INNER JOIN dept_emp ON employees.emp_no = dept_emp.emp_no GROUP BY employees.first_name, employees.last_name
Yukarıda ki sorguyu çalıştırdığımızda kim kaç departmanda çalışmış görebiliyoruz. Örneği aşağıda
Evet bazı personeller departman değişmiş görebiliyoruz. Yukarı da ki sorguda ki count personelin kaç departman kaydıyla eşleştiğini bularak sayıları hesaplıyor.
Tam tersi olarak departmanlarda kaç kişi çalışmış ona bakalım.
SELECT departments.dept_name, count(dept_emp.emp_no) AS TotalEmp FROM departments INNER JOIN dept_emp ON departments.dept_no = dept_emp.dept_no GROUP BY departments.dept_name
Burada deminki işlemin tersini yaptık. Sonuç
Sonuç yukarıda ki gibi. Ama şuna bakın ne kadar personel çalışıyor sanırım bir hata yaptık. Bu sorguda ilgili departmanda gelmiş geçmiş herkesi gösterdik. O zaman şu anda kaç kişi çalışıyor onu öğrenmek istiyorsak tarih aralıklarını kullanarak sorguyu düzeltelim.
SELECT departments.dept_name, count(dept_emp.emp_no) AS TotalEmp FROM departments INNER JOIN dept_emp ON departments.dept_no = dept_emp.dept_no WHERE dept_emp.from_date <= NOW() AND dept_emp.to_date >= NOW() GROUP BY departments.dept_name
Evet sorguda artık şu an kavramı var. Sonuç
Bakalım sonucumuza evet biraz sayı azalmış durumda ama epeyce büyük bir firmaymış diyebilirim. Gelelim kim nerede şu anda çalışıyor onu bulmaya.
SELECT departments.dept_name, employees.first_name, employees.last_name FROM departments INNER JOIN dept_emp ON departments.dept_no = dept_emp.dept_no INNER JOIN employees ON dept_emp.emp_no = employees.emp_no WHERE dept_emp.from_date <= NOW() AND dept_emp.to_date >= NOW()
İlgili sorgu bize departmanlarda şu an kimler çalışıyor listesini dökmekte.
Örnek listemiz yukarı da ki gibi olacaktır.
Başka bir tablo daha var. Bu da departman amirleri (dept_manager) tablosu. Bu tablonun yapısı ve kullanımı dept_emp ile tamamen aynı. Yukarıda ki sorguda sadece dept_emp yerine dept_manager yazarak kimler amirmiş vs bulabiliriz.
Farklı bir tablo da maaşlar (salaries) tablosu. Bu tabloda yine benzer yapıda hemen içeriğine bir göz atalım.
Evet tabloda çalışan no (emp_no), maaş (salary), başlangıç tarihi (from_date), bitiş tarihi (to_date) alanları var. Burada farklı olarak tarih bu yıl kim ne alıyor onu görebileceğimiz bir sorgu geliştirebiliriz.
SELECT employees.first_name, employees.last_name, salaries.salary FROM employees INNER JOIN salaries ON employees.emp_no = salaries.emp_no WHERE YEAR(salaries.from_date) <= 2015 AND YEAR(salaries.to_date) >= 2015
Yukarıda ki sorgu da 2015 yılında kim ne alır onu sorgulamış olduk.
Sonuç iyi kazanıyormuşlar demekten başka birşey değil 🙂 Evet tabloları daha fazla birbirine katarak departmanın bu yıl ki gideri gibi bir çarpraz sorgu dahi kurmanız mümkün. Tabi kendinizi kastırmak isterseniz. Daha çok eğitim amaçlı bu veritabanını mysql hakimiyetiniz için kullanabilir veya sorguların ne kadar zamanda çalıştığını test etmek için de faydalanabilirsiniz.
MySQL sitesinde orijinal kurulum ve test kaynağı için http://dev.mysql.com/doc/employee/en/index.html adresinden faydalanabilirsiniz.
Bir daha ki yazımda görüşmek dileğiyle.
teşekkür ederim