2010年11月2日火曜日

SQL の相関サブクエリ (3) - 量化された比較述語 ALL, ANY



SQL  (2)  EXISTS  


SQL exists  ALL  ANY 

WHERE   XXXX  1 XXXX  

  Wikipedia 

Wiese 2004

 
 
 
1 
 
 
使AB
 
使SQL 

 

ALL, ANY 


SQL-92    "BNF Grammar for ISO/IEC 9075:1992 - Database Language SQL (SQL-92)" 9

<predicate>    ::= 
<comparison predicate> 
     | <between predicate> 
     | <in predicate> 
     | <like predicate> 
     | <null predicate> 
     | <quantified comparison predicate> 
     | <exists predicate> 
     | <match predicate> 
     | <overlaps predicate>
 
 

<quantified comparison predicate>    ::=   <row value constuctor> <comp op> <quantifier> <table subquery>
 
   ALL, SOME  ANY 

<quantifier>    ::=   <all> | <some>

<all>    ::=   ALL 
<some>    ::=   SOME | ANY 
 <comp op>  <table subquery> 

 


 ALL, ANY 使

 
ALL 




 




select age
from persons
where gender = 1


  使 ALL      

select *
from persons as p
where p.gender = 2 and
      p.age > all (select age
                   from persons
                   where gender = 1)




 SQL 

+----+--------+--------+-----+
| id | name   | gender | age |
+----+--------+--------+-----+
|  6 | Sadayo |      2 |  70 |
+----+--------+--------+-----+
1 row in set (0.03 sec)

 ALL 使

 
ANY 

ALL  ANY 









select *
from persons as p
where p.gender = 2 and
      p.age > any (select age
                   from persons
                   where gender = 1)




+----+--------+--------+-----+
| id | name   | gender | age |
+----+--------+--------+-----+
|  2 | Hanako |      2 |  20 |
|  6 | Sadayo |      2 |  70 |
|  7 | Hiroko |      2 |  15 |
+----+--------+--------+-----+
3 rows in set (0.00 sec)


ALL, ANY 

 
Haskell  all, any 

 SQL  Haskell 

[p | p <- persons
   , gender p == 2
   , all (\p' -> age p > age p') 
         [p | p <- persons
            , gender p == 1]]


( cf. gist: 645292 - GitHub )

[p | p <- persons
   , gender p == 2
   , any (\p' -> age p > age p') 
         [p | p <- persons
            , gender p == 1]]


( cf. gist: 645292  GitHub )

 







 




ALL 使


(一)  

(二)   




select *
from persons as p1
where p1.age >= all (select age
                     from persons as p2
                     where p2.gender = p1.gender)


 persons  p1  persons  p2  

p1   p2   

111-01-2010CropperCapture[1]
   gender 



+----+---------+--------+-----+
| id | name    | gender | age |
+----+---------+--------+-----+
|  4 | Saburou |      1 |  40 |
|  6 | Sadayo  |      2 |  70 |
+----+---------+--------+-----+
2 rows in set (0.09 sec)


 
Haskell 

Haskell 
[p1 | p1 <- persons
    , all (\p -> age p1 >= age p)
          [p2 | p2 <- persons , gender p2 == gender p1]]


( cf. gist: 645292  GitHub ) 

 
 max 使



select gender, max(age)
from persons as p
group by gender




+--------+----------+
| gender | max(age) |
+--------+----------+
|      1 |       40 |
|      2 |       70 |
+--------+----------+
2 rows in set (0.09 sec)


  gender  max(age) 

select *
from persons as p1
where exists (select *               
              from (select gender, max(age) as mage
                    from persons as p group by gender) as m where m.gender = p1.gender and m.mage   = p1.age)


使 (+_+)

 ALL 

select *
from persons as p1
where age = (select max(p2.age)
             from persons as p2
             where p2.gender = p1.gender)






 
Haskell 

Haskell 

[p1 | p1 <- persons
    , age p1 == maximum [age p2 | p2 <- persons
                                , gender p2 == gender p1]]


( cf. gist: 645292  GitHub )

SQL  (4) - SELECT 使 



SQL  Wikipedia 

SQL-92 - Wikipedia 

SQL9 SQL 使