İLİŞKİSEL BİR VERİTABANINDA İKİ BOYUTLU TABLO KÜMELERİ BULUNMAKTADIR.

VERİTABANINI OLUŞTURANLAR;
* TABLES ,
* COLUMNS,
* ROWS ,
* FIELDS,

VERİ TABANINDAKİ BİR TABLONUN GÖRÜNTÜSÜ
--------------------------------------------------------------------------------



COLUMNS--> EMPNO ENAME JOB MGR
----- ----- ---------- ---------
ROWS 7369 SMITH CLERK 7902
| 7499 ALLEN SALESMAN 7698
| 7521 WARD SALESMAN 7698
V 7566 JONES MANAGER 7839
7654 MARTIN SALESMAN 7698
7698 BLAKE MANAGER 7839
7782 CLARK MANAGER 7839
7788 SCOTT ANALYST 7566
7839 KING PRESIDENT
7844 TURNER SALESMAN 7698
7876 ADAMS CLERK 7788
7900 JAMES CLERK 7698
7902 FORD ANALYST 7566
7934 MILLER CLERK 7782 <--FIELD


SQL
--------------------------------------------------------------------------------

SQL ORACLE VERİTABANINA ERİŞİMDE KULLANILAN BİR SORGULAMA DİLİDİR.

SQL KOMUT SETİ:

SELECT EN SIK KULLANILAN SQL KOMUTUDUR. DATABASE DEN BİLGİ GETİRMEYİ SAĞLAR.

INSERT BU ÜÇ KOMUT TABLOLARA YENİ ROW LAR(SATIR-BİLGİLER) EKLEYİP,
UPDATE VAR OLAN ROW BİLGİLERİNİ DEĞİŞTİRME,
DELETE İSTENMEYEN ROW LARI TABLODAN SİLMEK İÇİN KULLANILIR.

CREATE BU ÜÇ KOMUT DATA YAPILARI OLUŞTURMAK, SİLMEK, DEĞİŞTİRMEK İÇİN
ALTER KULLANILIR.
DROP ÖRNEĞİN: TABLOLAR, VIEWLAR, INDEXLER GİBİ.

GRANT BU İKİ KOMUT DATABASE DEKİ BİLGİLERE ERİŞİM YETKİSİ VERMEK,
REVOKE YADA VERİLMİŞ YETKİLERİ GERİ ALMAK İÇİN KULLANILIR.


SQL KOMUTU YAZMA:

- SQL KOMUTLARI BİR YADA BİRDEN FAZLA SATIRDAN OLUŞMAKTADIR.
- TABLOLAR KULLANILIR.
- KOMUT KELİMELERİ BAŞKA SATIRLARA PARÇALANAMAZ.
- SQL KOMUTLARI AYNI ANDA HEM BÜYÜK HEMDE KÜÇÜK HARF KULLANILARAK YAZILAMAZ.
- BİR SQL KOMUTU SQL PROMPT DA YAZILMAYA BAŞLANIR, VE DİĞER ALT SATIRLARA
GEÇİLDİKCE NUMARA ALIR. BU SQL BUFFER OLARAK TANIMLANIR.
- SQL CÜMLESİ TAMAMLANINCA SONUNA ';' İŞARETİ KONUR.
SQL>SELECT * FROM EMP;
- SQL CÜMLESİ TAMAMLANINCA BİR ALTTAKİ BOŞ SATIRA / İŞARETİ KONUR.
SQL> SELECT * FROM EMP
2 /
- SON SORGU BUFFERDAN ÇALIŞTIRMAK İSTENİRSE SQL PROMPT DA
SQL>/ KONUR
- SON SORGU BUFFERDAN ÇALIŞTIRMAK İSTENİRSE SQL PROMPT DA
SQL>R[UN] KONUR.


EN BASİT SELECT YAPISI.

SELECT * FROM TABLO_ADI

* SORGU YAPACAĞINIZ TABLODAKİ BÜTÜN KOLONLARI TEMSİL EDER.

SQL> SELECT * FROM EMP;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
--------- ---------- --------- --------- --------- --------- --------- ---------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 09-DEC-82 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30




SQL> SELECT DEPTNO,ENAME,MGR FROM EMP;

DEPTNO ENAME MGR
--------- ---------- ---------
20 SMITH 7902
30 ALLEN 7698
30 WARD 7698
20 JONES 7839
30 MARTIN 7698
30 BLAKE 7839
10 CLARK 7839
20 SCOTT 7566
10 KING
30 TURNER 7698
20 ADAMS 7788
30 JAMES 7698
20 FORD 7566
10 MILLER 7782


ARİTMETİK DEĞERLER:

+, *, -, /

select ename,sal+250*12 from emp;

ENAME SAL+250*12
---------- ----------
SMITH 3800
ALLEN 4600
WARD 4250
JONES 5975
MARTIN 4250
BLAKE 5850
CLARK 5450
SCOTT 6000
KING 8000
TURNER 4500
ADAMS 4100
JAMES 3950
FORD 6000
MILLER 4300

select ename,(sal+250)*12 from emp;

ENAME (SAL+250)*12
---------- ------------
SMITH 12600
ALLEN 22200
WARD 18000
JONES 38700
MARTIN 18000
BLAKE 37200
CLARK 32400
SCOTT 39000
KING 63000
TURNER 21000
ADAMS 16200
JAMES 14400
FORD 39000
MILLER 18600



ALIES :
select ename,(sal+250)*12 ücret from emp
ENAME ÜCRET
---------- ---------
SMITH 12600

CONCATENATION OPERATOR (BİRLEŞTİRME);

select empno||ename employee from emp

EMPLOYEE
--------------
7369SMITH
7499ALLEN
7521WARD
7566JONES
7654MARTIN
7698BLAKE


select empno||'-'||ename employee,'WORKS IN DEPARTMENT',deptno from emp

EMPLOYEE 'WORKSINDEPARTMENT' DEPTNO
--------------------- ------------------- ---------
7369-SMITH WORKS IN DEPARTMENT 20
7499-ALLEN WORKS IN DEPARTMENT 30
7521-WARD WORKS IN DEPARTMENT 30
7566-JONES WORKS IN DEPARTMENT 20

select ename,sal*12+comm annual_sal from emp

ENAME ANNUAL_SAL
---------- ----------
SMITH
ALLEN 19500
WARD 15500
JONES
MARTIN 16400
BLAKE
CLARK

select ename,sal*12+nvl(comm,0) annual_sal from emp

ENAME ANNUAL_SAL
---------- ----------
SMITH 9600
ALLEN 19500
WARD 15500
JONES 35700
MARTIN 16400
BLAKE 34200
CLARK 29400












DISTINCT CÜMLESİ:

DISTINCT TANIMLANAN KOLONLARDAN GELEN BİLGİLER ARASINDA BİRDEN FAZLA AYNI KAYIT VARSA ONLARI TEKE İNDİRİR.

SELECT DEPTNO FROM EMP;

DEPTNO
---------
20
30
30
20
30
30
10

SELECT DISTINCT DEPTNO FROM EMP;

DEPTNO
---------
10
20
30

SELECT DISTINCT DEPTNO,JOB FROM EMP;

DEPTNO JOB
--------- ---------
10 CLERK
10 MANAGER
10 PRESIDENT
20 ANALYST
20 CLERK
20 MANAGER
30 CLERK
30 MANAGER
30 SALESMAN


ORDER BY CÜMLESİ:
SORGU SONUCU GELEN BİLGİLERİ,ORDER BY CÜMLESİNDEN SONRA BELİRTİLEN KOLONLARDAKİ BİLGİLERE GÖRE SIRALAR.DEFAULT OLARAK KÜÇÜKTEN BÜYÜĞE DOĞRU SIRALAMA YAPAR.
ORDER BY KOLON1,KOLON2 ASC
ASC (ASCENDING) BELİRTİLİRSE BÜYÜKTEN KÜÇÜĞE DOĞRU SIRALAR.

SELECT ENAME,JOB,SAL*12,DEPTNO FROM EMP ORDER BY ENAME;

ENAME JOB SAL*12 DEPTNO
---------- --------- --------- ---------
ADAMS CLERK 13200 20
ALLEN SALESMAN 19200 30
BLAKE MANAGER 34200 30
CLARK MANAGER 29400 10
FORD ANALYST 36000 20
JAMES CLERK 11400 30
JONES MANAGER 35700 20
KING PRESIDENT 60000 10
MARTIN SALESMAN 15000 30
MILLER CLERK 15600 10



SELECT ENAME,JOB,HIREDATE FROM EMP ORDER BY HIREDATE DESC;

ENAME JOB HIREDATE
---------- --------- ---------
ADAMS CLERK 12-JAN-83
SCOTT ANALYST 09-DEC-82
MILLER CLERK 23-JAN-82
JAMES CLERK 03-DEC-81
FORD ANALYST 03-DEC-81
KING PRESIDENT 17-NOV-81
MARTIN SALESMAN 28-SEP-81
TURNER SALESMAN 08-SEP-81
CLARK MANAGER 09-JUN-81


SELECT DEPTNO,ENAME,JOB,SAL FROM EMP ORDER BY DEPTNO,SAL DESC;

DEPTNO ENAME JOB SAL
--------- ---------- --------- ---------
10 KING PRESIDENT 5000
10 CLARK MANAGER 2450
10 MILLER CLERK 1300
20 SCOTT ANALYST 3000
20 FORD ANALYST 3000
20 JONES MANAGER 2975
20 ADAMS CLERK 1100
20 SMITH CLERK 800
30 BLAKE MANAGER 2850
30 ALLEN SALESMAN 1600

SAL DEĞERİ NULL OLANLAR ASC SORGUDA EN ALTTA ÇIKAR.
SAL DEĞERİ DESC OLANLAR EN BAŞTA GÖRÜNÜR.

WHERE CÜMLESİ:

TABLOLARDAN İSTEDİĞİMİZ BİLGİLERİ GETİRTMEK İÇİN GEREKLİ OLAN SORGULAMA KOŞULLARI, TABLOLAR ARASI İLİŞKİLER BURADA TANIMLANIYOR.

BURADA KULLANILAN OPERATÖRLER;

=, >, >= ,< , <=

SELECT ENAME,EMPNO,JOB,DEPTNO FROM EMP WHERE JOB='CLERK';

ENAME EMPNO JOB DEPTNO
---------- --------- --------- ---------
SMITH 7369 CLERK 20
ADAMS 7876 CLERK 20
JAMES 7900 CLERK 30
MILLER 7934 CLERK 10

SELECT DNAME,DEPTNO FROM DEPT WHERE DEPTNO>20;

DNAME DEPTNO
-------------- ---------
SALES 30
OPERATIONS 40

SELECT ENAME,SAL,COMM FROM EMP WHERE COMM>SAL;

ENAME SAL COMM
---------- --------- ---------
MARTIN 1250 1400


DİĞER:
SELECT ENAME,SAL,COMM FROM EMP WHERE NVL(COMM,0) SELECT ENAME,SAL,COMM FROM EMP WHERE COMM



WHERE CÜMLESİNDE KULLANILAN DİĞER OPERATÖRLER;


BETWEEN ..AND ...

IN

LIKE

IS NULL


BETWEEN :
BETWEEN x AND y

X İLE Y ARALIĞINDAKİ DEĞERLER ALINIR

SELECT ENAME,SAL FROM EMP WHERE SAL BETWEEN 1000 AND 2000;

ENAME SAL
---------- ---------
ALLEN 1600
WARD 1250
MARTIN 1250
TURNER 1500
ADAMS 1100
MILLER 1300

DİĞER:
SELECT * FROM EMP WHERE HIREDATE BETWEEN '01-DEC-1982' AND '01-OCT-2004'

IN :
IN (list)

PARANTEZ ARALIĞINDAKİ DEĞERLERDEN HERHANGİ BİRİNE YADA BİRDEN FAZLA DEĞERE EŞİT
OLANLARI ALIR.

SELECT EMPNO,ENAME,SAL,MGR FROM EMP WHERE MGR IN (7902,7566,7788);

EMPNO ENAME SAL MGR
--------- ---------- --------- ---------
7369 SMITH 800 7902
7788 SCOTT 3000 7566
7876 ADAMS 1100 7788
7902 FORD 3000 7566
DİĞER:
SELECT EMPNO,ENAME,SAL,MGR,COMM FROM EMP WHERE COMM IN (0,500);
SELECT EMPNO,ENAME,SAL,MGR,COMM FROM EMP WHERE NVL(COMM,0) IN (0,500);

LIKE :

SELECT ENAME FROM EMP WHERE ENAME LIKE 'S%';

ENAME
----------
SMITH
SCOTT
DİĞER:
SELECT ENAME FROM EMP WHERE ENAME LIKE '%S%'
SELECT ENAME FROM EMP WHERE ENAME LIKE 'S%'

SELECT ENAME FROM EMP WHERE ENAME LIKE '____';

ENAME
------
WARD
KING
FORD

IS NULL:

KULLANILDIĞI KOLON İÇİNDEKİ NULL DEĞER İÇEREN ALANLARI GETİRİR.

SELECT ENAME,MGR FROM EMP WHERE MGR IS NULL;

ENAME MGR
---------- ---------
KING

OLUMSUZLUK OPERATÖRLERİ:
!=
<>
NOT BETWEEN
NOT IN
NOT LIKE
IS NOT NULL


SELECT ENAME,SAL FROM EMP WHERE SAL NOT BETWEEN 1000 AND 2000;

ENAME SAL
---------- ---------
SMITH 800
JONES 2975
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
JAMES 950
FORD 3000


SELECT ENAME,JOB FROM EMP WHERE JOB NOT LIKE 'M%';

ENAME JOB
---------- ---------
SMITH CLERK
ALLEN SALESMAN
WARD SALESMAN
MARTIN SALESMAN
SCOTT ANALYST
KING PRESIDENT
TURNER SALESMAN
ADAMS CLERK
JAMES CLERK
FORD ANALYST
MILLER CLERK




SELECT ENAME,MGR FROM EMP WHERE MGR IS NOT NULL;

ENAME MGR
---------- ---------
SMITH 7902
ALLEN 7698
WARD 7698
JONES 7839
MARTIN 7698
BLAKE 7839
CLARK 7839
SCOTT 7566
TURNER 7698
ADAMS 7788
JAMES 7698
FORD 7566
MILLER 7782

--------------------------------------------------------------------------------
NOT:
MGR=NULL YANLIŞ SONUÇ VERİR.
= KULLANILARAK SORGU YAPILACAKSA AŞAĞIDAKİ ÖRNEKTEKİ GİBİ NVL KOMUTU KULLANILMALIDIR.

SELECT ENAME,MGR FROM EMP WHERE NVL(MGR,0)=0;

ENAME MGR
---------- ---------
KING





AND � OR:

AŞAĞIDAKİ ÖRNEKDE AND KULLANILARAK SAL DEĞERİ 1000 İLE 2000 ARASINDA OLAN VE
GÖREVİ 'CLERK' OLANLARIN BİLGİLERİ İSTENMİŞTİR.

SELECT EMPNO,ENAME,JOB,SAL FROM EMP WHERE SAL BETWEEN 1000 AND 2000 AND JOB='CLERK';

EMPNO ENAME JOB SAL
--------- ---------- --------- ---------
7876 ADAMS CLERK 1100
7934 MILLER CLERK 1300
OR

AŞAĞIDAKİ ÖRNEKDE OR KULLANILARAK SAL DEĞERİ 1000 İLE 2000 ARASINDA OLANLAR YADA
GÖREVİ 'CLERK' OLANLARIN HEPSİNİN DÖKÜMÜ İSTENMİŞTİR.

SELECT EMPNO,ENAME,JOB,SAL FROM EMP WHERE SAL BETWEEN 1000 AND 2000 OR JOB='CLERK';

EMPNO ENAME JOB SAL
--------- ---------- --------- ---------
7369 SMITH CLERK 800
7499 ALLEN SALESMAN 1600
7521 WARD SALESMAN 1250
7654 MARTIN SALESMAN 1250
7844 TURNER SALESMAN 1500
7876 ADAMS CLERK 1100
7900 JAMES CLERK 950
7934 MILLER CLERK 1300
SELECT EMPNO,ENAME,SAL,DEPTNO,JOB FROM EMP
WHERE SAL>1500
AND JOB='MANAGER'
OR JOB='SALESMAN';

EMPNO ENAME SAL DEPTNO
--------- ---------- --------- ---------
7499 ALLEN 1600 30
7521 WARD 1250 30
7566 JONES 2975 20
7654 MARTIN 1250 30
7698 BLAKE 2850 30
7782 CLARK 2450 10
7844 TURNER 1500 30

YUKARIDAKİ ÖRNEKDE; AND İŞLEMİNİN OR İŞLEMİNE GÖRE ÖNCELİĞİ VARDIR. BU YÜZDEN ÖNCE SALARIES 1500 DEN BÜYÜK OLAN VE MANAGER OLANLAR DÖKÜLÜR.
DAHA SONRA BÜTÜN SALESMAN LAR ÜCRETİNE BAKILMAKSIZIN DÖKÜLÜR. YANİ
WHERE (SAL>1500 AND JOB='MANAGER') OR JOB='SALESMAN' GİBİ ÇALIŞIR.
PARANTEZ İÇLERİ SORGULARDA HEP ÖNCE ÇALIŞIRLAR.


SELECT EMPNO,ENAME,SAL,DEPTNO,JOB FROM EMP
WHERE SAL>1500
AND (JOB='MANAGER' OR JOB='SALESMAN');

EMPNO ENAME SAL DEPTNO
--------- ---------- --------- ---------
7499 ALLEN 1600 30
7566 JONES 2975 20
7698 BLAKE 2850 30
7782 CLARK 2450 10

BURA ÖRNEKDE DE GÖREVİ MANAGER YADA SALESMAN OLANLARDAN ÜCRETİ 1500 DEN BÜYÜK OLANLAR DÖKÜLÜYOR.
AŞAĞIDAKİ ÖRNEKTE DE GÖRÜLDÜĞÜ GİBİ, OR DAN SONRA PARANTEZ KONMADAN AND KULLANILIYORSA AŞAĞIDAKİ GİBİ ÇALIŞIYOR.

SELECT EMPNO,ENAME,SAL,DEPTNO,JOB FROM EMP
WHERE SAL>1200 AND JOB='SALESMAN'
OR JOB='MANAGER' AND EMPNO=7566
İLE
SELECT EMPNO,ENAME,SAL,DEPTNO,JOB FROM EMP
WHERE SAL>1200 AND JOB='SALESMAN'
OR (JOB='MANAGER' AND EMPNO=7566)

İKİSİ AYNIDIR.

EMPNO ENAME SAL DEPTNO JOB
--------- ---------- --------- --------- ---------
7499 ALLEN 1600 30 SALESMAN
7521 WARD 1250 30 SALESMAN
7566 JONES 2975 20 MANAGER
7654 MARTIN 1250 30 SALESMAN
7844 TURNER 1500 30 SALESMAN

BURADA PARANTEZİN HERZAMAN ÖNCELİĞİ OLDUĞU İÇİN ÖNCE PARANTEZ İÇİ KONTROL EDİLİR
BAŞINDA OR OLDUĞU İÇİN BU KOŞULU SAĞLAYANLAR BASILIYOR VE JOB SALESMAN VE UCRETİ 1200 DOLARDAN BÜYÜK OLANLAR DA BASILIR.





KARAKTER ALAN TANIMLAMA:

VARCHAR2
CHAR

VARCHAR2 İLE ALAN TANIMLANDIĞINDA İÇİNE BİLGİ GİRİLİRKEN GERİ KALAN ALANLARA BOŞLUK ATMAZ.

CHAR İLE ALAN TANIMLANDIĞINDA İÇİNE BİLGİ GİRİLİRKEN GERİ KALAN ALANLARA BOŞLUK ATAR.BÖYLECE BÜTÜN KAYITLARIN ALAN UZUNLUKLARINI EŞİTLER.

DİĞER:
CREATE TABLE X1 (A CHAR(10),B VARCHAR2(10))
INSERT INTO X1 VALUES ('CCC','CCC');
SELECT LENGTH(A),LENGTH(B) FROM X1;
TEXTIOCHAR FORMUNU TEST EDELİM.

SQL/PLUS DA SORGU CÜMLESİNİ GÖRÜNTÜLETME VE DEĞİŞTİRME:

LIST L SON SORGUYU GÖRÜNTÜLER.
LIST L n SORGUNUN KAÇINCI SATIRINI GÖRÜNTÜLETMEK İSTİYORSANIZ n E DEĞER ATIYORSUNUZ.
LIST L m n BELİRTİLEN İKİ SATIR ARALIĞINDA DEĞER GÖRÜNTÜLEME.
APPEND A TEXT EN SON YAPTIĞINIZ SORGUYA BİR ŞEY EKLEMEK İSTENDİĞİNDE.
CHANGE C/OLD/NEW/ SORGUDAKİ BİR YERİ DEĞİŞTİRMEK İÇİN.
CLEAR BUFFER CL BUFF SQL İN BUFFER DAKİ BÜTÜN SORGUYU SİLER.
DEL ÇAĞIRDIĞINIZ EN SON SATIRI SİLER.
DEL n BELİRTİLEN SATIRI SİLER.
INPUT I SONSUZ SATIR İLAVE ETME.
INPUT TEXT I TEXT İLGİLİ SATIRI İLAVE ETME.
RUN R YADA / SON SORGUYU ÇALIŞTIRMA.


SORGU SAKLAMA:

SAVE dosyaadi
GET dosyaadi
START dosyaadi
ED dosyaadi
EXIT sqlplus dan çıkış.


& KOMUTU:

SORGU HER ÇALIŞTIRILIŞINDA DEĞER SORAR.

SELECT ENAME,DEPTNO,SAL*12 FROM EMP WHERE JOB=&JOB_NE

JOB ALANI KARAKTER OLDUĞU İÇİN EKRANDA JOB BİLGİSİ GİRİLİRKEN ' ' ARASINDA GİRİLMELİDİR.YADA

SELECT ENAME,DEPTNO,SAL*12 FROM EMP WHERE JOB='&JOB_NE'

Enter value for job_ne: CLERK
old 1: SELECT ENAME,DEPTNO,SAL*12 FROM EMP WHERE JOB='&JOB_NE'
new 1: SELECT ENAME,DEPTNO,SAL*12 FROM EMP WHERE JOB='CLERK'

ENAME DEPTNO SAL*12
---------- --------- ---------
SMITH 20 9600
ADAMS 20 13200
JAMES 30 11400
MILLER 10 15600
TIRNAK SORGUDA KONULABİLİR.
&& KOMUTU:

İLK GİRİLEN DEĞERİ SAKLAR. SORGU TEKRAR ÇALIŞTIRILINCA BİRDAHA HİÇ YENİ DEĞER SORMAZ.

SELECT ENAME,DEPTNO,&ISLEM FROM EMP WHERE JOB='&&JOB_NE'

UNDEFINE KOMUTU :

UNDEFINE JOB_NE

İLE İÇİNDEKİ DEĞER SİLİNİP TEKRAR SORMASI SAĞLANIR.

YADA

DEFINE KOMUTU :

İLE YENİ DEĞER ATANIR.

DEFINE JOB_NE='SALESMAN'

ÖRNEK:
SELECT ENAME,DEPTNO,&ISLEM FROM EMP WHERE JOB='&JOB_NE';

Enter value for islem: SAL*12
old 1: SELECT ENAME,DEPTNO,&ISLEM FROM EMP WHERE JOB='&JOB_NE'
new 1: SELECT ENAME,DEPTNO,SAL*12 FROM EMP WHERE JOB='SALESMAN'

ENAME DEPTNO SAL*12
---------- --------- ---------
ALLEN 30 19200
WARD 30 15000
MARTIN 30 15000
TURNER 30 18000

SQL> /
Enter value for islem: SAL*12+NVL(COMM,0)
old 1: SELECT ENAME,DEPTNO,&ISLEM FROM EMP WHERE JOB='&JOB_NE'
new 1: SELECT ENAME,DEPTNO,SAL*12+NVL(COMM,0) FROM EMP WHERE JOB='SALESMAN'

ENAME DEPTNO SAL*12+NVL(COMM,0)
---------- --------- ------------------
ALLEN 30 19500
WARD 30 15500
MARTIN 30 16400
TURNER 30 18000

SORGUYU SAKLAYIP DEĞER VEREREK ÇALIŞTIRMA:

SELECT ENAME,DEPTNO,&1 FROM EMP WHERE JOB='&2'

SAVE DENEME2 DOSYA SAKLANIR

START DENEME2 SAL*12 MANAGER
DOSYA ADINDAN ONRA 1 VE 2 LERİN DEĞERLERİ SIRASIYLA YAZILIR.

UNDEFINE 1 2
BU DEĞERLER HAFIZADA SAKLI KALDIĞINDAN UNDEFINE KOMUTU İLE SIRASI İLE 1 2 YAZILIR VE SİLİNİR.
YADA

DEFINE 1=SAL/12
DEFINE 2=SALESMAN İLE YENİ DEĞERLER ATANIR.
FONKSİYONLAR:

KARAKTER FONKSİYONLARI:

LOWER:
LOWER(COL/VALUE) KULLANILDIĞI ALANDAKİ BİLGİLERİ KÜÇÜK HARFLERE DÖNÜŞTÜRÜR.

SELECT LOWER(ENAME),LOWER('SQL COURSE') FROM EMP;

LOWER(ENAM LOWER('SQL
---------- ----------
smith sql course
allen sql course
ward sql course
jones sql course
martin sql course
blake sql course
clark sql course

UPPER:
UPPER(COL/VALUE) KULLANILDIĞI ALANDAKİ BİLGİLERİ BÜYÜK HARFLERE DÖNÜŞTÜRÜR.

SELECT ENAME FROM EMP WHERE ENAME=UPPER('&ENAME');

SQL> SELECT ENAME FROM EMP WHERE ENAME=UPPER('&ENAME');
Enter value for ename: clark

ENAME
----------
CLARK



INITCAP:
İLK HARLERİ BÜYÜK DİĞERLERİNİ KÜÇÜK HARFE DÖNÜŞTÜRÜR.

SELECT INITCAP(DNAME),INITCAP(LOC) FROM DEPT;

INITCAP(DNAME) INITCAP(LOC)
-------------- -------------
Accounting New York
Research Dallas
Sales Chicago
Operations Boston


CONCAT :
İKİ SÜTUNU BİRLEŞTİRME KOMUTUDUR.

SELECT CONCAT(ENAME,JOB) JOB FROM EMP WHERE EMPNO=7900;

JOB
-------------------
JAMESCLERK


||:
BU FONKSİYON İLE BİRDEN FAZLA BİRLEŞTİRME YAPILABİLİR.

SELECT ENAME||JOB||SAL*12 JOB FROM EMP WHERE EMPNO=7900;

JOB
---------------------
JAMESCLERK11400
LPAD ve RPAD KOMUTLARI:
LPAD(col/value,n,'string')

KOLON YADA VALUE DAN GELEN BİLGİ KAÇ KARAKTER UZUNLUĞUNDAYSA ONU N KARAKTERE KADAR STRING DE BELİRTİLEN DEĞER İLE SOLDAN TAMAMLAR.
STRING BELİRTİLMEZSE SOLDAN BAŞLAYARAK BOŞLUK BASAR.

SELECT LPAD(ENAME,20,'*'),LPAD(ENAME,20),LPAD(ENAME,20,'. ') FROM EMP;

LPAD(ENAME,20,'*') LPAD(ENAME,20) LPAD(ENAME,20,'.')
-------------------- -------------------- --------------------
***************SMITH SMITH ...............SMITH
***************ALLEN ALLEN ...............ALLEN
****************WARD WARD ................WARD
***************JONES JONES ...............JONES
**************MARTIN MARTIN ..............MARTIN
***************BLAKE BLAKE ...............BLAKE
***************CLARK CLARK ...............CLARK

RPAD(col/value,n,'string')
KOLON YADA VALUE DAN GELEN BİLGİ KAÇ KARAKTER UZUNLUĞUNDAYSA ONU N KARAKTERE KADAR STRING DE BELİRTİLEN DEĞER İLE SAĞDAN TAMAMLAR.
STRING BELİRTİLMEZSE SAĞDAN BAŞLAYARAK BOŞLUK BASAR.

SELECT RPAD(ENAME,20,'*'),RPAD(ENAME,20),RPAD(ENAME,20,'. ') FROM EMP;

RPAD(ENAME,20,'*') RPAD(ENAME,20) RPAD(ENAME,20,'.')
-------------------- -------------------- --------------------
SMITH*************** SMITH SMITH...............
ALLEN*************** ALLEN ALLEN...............
WARD**************** WARD WARD................
JONES*************** JONES JONES...............
MARTIN************** MARTIN MARTIN..............
BLAKE*************** BLAKE BLAKE...............


SUBSTR:
SUBSTR(col/value,n,m)

İLGİLİ SÜTUN YADA DEĞERİN n İNCİ KARAKTERİNDEN BAŞLAYARAK m TANE KARAKTER KADAR OLAN ALANI BASAR.

SELECT ENAME,SUBSTR(ENAME,3,5),SUBSTR('ORACLE',2,4) FROM EMP;

SUBST SUBS
----- ----
ITH RACL
LEN RACL
RD RACL
NES RACL

LTRIM:
LTRIM(col/value,'char/string')

SOLDAN BAŞLAYARAK BELİRTİLEN HARFLERİ KESER.

SELECT ENAME,LTRIM(ENAME,'S'),LTRIM(ENAME,'SC') FROM EMP WHERE ENAME LIKE 'S%';


LTRIM(ENAM LTRIM(ENAM
---------- ----------
MITH MITH
COTT OTT

SELECT LTRIM(ENAME,'S'),LTRIM(ENAME,'CS') FROM EMP WHERE ENAME LIKE 'S%';

LTRIM(ENAM LTRIM(ENAM
---------- ----------
MITH MITH
COTT OTT

AYNI SONUCU VERİRLER. ÖNEMLİ OLAN SC YADA CS NİN YANYANA OLMALARIDIR.

UPDATE EMP SET ENAME=LTRIM(ENAME)

KAYIT BAŞINDAKİ GEREKSİZ BOŞLUKLARI ATMANIZI SAĞLAR.

DİĞER:
INSERT INTO EMP (EMPNO,ENAME) VALUES (3333,' LALE');
DELETE FROM EMP WHERE EMPNO=3333;

RTRIM:
RTRIM(col/value,'char/string')

SAĞDAN BAŞLAYARAK BELİRTİLEN HARFLERİ KESER.

SELECT RTRIM(ENAME),RTRIM(ENAME,'H'),RTRIM(ENAME,'TH') FROM EMP
WHERE ENAME LIKE 'S%'

SELECT RTRIM(ENAME),RTRIM(ENAME,'H'),RTRIM(ENAME,'HT') FROM EMP
WHERE ENAME LIKE 'S%'

AYNI SONUCU VERİRLER. ÖNEMLİ OLAN SC YADA CS NİN YANYANA OLMALARIDIR.

RTRIM(ENAME) KAYIT SONUNDA BOŞLUK VARSA ONLARI KESER.

UPDATE EMP SET ENAME=RTRIM(ENAME)
KAYIT SONUNDAKİ GEREKSİZ BOŞLUKLARI ATMANIZI SAĞLAR.

LENGTH:
ALAN UZUNLUĞUNU VERİR.

SELECT LENGTH('ORACLE'),ENAME,LENGTH(ENAME) FROM EMP

LLENGTH('ORACLE') ENAME LENGTH(ENAME)
---------------- ---------- -------------
6 SMITH 5
6 ALLEN 5
6 WARD 4
6 JONES 5

TRANSLATE:
TRANSLATE(col/value,from,to)

BELİRTİLEN BİR YADA BİRDEN FAZLA HARFİ BULDUĞU ZAMAN BELİRTİLEN KARAKTER İLE DEĞİŞTİRİR.

SELECT ENAME,TRANSLATE(ENAME,'C','P'),JOB,TRANSLATE(JOB,' AR','IT') FROM EMP;

JOB ALANINDA GEÇEN BÜTÜN A LAR I OLUR, R LER T İLE YER DEĞİŞİR.

ENAME TRANSLATE( JOB TRANSLATE
---------- ---------- --------- ---------
SMITH SMITH CLERK CLETK
ALLEN ALLEN SALESMAN SILESMIN
WARD WARD SALESMAN SILESMIN
JONES JONES MANAGER MINIGET
MARTIN MARTIN SALESMAN SILESMIN
SELECT ENAME,TRANSLATE(ENAME,'C','P'),JOB,TRANSLATE(JOB,' AR','T') FROM EMP;

BÜTÜN A LAT T OLUR , R YE KARŞILIK BİR KARAKTER BELİRTİLMEDİĞİ İÇİN BU HARFİ SİLER.
ENAME TRANSLATE( JOB TRANSLATE
---------- ---------- --------- ---------
SMITH SMITH CLERK CLEK
ALLEN ALLEN SALESMAN STLESMTN
WARD WARD SALESMAN STLESMTN
JONES JONES MANAGER MTNTGE
MARTIN MARTIN SALESMAN STLESMTN
BLAKE BLAKE MANAGER MTNTGE


REPLACE:
REPLACE(col/value,from,to)

BELİRTİLEN DEĞERİN TÜMÜ YENİ VERİLEN DEĞER İLE YER DEĞİŞİR.

SELECT JOB,SUBSTR(REPLACE(JOB,'SALESMAN','SALESPERSON'),1 ,12) X,ENAME,
SUBSTR(REPLACE(ENAME,'CO','PXX'),1,12) X1 FROM EMP;

SALESMAN GEÇEN YERLER SALESPERSON OLARAK DEĞİŞTİRİLİR.
CO GEÇEN YERLER PXX OLARAK DEĞİŞİR. TEK BAŞINA C YADA O VARSA BUNLAR DEĞİŞMEZ.

JOB X ENAME X1
--------- ------------ ---------- ------------
CLERK CLERK SMITH SMITH
SALESMAN SALESPERSON ALLEN ALLEN
SALESMAN SALESPERSON WARD WARD
MANAGER MANAGER JONES JONES
SALESMAN SALESPERSON MARTIN MARTIN
MANAGER MANAGER BLAKE BLAKE
MANAGER MANAGER CLARK CLARK
ANALYST ANALYST SCOTT SPXXTT

NÜMERİK FONKSİYONLAR:

ROUND:
ROUND(col/value,n)

SELECT ROUND(45.923,1),ROUND(45.923),ROUND(45.540,1),ROUN D(45.550,1),ROUND(45.323,-1),ROUND(SAL/32,2) FROM EMP WHERE DEPTNO=10

ROUND(45.923,1) ROUND(45.923) ROUND(45.540,1) ROUND(45.550,1) ROUND(45.323,-1) ROUND(SAL/32,2)
--------------- ------------- --------------- --------------- ---------------- ---------------
45.9 46 45.5 45.6 50 81.56
45.9 46 45.5 45.6 50 161.25
45.9 46 45.5 45.6 50 45.63
45.9 46 45.5 45.6 50 81.56
45.9 46 45.5 45.6 50 161.25
45.10


(NEGATİF ROUND MANTIĞI:
ROUND(65,-1) = SELECT ROUND(65/10)*10 FROM DUAL;
ROUND(65,-2) = SELECT ROUND(65/100)*100 FROM DUAL;)
TRUNC:
TRUNC(col/value,n)

SELECT TRUNC(45.923,1),TRUNC(45.923),TRUNC(45.540,1),TRUN C(45.550,1),TRUNC(45.323,-1),TRUNC(SAL/32,2) FROM EMP WHERE DEPTNO=10

TRUNC(45.923,1) TRUNC(45.923) TRUNC(45.540,1) TRUNC(45.550,1) TRUNC(45.323,-1) TRUNC(SAL/32,2)
--------------- ------------- --------------- --------------- ---------------- ---------------
45.9 45 45.5 45.5 40 81.56
45.9 45 45.5 45.5 40 161.25
45.9 45 45.5 45.5 40 45.62
45.9 45 45.5 45.5 40 81.56
45.9 45 45.5 45.5 40 161.25

DİĞER: SELECT TRUNC(65/10)*10,TRUNC(65.999,-1) FROM DUAL;


CEIL:
CEIL(col/value)

SAYIYI KENDİNDEN BÜYÜK YADA EŞİT OLAN EN KÜÇÜK TAM SAYIYA TAMAMLAR.

SELECT CEIL(SAL),CEIL(99.9),CEIL(101.36),CEIL(-11.1) FROM EMP WHERE SAL BETWEEN 3000 AND 5000

CEIL(SAL) CEIL(99.9) CEIL(101.36) CEIL(-11.1)
--------- ---------- ------------ -----------
3135 100 102 -11
3010 100 102 -11
3160 100 102 -11
3160 100 102 -11
3135 100 102 -11
3010 100 102 -11
3160 100 102 -11
3160 100 102 -11
3135 100 102 -11

(NEGATİF DEĞERİ BULMA: SAYI DOĞRUSUNDA -11.1 DEĞERİ -11 DEN SONRA GELEN DAHA KÜÇÜK BİR DEĞERDİR. CEIL KENDİNDEN SONRAKİ EN BÜYÜK DEĞERİ GETİRDİĞİNDEN -11 BASAR)

FLOOR:
FLOOR(col/value)

SAYIYI KENDİNDEN KÜÇÜK YADA EŞİT OLAN EN BÜYÜK TAM SAYIYA TAMAMLAR.

SELECT FLOOR(SAL),FLOOR(99.9),FLOOR(101.36),FLOOR(-11.1) FROM EMP WHERE SAL BETWEEN 3000 AND 5000

FLOOR(SAL) FLOOR(99.9) FLOOR(101.01) FLOOR(-11.1)
---------- ----------- ------------- ------------
3135 99 101 -12
3010 99 101 -12
3160 99 101 -12
3160 99 101 -12
3135 99 101 -12
POWER:
POWER(col/value,n)
İLGİLİ ALANDAKİ DEĞERLERİN n İNCİ ÜSSÜNÜ ALMA
SELECT SAL,POWER(SAL,2) FROM EMP;
SAL POWER(SAL,2)
--------- ------------
800 640000
1600 2560000
1250 1562500
2975 8850625
1250 1562500
EXP:
EXP(n)
e=2.711828183
e NİN n İNCİ ÜSSÜNÜ BULMA.
SELECT EXP(4) FROM DUAL
EXP(4)
---------
54.59815

SQRT
SQRT(coo/value)
KARAKÖK BULMA.
SELECT SAL,SQRT(SAL),SQRT(40) FROM EMP WHERE COMM>0;

SAL SQRT(SAL) SQRT(40)
--------- --------- ---------
1600 40 6.3245553
1250 35.355339 6.3245553
1250 35.355339 6.3245553
SIGN
SIGN(col/value)
YAPILAN ARİTMATİKSEL İŞLEMİN SONUCU NEGATİF İSE -1 POZİTİF İSE 1 DEĞER DÖNDÜRÜR.
SELECT SAL-COMM,SIGN(SAL-COMM),COMM-SAL,SIGN(COMM-SAL) FROM EMP WHERE COMM>0;

SAL-COMM SIGN(SAL-COMM) COMM-SAL SIGN(COMM-SAL)
--------- -------------- --------- --------------
1300 1 -1300 -1
750 1 -750 -1
-150 -1 150 1
DİĞER:
SELECT SIGN(TO_NUMBER(TO_CHAR(SYSDATE,'YYYY'))-2005) FROM DUAL

ABS
ABS(col/value)
NEGATİF ÇIKAN SONUÇLARI POZİTİFE ÇEVİRİR.
SELECT SAL,COMM,COMM-SAL,ABS(COMM-SAL),ABS(-111) FROM EMP WHERE DEPTNO=30;

SAL COMM COMM-SAL ABS(COMM-SAL) ABS(-111)
--------- --------- --------- ------------- ---------
1600 300 -1300 1300 111
1250 500 -750 750 111
1250 1400 150 150 111

MOD:
MOD(value1,value2)
value1 İN value2 YE BÖLÜNMESİNDE KALAN KISMINDAKİ DEĞERİ BULUR.
SELECT SAL,COMM,MOD(SAL,COMM),MOD(100,40) FROM EMP WHERE DEPTNO=30 ORDER BY COMM

SAL COMM MOD(SAL,COMM) MOD(100,40)
--------- --------- ------------- -----------
1500 0 1500 20
1600 300 100 20
1250 500 250 20

DİĞER FONKSİYONLAR.

LOG(m,n) n İN m E GÖRE LOGARİTMASI,
SIN(n) n İN SINE,
SINH(n) HYPERBOLIC SINE BULMA,
TAN(n) n İN TANGENT DEĞERİNİ BULMA,
TANH(n) n İN HYPERBOLIC TANGENT DEĞERİNİ BULMA,
COS(n) n İN COSINE DEĞERİNİ BULMA,
COSH(n) n IN HYPERBOLIC COSINE DEĞERİNİ BULMA.


DATE(TARİH):

DATE TANIMLI ALANLARDA TOPLAMA VE ÇIKARTMA YAPILABİLİR.

SELECT HIREDATE,HIREDATE-6,HIREDATE+6,SYSDATE-HIREDATE FROM EMP WHERE TO_CHAR(HIREDATE,'MON')='JUN' ;

HIREDATE HIREDATE- HIREDATE+ SYSDATE-HIREDATE
--------- --------- --------- ----------------
09-JUN-81 03-JUN-81 15-JUN-81 8583.5071

İLGİLİ TARİHDEN 6 GÜN ÖNCEKİ YADA 6 GÜN SONRAKİ TARİHİ BULABİLİRİZ.
İKİ TARİHİ BİRBİRİNDEN ÇIKARARAK ARADA KAÇ GÜN OLDUĞUNU BULABİLİRİZ.



SELECT TO_DATE('11/01/2004','DD/MM/YYYY')-TO_DATE('11/06/2004','DD/MM/YYYY')TAR FROM DUAL;

TAR
---------
- 152

MONTHS_BETWEEN:
MONTHS_BETWEEN(date1,date2)

İKİ TARİH ARASINDA KAÇ AY OLDUĞUNU BULUNUR.POZİTİF DEĞER ALMAK İÇİN ÖNCE BÜYÜK OLAN TARİH GİRİLİR.

SELECT MONTHS_BETWEEN(SYSDATE,HIREDATE),
MONTHS_BETWEEN('11-JUL-2004','11-JAN-2004') FROM EMP WHERE DEPTNO=10;

MONTHS_BETWEEN(SYSDATE,HIREDATE) MONTHS_BETWEEN('11-JUL-2004','11-JAN-2004')
-------------------------------- -------------------------------------------
281.98415 6
276.72609 6
274.53254 6

SELECT MONTHS_BETWEEN(TO_DATE('11-01-2004','DD/MM/YYYY'),
TO_DATE('15-06-2004','DD/MM/YYYY')) TAR FROM DUAL;
TAR
---------
-5.129032

KÜÇÜK OLAN BİR TARİH İLE BÜYÜK BİR TARİH ARASINDAKİ AY FARKI ALINIRSA NEGATİF DEĞER BASAR.

ADD_MONTHS
ADD_MONTHS(date,n)

date FORMATINDAKİ ALANA n KADAR AY EKLENEREK YENİ BİR TARİH BULUNUR.
-n GİRİLİRSE n KADAR AY EKSİLTİLİREK YENİ TARİH BULUNUR.

SELECT HIREDATE,ADD_MONTHS(HIREDATE,5),ADD_MONTHS(HIREDAT E,-5) FROM EMP WHERE DEPTNO=30;

HIREDATE ADD_MONTH ADD_MONTH
--------- --------- ---------
20-FEB-81 20-JUL-81 20-SEP-80

NEXT_DAY:
NEXT_DAY(date1,char)

HAFTANIN GÜNLERİ PAZARDAN CUMARTESİYE KADAR 1 DEN 7 KADAR DİYE DEĞER ALMAKTADIR.
BUNA GÖRE

SELECT NEXT_DAY(SYSDATE,'SUNDEY'),NEXT_DAY(SYSDATE,1) FROM DUAL;

SYSDATE NEXT_DAY(SYSDATE,'SUNDEY') NEXT_DAY(SYSDATE,1)
--------- -------------------------- -------------------
08-DEC-04 12-DEC-04 12-DEC-04

SİSTEM TARİHİNDEN BİR SONRAKİ PAZAR BULUNABİLİR.

LAST_DAY:
LAST_DAY(date1)

VERİLEN TARİHİN İÇİNDE BULUNDUĞU AYIN SON GÜNÜ BULUNUR.

SELECT SYSDATE,LAST_DAY(SYSDATE) FROM DUAL;

SYSDATE LAST_DAY(SYSDATE)
--------- ----------------
08-DEC-04 31-DEC-04


TARİHDE ROUND KULLANMA:

ROUND(date1)

date1 DE TANIMLI TARİH GÜNÜN İLK YARISI İSE (SAAT 01:00 DAN 12:00 KADAR İLK YARI) İÇİNDE BULUNDUĞU GÜNÜ BASAR
İKİNCİ YARISI İSE BİR SONRAKİ GÜNÜ BASAR.

ROUND(date1,'MONTH')
date1 DE TANIMLI TARİH AYIN İLK YARISI İSE İÇİNDE BULUNDUĞU AYIN İLK GÜNÜNÜ BASAR.
İKİNCİ YARISI İSE BİR SONRAKİ AYIN İLK GÜNÜNÜ BASAR.

ROUND(date1,'YEAR')
date1 DE TANIMLI TARİH YILIN İLK YARISI İSE İÇİNDE BULUNDUĞU YILIN İLK GÜNÜNÜ BASAR.
İKİNCİ YARISI İSE BİR SONRAKİ YILIN İLK GÜNÜNÜ BASAR.


SELECT ROUND(SYSDATE),ROUND(SYSDATE,'MONTH'),ROUND(SYSDAT E,'YEAR') FROM DUAL
UNION ALL
SELECT ROUND(SYSDATE),ROUND(SYSDATE+20,'MONTH'),ROUND(SYS DATE,'YEAR') FROM DUAL
UNION ALL
SELECT ROUND(SYSDATE),ROUND(SYSDATE+20,'MONTH'),ROUND(ADD _MONTHS(SYSDATE,7),'YEAR') FROM DUAL
UNION ALL
SELECT ROUND(SYSDATE),ROUND(SYSDATE+20,'MONTH'),ROUND(ADD _MONTHS(SYSDATE,6),'YEAR') FROM DUAL

04-DEC-04 01-DEC-04 01-JAN-05
04-DEC-04 01-JAN-05 01-JAN-05
04-DEC-04 01-JAN-05 01-JAN-06
04-DEC-04 01-JAN-05 01-JAN-05

TARİHDE TRUNC KULLANMA:

TRUNC(date1) date1 DE TANIMLI TARİHİN İÇİNDE BULUNDUĞU GÜNÜ BASAR.
TRUNC(date1,'MONTH') date1 DE TANIMLI TARİHİN İÇİNDE BULUNDUĞU AYIN İLK GÜNÜNÜ BASAR.
TRUNC(date1,'YEAR') date1 DE TANIMLI TARİHİN İÇİNDE BULUNDUĞU YILIN İLK GÜNÜNÜ BASAR.

SELECT TRUNC(SYSDATE),TRUNC(SYSDATE,'MONTH'),TRUNC(SYSDAT E,'YEAR') FROM DUAL
UNION ALL
SELECT TRUNC(SYSDATE),TRUNC(SYSDATE+20,'MONTH'),TRUNC(ADD _MONTHS(SYSDATE,6),'YEAR') FROM DUAL;

03-DEC-04 01-DEC-04 01-JAN-04
03-DEC-04 01-DEC-04 01-JAN-05


BİLGİ TİPİNİ DEĞİŞTİRME:

TO_CHAR(number/date,'fmt') NÜMERİK YADA TARİH TANIMLI ALANLARDAKİ BİLGELERİ KARAKTERE ÇEVİREREK BASAR.
TO_NUMBER(char) KARAKTER TANIMLI ALANLARDA SAYISAL DEĞER VARSA BU BİLGİLERİ NÜMERİK DEĞERE DÖNÜŞTÜREREK BASAR. HARFLERİ NÜMERİK DEĞERE ÇEVİRMEZ.
TO_DATE('char','fmt') TARİHİ GÖSTEREN KARAKTER BİR DEĞERİ VERİLEN FORMATTA TARIHE ÇEVİRİR. 'fmt' VERİLMEZSE DD-MON- YY FORMATINDA GÖSTERİM YAPAR.
TO_CHAR:

ORJİNAL TARİH FORMATI DD-MON-YYYY OLAN ALAN AŞAĞIDAKİ GİBİ GÖSTERİLEBİLİR.

SELECT TO_CHAR(SYSDATE,'DAY, DDTH MONTH YYYY') FROM DUAL
UNION ALL
SELECT TO_CHAR(SYSDATE,'FMDAY, DDTH MONTH YYYY') FROM DUAL
UNION ALL
SELECT TO_CHAR(SYSDATE,'FMDAY, DDSP MONTH YYYY') FROM DUAL;

FRIDAY , 03RD DECEMBER 2004
FRIDAY, 3RD DECEMBER 2004
FRIDAY, THIRD DECEMBER 2004

FM DAY VE DD ALANLARINDAKİ BOŞLUKLARIN VE 0 DEĞERLERİNİN GÖZÜKMESİNİ ÖNLER.
SP GÜNÜN OKUNDUĞU GİBİ HARFLEN GÖSTERİMİNİ YAPIYOR.

TARİHİN ZAMANI GÖSTEREN KISMIDA GÖRÜNTÜLENEBİLİR:
SELECT TO_CHAR(SYSDATE,'DD/MM/YYY HH:MI:SS') FROM DUAL;

03/12/004 02:24:10

NÜMERİK SAHALARI GÖRÜNTÜLETİRKEN FORMAT VERİLEBİLİR:
SELECT TO_CHAR(SAL,'$9,999') FROM EMP WHERE DEPTNO=10;

TO_CHAR
-------
$2,450
$5,000
$1,300

TO_NUMBER:

DATE TANIMLI BİR ALANIN TO_CHAR İLE SADECE YIL KISMI ALINIP BULUNAN DEĞER TO_NUMBER İLE NUMERİK DEĞERE ÇEVRİLİYOR.

SELECT ENAME,TO_CHAR(HIREDATE,'DD/MM/YYYY'),TO_NUMBER(TO_CHAR(HIREDATE,'YYYY')) YEAR FROM EMP
WHERE TO_NUMBER(TO_CHAR(HIREDATE,'YYYY'))=1981

ENAME TO_CHAR(HI YEAR
---------- ---------- ---------
ALLEN 20/02/1981 1981
WARD 22/02/1981 1981
JONES 02/04/1981 1981
MARTIN 28/09/1981 1981

TO_DATE:

SELECT EMPNO,ENAME,HIREDATE FROM EMP
WHERE HIREDATE=TO_DATE('23-JAN-1982','DD-MON-YYYY')

EMPNO ENAME HIREDATE
--------- ---------- ---------
7934 MILLER 23-JAN-82

TABLODA DATE TANIMLI BİR ALANA KAYIT GİRİLİRKEN YADA UPDATE YAPILIRKEN GİRİLEN DEĞER DATE FORMATINA ÇEVİRİLİR.

UPDATE EMP SET HIREDATE=TO_DATE('01/10/2004','DD/MM/YYYY')
WHERE HIREDATE=TO_DATE('03/12/1981','DD/MM/YYYY') AND ROWNUM=1

1 row updated.

AŞAĞIDAKİDE WHERE KOŞULUNDA SİSTEMİN DEFAULT TARİH FORMATINI KULLANAN HALİ:

UPDATE EMP SET HIREDATE=TO_DATE('01/10/2004','DD/MM/YYYY')
WHERE HIREDATE='03-DEC-1981' AND ROWNUM=1
1 row updated.

DECODE:

DECODE(col/expression,
search1,result1,[search2,result2,...,]default

col/expression DA BELİRTİLEN KOLONDAN YADA BURADA YAPILAN BİR HESAPLAMA SONUCUNDA GELEN DEĞER ,
search1 DE VERİLEN DEĞERE EŞİTSE ,resutl1 DEKİ VERİLEN DEĞER BASILIR
search2 DE VERİLEN DEĞERE EŞİTSE ,resutl2 DEKİ VERİLEN DEĞER BASILIR
HİÇ BİRİNE EŞİT DEĞİLSE default KISMINDAKİ DEĞER NE İSE ONU BASAR.

SELECT ENAME,DECODE(TO_CHAR(HIREDATE,'MM'),1,'OCAK',2,'ŞU BAT',
3,'MART',4,'NİSAN',5,'MAYIS',6,'HAZİRAN',7,'TEMMUZ ',8,'AGUSTOS',9,'EYLÜL',10,
'EKİM',11,'KASIM',12,'ARALIK') FROM EMP

ENAME DECODE(
---------- -------
SMITH ARALIK
ALLEN ŞUBAT
WARD ŞUBAT
JONES NİSAN
MARTIN EYLÜL
BLAKE MAYIS
CLARK HAZİRAN
SELECT ENAME,
DECODE(JOB,'CLERK',SAL+SAL*5/100,'MANAGER',SAL+SAL*10/100,SAL+SAL*3/100) NEW_SAL FROM EMP WHERE DEPTNO=10;

ENAME NEW_SAL
---------- ---------
CLARK 2695
KING 5150
MILLER 1365

SEARCH KISIMLARINDA BAŞKA İÇ DECODE LARDA YAZILABİLİR:

SELECT ENAME,
DECODE(JOB,'CLERK',SAL+SAL*5/100,
'MANAGER',DECODE(NVL(COMM,0),0,500+(SAL+SAL*10/100),SAL+SAL*10/100), SAL+SAL*3/100) NEW_SAL FROM EMP WHERE DEPTNO=10;

ENAME NEW_SAL
---------- ---------
CLARK 3195
KING 5150
MILLER 1365



NVL(col/value,val):

TABLODA BOŞ OLAN ALANLARA , DEĞER ATANIR.

SELECT COMM,SAL*12+COMM,SAL*12+NVL(COMM,0) FROM EMP;

COMM SAL*12+COMM SAL*12+NVL(COMM,0)
--------- ----------- ------------------
9600
300 19500 19500
500 15500 15500
35700

BOŞ OLAN ALANLAR İLE İLGİLİ BİR HESAPLAMA YAPILIRKEN NVL KULLANILMAZSA O HESAPLAMANIN DEĞERİDE BOŞ DÖNER.

SELECT NVL(TO_CHAR(COMM),'GİRİLMEMİŞ') FROM EMP WHERE COMM IS NULL;

NVL(TO_CHAR(COMM),'GİRİLMEMİŞ')
--------------------------------
GİRİLMEMİŞ
GİRİLMEMİŞ
GİRİLMEMİŞ
GİRİLMEMİŞ

GREATEST(col/value,col/value,...):

PARANTEZ ARALIĞINDA GELEN DEĞERLERDEN EN BÜYÜK OLANI BULUNUR.

SELECT GREATEST(2000,3000,5000) GRT,SAL,COMM,GREATEST(SAL,COMM) GRT1, GREATEST(SAL,NVL(COMM,0)) GRT2 FROM EMP WHERE DEPTNO=30;

GRT SAL COMM GRT1 GRT2
--------- --------- --------- --------- ---------
5000 1600 300 1600 1600
5000 1250 500 1250 1250
5000 1250 1400 1400 1400
5000 2850 2850

LEAST(col/value,col/value,...):

PARANTEZ ARALIĞINDA GELEN DEĞERLERDEN EN KÜÇÜK OLANI BULUNUR.

SELECT LEAST(2000,3000,5000) LST,SAL,COMM,LEAST(SAL,COMM) LST1, LEAST(SAL,NVL(COMM,0)) LST2 FROM EMP WHERE DEPTNO=30;

LST SAL COMM LST1 LST2
--------- --------- --------- --------- ---------
2000 1600 300 300 300
2000 1250 500 500 500
2000 1250 1400 1250 1250
2000 2850 0

VSIZE(col/value):
BİLGİNİN KAÇ BYTE YER TUTTUĞUNU BULMA

SELECT VSIZE(ENAME),VSIZE(DEPTNO),VSIZE(HIREDATE) FROM EMP

GRUP FONKSİYONLAR:

AŞAĞIDAKİ FONKSİYONLAR NULL OLAN ALANLARI GÖZARDI EDEREK İŞLEMİNİ YAPAR.
COUNT(*) HARİÇ BU NULL ALANLARIDA SAYAR.

AVG(DISTINCT/ALL/n)
COUNT(DISTINCT/ALL/expr*)
MAX(DISTINCT/ALL/expr)
MIN(DISTINCT/ALL/expr)
SUM(DISTINCT/ALL/n)
VARIANCE(DISTINCT/ALL/n)


DISTINCT BİRDEN FAZLA AYNI KAYIT VAR İSE TEK KAYITA İNDİRİR.
ALL BİRDEN FAZLA AYNI KAYIT VAR İSE HEPSİNİ HESABA DAHİL EDER.

SELECT AVG(SAL) FROM EMP
UNION ALL
SELECT MIN(SAL) FROM EMP
UNION ALL
SELECT COUNT(*) FROM EMP;

AVG(SAL)
---------
2073.2143
800
14

GROUP BY KOMUTU:

GROUP BY KOMUTU BİLGİLERİ BÖLEREK DAHA KÜÇÜK GRUPLAR ELDE ETMEMİZİ SAĞLAR.

SELECT JOB,COUNT(*) FROM EMP GROUP BY JOB
HER ÜNVAN GRUBUNDA KAÇ KİŞİNİN OLDUĞUNU BULUNABİLİR.

JOB COUNT(*)
--------- ---------
ANALYST 2
CLERK 4
MANAGER 3
PRESIDENT 1
SALESMAN 4



SELECT JOB,AVG(SAL) FROM EMP GROUP BY JOB
ÜNVANA GÖRE ORTALAMA ÜCRET HESAPLANABİLİR.

JOB AVG(SAL)
--------- ---------
ANALYST 3000
CLERK 1037.5
MANAGER 2758.3333
PRESIDENT 5000
SALESMAN 1400

SELECT DEPTNO,JOB,AVG(SAL) FROM EMP
GROUP BY DEPTNO,JOB;

DEPTNO JOB AVG(SAL)
--------- --------- ---------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
20 ANALYST 3000
20 CLERK 950
20 MANAGER 2975
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 1400

SELECT JOB,MAX(SAL) FROM EMP GROUP BY JOB;

JOB MAX(SAL)
--------- ---------
ANALYST 3000
CLERK 1300
MANAGER 2975
PRESIDENT 5000
SALESMAN 1600

SELECT MAX(SAL) FROM EMP;
SORGUSU EMP TABLOSUNDAKİ EN BÜYÜK ÜCRETİ BASAR.

MAX(SAL)
---------
5000

AŞAĞIDAKİ ÖRNEKTE;

SELECT JOB,MAX(SAL) FROM EMP;

SORGUYA JOB KOLONU EKLENDİĞİ HALDE GROUP BY BELİRTİLMEDİĞİ İÇİN SORGU HATA VERİR.
SELECT JOB,MAX(SAL) FROM EMP
*
ERROR at line 1:
ORA-00937: not a single-group group function

DİĞER:

SELECT MAX(AVG(SAL)) FROM EMP
GROUP BY JOB

JOB BAZINDA AVERAGE DEĞERLER HESAPLANIYOR VE GELEN DEĞERLER İÇİNDE EN BÜYÜK OLANI BASILIYOR. BURADA MAX GROUP BY İLE ÇALIŞMIYOR.



HAVING KOMUTU:

WHERE KULLANIRKEN GRUP FUNCTION KOMUTLARINI BURADA KULLANAMAYIZ.
GRUP FUNCTION LARI KULLANARAK SORGU YAPMAK İSTENİRSE HAVING KULLANILMAKTADIR.

SELECT DEPTNO,AVG(SAL),COUNT(*) FROM EMP
GROUP BY DEPTNO
HAVING COUNT(*)>3

DEPTNO AVG(SAL) COUNT(*)
--------- --------- ---------
20 2175 5
30 1566.6667 6

COUNT(*)>3 İLE BURADA EMP TABLOSUNDA 3 DEN FAZLA AYNI DEPTNOYA SAHİP OLAN KAYITLAR İÇERİSİNDEN DEPTNO BAZINDA GROUP YAPILARAK ORTALAMA ÜCRET BULUNMAKTADIR.
(SELECT DEPTNO FROM EMP ORDER BY DEPTNO İLE 3 DEN FAZLA AYNI DEPTNOSU OLAN KAYITLARI GÖREBİLİRİZ.)

SELECT JOB,MAX(SAL) FROM EMP
HAVING MAX(SAL)>=3000
GROUP BY JOB;

JOB MAX(SAL)
--------- ---------
ANALYST 3000
PRESIDENT 5000

GROUP BY KOMUTU HAVING DEN ÖNCE ÇALIŞTIĞINDAN HAVING IN GROUP BY DAN ÖNCE YAZILMASININ ÖNEMİ YOKTUR.

AŞAĞIDAKİ ÖRNEKDE FUNCTION SONUCUNA GÖRE İSTENİLENİ DÖKMEK İÇİN HAVING KULLANILMIŞ,JOB ALANI MANAGER OLAMAYANLARIN BASILMASI İÇİNDE WHERE KULLANILMIŞTIR.ÇÜNKÜ JOB KOLONUN ADIDIR BİR GRUP FONKSİYON DEĞİLDİR.

SELECT JOB,MAX(SAL) FROM EMP
WHERE JOB!='MANAGER'
HAVING MAX(SAL)>=3000
GROUP BY JOB;

JOB MAX(SAL)
--------- ---------
ANALYST 3000
CLERK 1300
PRESIDENT 5000
SALESMAN 1600

GROUP BY KULLANILARAK SORGU YAPILIRKEN WHERE DEN SONRA BELİRTİLENLER HAVING KULLANILARAK DA YAPILABİLİR.

SELECT SAL,COUNT(*) FROM EMP
GROUP BY SAL
HAVING SAL>=2610 AND SAL!=3000

İLE

SELECT SAL,COUNT(*) FROM EMP
WHERE SAL>=2610 AND SAL!=3000
GROUP BY SAL

AYNI SONUCU VERİR.

(ÖNCE WHERE ÇALIŞIYOR,SONRA GROUP BY SONRA HAVING).

ÖRNEK:

SELECT JOB,MAX(SAL) FROM EMP
WHERE NVL(COMM,0)!=0
HAVING MAX(SAL)>=1000
GROUP BY JOB.

JOB MAX(SAL)
--------- ---------
SALESMAN 1600

ÖNCE COMM NU SIFIR OLMAYANLAR BULUNUYOR. SONRA GROUP YAPILIYOR. SONRA HAVING DE SAĞLANANLAR GELİYOR.




BİRDEN FAZLA TABLOYU KULLANARAK SORGU YAPMA:

SELECT ENAME,JOB,DNAME
FROM EMP,DEPT
WHERE EMP.DEPTNO=DEPT.DEPTNO
ORDER BY DEPT.DEPTNO


TABLOLAR İÇİN ALIES KULLANIMI:

SELECT E.DEPTNO,ENAME,JOB,DNAME
FROM EMP E,DEPT D
WHERE E.DEPTNO=D.DEPTNO
ORDER BY D.DEPTNO

BU SORGUDA EMP TABLOSUNDAKİ DEPTNO SU DEPT TABLOSUNDAKİ DEPTNOSUNA EŞİT OLAN KAYITLAR DÖKÜLÜR.



DEPTNO ENAME JOB DNAME
--------- ---------- --------- -----------
10 CLARK MANAGER ACCOUNTING
10 KING PRESIDENT ACCOUNTING
10 MILLER CLERK ACCOUNTING
20 SMITH CLERK RESEARCH
20 ADAMS CLERK RESEARCH
20 FORD ANALYST RESEARCH
20 SCOTT ANALYST RESEARCH
20 JONES MANAGER RESEARCH
30 ALLEN SALESMAN SALES
30 BLAKE MANAGER SALES
30 MARTIN SALESMAN SALES
30 JAMES CLERK SALES
30 TURNER SALESMAN SALES
30 WARD SALESMAN SALES










ANCAK AŞAGIDAKİ ÖRNEKTE
E.DEPTNO(+)=D.DEPTNO
(+) KULLANILARAK EMP TABLOSUNDA DEPTNO 40 İÇİN KAYIT OLAMASINA RAĞMEN DEPT TABLOSUNDAKİ DNAME İN BASILMASI İSTENMİŞTİR.


SELECT E.DEPTNO,ENAME,JOB,DNAME
FROM EMP E,DEPT D
WHERE E.DEPTNO(+)=D.DEPTNO AND D.DEPTNO IN (30,40)
ORDER BY D.DEPTNO;

DEPTNO ENAME JOB DNAME
--------- ---------- --------- --------------
30 ALLEN SALESMAN SALES
30 BLAKE MANAGER SALES
30 MARTIN SALESMAN SALES
30 JAMES CLERK SALES
30 TURNER SALESMAN SALES
30 WARD SALESMAN SALES
OPERATIONS

AYNI TABLOYU KULLANARAKTA EŞLEME YAPABİLİRİZ:

BU SORGUDA ÇALIŞANLARDAN ÜCRETİ KENDİ MANAGER INDAN AZ OLANLARI DÖKÜYOR.

SELECT
E.ENAME EMP_NAME,E.SAL EMP_SAL,E.MGR,MGR.EMPNO,
MGR.ENAME MGR_NAME,MGR.SAL MGR_SAL
FROM EMP E,EMP MGR
WHERE E.MGR=MGR.EMPNO AND E.SAL
EMP_NAME EMP_SAL MGR EMPNO MGR_NAME MGR_SAL
---------- --------- --------- --------- ---------- ---------
ALLEN 1600 7698 7698 BLAKE 2850
WARD 1250 7698 7698 BLAKE 2850
JAMES 950 7698 7698 BLAKE 2850
TURNER 1500 7698 7698 BLAKE 2850
MARTIN 1250 7698 7698 BLAKE 2850
MILLER 1300 7782 7782 CLARK 2450
ADAMS 1100 7788 7788 SCOTT 3000
JONES 2975 7839 7839 KING 5000
CLARK 2450 7839 7839 KING 5000
BLAKE 2850 7839 7839 KING 5000
SMITH 800 7902 7902 FORD 3000



SET OPERATOR:

UNION:

BİRDEN FAZLA SORGUYU BİRLEŞTİRİR ANCAK AYNI OLAN SATIRLARI BİRKEZ BASAR.
DISTINCT YAPAR.

SELECT JOB FROM EMP WHERE DEPTNO=10
UNION
SELECT JOB FROM EMP WHERE DEPTNO=30;

JOB
---------
CLERK
MANAGER
PRESIDENT
SALESMAN

UNION ALL:

BİRDEN FAZLA SORGUYU BİRLEŞTİRİR AYNI OLANLARIDA BASAR.

SELECT JOB FROM EMP WHERE DEPTNO=10
UNION ALL
SELECT JOB FROM EMP WHERE DEPTNO=30;

JOB
---------
MANAGER
PRESIDENT
CLERK
SALESMAN
SALESMAN
SALESMAN
MANAGER
SALESMAN
CLERK

AŞAĞIDAKİ SORGU ŞEKLİ İLE UNION DAN ELDE EDİLEN SONUÇ ALINIR:

SELECT DISTINCT JOB FROM
(SELECT JOB FROM EMP WHERE DEPTNO=10
UNION ALL
SELECT JOB FROM EMP WHERE DEPTNO=30)

INTERSECT:

BİRDEN FAZLA SORGUDAN GELEN KAYITLARDAN AYNI OLMAYANLARI AYIKLAR.AYNI OLANLARI BASAR.

SELECT JOB FROM EMP WHERE DEPTNO=10
INTERSECT
SELECT JOB FROM EMP WHERE DEPTNO=30;

JOB
---------
CLERK
MANAGER

BU VERİYİ UNION KULLANARAK BULMAK İSTERSEK;

SELECT E.JOB FROM EMP E WHERE E.DEPTNO=10 AND E.JOB
IN (SELECT D.JOB FROM EMP D WHERE D.DEPTNO=30);


MINUS:

BİRİNCİ SORGUDAN ELDE EDİLEN VERİLERDEN İKİNCİ SORGUDA OLANLARI ÇIKARIR SONUCU BASAR.

SELECT JOB FROM EMP WHERE DEPTNO=10
MINUS
SELECT JOB FROM EMP WHERE DEPTNO=30;

JOB
---------
PRESIDENT





ORDER BY İLE:

KOLON ADI VERMEDEN KAÇINCI KOLON OLDUĞUNU BELİRTEREK SIRALAMA YAPILABİLİNİR.

SELECT ENAME,JOB,SAL FROM EMP WHERE DEPTNO=10
UNION
SELECT ENAME,JOB,3000 FROM EMP WHERE DEPTNO=30
ORDER BY 3,2;

ÖNCE ÜÇÜNCÜ KOLONA GÖRE SIRALAMA YAPAR,SONRA İKİNCİ KOLONA GÖRE SIRALAMA YAPAR.


NESTED SUBQUERY:

AŞAĞIDAKİ ÖRNEK İKİ SORGU KÜMESİ İÇERMEKTEDİR. BUNLARDAN BİRİ ANA SORGU DİĞERİ İÇ SORGUDUR. ÖNCE İÇ SORGU ÇALIŞIR BURADAN GELEN DEĞERLE ANA SORGU ÇALIŞIR.

SELECT ENAME,JOB
FROM EMP
WHERE JOB=(SELECT JOB
FROM EMP
WHERE ENAME='BLAKE');

ENAME JOB
---------- ---------
JONES MANAGER
BLAKE MANAGER
CLARK MANAGER

SORGUYU AÇARSAK:
İÇ SORGUDAN DÖNEN DEĞER;

SELECT JOB
FROM EMP
WHERE ENAME='BLAKE';

JOB
---------
MANAGER

WHERE KOŞULUNDA JOB='MANAGER' YAZILINCADA AYNI SONUÇ ELDE EDİLİR.


SELECT ENAME,JOB
FROM EMP
WHERE JOB='MANAGER'


ENAME JOB
---------- ---------
JONES MANAGER
BLAKE MANAGER
CLARK MANAGER



BU ÖRNEKTE GÖRÜLDÜĞÜ GİBİ İÇ SORGUDAN TEK KAYIT DÖNECEK İSE LOGICAL
OPERATOR LER KULLANILIR.


ÖRNEĞİN: =, >, <, >=, <=, !=


ALT SORGU BİRDEN FAZLA KAYIT DÖNDÜRÜRSE:

IN KULLAMIMI:

SELECT ENAME,SAL,DEPTNO
FROM EMP
WHERE SAL IN (SELECT MIN(SAL)
FROM EMP
GROUP BY DEPTNO);

ENAME SAL DEPTNO
---------- --------- ---------
SMITH 800 20
JAMES 950 30
MILLER 1300 10

BU ÖRNEKTE İÇ SORGU BİRDEN FAZLA KAYIT GETİRMEKTEDİR. BU YÜZDEN KULLANILACAK KOMUT IN OLACAKTIR.

AÇILIMI:
İÇ SORGUDA HERBİR DEPTNO DA ÇALIŞANLAR İÇİNDEN EN DÜŞÜK ÜCRETİ ALANI BULMAKTADIR.

SELECT MIN(SAL)
FROM EMP
GROUP BY DEPTNO;

MIN(SAL)
---------
1300
800
950

DIŞ SORGUDA BU EN DÜŞÜK ÜCRETİ ALANLARIN KİM OLDUKLARINI GÖSTERMEKTEDİR.

SELECT ENAME,SAL,DEPTNO
FROM EMP
WHERE SAL IN (1300,800,950);

ENAME SAL DEPTNO
---------- --------- ---------
SMITH 800 20
JAMES 950 30
MILLER 1300 10

WHERE DEKİ EŞLEŞTİRME BİRDEN FAZLA DEĞER İÇİN DE YAPILABİLİR:

SELECT ENAME,SAL,DEPTNO
FROM EMP
WHERE (SAL,DEPTNO) IN (SELECT MIN(SAL),DEPTNO
FROM EMP
GROUP BY DEPTNO);

ENAME SAL DEPTNO
---------- --------- ---------
SMITH 800 20
JAMES 950 30
MILLER 1300 10

ANCAK EŞLEŞTİRME YAPILAN DEĞERLERİN SAYISI BİREBİR EŞİT OLMALI VE DATA TYPE LARIDA AYNI OLMALIDIR.
WHERE (NUMBERDEĞER,CHARDEĞER)=(DATEDEĞER,NUMDEĞER,CHARDE ĞER,..) ŞEKLİNDE BİR EŞLEŞTİRME YANLIŞTIR.
WHERE (NUMBERDEĞER,CHARDEĞER)=(NUMBERDEĞER,CHARDEĞER) DOĞRUDUR.


BU SORGU TİPLERİNDE ALINABİLECEK HATALARA ÖRNEK:


ÇOKLU KAYIT GETİREN BİR İÇ SORGU KULLANIRKEN AŞAĞIDAKİ GİBİ WHERE KOŞULUNDA = SEMBOLÜNÜ KULLANILIRSA HATA VERİR.

SQL> SELECT ENAME,SAL,DEPTNO
2 FROM EMP
3 WHERE SAL = (SELECT MIN(SAL)
4 FROM EMP
5 GROUP BY DEPTNO);
WHERE SAL = (SELECT MIN(SAL)
*
ERROR at line 3:
ORA-01427: single-row subquery returns more than one row

YADA İÇ SORGUDAN HİÇ BİR DĞER DÖNMEZSE AŞAĞIDAKİ HATA MESAJI ALINIR.

SQL> SELECT ENAME,JOB
2 FROM EMP
3 WHERE JOB=(SELECT JOB
4 FROM EMP
5 WHERE ENAME='AHMET');

no rows selected



SOME/ANY yada ALL KOMUTLARI:

ANY ve ALL KOMUTLARI BİRDEN FAZLA SATIR DÖNEN ALT SORGULARDA KULLANILIR. BUNLAR WHERE YADA HAVING KULLANIRKEN LOGICAL OPERATOR (=,!=,>,<,>=,<=) İLE BERABER KULLANILIR.

ÖRNEĞİN; >ANY YADA =ANY (BU IN İLE AYNIDIR.)

AŞAĞIDAKİ ÖRNEKTE; İÇ SORGUDAN 30 NOLU DEPT DE ÇALIŞAN PERSONEL ÜCRETLERİ GELMEKTEDİR. ANA SORGUDA DA BU ÜCRETLERDEN DAHA YÜKSEK ÜCRET ALAN TÜM PERSONELİN DÖKÜMÜ YAPILMIŞTIR.

SELECT ENAME,SAL,JOB,DEPTNO
FROM EMP
WHERE SAL>ALL (SELECT DISTINCT SAL
FROM EMP
WHERE DEPTNO=30);

ENAME SAL JOB DEPTNO
---------- --------- --------- ---------
JONES 2975 MANAGER 20
SCOTT 3000 ANALYST 20
KING 5000 PRESIDENT 10
FORD 3000 ANALYST 20



AÇARSAK:
İÇ SORGUDAN DÖNEN:
SELECT DISTINCT SAL
FROM EMP
WHERE DEPTNO=30;


SAL
---------
950
1250
1500
1600
2850

OLUMSUZLUK SEMBOLÜ OLAN NOT KOMUTU IN, ANY, ALL İLE BERABER KULLANILABİLİR.

İÇ SORGU KULLANILAN YERLERDE HAVING CÜMLESİ KULLANIMI:

(HATIRLAYACAĞIMIZ GİBİ WHERE HER BİR SATIR KAYIT İÇİN KULLANILMAKTA, HAVING DE GRUPLANMIŞ DATALAR İÇİN KULLANILMAKTAYDI.)


AŞAĞIDAKİ ÖRNEKTE;İÇ SORGUDA 30 NOLU DEPT DE ÇALIŞANLARIN ORTALAMA ÜCRETİ BULUNMUŞTUR. ANA SORGUDA DEPTLERE GÖRE GRUPLAMA YAPMIŞ VE HER GRUB İÇİN ORTALAMA ÜCRETİ İÇ SORGUDAN DÖNEN DEĞERDEN BÜYÜK OLANLARI BASMIŞTIR.

SELECT DEPTNO,AVG(SAL) FROM EMP
HAVING AVG(SAL)> (SELECT AVG(SAL)
FROM EMP
WHERE DEPTNO=30)
GROUP BY DEPTNO;

DEPTNO AVG(SAL)
--------- ---------
10 2916.6667
20 2175


AÇILIMI:
İÇ SORGUDAN GELEN DEĞER:
SELECT AVG(SAL)
FROM EMP
WHERE DEPTNO=30;

AVG(SAL)
---------
1566.6667


AŞAĞIDAKİ ÖRNEKTE DE: İÇ SORGU PERSONEL ÜNVANLARINA(JOB) GÖRE GRUPLANMIŞTIR.
HER ÜNVAN GRUBU İÇİN ORTALAMA ÜCRET HESAPLANMIŞ VE BUNLAR İÇERİSİNDEN EN BÜYÜK
OLANI BULUNMUŞTUR. ANA SORGUDA BU MAX DEĞERE EŞİT OLAN ÜNVANI BASMIŞTIR.

SELECT JOB,AVG(SAL)
FROM EMP
GROUP BY JOB
HAVING AVG(SAL) = (SELECT MAX(AVG(SAL))
FROM EMP
GROUP BY JOB);

JOB AVG(SAL)
--------- ---------
PRESIDENT 5000


AÇILIMI:

İÇ SORGUDAN DÖNEN DEĞER:


SELECT MAX(AVG(SAL))
FROM EMP
GROUP BY JOB;

MAX(AVG(SAL))
-------------
5000

MAX KOŞULUNU KALDIRIRSAK:

SELECT AVG(SAL)
FROM EMP
GROUP BY JOB;

AVG(SAL)
---------
3000
1037.5
2758.3333
5000 MAX OLAN DEĞER.
1400


İÇ SORGULARDA ORDER BY CÜMLESİ KULLANILAMAZ.


İÇ SORGUNUN ALTINDA DA İÇ SORGULAR YAPILABİLİR:

AŞAĞIDAKİ ÖRNEKDE:
EN İÇ SORGUDA BÖLÜM ADI SALES OLAN BÖLÜMÜN DEPTNO SU BULUNUR. BU DEPTNO YA EŞİT
OLAN BÖLÜMDE ÇALIŞANLARIN İÇİNDE ALINAN EN YÜKSEK ÜCRET BULUNUR VE ANA SORGUDA DA TÜM PERSONEL ARASINDA BU ÜCRETTEN DAHA YÜKSEK ÜCRET ALAN PERSONEL LİSTESİ DÖKÜLÜR. ANA SORGU ÜCRETE GÖRE SIRALANIR.

SELECT ENAME,JOB,HIREDATE,SAL
FROM EMP
WHERE SAL> (SELECT MAX(SAL)
FROM EMP
WHERE DEPTNO= (SELECT DEPTNO
FROM DEPT
WHERE DNAME='SALES'))
ORDER BY SAL;

ENAME JOB HIREDATE SAL
---------- --------- --------- ---------
JONES MANAGER 02-APR-81 2975
SCOTT ANALYST 09-DEC-82 3000
FORD ANALYST 03-DEC-81 3000
KING PRESIDENT 17-NOV-81 5000

AÇILIMI:
EN İÇ SORGUDAN DÖNEN:
SELECT DEPTNO
FROM DEPT
WHERE DNAME='SALES';
DEPTNO
---------
30






BİR ÜST İÇ SORGU:

SELECT MAX(SAL)
FROM EMP
WHERE DEPTNO= (SELECT DEPTNO
FROM DEPT
WHERE DNAME='SALES');
MAX(SAL)
---------
2850

EXISTS KOMUTU:

İÇ SORGUDAN DÖNEN DEĞER ANA SORGUDAKİ DEĞERLERİN ARASINDA BULUNUYORSA SONUÇ TRUE DÖNER VE ANA SORGU GETİRDİĞİ KAYDI BASAR. EĞER İÇ SORGUDAKİ DEĞER ANA SORGUDAN GELEN KAYITLARIN ARASINDA YOKSA FALSE DÖNER VE ANA SORGUDA O SATIR BASILMAZ.


AŞAĞIDAKİ ÖRNEKDE; İÇ SORGUDA EMP TABLOSUNDAKİ MGR SÜTUNUNDAKİ DEĞER ANA SORGUDAN GELEN EMPNO YA EŞİTSE TRUE DÖNER VE ANA SORGUDAKİ SATIR BASILIR.


SELECT EMPNO,ENAME,JOB,DEPTNO
FROM EMP E
WHERE EXISTS (SELECT EMPNO
FROM EMP
WHERE EMP.MGR=E.EMPNO)
ORDER BY EMPNO;

EMPNO ENAME JOB DEPTNO
--------- ---------- --------- ---------
7566 JONES MANAGER 20
7698 BLAKE MANAGER 30
7782 CLARK MANAGER 10
7788 SCOTT ANALYST 20
7839 KING PRESIDENT 10
7902 FORD ANALYST 20



İÇ SORGUDAKİ SELECT EDİLEN DEĞERİN ÖNEMİ YOKTUR BURAYA HERHANGİ BİR DEĞER KONSADA OLUR.ÖRNEĞİN;

SELECT EMPNO,ENAME,JOB,DEPTNO
FROM EMP E
WHERE EXISTS (SELECT 1
FROM EMP
WHERE EMP.MGR=E.EMPNO)
ORDER BY EMPNO;



EMPNO ENAME JOB DEPTNO
--------- ---------- --------- ---------
7566 JONES MANAGER 20
7698 BLAKE MANAGER 30
7782 CLARK MANAGER 10
7788 SCOTT ANALYST 20
7839 KING PRESIDENT 10
7902 FORD ANALYST 20




NOT EXISTS:

AŞAĞIDAKİ ÖRNEKDE; İÇ SORGUDA DEPT(BÖLÜMLER) TABLOSUNDAKİ DEPTNOSU İLE ANA SORGUDAKİ EMP TABLOSUNDAKİ DEPTNO EŞLEŞTİRİLMİŞ VE EMP DE OLUPDA DEPT DE OLMAYAN DEĞER VARMI DİYE BAKILMIŞTIR.




SELECT EMPNO,ENAME,DEPTNO
FROM EMP
WHERE NOT EXISTS (SELECT DEPTNO
FROM DEPT
WHERE DEPT.DEPTNO=EMP.DEPTNO);

no rows selected

EMP DEKİ BÜTÜN DEPTNO LAR DEPT TABLOSUNDA BULUNDUĞU İÇİN SORGU KAYIT BULAMAMIŞTIR.



TESTİ:
AŞAĞIDA GÖRÜLDÜĞÜ GİBİ EMP DEN GELEN DEĞERLERİN HEPSİ DEPT TABLOSUNDA BULUNDUĞU İÇİN EMP DE OLUPDA DEPT DE OLMAYAN BİR DEĞER YOKTUR.

SELECT DISTINCT DEPTNO FROM EMP;

DEPTNO
---------
10
20
30



SELECT DISTINCT DEPTNO FROM DEPT;
DEPTNO
---------
10
20
30
40

ANCAK SORGUNUN TERSİNİ YAPSAYDIK:
YUKARIDAKİ TESTDE DE GÖRÜLDÜĞÜ GİBİ DEPT DE OLUP ANCAK EMP DE OLMAYAN BİR KAYIT VAR VE AŞAĞIDAKİ SORGU İLE BU BULUNMAKTADIR.


SELECT DEPTNO,DNAME
FROM DEPT
WHERE NOT EXISTS (SELECT DEPTNO
FROM EMP
WHERE DEPT.DEPTNO=EMP.DEPTNO);

DEPTNO DNAME
--------- -------------
40 OPERATIONS






NOT EXITS VE NOT IN KOMUTLAR KULLANIRKEN:

NOT IN KOMUTU KULLANILIRKEN NULL DEĞER İÇEREN SATIRLAR İŞLEME ALINMADIĞINDAN YANLIŞ SONUCA VARILABİLİR BUNUN YERİNE NOT EXISTS KULLANMAK DAHA İYİ OLACAKTIR.

ÖRNEĞİN:
BURADA İÇ SORGUDA MGR DEĞERİ NULL OLAN KAYITLAR VARDIR. ANCAK NOT IN SADECE DOLU OLANLARA BAKTIĞI İÇİN EMPNO SU MGR YE EŞİT OLANLARI GÖRECEK VE HİÇ BİR KAYIT DÖNDÜRMEYECEKTİR.


SELECT ENAME,JOB
FROM EMP
WHERE EMPNO NOT IN (SELECT MGR FROM EMP);

no rows selected



İÇ SORGUDAN DÖNENLER:
MGR
---------
7902
7698
7698
7839
7698
7839
7839
7566

7698
7788
7698
7566
7782


ANCAK NOT EXISTS İLE NULL OLANLARIDA KONTROL EDİLEBİLİR;

SELECT ENAME,JOB
FROM EMP E
WHERE NOT EXISTS (SELECT 1 FROM EMP WHERE E.EMPNO=EMP.MGR);


ENAME JOB
---------- --------
SMITH CLERK
ALLEN SALESMAN
WARD SALESMAN
MARTIN SALESMAN
TURNER SALESMAN
ADAMS CLERK
JAMES CLERK
MILLER CLERK









YADA NOT IN KULLANILMAK İSTENİRSE BOŞ KAYIT OLABİLECEĞİ DÜŞÜNÜLEREK NVL KULLANMAK DOĞRU OLACAKTIR.

SELECT ENAME,JOB
FROM EMP
WHERE EMPNO NOT IN (SELECT NV(MGR,0) FROM EMP);

ENAME JOB
---------- ---------
SMITH CLERK
ALLEN SALESMAN
WARD SALESMAN
MARTIN SALESMAN
TURNER SALESMAN
ADAMS CLERK
JAMES CLERK
MILLER CLERK


CASE WHEN KOMUTU:

BU KOMUT SQL CÜMLESİNDE IF CONDITION GİBİ ÇALIŞMAKTADIR. DECODE İLE YAPILABİLEN SORGU TÜRLERİ, CASE WHEN İLE DAHA KOLYLIKLA YAPILABİLMEKTEDİR. BAZI SORGULARDA DECODE LAR BİRBİRİ İÇERİSİNDE KULLANILIRKEN ANLAŞILMASI ZOR HAL ALABİLMEKTEDİR.
CASE WHEN YAPISI DAHA AÇIKTIR.

CASE WHEN ....THEN
WHEN.....THEN
.
ELSE
.
END

ÖRNEK :

SELECT ENAME,JOB,SAL,CASE
WHEN (JOB='MANAGER' OR JOB='SALESMAN') AND DEPTNO=30 THEN
(SAL+SAL*15)+500
WHEN (JOB='MANAGER' OR JOB='SALESMAN') AND DEPTNO=20 THEN
(SAL+SAL*10)+100
ELSE
(SAL+SAL*5)+100
END NEWSAL
FROM EMP

SQL> /

ENAME JOB SAL NEWSAL
---------- --------- --------- ---------
SMITH CLERK 800 4900
ALLEN SALESMAN 1600 26100
WARD SALESMAN 1250 20500
JONES MANAGER 2975 32825
MARTIN SALESMAN 1250 20500
BLAKE MANAGER 2850 46100
CLARK MANAGER 2450 14800
SCOTT ANALYST 3000 18100
KING PRESIDENT 5000 30100
TURNER SALESMAN 1500 24500
ADAMS CLERK 1100 6700
JAMES CLERK 950 5800
FORD ANALYST 3000 18100
MILLER CLERK 1300 7900

SELECT CÜMLESİNDE BAŞKA SELECT CÜMLELERİ YAZMA:

ÖNCEDEN WHERE CONDITIONDA İÇ SORGU YAZMAYI GÖRMÜŞTÜK. BURADA İSE SELECT CÜMLECİĞİNDE BAŞKA BİR SELECT KUMUTU DATA YAZABİLECEĞİMİZİ GÖRECEĞİZ.

AŞAĞIDAKİ ÖRNEKTE GÖRÜLDÜĞÜ GİBİ DEPT TABLOSUNDAN DEPTNO BİLGİLERİNİ DÖKERKEN AYNI ANDA KOLONLARIN YANINA BİR SELECT CÜMLECİĞİ DAHA YAZARAK YENİ BİR BİLGİ SÜTUNU ELDE EDİYORUZ.
BURADAKİ SELECT SÜTUNU EMP TABLOSUNDAKİ DEPTNOSU DEPT DEN GELEN DEPTNO YA EŞİT OLAN PERSONELİN DEPTNO BAZINDA ORTALAMA ÜCRETİNİ BULUP YAZMAKTADIR.

SELECT D.DEPTNO,D.DNAME,LOC,(SELECT AVG(SAL) FROM EMP E WHERE E.DEPTNO=D.DEPTNO GROUP BY E.DEPTNO) AVRSAL
FROM DEPT D;

DEPTNO DNAME LOC AVRSAL
--------- -------------- ------------- ---------
10 ACCOUNTING NEW YORK 2916.6667
20 RESEARCH DALLAS 2175
30 SALES CHICAGO 1566.6667
40 OPERATIONS BOSTON

BU SORGUNUN SONUCU AŞAĞIDAKİ SORGU İLE AYNIDIR:

SELECT DEPTNO,AVG(SAL) FROM EMP GROUP BY DEPTNO


DEPTNO AVG(SAL)
--------- ---------
10 2916.6667

Etiketler:
Beğeniler: 0
Favoriler: 0
İzlenmeler: 1002
favori
like
share
hayalll Tarih: 12.09.2008 04:12
teşekkuler paylaştığınız için...
CAKIR1917 Tarih: 06.11.2007 13:21
Çok saol veritabanı kalmıştım çok faydalı hocanın anlattığı şeylerin aslında ne kadar basit olduğunu gösterdin tşk ederim.En yakın zamanad çıktısını alıp başına oturacam.