"EXIST" operator'ü "In" gibi başka bir set-comparison operatörüdür. Bir set'in nonempty olduğunu test etmek için kullanılır. Herbir Sailor S row'u için , R.bid = 103 AND S.sid = R. sid için , set of Reserves rows R nonempty midir diye test ederiz.(Thus, for each Sailor row S, we test whether the set of Reserves rows r such that R.bid = 103 AND S.sid = R. sid is nonempty.) If so , Sailor S has reserved boat 103, and we retrieve the name. The subquery clearly depends on the current row of S and must be reevaluated for each row in Sailors.
Subquery'deki S, (S.sid) correlation diye adlandırılır ve bu gibi queryler de correlated queries olarak adlandırılır. Subquery dışarıdaki query'e bağımlıdır. Bağımlı değilse correlated query değildir.
- Subquery'deki * kullanılmasının amacı qualifying row olup olmadığını check etmek içindir, row'dan bi column retrieve etmek için değildir. Bu good programming style'dır.
- The inner subquery depend on the row that is currently being examined in the outer query.
Başka bir örnek olarak da , NOT EXIST kullanarak , red boat'u reserve etmeyen Sailor'ların isimlerini compute ederiz.
-IN is equal to =ANY
-NOT IN is equal to <>ALL
SQL ' de 5 tane aggregate operation'ı vardır:
1- COUNT (DISTINCT A) : # of unique values in the A column ,
2- SUM (DISTINCT A) : sum of unique values in the A column ,
3- AVG(DISTINCT A) : average of unique values in the A column ,
4- MAX(A) : max value in the A column , (Max veya Min ile DISTINCT keyword'ünü kullanmak not make sense)
5- MIN(A) : min value in the A column ,
Question : Find the name and age of the oldest sailor:
Supposed Solution(Wrong):
SELECT S.sname,MAX(S.age)
FROM Sailors S
The above query is ILLEGAL in Sql !! Eğer SELECT clause'u aggragate operation kullanıyorsa , burada sadece aggregate operationları kullanmak ile sınırlandırılırız. Ama query GROUP BY clause'u içeriyorsa bu sınır kalkar.
Correct Solution:
SELECT S.sname,S.age
FROM SAILORS S
WHERE S.age = ( SELECT MAX(S2.age) -> Buradaki Left-hand side ile Right-hand side yer değişimi
FROM Sailors S2 -> SQL92 de legal'dir ancak çoğu sistemde değildir.
)
Alternative Solution:
LIKE
% -> zero or more character
_ -> exactly 1 character
Not: String'in tırnak içinde yazıldığına dikkat et !!
UNION
- red ve green tırnak içinde yazıldığına dikkat et!
Alternatively;
We can do it with UNION keyword.
Sql'de default ayarlara göre ,yani eğer DISTINCT belirtilmemişse, duplicate'ler eliminate edilmezler.
Ancak Default'a göre UNION'de duplicate'ler eliminate edilir
EXCEPT
Note that UNION, INTERSECT, and EXCEPT can be used on any two tables that are
union-compatible, that is, have the same number of columns and the columns, taken
in order, have the same types.
NESTED QUERIES
- Subquery çoğu zaman WHERE clause'unda olur. Bazen de FROM ve HAVING clause'larında da kullanılır.
ANY
As a further example , using ALL instead of ANY , we find Sailors whose rating is better than every sailor called Horatio.
ALL
More example about nested queries:
Examples about GROUPING & HAVING
http://www.cs.toronto.edu/~avaisman/csc343summer/tutorials/Tutorial_5.pdf
No comments:
Post a Comment