Yapısal Sorgulama Dili olan SQL, ilişkisel veritabanlarındaki bilgileri sorgulamak için standart kullanımı olan bir dildir. Standart bir dil olmasına karşılık, çeşitli veritabanlarında SQL kullanımları arasında farklılıklar vardır. SQL komutları ile, tablolara yeni kayıt girme, varolan kayıtları sorgulama (arama ve listeleme), varolan bilgileri değiştirme ve varolan kayıtları silme işlemleri yapılabilir.

Üzerinde sql komutlarını uygulayacağımız, örnek olarak klinik ve hastalar tablosundan birkaç kayıt verilsin.Klinik tablosundaki alan isimleri ve örnek veriler;

klinik_id klinik_adi
——— ———–
1 dahiliye
2 kbb
3 göz
4 ortopedi

hastalar tablosundaki alan isimleri ve örnek veriler;

hasta_id hasta_no hasta_adi klinik_id
——– ——— ——— ———
1 100 ahmet 3
2 185 mustafa 2
3 210 ali 1
4 240 ayse 1
5 250 ahmet 3

Bu noktadan sonraki örnekleri yukarıdaki değerleri göz önünde tutarak inceleyiniz.

A-SQL FONKSİYONLARISQL’de kullanılan bazı fonksiyonlar vardır, bu fonksiyonlar ekrana sadece tek değer görüntülerler.

SUM([DISTINCT] alan_adi) Belirtilen alan için toplam fonksiyonu (sayısal alanlarda) COUNT(*) Toplam kayıt sayısı COUNT(DISTINCT alan_adi) Belirtilen alana göre farklı olan kayıtların sayısıMAX([DISTINCT] alan_adi) Belirtilen alanda en büyük değerMIN(DISTINCT] alan_adi) Belirtilen alanda en küçük değer AVG([DISTINCT] alan_adi) Belirtilen alanda ortalama değeri. DISTINCT parametresi ile belirtilen alanda bulunan bilgilerden aynı olanlarından sadece birinin seçilmesini sağlar.

SELECT COUNT(*) FROM hastalarSonucunda ekrana gelecek kayıt sayısı 5 dir.

SELECT DISTINCT klinik_id FROM hastalar

Tekrar eden kayıtlardan birer tane listelenir.

klinik_id
———
3
2
1

SELECT COUNT(DISTINCT klinik_id) FROM hastalar
Sql ifadesinde ekrana gelecek kayıt sayısı 3 olacaktır.

SELECT MAX(hasta_no) FROM hastalarEn büyük hasta numarası, ekrana 250 olarak görüntüler. En büyük değer kaç tane olursa olsun bir tanesi görüntülenir.

SELECT SUM(hasta_no) FROM hastalarhasta numaralarının toplamını ekrana verecektir.

B-SORGULAMA
SELECT hasta_no*10 FROM hastalar

hastalar tablosundaki tüm hastaların hasta numaralarının 10 ile çarpımını ekrana görüntüleyecektir. Burada hasta numaralarının 10 ile çarpımı sadece ekrana görüntülenecek tabloda ise değişmeyecektir.

SELECT * FROM hastalar

hastalar tablosundaki bütün alanların içeriklerini ekrana görüntüleyecektir.

SELECT * FROM hastalar WHERE hasta_adi=’ahmet’

Hasta adı ahmet olan kayıtları ekrana getirecektir.tablomuzda 2 tane ahmet adı olduğu için 2 kayıt ekrana gelecektir.

SELECT * FROM hastalar ORDER BY hasta_adi

Tabloyu Hasta adına göre A’dan Z’ye sıralar.

SELECT * FROM hastalar ORDER BY hasta_adi DESC

Tabloyu Hasta adına göre Z’den A’ya sıralar.

SELECT hasta_adi FROM hastalar WHERE hasta_adi IN (‘ali’,’ayse’)hastalar tablosunda hasta_adi alanında içinde ali ve ayşe olanları listeler.

SELECT * FROM hastalar WHERE hasta_no IS NULL

hasta_no alanı boş olan kayıtları listeler.

SELECT * FROM hastalar WHERE hasta_no IS NOT NULL

hasta_no alanı boş olmayan kayıtları listeler.

SELECT hasta_no,hasta_adi FROM hastalar WHERE hasta_adi LIKE ‘a%’Adı ‘a’ ile başlayan kayıtların hasta no ve adlarını listeler.

SELECT hasta_no,hasta_adi FROM hastalar WHERE hasta_adi LIKE ‘%me%’hasta_adi alanında içinde ‘me’ olan kayıtların hasta no ve adlarını listeler.

SELECT hasta_no,hasta_adi FROM hastalar WHERE hasta_adi LIKE ‘%a’Adı ‘a’ ile biten kayıtların hasta no ve adlarını listeler.

SELECT alan_adi FROM tablo1,tablo2 WHERE koşullarBirden fazla tablodan aynı anda bilgi getirilmesi gerektiğinde, ortak alanlar üzerinden birleştirme işlemleri yapılır. Birleştirme işlemi koşullar bölümünde yapılır, ortak olan alanlar eşleştirilir.

SELECT h.hasta_no,h.hasta_adi,k.klinik_adi FROM hastalar h,klinik k
WHERE h.klinik_id=k.klinik_id and k.klinik_id=’2’

Klinik id’si 2 olan hastanın no’sunu,adını ve klinik adını ekrana getirir, klinik tablosunda olan klinik_adi alanını da hastalar tablosundaki diğer alanlar gibi ekrana getirmek istiyorsak, bu klinik tablosu ile hastalar tablosunu ortak alan üzerinde birleştirmemiz gerekir. Burada ‘h’ hastalar tablosuna, ‘k’ klinik tablosuna verilmiş geçici isimlerdir. Bu geçici isimler sayesinde sql’i daha anlaşılır ve kısa yazmak mümkündür.

Aynı ifadeyi join birleştirme operatörü ile de yapabiliriz:
SELECT h.hasta_no,h.hasta_adi,k.klinik_adi FROM hastalar h join klinik k
on(h.klinik_id=k.klinik_id) WHERE k.klinik_id=’2’

SELECT hasta_adi,count(*) sayısı FROM hastalar GROUP BY hasta_adihasta adına göre grupladığımızda adı Ahmet olan 2 kaydın ve diğerlerinin birer tane olduğunu görürüz.Örnek kayıtlara göre aşağıdaki sonuç elde edilir.hasta_adi sayısı
——– —– ahmet 2 ali 1
ayse 1
Mustafa 1

DML(DATA MANIPULATION LANGUAGE-VERİ İŞLEME DİLİ)

-select (okuma)
-insert (kayıt girme)
-update (kayıt değiştirme)
-delete (kayıt silme)

select hasta_adi as adi from hastalar where hasta_id>’3’

hasta id’si 3’ten büyük olan hastaların adını ‘adı’ alias(takma ad) olarak ekrana getirir.

adi
——–
ayse
ahmet

select hasta_adi as adi from hastalar where hasta_id<’3’ and klinik_id=’3’

adi
——-
ahmet

select hasta_no as no from hastalar where hasta_adi like ‘m%’ or klinik_id=’1′

no
——
185
210
240

select h.hasta_no,h.hasta_adi ‘ in klinigi ‘ k.klinik_adi “hastanin klinigi”
from hastalar h join klinik k
on (h.klinik_id=k.klinik_id)

operatörü ile birleştirme işlemleri yapılabilir.

insert into hastalar (1,100,’ahmet’,3)

karakter tipli veriler tek tırnak içine alınır.

update hastalar set hasta_adi=’fatma’ where hasta_adi=’ayse’

hasta adı ayse olan kayıttaki hastanın adını fatma olarak değiştirir.

delete from hastalar where hasta_no=’100’

hasta numarası 100 olan hastanın kaydını(satırı) siler.

C-TABLO OLUŞTURMAK (CREATE TABLE …)

CREATE TABLE TABLO_ADI (ALAN_ADI1 VERİTİPİ,
ALAN_ADI2 VERİTİPİ CONSTRAINT CONST_ADI1 NOT NULL,
ALAN_ADI3 VERİTİPİ CONSTRAINT CONST_ADI2 NOT NULL,
ALAN_ADI3 VERİTİPİ CONSTRAINT CONST_ADI3 CHECK(ALAN_ADI3),
ALAN_ADI4 VERİTİPİ CONSTRAINT CONST_ADI4 NOT NULL,
ALAN_ADI5 VERİTİPİ CONSTRAINT CONST_ADI5 UNIQUE(ALAN_ADI5),
ALAN_ADI6 VERİTİPİ CONSTRAINT CONST_ADI6 NOT NULL,
CONSTRAINT CONST_ADI7 FOREIGN KEY(ALAN_ADI5) REFERENCES TABLO_ADI(ALAN_ADI5),
CONSTRAINT CONST_ADI8 PRIMARY KEY(ALAN_ADI1))

İlişkili bir tablonun genel şeması yukarıdaki gibidir.

CREATE TABLE hastalar (hasta_id NUMBER(4),
hasta_no NUMBER(4) CONSTRAINT const_nn_hasta_no NOT NULL,
hasta_adi VARCHAR2(15) CONSTRAINT const_nn_hasta_adi NOT NULL,
klinik_id NUMBER(4) CONSTRAINT const_nn_klinik_id NOT NULL,
CONSTRAINT const_uq_hasta_no UNIQUE(hasta_no),
CONSTRAINT const_fk_klinik_id FOREIGN KEY(klinik_id) REFERENCES klinik(klinik_id),
CONSTRAINT const_pk_hasta_id PRIMARY KEY(hasta_id));

yada

CREATE TABLE hastalar (hasta_id NUMBER(4),
hasta_no NUMBER(4),
hasta_adi VARCHAR2(15) NOT NULL,
klinik_id NUMBER(4),
CONSTRAINT const_uq_hasta_no UNIQUE(hasta_no),
CONSTRAINT const_fk_klinik_id FOREIGN KEY(klinik_id) REFERENCES klinik(klinik_id),
CONSTRAINT const_pk_hasta_id PRIMARY KEY(hasta_id));

hastalar tablosu ile klinik tablosunun ‘klinik_id’ alanları ortaktır,
bu yüzden öncelikle klinik tablosunu oluşturuyoruz,sonra da klinik tablosunu referans ederek hastalar tablosundaki klinik_id alanını foreign key(ikincil anahtar) yaparak hastalar tablosunu oluşturuyoruz.

CREATE TABLE klinik(klinik_id number(4),
klinik_adi varchar2(20) CONSTRAINT const_nn_klinik_adi NOT NULL,
CONSTRAINT const_pk_klinik_id PRIMARY KEY(klinik_id));

CREATE TABLE TABLO_ADI2 AS SELECT * FROM TABLO_ADI WHERE …

CREATE TABLE hastalar2 as select * from hastalar

‘hastalar’ tablosunu ‘hastalar2’ adında, tüm kayıtları ile birlikte bir kopyasını oluşturabiliriz.

CREATE TYPE bolum_tip AS OBJECT ( bolum_no NUMBER(4), Bolum_adi VARCHAR2(20) ); alan ve veritiplerini, type(tip) denilen yapılarda önceden oluşturarak sonradan oluşturacağımız tablolar için kolaylık sağlamış oluruz. CREATE TABLE bolum OF bolum_tip; ‘bolum’ tablosunu oluştururken alan ve veritipi tanımlaması yapmadan önceden hazırladığımız tip üzerinden tablomuzu oluşturabiliriz. D-TABLO YAPISINDA DEĞİŞİKLİK YAPMAK (ALTER TABLE …)

ALTER TABLE hastalarADD hasta_soyadi VARCHAR2(15)ADD fonksiyonu ile hastalar tablosuna hastanın soyadının girilebilmesi için, ‘hasta-soyadi’ adında bir alan eklenmiştir.

ALTER TABLE hastalarMODIFY hasta_soyadi VARCHAR2(25)

MODIFY fonksiyonu ile istediğimiz alan üzerinde değişiklik yapabiliriz,mesela alanın boyutunu genişletebiliriz.

ALTER TABLE hastalarDROP hasta_soyadihastalar tablosunda var olan ‘hasta_soyadi’ alanını DROP fonksiyonu ile silebiliriz.

ALTER TABLE hastalarRENAME TABLE hastalar1’hastalar’ tablosunun adını ‘hastalar1’ olarak RENAME TABLE fonksiyonu ile değiştirebiliriz.

DROP TABLE hastalar

Hastalar tablosunu tüm kayıtlarıyla birlikte siler.

E-KULLANICI OLUŞTURMAK (CREATE USER …)

CREATE USER USER_NAME IDENTIFIED BY PASSWORD ..

CREATE USER orhan IDENTIFIED BY o

Basitçe bir kullanıcı yukarıdaki gibi oluşturulur,default olarak ‘USERS01.DBF’ datafile’ını ve tablespace’ini kullanır.

Fakat kullanıcı kendi kullanacağı bir tablespace ve datafile için aşağıdaki şekilde oluşturulmalıdır;

CREATE USER orhan IDENTIFIED BY o DEFAULT TABLESPACE test TEMPORARY TABLESPACE temp;

Burada ‘test’ tablespace’i daha önceden(kullanıcı oluşturulmadan) oluşturulmuştur.

GRANT … TO USER (KULLANICIYA HAKLAR VERMEK)

grant connect to orhan

yeni oluşturulan ‘orhan’ kullanıcısına database’e bağlanma izni öncelikle verilmelidir.

Orhan kullanıcısı olarak bağlı iken;

grant select on hastalar to ahmet

orhan kullanıcısına ait ‘hastalar’ tablosunu okuma hakkını(select) ahmet kullanıcısına verebiliyoruz.

Daha sonra Ahmet kullanıcısı olarak bağlanıp ,

select * from orhan.hastalar

sorgusuyla hastalar tablosunu ahmet’in okuması sağlanır.

revoke select on hastalar from ahmet

ile de orhan kullanıcısı ahmet’e verdiği select(okuma) hakkını geri alabilir.
grant delete on hastalar to ahmet
grant update on hastalar to ahmet
grant insert on hastalar to ahmet

revoke delete on hastalar from ahmet
revoke update on hastalar from ahmet
revoke insert on hastalar from ahmet

grant select,update,delete,insert on hastalar to public

ie bu hakları bütün kullanıcılara verebiliriz.

grant sysdba to orhan

revoke sysdba from orhan

grant imp_full_database to ahmet

grant exp_full_database to ahmet

hakları ile database’i export ve import etme yetkisi verilebilir.

grant create table,alter any table,drop any table,create user,alter user,drop user,create role,drop any role,grant any role to Ahmet
SELECT * FROM SESSION_ROLES

Sorgusu İle kullanıcının sahip olduğu tüm rolleri görüntüleyebiliriz.
SELECT * FROM SESSION_PRIVS Sorgusu ile de kullanıcının sahip olduğu tüm yetkileri görebiliriz.

ALTER USER orhan IDENTIFIED BY ordba

Alter user kalıbı ile user’in şifresini değiştirebiliriz.
DROP USER orhan CASCADE Drop user kalıbını cascade deyimi ile kullandığımızda user’i tüm bağlantıları ile birlikte siler.

set line 100;
SELECT USERNAME, PROFILE, ACCOUNT_STATUS FROM DBA_USERS

kullanıcının sahip olduğu profile ve hesaplarını görüntüleyebiliriz.

———————————————-
2 türlü tablespace’i drop edebiliriz;
burada 1. yol diğerine göre daha hızlıdır.

1- yol:

drop user orhan cascade;
drop tablespace test;

2- yol:

drop tablespace test including contents;
drop user orhan;