SQL Yapılandırılmış Sorgu Dili
Yapısal Sorgu Dili (SQL), ilişkisel bir veritabanı yönetim sisteminde tutulan verileri yönetmek için tasarlanmış bir veritabanı dilidir. SQL ilk olarak 1970'lerin başında IBM tarafından geliştirilmiştir (Date 1986). SEQUEL (Structured English Query Language) olarak adlandırılan ilk versiyon, IBM'in yarı-ilişkisel veritabanı yönetim sistemi System R'da depolanan verileri işlemek ve almak için tasarlanmıştır. Daha sonra 1970'lerin sonlarında, şimdiki adı Oracle Corporation olan Relational Software Inc. şirketi SQL'in piyasada bulunan ilk uygulaması olan VAX bilgisayarlar için Oracle V2'yi tanıttı.
Oracle Database, Microsoft SQL Server (Aşağıdaki şekilde gösterilmiştir), MySQL, IBM DB2, IBM Informix ve Microsoft Access gibi şu anda mevcut olan ilişkisel VTYS'lerin çoğu SQL kullanmaktadır.
Bir VTYS'de SQL veritabanı dili şu amaçlarla kullanılır:
- Veritabanı ve tablo yapılarını oluşturma
- Temel veri yönetimi işlerini gerçekleştirme (ekleme, silme ve değiştirme)
- Ham verileri faydalı bilgilere dönüştürmek için karmaşık sorgular gerçekleştirme
Bu bölümde, veritabanı ve tablo yapılarını oluşturmak için SQL kullanımına odaklanacağız, özellikle de SQL'i bir veri tanımlama dili (DDL) olarak kullanacağız. İleriki bölümde, veritabanı tablolarına veri eklemek, silmek, seçmek ve güncellemek için bir veri işleme dili (DML) olarak SQL kullanacağız.
Veritabanı Oluşturma
Başlıca SQL DDL deyimleri CREATE DATABASE ve CREATE/DROP/ALTER TABLE'dır. CREATE SQL deyimi veritabanı ve tablo yapılarını oluşturmak için kullanılır.
Örnek: CREATE DATABASE SW
SQL deyimi CREATE DATABASE SW ile SW adında yeni bir veritabanı oluşturulur. Veritabanı oluşturulduktan sonra, bir sonraki adım veritabanı tablolarını oluşturmaktır.
CREATE TABLE komutu için genel format şöyledir:
CREATE TABLE <tablename> ( ColumnName, Datatype, Optional Column Constraint, ColumnName, Datatype, Optional Column Constraint, Optional table Constraints ); |
Tablename, Employee gibi veritabanı tablosunun adıdır. CREATE TABLE'daki her alanın üç bölümü vardır (yukarıya bakın):
- Satır İsmi
- Veri Tipi
- İsteğe Bağlı Sütun Kısıtı
Satır İsmi
Satır ismi tablo içinde benzersiz olmalıdır. Bazı ColumnName örnekleri FirstName ve LastName'dir.
Veri Tipleri
Veri türü, aşağıda açıklandığı gibi, bir sistem veri türü veya kullanıcı tanımlı bir veri türü olmalıdır. Veri türlerinin çoğunun CHAR(35) veya Numeric(8,2) gibi bir boyutu vardır.
Bit;1 veya 0 değerine sahip tamsayı verileri
Int; -2^31 ile 2^31-1 arasındaki tamsayı verileri
Smallint; 2^15 ile 2^15-1 arasında tamsayı verileri
Tinyint; 0 ile 255 arasında tam sayı verileri
Decimal; -10^38 ile 10^38-1 arasında sabit hassasiyet ve ölçekli sayısal veriler
Numeric; Decimal ile eşanlamlı
Timestamp; Veritabanı çapında benzersiz bir numara
Uniqueidentifier; Küresel olarak benzersiz bir tanımlayıcı (GUID)
Money; -2^63 ile 2^63-1 arasındaki parasal veri değerleri, bir para biriminin on binde birine kadar doğrulukla
Smallmoney; -214,748.3648 ile +214,748.3647 arasındaki parasal veri değerleri, bir para biriminin on binde birine kadar doğrulukla
Float; -1.79E + 308 ile 1.79E + 308 arasında yüzdeli duyarlıklı sayı verileri
Real; -3.40E + 38 ile 3.40E + 38 arasında yüzdesel hassasiyetli sayı verileri
Datetime; 1 Ocak 1753'ten 31 Aralık 9999'a kadar, saniyenin üçte biri veya 3,33 milisaniye hassasiyetle tarih ve saat verileri
Smalldatetime; 1 Ocak 1900'den 6 Haziran 2079'a kadar bir dakika hassasiyetle tarih ve saat verileri
Char; Maksimum 8.000 karakter uzunluğunda sabit uzunlukta Unicode olmayan karakter verileri
Varchar; Maksimum 8.000 karakterlik değişken uzunlukta Unicode olmayan veri
Text; Maksimum uzunluğu 2^31 - 1 karakter olan değişken uzunlukta Unicode olmayan veriler
Binary; Maksimum 8.000 bayt uzunluğunda sabit uzunlukta binary veri
Varbinary; Maksimum 8.000 bayt uzunluğunda değişken uzunluklu ikili veri
Image; Maksimum uzunluğu 2^31 - 1 bayt olan değişken uzunluklu ikili veri
İsteğe Bağlı Sütun Kısıtlamaları
İsteğe Bağlı Sütun Kısıtlamaları NULL, NOT NULL, UNIQUE, PRIMARY KEY ve DEFAULT olup yeni bir kayıt için bir değer başlatmak için kullanılır. NULL sütun kısıtı, null değerlere izin verildiğini gösterir; bu da bu sütun için bir değer olmadan bir satır oluşturulabileceği anlamına gelir. NOT NULL sütun kısıtı, yeni bir satır oluşturulduğunda bir değer sağlanması gerektiğini belirtir.
Örnek olarak, 16 öznitelik veya alana sahip employees tablosunu oluşturmak için CREATE TABLE EMPLOYEES SQL deyimini kullanacağız.
USE SW CREATE TABLE EMPLOYEES ( EmployeeNo CHAR(10) NOT NULL UNIQUE, DepartmentName CHAR(30) NOT NULL DEFAULT “Human Resources”, FirstName CHAR(25) NOT NULL, LastName CHAR(25) NOT NULL, Category CHAR(20) NOT NULL, HourlyRate CURRENCY NOT NULL, TimeCard LOGICAL NOT NULL, HourlySalaried CHAR(1) NOT NULL, EmpType CHAR(1) NOT NULL, Terminated LOGICAL NOT NULL, ExemptCode CHAR(2) NOT NULL, Supervisor LOGICAL NOT NULL, SupervisorName CHAR(50) NOT NULL, BirthDate DATE NOT NULL, CollegeDegree CHAR(5) NOT NULL, CONSTRAINT Employee_PK PRIMARY KEY(EmployeeNo ); |
İlk alan, alan türü CHAR olan EmployeeNo'dur. Bu alan için alan uzunluğu 10 karakterdir ve kullanıcı bu alanı boş bırakamaz (NOT NULL).
Benzer şekilde, ikinci alan 30 uzunluğunda CHAR alan türüne sahip DepartmentName'dir. Tüm tablo sütunları tanımlandıktan sonra, birincil anahtarı oluşturmak için CONSTRAINT kelimesiyle tanımlanan bir tablo kısıtlaması kullanılır:
CONSTRAINT EmployeePK PRIMARY KEY(EmployeeNo) |
Kısıtlama özelliğini bu bölümün ilerleyen kısımlarında tartışacağız.
Aynı şekilde, aşağıdaki örnekte gösterildiği gibi CREATE TABLE SQL DDL komutunu kullanarak bir Department tablosu, bir Project tablosu ve bir Assignment tablosu oluşturabiliriz.
USE SW CREATE TABLE DEPARTMENT ( DepartmentName Char(35) NOT NULL, BudgetCode Char(30) NOT NULL, OfficeNumber Char(15) NOT NULL, Phone Char(15) NOT NULL, CONSTRAINT DEPARTMENT_PK PRIMARY KEY(DepartmentName) ); |
Bu örnekte, yedi alan içeren bir proje tablosu oluşturulmuştur: ProjectID, ProjectName, Department, MaxHours, StartDate ve EndDate.
USE SW CREATE TABLE PROJECT ( ProjectID Int NOT NULL IDENTITY (1000,100), ProjectName Char(50) NOT NULL, Department Char(35) NOT NULL, MaxHours Numeric(8,2) NOT NULL DEFAULT 100, StartDate DateTime NULL, EndDate DateTime NULL, CONSTRAINT ASSIGNMENT_PK PRIMARY KEY(ProjectID) ); |
Bu son örnekte, üç alana sahip bir atama tablosu oluşturulmuştur: ProjectID, EmployeeNumber ve HoursWorked. Atama tablosu, bir çalışanın belirli bir projede (ProjectID) kiminle (EmployeeNumber) ve ne kadar süreyle (HoursWorked) çalıştığını kaydetmek için kullanılır.
USE SW CREATE TABLE ASSIGNMENT ( ProjectID Int NOT NULL, EmployeeNumber Int NOT NULL, HoursWorked Numeric(6,2) NULL, ); |
Tablo Kısıtlamaları
Tablo kısıtlamaları CONSTRAINT anahtar sözcüğü ile tanımlanır ve aşağıda açıklanan çeşitli kısıtlamaları uygulamak için kullanılabilir.
IDENTITY kısıtlaması
Bu sütun için benzersiz, artan bir değer sağlamak üzere isteğe bağlı sütun kısıtlaması IDENTITY'yi kullanabiliriz. Identity sütunları, tablo için benzersiz satır tanımlayıcısı olarak hizmet etmek üzere genellikle PRIMARY KEY kısıtlamalarıyla birlikte kullanılır. IDENTITY özelliği, tinyint, smallint, int, decimal veya numeric veri türüne sahip bir sütuna atanabilir. Bu kısıtlama:
- Sıralı sayılar üretir
- Varlık bütünlüğünü zorlamaz
- Yalnızca bir sütun IDENTITY özelliğine sahip olabilir
- Bir integer, numeric veya decimal veri tipi olarak tanımlanmalıdır
- IDENTITY özelliğine sahip bir sütun güncellenemez
- NULL değerler içeremez
- Varsayılanlar ve varsayılan kısıtlamalar sütuna bağlanamaz
IDENTITY[(seed, increment)] için
- Seed - kimlik sütununun ilk değeri
- Increment - son artış sütununa eklenecek değer
Bu HOTEL veritabanında tblHotel tablosunu oluşturarak SQL DDL ifadelerini daha fazla göstermek için başka bir veritabanı örneği kullanacağız.
CREATE TABLE tblHotel ( HotelNo Int IDENTITY (1,1), Name Char(50) NOT NULL, Address Char(50) NULL, City Char(25) NULL, ) |
UNIQUE kısıtlaması
UNIQUE kısıtı, bir sütuna yinelenen değerlerin girilmesini önler.
- Varlık bütünlüğünü sağlamak için hem PK hem de UNIQUE kısıtlamaları kullanılır.
- Bir tablo için birden fazla UNIQUE kısıtlaması tanımlanabilir.
- Mevcut bir tabloya UNIQUE kısıtı eklendiğinde, mevcut veriler her zaman doğrulanır.
- NULL kabul eden sütunlara UNIQUE kısıtlaması yerleştirilebilir. Yalnızca bir satır NULL olabilir.
- UNIQUE kısıtlaması, seçilen sütun üzerinde otomatik olarak benzersiz bir dizin oluşturur.
Bu, UNIQUE kısıtlaması için genel sözdizimidir:
[CONSTRAINT constraint_name] UNIQUE [CLUSTERED | NONCLUSTERED] (col_name [, col_name2 […, col_name16]]) [ON segment_name] |
Bu, UNIQUE kısıtlamasının kullanıldığı bir örnektir.
CREATE TABLE EMPLOYEES ( EmployeeNo CHAR(10) NOT NULL UNIQUE, ) |
FOREIGN KEY kısıtlaması
FOREIGN KEY (FK) kısıtı, değerleri başka bir tablonun PRIMARY KEY'iyle (PK) eşleşen bir sütunu veya sütun kombinasyonunu tanımlar.
- Bir FK'daki değerler, ilişkili tablodaki PK değerleri güncellendiğinde/değiştirildiğinde otomatik olarak güncellenir.
- FK kısıtlamaları PK veya başka bir tablonun UNIQUE kısıtlamasına referans vermelidir.
- FK için sütun sayısı PK veya UNIQUE kısıtlaması ile aynı olmalıdır.
- WITH NOCHECK seçeneği kullanılırsa, FK kısıtı bir tablodaki mevcut verileri doğrulamaz.
- Bir FK kısıtlamasına katılan sütunlarda hiçbir dizin oluşturulmaz.
Aşağıdaki kodlar, FOREIGN KEY kısıtlaması için genel sözdizimidir:
[CONSTRAINT constraint_name] [FOREIGN KEY (col_name [, col_name2 […, col_name16]])] REFERENCES [owner.]ref_table [(ref_col [, ref_col2 […, ref_col16]])] |
Bu örnekte, tblRoom tablosundaki HotelNo alanı, daha önce gösterilen tblHotel tablosundaki HotelNo alanının bir FK'sıdır.
USE HOTEL GO CREATE TABLE tblRoom ( HotelNo Int NOT NULL , RoomNo Int NOT NULL, Type Char(50) NULL, Price Money NULL, PRIMARY KEY (HotelNo, RoomNo), FOREIGN KEY (HotelNo) REFERENCES tblHotel ) |
CHECK kısıtlaması
CHECK kısıtı, bir tabloya girilebilecek değerleri kısıtlar.
- WHERE cümlesine benzer arama koşulları içerebilir.
- Aynı tablodaki sütunlara referans verebilir.
- Bir CHECK kısıtlaması için veri doğrulama kuralı bir boolean ifadesine göre değerlendirilmelidir.
- Kendisine bağlı bir kuralı olan bir sütun için tanımlanabilir.
Bu, CHECK kısıtlaması için genel sözdizimidir:
[CONSTRAINT constraint_name] CHECK [NOT FOR REPLICATION] (expression) |
Bu örnekte, Tür alanı yalnızca 'Single', 'Double', 'Suite' veya 'Executive' türlerine sahip olacak şekilde sınırlandırılmıştır.
USE HOTEL GO CREATE TABLE tblRoom ( HotelNo Int NOT NULL, RoomNo Int NOT NULL, Type Char(50) NULL, Price Money NULL, PRIMARY KEY (HotelNo, RoomNo), FOREIGN KEY (HotelNo) REFERENCES tblHotel CONSTRAINT Valid_Type CHECK (Type IN (‘Single’, ‘Double’, ‘Suite’, ‘Executive’)) ) |
Bu ikinci örnekte, çalışanın işe başlama tarihi 1 Ocak 2004'ten önce olmalı veya maaş sınırı 300.000 $ olmalıdır.
GO CREATE TABLE SALESREPS ( Empl_num Int Not Null CHECK (Empl_num BETWEEN 101 and 199), Name Char (15), Age Int CHECK (Age >= 21), Quota Money CHECK (Quota >= 0.0), HireDate DateTime, CONSTRAINT QuotaCap CHECK ((HireDate < “01-01-2004”) OR (Quota <=300000)) ) |
DEFAULT kısıtlama
DEFAULT kısıtlaması, kullanıcı bir değer sağlamazsa bir sütun için otomatik olarak eklenen bir değer sağlamak için kullanılır.
- Bir sütunun yalnızca bir DEFAULT değeri olabilir.
- DEFAULT kısıtı, timestamp veri türüne veya identity özelliğine sahip sütunlarda kullanılamaz.
- DEFAULT kısıtlamaları oluşturulduklarında otomatik olarak bir sütuna bağlanırlar.
DEFAULT kısıtlaması için genel sözdizimi şöyledir:
[CONSTRAINT constraint_name] DEFAULT {constant_expression | niladic-function | NULL} [FOR col_name] |
Bu örnek, şehir alanı için varsayılanı 'Vancouver' olarak ayarlar.
USE HOTEL ALTER TABLE tblHotel Add CONSTRAINT df_city DEFAULT ‘Vancouver’ FOR City |
Kullanıcı Tanımlı Tipler
Kullanıcı tanımlı tipler her zaman sistem tarafından sağlanan veri tipine dayanır. Veri bütünlüğünü zorlayabilirler ve null'lara izin verirler.
SQL Server'da kullanıcı tanımlı bir veri türü oluşturmak için, veritabanınızda "Programlanabilirlik" altında türleri seçin. Ardından, sağ tıklayın ve 'New' ->'User-defined data type'ı seçin veya sp_addtype sistem saklı yordamını çalıştırın. Bundan sonra şunu yazın:
sp_addtype ssn, ‘varchar(11)’, ‘NOT NULL’ |
Bu, dokuz karakterli SIN adında yeni bir kullanıcı tanımlı veri türü ekleyecektir.
Bu örnekte, EmployeeSIN alanı kullanıcı tanımlı veri tipi SIN'i kullanır.
CREATE TABLE SINTable ( EmployeeID INT Primary Key, EmployeeSIN SIN, CONSTRAINT CheckSIN CHECK (EmployeeSIN LIKE ‘ [0-9][0-9][0-9] – [0-9][0-9] [0-9] – [0-9][0-9][0-9] ‘) ) |
ALTER TABLE
Kısıtlamalar eklemek ve çıkarmak için ALTER TABLE deyimlerini kullanabilirsiniz.
- ALTER TABLE sütunların kaldırılmasına izin verir.
- Bir kısıtlama eklendiğinde, mevcut tüm veriler ihlallere karşı doğrulanır.
Bu örnekte, bir ColumnName alanına IDENTITY özelliği eklemek için ALTER TABLE deyimini kullanıyoruz.
USE HOTEL GO ALTER TABLE tblHotel ADD CONSTRAINT unqName UNIQUE (Name) |
ALTER TABLE TableName gibi IDENTITY özelliğine sahip bir sütun eklemek için ALTER TABLE deyimini kullanın.
ADD ColumnName int IDENTITY(seed, increment) |
DROP TABLE
DROP TABLE bir tabloyu veritabanından kaldıracaktır. Doğru veritabanını seçtiğinizden emin olun.
DROP TABLE tblHotel |
Yukarıdaki SQL DROP TABLE deyiminin çalıştırılması tblHotel tablosunu veritabanından kaldıracaktır.
Alıştırmalar | ||||||||||||||
1. Bütünlük Kuralları ve Kısıtlamalar alıştırmasındaki bilgileri kullanarak, Transact SQL kullanarak şemayı uygulayın (her tablo için SQL ifadelerini gösterin). Kısıtlamaları da uygulayın. 2. Burada gösterilen tabloyu SQL Server’da oluşturun ve kullandığınız deyimleri gösterin. Tablo; Employee
Şekil; A. Watt tarafından hazırlanan, 3-9. sorular için verileri içeren çalışan tablosu. 3 ila 9. soruları yanıtlamak için yukarıdaki şekli kullanın. 3. Personel numarası 107 olan kişinin iş kodunu 501 olarak değiştirmek için SQL kodunu yazın. Görevi tamamladıktan sonra sonuçları inceleyin ve ardından iş kodunu orijinal değerine sıfırlayın. 4. Employee tablosunda gösterilen verilerin girildiğini varsayarak, 502 iş kodu için tüm öznitelikleri listeleyen SQL kodunu yazın. 5. İş kodu sınıflandırması 500 olan ve 22 Haziran 2004 tarihinde işe alınan William Smithfield adlı kişinin satırını silmek için SQL kodunu yazın. (İpucu: Bu problemde verilen tüm bilgileri dahil etmek için mantıksal operatörleri kullanın). 6. Employee tablosuna EMP_PCT ve PROJ_NUM özniteliklerini ekleyin. EMP_PCT, her çalışana ödenecek ikramiye yüzdesidir. 7. Tek bir komut kullanarak, iş sınıflandırması (JOB_CODE) 500 olan tüm çalışanlar için proje numarasını (PROJ_NUM) = 18 olarak girecek SQL kodunu yazın. 8. Tek bir komut kullanarak, iş sınıflandırması (JOB_CODE) 502 veya daha yüksek olan tüm çalışanlar için proje numarasını (PROJ_NUM) = 25 olarak girecek SQL kodunu yazın. 9. PROJ_NUM’u 1 Ocak 1994’ten önce işe alınmış ve iş kodu en az 501 olan çalışanlar için 14 olarak değiştirecek SQL kodunu yazın. (Tablonun bu sorudan önceki orijinal durumuna geri getirileceğini varsayabilirsiniz). Ayrıca bkz Ek; Çözümlü SQL Laboratuvarı |
Referanslar
Date, C.J. Relational Database Selected Writings. Reading: Mass: Addison-Wesley Publishing Company Inc., 1986, p. 269-311.
Önceki Ders: Veritabanı Kullanıcıları
Sonraki Ders: SQL Veri Manipülasyon Dili
Yorumlar
Yorum Gönder