Javaããã°ã©ããŒã¯ãã¬ãã«ã«å¿ããŠããªããžã§ã¯ãæåããã³åœä»€åã®æèã劚ããŸãã
-ç¿åŸïŒèª°ã§ãåœä»€çã«ããã°ã©ãã³ã°ã§ããŸãïŒ
-ãã°ãïŒãã³ãã¬ãŒããã©ãã«ã§ãé©çšããŠååãä»ããããã®ãã³ãã¬ãŒãïŒ
-æ°åïŒçã®ãªããžã§ã¯ãã¢ãããŒããé©çšããããšã¯ãåœä»€ãããå°ãé£ããïŒ
ããããJavaéçºè ãSQLã³ãŒããäœæãããšããã¹ãŠãå€ãããŸãã
SQLã¯ããªããžã§ã¯ãæåãŸãã¯åœä»€åã®æèãšã¯é¢ä¿ã®ãªã宣èšåèšèªã§ãã SQã§ãªã¯ãšã¹ããè¡šçŸããããšã¯éåžžã«ç°¡åã§ããããããæ£ç¢ºãã€æé©ã«è¡šçŸããããšã¯ããªãå°é£ã§ãã éçºè ã¯ãããã°ã©ãã³ã°ãã©ãã€ã ãåèããå¿ èŠãããã ãã§ãªããéåè«ã®èŠ³ç¹ããèããå¿ èŠããããŸãã
以äžã¯ãJDBCãŸãã¯jOOQã®SQLã䜿çšããŠJavaéçºè ãç¯ããããããééãã§ãïŒç¹å®ã®é åºãªãïŒã ä»ã®10åã®ãšã©ãŒã«ã€ããŠã¯ããã®èšäºãåç §ããŠãã ãã ã
1. NULLãå¿ãã
NULLã®èª€è§£ã¯ãããããJavaéçºè ãSQLãèšè¿°ãããšãã«ç¯ãæ倧ã®ééãã§ãã ããã¯ãNULLãUNKNOWNãšãåŒã°ãããããããããŸããã åã«UNKNOWNãšåŒã°ããŠããã°ãç解ããããã§ãããã ãã1ã€ã®çç±ã¯ãããŒã¿ãååŸããŠå€æ°ããã€ã³ããããšãJDBCã¯Java NULLã«SQL NULLãåæ ããããã§ãã ããã«ãããNULL = NULLïŒSQLïŒãnull == nullïŒJAVAïŒãšåãããã«åäœããå¯èœæ§ããããŸãã
NULL誀解ã®æãæ確ãªäŸã®1ã€ã¯ã NULLè¿°éšãã¹ããªã³ã°å€åŒã§äœ¿çšãããå Žåã§ãã
å¥ã®ãããå ·äœçãªåé¡ã¯ãNOT IN anti-joinsã®NULLå€ã®ç解ããªãå Žåã«çºçããŸã ã
è¬ïŒ
ããªãèªèº«ãèšç·ŽããŸãã è€éãªããšã¯ãããŸãã-SQLãæžããšãã¯åžžã«NULLã«ã€ããŠèããŠãã ããïŒ
-ãã®è¿°èªã¯NULLã«é¢ããŠæ£ããã§ããïŒ
-NULLã¯ãã®é¢æ°ã®çµæã«åœ±é¿ããŸããïŒ
2. Javaã¡ã¢ãªå ã®ããŒã¿ã®åŠç
å€ãã®Javaããã°ã©ããŒãSQLãããç¥ã£ãŠããããã§ã¯ãããŸããã ã©ã³ãã ã«åå ããå¥åŠãªUNIONãšç³ãåãªãã ãŠã£ã³ããŠé¢æ°ã¯ã©ãã§ããïŒ ã°ã«ãŒãåã»ããïŒ å€ãã®Javaéçºè ã¯SQLããŒã¿ãã¡ã¢ãªã«ããŒãããé©åãªã³ã¬ã¯ã·ã§ã³ã«å€æããåé·ãªåŸªç°æ§é ã䜿çšããŠãããã®ã³ã¬ã¯ã·ã§ã³ã«å¿ èŠãªèšç®ãå®è¡ããŸãïŒå°ãªããšãJAVA 8ã®ã³ã¬ã¯ã·ã§ã³ãæ¹åããããŸã§ïŒã
ãã ããäžéšã®SQLããŒã¿ããŒã¹ã¯ãããã«é©ãããèšè¿°ããããè¿œå ã®ïŒSQLæšæºïŒïŒOLAPé¢æ°ããµããŒãããŠããŸãã 1ã€ã®äŸïŒæšæºã§ã¯ãªãïŒã¯ã Oracleã®åªããMODELã¹ããŒãã¡ã³ãã§ãã ããŒã¿ããŒã¹ã«åŠçãè¡ãããçµæãJavaã¡ã¢ãªã«ãã«ããã ãã§ãã çµå±ãäžéšã®è³¢ã人ããã§ã«ãããã®é«äŸ¡ãªè£œåãæé©åããŠããããã§ãã ãããã£ãŠãããŒã¿ããŒã¹ã§OLAPã䜿çšãããšã次ã®2ã€ã®ããšãåŸãããŸãã
-ã·ã³ãã«ã ãããããJavaãããSQLã§æ£ããèšè¿°ããæ¹ãç°¡åã§ãã
-ããã©ãŒãã³ã¹ã DBã¯ãã¢ã«ãŽãªãºã ãããé«éã§ããå¯èœæ§ããããŸãã ããã«éèŠãªããšã¯ãäœçŸäžãã®ã¬ã³ãŒããæç·ã§ååŸããå¿ èŠããªãããšã§ãã
è¬ïŒ
Javaã䜿çšããŠããŒã¿æåã®ã¢ã«ãŽãªãºã ãäœæãããã³ã«ãããã®äœæ¥ãããŒã¿ããŒã¹ã«ç§»è¡ããããšã¯å¯èœã§ããïŒããšèªåããŠãã ããã
3. UNION ALLã®ä»£ããã«UNIONã䜿çšãã
UNION ALLã«ã¯UNIONã«é¢ããè¿œå ã®åèªãå¿ èŠã§ãããšããäºå®ã«æ¥ããããŸãã SQLæšæºã以äžããµããŒãããããã«å®çŸ©ãããŠããã°ãã¯ããã«åªããŠããŸãã
-UNIONïŒè€è£œãèš±å¯ïŒ
-UNION DISTINCTïŒéè€ãåé€ïŒ
éè€é€å»ã¯ããŸãäžè¬çã«äœ¿çšãããªãã ãã§ãªãã倧ããªãµã³ããªã³ã°çµæã§ã¯ããªãé ãã§ãã 2ã€ã®ãµãã¯ãšãªãé åºä»ãããåã¿ãã«ãåŸç¶ã®ã¿ãã«ãšæ¯èŒããå¿ èŠããããŸãã
SQLæšæºã§INTERSECT ALLããã³EXCEPT ALLãå®çŸ©ãããŠããå Žåã§ãããã¹ãŠã®ããŒã¿ããŒã¹ããããã®äœ¿çšé »åºŠã®äœãæäœã»ãããå®è£ ã§ããããã§ã¯ãªãããšã«æ³šæããŠãã ããã
è¬ïŒ
UNIONãäœæãããã³ã«UNION ALLãäœæãããã©ãããæ€èšããŠãã ããã
4. JDBCã䜿çšããŠå€§ããªãµã³ãã«ãããŒãžåå²ãã
ã»ãšãã©ã®ããŒã¿ããŒã¹ã¯ãLIMIT ... OFFSETãTOP ... START ATãOFFSET ... FETCHæŒç®åã䜿çšããŠãããçš®ã®ããŒãžããŒã·ã§ã³ããµããŒãããŠããŸãã ãããã®ã¹ããŒãã¡ã³ãããµããŒããããŠããªãå Žåã§ãã ROWNUMïŒOracleïŒãŸãã¯ROW_NUMBERïŒïŒOVERïŒïŒãã£ã«ã¿ãªã³ã°ïŒDB2ãSQL Server 2008ãªã©ïŒãååšããå¯èœæ§ããããŸãã ããã¯äž»ã«å€§ããªå€äœã«é©çšãããŸãïŒ
è¬ïŒ
ãããã®æŒç®åããŸãã¯ãããã®æŒç®åãæš¡å£ã§ããããŒã«ïŒjOOQãªã©ïŒã䜿çšããŠãã ããã
5. Javaã¡ã¢ãªã§ã®ããŒã¿æ¥ç¶
SQLã®åæããçŸåšãŸã§ãäžéšã®éåãªJavaããã°ã©ããŒã¯JOINãäœæããŸãã JOINã®å®è¡é床ãé ããšããæ代é ãã®æãããããŸãã ããã¯ããªãŒããŒããããªããã£ãã€ã¶ãŒããçµåãããããŒãã«ã®ã»ã«ãäœæããåã«ããŒãã«å šäœãã¡ã¢ãªã«ããŒãããããšã«ããããã¹ããããã«ãŒããäœæããããšãéžæããå Žåã«è©²åœããŸãã ããããããã¯ãã£ãã«èµ·ãããŸããã éåžžã®è¿°èªãå¶éãã€ã³ããã¯ã¹ãMERGE JOINãŸãã¯HASH JOINæäœã¯éåžžã«é«éã§ã-ããã¯ãã¹ãŠæ£ããã¡ã¿ããŒã¿ã«äŸåããŸãïŒ Tom Kyteã¯ããã«ã€ããŠããæžããŠããŸã ïŒã ãã ãã2ã€ã®å¥ã ã®ã¯ãšãªã䜿çšããŠ2ã€ã®ããŒãã«ãããŒãããäœããã®æ¹æ³ã§Javaã¡ã¢ãªã«çµåããJavaéçºè ã¯ãŸã ã»ãšãã©ããªãã§ãããã
è¬ïŒ
ããŸããŸãªæ®µéã§ããŸããŸãªè¡šããéžæããå ŽåãããäžåºŠèãçŽããŠãã ãããçªç¶ãèŠæ±ã1ã€è¡šçŸã§ããŸãã
6. DISTINCTãŸãã¯UNIONã䜿çšããŠãã©ã³ãã ãªãã«ã«ãç©ããéè€ãåé€ãã
è€éãªçµåïŒJOINïŒã«ãããéçºè ã¯æå³ã®ããSQLã¯ãšãªé¢ä¿ã远跡ã§ããªããªããŸãã ããå ·äœçã«ã¯ãè€åå€éšããŒãšã®é¢ä¿ã䜿çšããå ŽåãJOIN ... ONã¹ããŒãã¡ã³ãã«æå³ã®ããè¿°éšãè¿œå ããããšãå¿ããå ŽåããããŸãã ããã«ãããæååãåžžã«éè€ããããäŸå€çãªç¶æ³ã§ã®ã¿éè€ããå¯èœæ§ããããŸãã ãã®åŸãäžéšã®éçºè ã¯DISTINCTã¹ããŒãã¡ã³ããè¿œå ããŠãããŒã¿ã®è€è£œãåæ¢ããŸãã ããã¯3ã€ã®çç±ã§æ£ãããããŸããã
ãçµæãçãããšã¯ã§ããŸãããåå ãçãããšã¯ã§ããŸãããã ããã§ããããã¯å¢çæ¡ä»¶ã®äžã§çµæã解決ããªããããããŸããã
-ããã¯ã倧èŠæš¡ãªãµã³ãã«ã§ã¯æéãããããŸãã DISTINCTã¯ãORDER BYæäœãå®è¡ããŠéè€ãåé€ããŸãã
-ããã¯ãã¡ã¢ãªã«ããŒãããããã«ã«ãã®å€§èŠæš¡ãªäœåã®å Žåã¯é ãã§ãã
è¬ïŒ
äžè¬ã«ãäžèŠãªéè€ãçºçããå Žåã¯ãJOINè¿°èªãä¿®æ£ããŸãã ããããã©ããã§å°ããªãã«ã«ãç©ã圢æãããã§ãããã
7. MERGEã¹ããŒãã¡ã³ãã®åé¿
ããã¯å®éã«ã¯ééãã§ã¯ãããŸãããããããã匷åãªMERGEãªãã¬ãŒã¿ãŒã®ç¥èãææã®æ¬ åŠã§ãã äžéšã®ããŒã¿ããŒã¹ã¯ãä»ã®åœ¢åŒã®UPSERTã¹ããŒãã¡ã³ããããšãã°MySQL ON DUPLICATE KEY UPDATEãèªèããŠããŸãã å®éãMERGEã¯ãç¹ã«SQL Serverãªã©ã®SQLæšæºãå€§å¹ ã«æ¡åŒµããããŒã¿ããŒã¹ã§ã¯ãéåžžã«åŒ·åã§ãã
è¬ïŒ
INSERTãšUPDATEãŸãã¯SELECT ... FOR UPDATEãšINSERT / UPDATEã®ãã§ãŒã³ãæ§ç¯ããŠUPSERTãå®è¡ããŠããå Žåã¯ãããäžåºŠèããŠãã ããã ãªãœãŒã¹ã奪ãåããªã¹ã¯ãåã代ããã«ãããåçŽãªMERGEãªã¯ãšã¹ããæžãããšãã§ããŸãã
8.ãŠã£ã³ããŠé¢æ°ã®ä»£ããã«éçŽé¢æ°ã䜿çšãã
ãŠã£ã³ããŠé¢æ°ãåºçŸããåã¯ãSQLã§ããŒã¿ãéèšããå¯äžã®æ¹æ³ã¯ãGROUP BYãæ圱ã§éèšé¢æ°ãšãšãã«äœ¿çšããããšã§ããã ããã¯ã»ãšãã©ã®å Žåã«ããŸãæ©èœããéçŽããŒã¿ã«éåžžã®ããŒã¿ãå ¥åããå¿ èŠãããå Žåãã°ã«ãŒãåãããã¯ãšãªãæ·»ä»ã¯ãšãªã«æžã蟌ãããšãã§ããŸãã
ãã ããSQLïŒ2003ã§ã¯ãå€ãã®ããŒã¿ããŒã¹ãããã€ããŒã«ãã£ãŠå®è£ ããããŠã£ã³ããŠé¢æ°ãå®çŸ©ãããŠããŸãã ãŠã£ã³ããŠé¢æ°ã¯ãã°ã«ãŒãåãããŠããªããµã³ãã«ã®ããŒã¿ãéèšã§ããŸãã å®éãåãŠã£ã³ããŠé¢æ°ã¯ç¬èªã®PARTITION BYæäœããµããŒãããŠããŸããããã¯ãã¬ããŒããäœæããããã®åªããããŒã«ã§ãã
ãŠã£ã³ããŠé¢æ°ã䜿çšãããšã次ã®ããšãå¯èœã«ãªããŸãã
-ããèªã¿ãããSQLãäœæããŸãïŒãµãã¯ãšãªã§åŒ·èª¿è¡šç€ºãããŠããªãGROUP BYåŒïŒ
-以æ¥ã®ããã©ãŒãã³ã¹ã®æ¹å RDBMSã¯ãŠã£ã³ããŠé¢æ°ãããç°¡åã«æé©åã§ããŸã
è¬ïŒ
ãµãã¯ãšãªã§GROUP BYåŒãèšè¿°ããå ŽåããŠã£ã³ããŠé¢æ°ã§è¡šçŸã§ãããã©ãããèããŸããïŒ
9.ããŸããŸãªãã©ã¡ãŒã¿ãŒã§ã¡ã¢ãªå ã®äžŠã¹æ¿ãã䜿çšãã
ORDER BYæŒç®åã¯ãCASEãå«ãå€ãã®ã¿ã€ãã®åŒããµããŒãããŸããããã¯ããœãŒããã©ã¡ãŒã¿ãŒãå®çŸ©ãããšãã«éåžžã«äŸ¿å©ã§ãã 次ã®çç±ã ãã§ãJavaã¡ã¢ãªå ã®ããŒã¿ããœãŒãããªãã§ãã ããã
-SQLã®ãœãŒããé ãããã
-SQLãœãŒãã§ã¯ãããã§ããŸããã
è¬ïŒ
Javaã¡ã¢ãªå ã®SQLããŒã¿ã䞊ã¹æ¿ããå Žåããã®äžŠã¹æ¿ããããŒã¿ããŒã¹ã«è»¢éã§ãããã©ãããèããŠãã ããã ããã¯ãããŒã¿ããŒã¹ã®ããŒãžããŒã·ã§ã³ã«é©ããŠããŸãã
10.è€æ°ã®ã¬ã³ãŒããäžåºŠã«1ã€ãã€æ¿å ¥ããŸã
JDBCã¯ããããšã¯äœããç¥ã£ãŠããã®ã§ãããã䜿çšããå¿ èŠããããŸãã æ°åã®ã¬ã³ãŒãã次ã ã«æ¿å ¥ããªãã§ãã ãããæ¯åæ°ããPreparedStatementãäœæããŸãã ãã¹ãŠã®ã¬ã³ãŒãã1ã€ã®ããŒãã«ã«ç§»åããå Žåã1ã€ã®SQLã¯ãšãªãšè€æ°ã®é¢é£ããŒã¿ã»ããã䜿çšããŠãINSERTã¯ãšãªã®ããããäœæããŸãã ããŒã¿ããŒã¹ãšãã®æ§æã«ãã£ãŠã¯ãUNDOãã°ãã¯ãªãŒã³ã«ä¿ã€ããã«ãäžå®æ°ã®ã¬ã³ãŒããæ¿å ¥ãããåŸã«ã³ãããããå¿ èŠãããå ŽåããããŸãã
è¬ïŒ
åžžã«å€§ããªããŒã¿ã»ããã®ãããæ¿å ¥ã䜿çšããŸãã
ãããã¯ã«é¢ããããã€ãã®èå³æ·±ãæ¬
-Bill Karwinã«ããSQLã¢ã³ããã¿ãŒã³
-Markus Winandã«ããSQLããã©ãŒãã³ã¹ã®èª¬æ