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.

Şekil; Microsoft SQL Server örneği, A. Watt tarafından.

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):

  1. Satır İsmi
  2. Veri Tipi
  3. İ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
ATTRIBUTE (FIELD) NAMEDATA DECLARATION
EMP_NUMCHAR(3)
EMP_LNAMEVARCHAR(15)
EMP_FNAMEVARCHAR(15)
EMP_INITIALCHAR(1)
EMP_HIREDATEDATE
JOB_CODECHAR(3)


Ş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

Bu blogdaki popüler yayınlar

Gelişim ve Kalıtım Eleştirel Düşünme Soruları

Periodonsiyum Klinik Uygulamalar

Dentin Oluşumu