SQL ile Veri Dünyasına Yolculuk: Veritabanı Yönetiminin Temel Adımları-2

Serkan Topkan
9 min readJun 24, 2023

--

SQL Nedir, temel kullanım pratikleri ile öğreniyoruz?

SQL Constraints

Kısıtlamalar, bir tabloya girebilecek veri türünü sınırlamak için kullanılır.

Kısıtlamalar bir tablo oluşturulurken (CREATE TABLE deyimiyle) veya tablo oluşturulduktan sonra (ALTER TABLE deyimiyle) belirtilebilir.

İşte en önemli kısıtlamalar:

• PRIMARY KEY
• NOT NULL
• UNIQUE
• FOREIGN KEY
• CHECK
• DEFAULT
• IDENTITY

Aşağıdaki bölümlerde bunlardan bazılarını ayrıntılı olarak açıklayacağım.

PRIMARY KEY

PRIMARY KEY kısıtı, bir veritabanı tablosundaki her kaydı benzersiz olarak tanımlar.

Birincil anahtarlar benzersiz değerler içermelidir. Sadece 1, 2 gibi çalışan sayılar kullanmak normaldir, 3, 4, 5, … Birincil Anahtar sütunundaki değerler olarak.

Bunu sistemin halletmesine izin vermek iyi bir fikirdir. Birincil Anahtarın identity(1,1) olarak ayarlanması gerektiğini belirterek.

IDENTITY(1,1) şu anlama gelir ilk değer 1 olacak ve daha sonra 1 artacaktır.

Her tablonun bir birincil anahtarı olmalıdır ve her tablonun yalnızca BİR birincil anahtarı olabilir.

Daha önce oluşturulan CUSTOMER tablosuna daha yakından bakarsak:

CREATE TABLE [CUSTOMER]
(
CustomerId int IDENTITY(1,1) PRIMARY KEY,
CustomerNumber int NOT NULL UNIQUE,
LastName varchar(50) NOT NULL,
FirstName varchar(50) NOT NULL,
AreaCode int NULL,
Address varchar(50) NULL,
Phone varchar(50) NULL,
)
GO

Gördüğünüz gibi, bir sütunun Birincil Anahtar olması gerektiğini belirtmek için “Birincil Anahtar” anahtar sözcüğünü kullanıyoruz.

Tasarımcı Araçlarında Birincil Anahtarları Ayarlama:
SQL Server’da Tasarımcı araçlarını kullanıyorsanız, bir tablodaki Birincil Anahtarı kolayca ayarlayabilirsiniz sağ tıklayıp “Set primary Key”yi seçin.

Birincil Anahtar sütununun önünde, bu sütunun Birincil Anahtar olduğunu göstermek için küçük bir anahtar olacaktır.

FOREIGN KEY

Bir tablodaki FOREIGN KEY başka bir tablodaki PRIMARY KEY’e işaret eder.
Örnek:

Bu tablolar için bir CREATE TABLE betiği oluşturacağız:

SCHOOL:

CREATE TABLE SCHOOL
(
SchoolId int IDENTITY(1,1) PRIMARY KEY,
SchoolName varchar(50) NOT NULL UNIQUE,
Description varchar(1000) NULL,
Address varchar(50) NULL,
Phone varchar(50) NULL,
PostCode varchar(50) NULL,
PostAddress varchar(50) NULL,
)
GO

CLASS:

CREATE TABLE CLASS
(
ClassId int IDENTITY(1,1) PRIMARY KEY,
SchoolId int NOT NULL FOREIGN KEY REFERENCES SCHOOL (SchoolId),
ClassName varchar(50) NOT NULL UNIQUE,
Description varchar(1000) NULL,
)
GO

FOREIGN KEY kısıtı, tablolar arasındaki bağlantıları yok edecek eylemleri önlemek için kullanılır.

FOREIGN KEY kısıtlaması aynı zamanda yabancı anahtar sütununa geçersiz verilerin eklenmesini de engeller, çünkü bu verilerin işaret ettiği tabloda bulunan değerlerden biri olması gerekir.

Tasarımcı Araçlarında Yabancı Anahtarları Ayarlama:

Tasarımcıyı kullanmak istiyorsanız, Yabancı Anahtar olmasını istediğiniz sütuna sağ tıklayın ve “Relationships…” seçeneğini seçin:

“Add” düğmesine tıklayın ve ardından küçük “…” düğmesine tıklayın. Ardından aşağıdaki pencere açılır (Tables and Columns):

Burada, Birincil Anahtar tablosundaki Birincil Anahtar Sütununu ve Yabancı Anahtar tablosundaki Yabancı Anahtar Sütununu belirtebilirsiniz.

NOT NULL

NOT NULL kısıtı, bir sütunun null değerleri kabul etmemesini zorunlu kılar.

NOT NULL kısıtı, bir alanın her zaman bir değer içermesini zorunlu kılar. Bu, bu alana bir değer eklemeden yeni bir kayıt ekleyemeyeceğiniz veya bir kaydı güncelleyemeyeceğiniz anlamına gelir.

Daha önce oluşturulan CUSTOMER tablosuna daha yakından bakacak olursak:

CREATE TABLE [CUSTOMER]
(
CustomerId int IDENTITY(1,1) PRIMARY KEY,
CustomerNumber int NOT NULL UNIQUE,
LastName varchar(50) NOT NULL,
FirstName varchar(50) NOT NULL,
AreaCode int NULL,
Address varchar(50) NULL,
Phone varchar(50) NULL,
)
GO

“CustomerNumber”, “LastName” ve “FirstName “in “NOT NULL” olarak ayarlandığını görüyoruz, bu bu sütunların veri içermesi gerektiği anlamına gelir.

“AreaCode”, “Address” ve “Phone” sütunları veri içerebilirken boş bırakılabilir, yani doldurulmaları gerekmez.

Not! Bir birincil anahtar sütunu NULL değerler içeremez.

Buradan sonra sadece kod örnekleri olarak devam edeceğim.

UNIQUE

UNIQUE kısıtı, bir veritabanı tablosundaki her kaydı benzersiz olarak tanımlar.

UNIQUE ve PRIMARY KEY kısıtlarının her ikisi de bir sütun veya sütun kümesi için benzersizlik garantisi sağlar.

Bir PRIMARY KEY kısıtlaması otomatik olarak üzerinde tanımlanmış bir UNIQUE kısıtlamasına sahiptir.

Not! Tablo başına çok sayıda UNIQUE kısıtına sahip olabilirsiniz, ancak tablo başına yalnızca bir PRIMARY KEY kısıtına sahip olabilirsiniz.

Daha önce oluşturulan CUSTOMER tablosuna daha yakından bakacak olursak:

CREATE TABLE [CUSTOMER]
(
CustomerId int IDENTITY(1,1) PRIMARY KEY,
CustomerNumber int NOT NULL UNIQUE,
LastName varchar(50) NOT NULL,
FirstName varchar(50) NOT NULL,
AreaCode int NULL,
Address varchar(50) NULL,
24 CREATE TABLE
Structured Query Language (SQL)
Phone varchar(50) NULL,
)
GO

“CustomerNumber “ın UNIQUE olarak ayarlandığını görüyoruz, yani her müşterinin bir benzersiz Müşteri Numarası.

CHECK

CHECK kısıtı, bir sütuna yerleştirilebilecek değer aralığını sınırlamak için kullanılır.

Tek bir sütunda bir CHECK kısıtı tanımlarsanız, bu sütun için yalnızca belirli değerlere izin verir.

Bir tablo üzerinde CHECK kısıtı tanımlarsanız, satırdaki diğer sütunlardaki değerlere bağlı olarak belirli sütunlardaki değerleri sınırlayabilir.

Örnek:

CREATE TABLE [CUSTOMER]
(
CustomerId int IDENTITY(1,1) PRIMARY KEY,
CustomerNumber int NOT NULL UNIQUE CHECK(CustomerNumber>0),
LastName varchar(50) NOT NULL,
FirstName varchar(50) NOT NULL,
AreaCode int NULL,
Address varchar(50) NULL,
Phone varchar(50) NULL,
)
GO

Bu durumda, sıfırdan küçük bir Müşteri Numarası girmeye çalıştığımızda bir hata mesajı alırız.

DEFAULT

DEFAULT kısıtı, bir sütuna varsayılan bir değer eklemek için kullanılır.
Başka bir değer belirtilmemişse, varsayılan değer tüm yeni kayıtlara eklenecektir.

Örnek:

CREATE TABLE [CUSTOMER]
(
CustomerId int IDENTITY(1,1) PRIMARY KEY,
CustomerNumber int NOT NULL UNIQUE,
LastName varchar(50) NOT NULL,
FirstName varchar(50) NOT NULL,
Country varchar(20) DEFAULT 'Norway',
AreaCode int NULL,
Address varchar(50) NULL,
Phone varchar(50) NULL,
)
GO

AUTO INCREMENT/IDENTITY

Çoğu zaman, her yeni kayıt eklendiğinde birincil anahtar alanının değerinin otomatik olarak oluşturulmasını isteriz.

Örnek:

CREATE TABLE CUSTOMER
(
CustomerId int IDENTITY(1,1) PRIMARY KEY,
CustomerNumber int NOT NULL UNIQUE,
LastName varchar(50) NOT NULL,
FirstName varchar(50) NOT NULL,
AreaCode int NULL,
Address varchar(50) NULL,
Phone varchar(50) NULL,
)
GO

Yukarıda gösterildiği gibi, bunun için IDENTITY() kullanırız. IDENTITY(1,1) ilk değerin 1 olacağı anlamına gelir
ve sonra 1 ile artacaktır.

ALTER TABLE

ALTER TABLE deyimi, mevcut bir tabloya sütun eklemek, silmek veya değiştirmek için kullanılır.
Bir tabloya sütun eklemek için aşağıdaki sözdizimini kullanın:

ALTER TABLE table_name
ADD column_name datatype

Bir tablodaki bir sütunu silmek için aşağıdaki sözdizimini kullanın (bazı veri tabanı sistemlerinin bir sütunun silinmesine izin vermez):

ALTER TABLE table_name
DROP COLUMN column_name

Tablodaki bir sütunun veri türünü değiştirmek için aşağıdaki sözdizimini kullanın:

ALTER TABLE table_name
ALTER COLUMN column_name datatype

CREATE TABLE kullanırsak ve tablo zaten mevcutsa bir hata mesajı alırız, bu nedenle CREATE TABLE ve ALTER TABLE’ı birleştirirsek, aşağıda gösterilen örnekte olduğu gibi hata vermeyen sağlam veri tabanı komut dosyaları oluşturabiliriz:

if not exists (select * from dbo.sysobjects where id = object_id(N'[CUSTOMER]') and
OBJECTPROPERTY(id, N'IsUserTable') = 1)
CREATE TABLE CUSTOMER
(
CustomerId int PRIMARY KEY,
CustomerNumber int NOT NULL UNIQUE,
LastName varchar(50) NOT NULL,
FirstName varchar(50) NOT NULL,
AreaCode int NULL,
Address varchar(50) NULL,
Phone varchar(50) NULL,
)
GO
if exists(select * from dbo.syscolumns where id = object_id(N'[CUSTOMER]') and
OBJECTPROPERTY(id, N'IsUserTable') = 1 and name = 'CustomerId')
ALTER TABLE CUSTOMER ALTER COLUMN CustomerId int
Else
ALTER TABLE CUSTOMER ADD CustomerId int
GO
if exists(select * from dbo.syscolumns where id = object_id(N'[CUSTOMER]') and
OBJECTPROPERTY(id, N'IsUserTable') = 1 and name = 'CustomerNumber')
ALTER TABLE CUSTOMER ALTER COLUMN CustomerNumber int
30 CREATE TABLE
Structured Query Language (SQL)
Else
ALTER TABLE CUSTOMER ADD CustomerNumber int
GO
...

INSERT INTO

INSERT INTO deyimi bir tabloya yeni bir satır eklemek için kullanılır.
INSERT INTO deyimini iki biçimde yazmak mümkündür.
İlk formda verilerin ekleneceği sütun adları belirtilmez, sadece değerleri belirtilir:

INSERT INTO table_name
VALUES (value1, value2, value3,...)

Örnek:

INSERT INTO CUSTOMER VALUES ('1000', 'Serkan', 'Topkan', 12,
'İstanbul', '11111111')

İkinci form hem sütun adlarını hem de eklenecek değerleri belirtir:

INSERT INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,...)

Bu form tavsiye edilir!

Örnek:

INSERT INTO CUSTOMER (CustomerNumber, LastName, FirstName, AreaCode,
Address, Phone)
VALUES ('1000', 'Serkan', 'Topkan', 12, 'İstanbul', '11111111')

Yalnızca Belirtilen Sütunlara Veri Ekleyin:

Yalnızca belirli sütunlara veri eklemek de mümkündür.

Örnek:

INSERT INTO CUSTOMER (CustomerNumber, LastName, FirstName)
VALUES ('1000', 'Serkan', 'Topkan')

Not! En azından NULL olamayan tüm sütunları dahil etmeniz gerekir.

UPDATE

UPDATE deyimi, bir tablodaki mevcut kayıtları güncellemek için kullanılır.

Sözdizimi aşağıdaki gibidir:

UPDATE table_name
SET column1=value, column2=value2,...
WHERE some_column=some_value

Not! UPDATE sözdizimindeki WHERE cümlesine dikkat edin. WHERE cümlesi hangi kayıt veya kayıtların güncellenmesi gerektiğini belirtir.

WHERE cümlesini atlarsanız, tüm kayıtlar güncellenecektir!

Örnek:

update CUSTOMER set AreaCode=46 where CustomerId=2

DELETE

DELETE deyimi bir tablodaki satırları silmek için kullanılır.

Sözdizimi:

DELETE FROM table_name
WHERE some_column=some_valueÖrnek:

Not! DELETE sözdizimindeki WHERE cümlesine dikkat edin. WHERE cümlesi hangi kayıt ya da kayıtların silinmesi gerektiğini belirtir.
WHERE cümlesini atlarsanız, tüm kayıtlar silinecektir!

Örnek:

delete from CUSTOMER where CustomerId=2

Tüm Satırları Sil:
Bir tablodaki tüm satırları, tabloyu silmeden silmek mümkündür.
Bu, tablo yapısının, özniteliklerin ve dizinlerin bozulmayacağı anlamına gelir:

DELETE FROM table_name

Not! Bunu sadece gerçekten istediğinizde yaptığınızdan emin olun! Bu ifadeyi geri alamazsınız!

SELECT

SELECT deyimi muhtemelen en çok kullanılan SQL komutudur.

SELECT deyimi, veri tabanından satır almak için kullanılır ve veri tabanındaki bir veya daha fazla tablodan bir veya daha fazla satırın veya sütunun seçilmesini sağlar.

Örnek olarak CUSTOMER tablosunu kullanacağız.

Örnek:

select * from CUSTOMER

Bu basit örnek, CUSTOMER tablosundaki tüm verileri alır. Tablodaki tüm sütunları almak istediğinizde “*” sembolü kullanılır.

Yalnızca birkaç sütun istiyorsanız, almak istediğiniz sütunların adlarını belirtebilirsiniz, örneğin:

select CustomerId, LastName, FirstName from CUSTOMER

Yani en basit haliyle SELECT deyimini aşağıdaki gibi kullanabiliriz:

select <column_names> from <table_names>

Tüm sütunları istiyorsak, “*” sembolünü kullanırız
Not! SQL büyük/küçük harfe duyarlı değildir. SELECT, “select” ile aynıdır.

SELECT deyiminin tam sözdizimi karmaşıktır, ancak ana cümleler şu şekilde özetlenebilir:

SELECT
[ ALL | DISTINCT ]
[TOP ( expression ) [PERCENT] [ WITH TIES ] ]
select_list [ INTO new_table ]
[ FROM table_source ] [ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ HAVING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ]

Karmaşık görünüyor :) , ancak sonraki bölümlerde farklı bölümleri adım adım ele alacağım.

ORDER BY

Verilerin belirli bir sırada görünmesini istiyorsanız “order by” anahtar sözcüğünü kullanmanız gerekir.

Örnek:

select * from CUSTOMER order by LastName

Ayrıca birkaç sütuna göre de sıralayabilirsiniz, örneğin şu şekilde:

select * from CUSTOMER order by Address, LastName

“order by” anahtar sözcüğünü kullanırsanız, varsayılan sıra artan (“asc”) olur. Eğer isterseniz sırasının tersi, yani azalan olması için “desc” anahtar sözcüğünü kullanmanız gerekir.

Örnek:

select * from CUSTOMER order by LastName desc

SELECT DISTINCT

Bir tabloda, bazı sütunlar yinelenen değerler içerebilir. Bu bir sorun değildir, ancak bazen bir tablodaki yalnızca farklı (distinct) değerleri listelemek isteyebilirsiniz.

DISTINCT anahtar sözcüğü yalnızca farklı (farklı) değerleri döndürmek için kullanılabilir.

Sözdizimi aşağıdaki gibidir:

select distinct <column_names> from <table_names>

Örnek:

select distinct FirstName from CUSTOMER

WHERE

WHERE cümlesi, yalnızca belirli bir kriteri karşılayan kayıtları ayıklamak için kullanılır.

Sözdizimi aşağıdaki gibidir:

select <column_names>
from <table_name>
where <column_name> operator value

Örnek:

select * from CUSTOMER where CustomerNumber='1001'

Not! SQL, yukarıdaki örnekte gösterildiği gibi metin değerlerinin etrafında tek tırnak kullanır.

Operators

WHERE cümlesi ile aşağıdaki operatörler kullanılabilir:

= Eşit
<> Eşit değil
> Daha büyük
< Daha az
>= Büyük veya eşit
<= Daha az veya eşit
LIKE: Bir model arayın.
IN: Sütunlardan en az biri için döndürmek istediğiniz tam değeri biliyorsanız.

Örnek:

select * from CUSTOMER where AreaCode>30

LIKE

LIKE operatörü, bir sütunda belirtilen bir deseni aramak için kullanılır.

Örnek:

SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern

Örnek:

select * from CUSTOMER where LastName like 'T%'

Not! “%” işareti, kalıptan önce ve sonra joker karakterleri (kalıpta eksik harfler) tanımlamak için kullanılabilir.

Örnek:

select * from CUSTOMER where LastName like '%a%'

NOT anahtar sözcüğü ile de birleştirebilirsiniz, örneğin:

select * from CUSTOMER where LastName not like '%a%'

IN

IN operatörü bir WHERE cümlesinde birden fazla değer belirtmenize olanak tanır.
Sözdizimi:

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)

BETWEEN

BETWEEN işleci, iki değer arasında bir veri aralığı seçer. Değerler sayı, metin veya tarih olabilir.

Sözdizimi:

SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2

Wildcards

SQL joker karakterleri, bir veri tabanında veri ararken bir veya daha fazla karakterin yerine geçebilir.
Not! SQL joker karakterleri SQL LIKE operatörü ile birlikte kullanılmalıdır.

Örnekler:

SELECT * FROM CUSTOMER WHERE LastName LIKE 'S_rk_n'
SELECT * FROM CUSTOMER WHERE CustomerNumber LIKE '[10]%'

AND & OR

AND operatörü, hem birinci koşul hem de ikinci koşul doğruysa bir kayıt görüntüler.
OR operatörü, ilk koşul ya da ikinci koşul doğruysa bir kayıt görüntüler.

Örnekler:

select * from CUSTOMER where LastName='Topkan' and FirstName='Serkan'
select * from CUSTOMER where LastName='Topkan' or FirstName='Serkan'

Ayrıca AND ve OR öğelerini birleştirebilirsiniz (karmaşık ifadeler oluşturmak için parantez kullanın).

Örnek:

select * from CUSTOMER
where LastName='Topkan' and (FirstName='Serkan' or FirstName='Topkan')

SELECT TOP

TOP cümlesi, döndürülecek kayıt sayısını belirtmek için kullanılır. TOP cümlesi binlerce kayıt içeren büyük tablolarda çok yararlı olabilir.
Çok sayıda kayıt döndürmek performansı etkileyebilir.

Sözdizimi:

SELECT TOP number|percent column_name(s)
FROM table_name

Örnek:

select TOP 1 * from CUSTOMER

Yüzde olarak da belirtebilirsiniz:

select TOP 60 percent * from CUSTOMER

Bu, binlerce kayıt içeren büyük tablolar için çok kullanışlıdır.

Alias

Bir takma ad kullanarak bir tabloya veya sütuna başka bir ad verebilirsiniz. Çok uzun veya karmaşık tablo adlarınız veya sütun adlarınız varsa bunu yapmak iyi bir şey olabilir.
Takma ad herhangi bir şey olabilir, ancak genellikle kısadır.

Tablolar için SQL Takma Ad Sözdizimi:

SELECT column_name(s)
FROM table_name
AS alias_name

Sütunlar için SQL Takma Ad Sözdizimi:

SELECT column_name AS alias_name
FROM table_name

Joins

SQL birleştirmeleri, bu tablolardaki belirli sütunlar arasındaki bir ilişkiye dayalı olarak iki veya daha fazla tablodan veri sorgulamak için kullanılır.

SQL JOIN Türleri :

Örneklerle devam etmeden önce, kullanabileceğiniz JOIN türlerini ve aralarındaki farkları listeleyeceğim.

- JOIN: Her iki tabloda da en az bir eşleşme olduğunda satırları döndürür.
- LEFT JOIN: Sağ tabloda eşleşme olmasa bile sol tablodaki tüm satırları döndürür.
- RIGHT JOIN: Sol tabloda eşleşme olmasa bile sağ tablodaki tüm satırları döndürür.
- FULL JOIN: Tablolardan birinde bir eşleşme olduğunda satırları döndürür.

Örnek:

2 tablo veriliyor:

  • SCHOOL
  • CLASS

Bir sorgu kullanarak SchoolName ve ClassName bilgilerini almak istiyoruz:

Birden fazla tablodan bilgi almak için JOIN kullanmamız gerekir. JOIN, bir tablodaki birincil anahtar ile başka bir tablodaki yabancı anahtarı birleştirmek için kullanılır.

Uygulama:

select
SCHOOL.SchoolName,
CLASS.ClassName
from
SCHOOL
INNER JOIN CLASS ON SCHOOL.SchoolId = CLASS.SchoolId

https://serkantopkan.medium.com/sql-ile-veri-d%C3%BCnyas%C4%B1na-yolculuk-veritaban%C4%B1-y%C3%B6netiminin-temel-ad%C4%B1mlar%C4%B1-3-e8cc2879e574

--

--