åã®ããŒã
- ããŒã1-habrahabr.ru/post/255361
- ããŒã2-habrahabr.ru/post/255523
- ããŒã3-habrahabr.ru/post/255825
ãã®éšåã§ã¯ãèæ ®ããŸã
ãã«ãããŒãã«ã¯ãšãªïŒ
- ããŒãã«çµåçµå-çµå
- WHEREå¥ã䜿çšããŠããŒãã«ããªã³ã¯ãã
- åçŽããŒãžã¯ãšãªã®çµæ-UNION
ãµãã¯ãšãªã䜿çšããïŒ
- FROMãSELECTãããã¯ã®ãµãã¯ãšãª
- APPLYã³ã³ã¹ãã©ã¯ãã®ãµãã¯ãšãª
- WITHå¥ã䜿çšãã
- WHEREãããã¯ã®ãµãã¯ãšãªïŒ
- ã°ã«ãŒãæ¯èŒ-ALLãANY
- ååšããæ¡ä»¶
- æ¡ä»¶IN
ããã€ãã®æ°ããããŒã¿ãè¿œå ããŸãã
ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ã®ããã«ãããã€ãã®éšéãšæçš¿ãè¿œå ããŸãã
SET IDENTITY_INSERT Departments ON INSERT Departments(ID,Name) VALUES(4,N' ') INSERT Departments(ID,Name) VALUES(5,N'') SET IDENTITY_INSERT Departments OFF
SET IDENTITY_INSERT Positions ON INSERT Positions(ID,Name) VALUES(5,N'') INSERT Positions(ID,Name) VALUES(6,N'') INSERT Positions(ID,Name) VALUES(7,N'') SET IDENTITY_INSERT Positions OFF
JOINæ¥ç¶-æ°Žå¹³ããŒã¿æ¥ç¶æäœ
ããã§ã¯ãããŒã¿ããŒã¹æ§é ã®ç¥èãããªãã¡ ãã®äžã«ããããŒãã«ããããã®ããŒãã«ã«ä¿åãããŠããããŒã¿ãããã³ããŒãã«ã®ã©ã®ãã£ãŒã«ããé¢é£ããŠãããã ãŸããããŒã¿ããŒã¹ã®æ§é ãåžžã«åŸ¹åºçã«ç 究ããŸãã éåžžã®ã¯ãšãªã¯ãã©ãããæ¥ãã®ããããã£ãŠããå Žåã«ã®ã¿èšè¿°ã§ããŸãã ç§ãã¡ã®æ§é ã¯ãåŸæ¥å¡ãéšçœ²ã圹è·ã®3ã€ã®ããŒãã«ã§æ§æãããŠããŸãã ãããæåã®éšåã®å³ã§ãïŒ

RDBã®æ¬è³ªãåå²ããŠåŸæããããšã§ããå Žåãã¢ãœã·ãšãŒã·ã§ã³ã®æäœã®æ¬è³ªã¯ãããŒãã«ã§åå²ãããããŒã¿ãåã³æ¥çããããšã§ãã ãããã人éã®åœ¢ã«æ»ããŸãã
ç°¡åã«èšãã°ãããŒãã«ãä»ã®ããŒãã«ãšæ°Žå¹³æ¹åã«çµåããæäœã¯ãããããæ¬ èœããŠããããŒã¿ãååŸããããã«äœ¿çšãããŸãã åŸæ¥å¡è¡šããã®èŠæ±ã«å¿ããŠãæçµçµæãååŸããããã«Departmentsè¡šã«Department Nameãã£ãŒã«ãããªãã£ãå Žåã®ããã£ã¬ã¯ã¿ãŒã®é±æ¬¡ã¬ããŒãã®äŸãæãåºããŠãã ããã
çè«ããå§ããŸãããã æ¥ç¶ã«ã¯5ã€ã®ã¿ã€ãããããŸãã
- JOIN -left_table JOIN right_table ON join_condition
- LEFT JOIN -left_table LEFT JOIN right_table ON join_conditions
- RIGHT JOIN -left_table RIGHT JOIN right_table ON join_conditions
- FULL JOIN -left_table FULL JOIN right_table ON join_condition
- CROSS JOIN -left_table CROSS JOIN right_table
çãæ§æ | å®å šãªæ§æ | 説æïŒããã¯èª°ããããã«æ確ã«ãªããšã¯éããŸããããããã£ãŠãæ確ã§ãªãå Žåã¯ãäŸã確èªããŠããããã«æ»ã£ãŠãã ãããïŒ |
---|---|---|
åå ãã | ã€ã³ããŒãžã§ã€ã³ | left_tableããã³right_tableã®è¡ãããçµåæ¡ä»¶ãè¿ãè¡ã®ã¿ãçµåãããŸãã |
å·Šããåå | å·Šå€éšçµå | left_tableã®ãã¹ãŠã®è¡ãè¿ãããŸãïŒããŒã¯ãŒãLEFTïŒã å³ããŒãã«ã®ããŒã¿ã¯ãjoin_æ¡ä»¶ãæºããããŠããå·ŠããŒãã«ã®è¡ã«ãã£ãŠã®ã¿è£å®ãããŸãã æ¬ èœããŒã¿ã®å Žåãright_tableè¡ã®ä»£ããã«NULLå€ãæ¿å ¥ãããŸãã |
æ£ããåå | å³ã¢ãŠã¿ãŒãžã§ã€ã³ | right_tableã®ãã¹ãŠã®è¡ãè¿ãããŸãïŒããŒã¯ãŒãRIGHTïŒã join_æ¡ä»¶ãæºããããŠããå·ŠåŽã®ããŒãã«è¡ã®ã¿ãå·ŠåŽã®ããŒãã«ããŒã¿ã§è£å®ãããŸãã æ¬ èœããŒã¿ã®å Žåãleft_tableè¡ã®ä»£ããã«NULLå€ãæ¿å ¥ãããŸãã |
å®å šåå | ãã«ã¢ãŠã¿ãŒãžã§ã€ã³ | left_tableããã³right_tableã®ãã¹ãŠã®è¡ãè¿ãããŸãã left_tableããã³right_tableã®è¡ã«ã€ããŠjoin_æ¡ä»¶ãæºããããå Žåããããã¯1ã€ã®è¡ã«çµåãããŸãã join_æ¡ä»¶ãæºããããªãè¡ã®å Žåãè¡å ã®ã©ã®ããŒãã«ã®ããŒã¿ãå©çšã§ããªããã«å¿ããŠãleft_tableã®å ŽæãŸãã¯right_tableã®å Žæã«NULLå€ãæ¿å ¥ãããŸãã |
ã¯ãã¹ãžã§ã€ã³ | - | left_tableã®åè¡ããright_tableã®ãã¹ãŠã®è¡ãšçµã¿åãããŸãã ãã®ã¿ã€ãã®ååç©ã¯ããã«ã«ãç©ãšåŒã°ããããšããããŸãã |
è¡šãããããããã«ãçãæ§æã®å®å šãªæ§æã¯ãINNERãŸãã¯OUTERãšããåèªã®ååšã®ã¿ãç°ãªããŸãã
å人çã«ã¯ãã¯ãšãªãäœæãããšãã¯åžžã«æ¬¡ã®çç±ã§çãæ§æã®ã¿ã䜿çšããŸãã
- ããã¯çããäžèŠãªåèªã§ã¯ãšãªãè©°ãŸãããŸããã
- LEFTãRIGHTãFULLããã³CROSSã«ãããšãJOINã®å Žåãã©ã®ãããªæ¥ç¶ã«ã€ããŠè©±ããŠããã®ããæ確ã§ãã
- ãã®å Žåã®INNERãšOUTERãšããèšèã¯ãåå¿è ãããæ··ä¹±ãããäžå¿ èŠãªåæ©çãªãã®ã ãšæããŸãã
ãããããã¡ãããããã¯ç§ã®å人çãªå¥œã¿ã§ããããããã誰ããé·ãéæžãã®ã奜ãã§ã圌ã¯ããã«åœŒã®é åãèŠãŠããŸãã
åã¿ã€ãã®æ¥ç¶ãç解ããããšã¯éåžžã«éèŠã§ãããªããªãã ç¹å®ã®ã¿ã€ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã¯ãšãªçµæãç°ãªãå ŽåããããŸãã å¥ã®çš®é¡ã®æ¥ç¶ã䜿çšããŠåãã¯ãšãªã®çµæãæ¯èŒããä»ã®ãšããéãã確èªããŠå ã«é²ã¿ãŸãïŒããã«æ»ããŸãïŒã
-- JOIN 5 SELECT emp.ID,emp.Name,emp.DepartmentID,dep.ID,dep.Name FROM Employees emp JOIN Departments dep ON emp.DepartmentID=dep.ID
ID | ãåå | DepartmentID | ID | ãåå |
---|---|---|---|---|
1000 | ã€ã¯ããI.I. | 1 | 1 | éå¶ |
1001 | ããããP.P. | 3 | 3 | IT |
1002 | ã·ãããS.S. | 2 | 2 | ç°¿èš |
1003 | ã¢ã³ãã¬ãšãA.A. | 3 | 3 | IT |
1004 | ãã³ã©ãšãN.N. | 3 | 3 | IT |
-- LEFT JOIN 6 SELECT emp.ID,emp.Name,emp.DepartmentID,dep.ID,dep.Name FROM Employees emp LEFT JOIN Departments dep ON emp.DepartmentID=dep.ID
ID | ãåå | DepartmentID | ID | ãåå |
---|---|---|---|---|
1000 | ã€ã¯ããI.I. | 1 | 1 | éå¶ |
1001 | ããããP.P. | 3 | 3 | IT |
1002 | ã·ãããS.S. | 2 | 2 | ç°¿èš |
1003 | ã¢ã³ãã¬ãšãA.A. | 3 | 3 | IT |
1004 | ãã³ã©ãšãN.N. | 3 | 3 | IT |
1005 | ã¢ã¬ã¯ãµã³ãããA.A. | ãã« | ãã« | ãã« |
-- RIGHT JOIN 7 SELECT emp.ID,emp.Name,emp.DepartmentID,dep.ID,dep.Name FROM Employees emp RIGHT JOIN Departments dep ON emp.DepartmentID=dep.ID
ID | ãåå | DepartmentID | ID | ãåå |
---|---|---|---|---|
1000 | ã€ã¯ããI.I. | 1 | 1 | éå¶ |
1002 | ã·ãããS.S. | 2 | 2 | ç°¿èš |
1001 | ããããP.P. | 3 | 3 | IT |
1003 | ã¢ã³ãã¬ãšãA.A. | 3 | 3 | IT |
1004 | ãã³ã©ãšãN.N. | 3 | 3 | IT |
ãã« | ãã« | ãã« | 4 | ããŒã±ãã£ã³ã°ãšåºå |
ãã« | ãã« | ãã« | 5 | ç©æµ |
-- FULL JOIN 8 SELECT emp.ID,emp.Name,emp.DepartmentID,dep.ID,dep.Name FROM Employees emp FULL JOIN Departments dep ON emp.DepartmentID=dep.ID
ID | ãåå | DepartmentID | ID | ãåå |
---|---|---|---|---|
1000 | ã€ã¯ããI.I. | 1 | 1 | éå¶ |
1001 | ããããP.P. | 3 | 3 | IT |
1002 | ã·ãããS.S. | 2 | 2 | ç°¿èš |
1003 | ã¢ã³ãã¬ãšãA.A. | 3 | 3 | IT |
1004 | ãã³ã©ãšãN.N. | 3 | 3 | IT |
1005 | ã¢ã¬ã¯ãµã³ãããA.A. | ãã« | ãã« | ãã« |
ãã« | ãã« | ãã« | 4 | ããŒã±ãã£ã³ã°ãšåºå |
ãã« | ãã« | ãã« | 5 | ç©æµ |
-- CROSS JOIN 30 - (6 Employees) * (5 Departments) SELECT emp.ID,emp.Name,emp.DepartmentID,dep.ID,dep.Name FROM Employees emp CROSS JOIN Departments dep
ID | ãåå | DepartmentID | ID | ãåå |
---|---|---|---|---|
1000 | ã€ã¯ããI.I. | 1 | 1 | éå¶ |
1001 | ããããP.P. | 3 | 1 | éå¶ |
1002 | ã·ãããS.S. | 2 | 1 | éå¶ |
1003 | ã¢ã³ãã¬ãšãA.A. | 3 | 1 | éå¶ |
1004 | ãã³ã©ãšãN.N. | 3 | 1 | éå¶ |
1005 | ã¢ã¬ã¯ãµã³ãããA.A. | ãã« | 1 | éå¶ |
1000 | ã€ã¯ããI.I. | 1 | 2 | ç°¿èš |
1001 | ããããP.P. | 3 | 2 | ç°¿èš |
1002 | ã·ãããS.S. | 2 | 2 | ç°¿èš |
1003 | ã¢ã³ãã¬ãšãA.A. | 3 | 2 | ç°¿èš |
1004 | ãã³ã©ãšãN.N. | 3 | 2 | ç°¿èš |
1005 | ã¢ã¬ã¯ãµã³ãããA.A. | ãã« | 2 | ç°¿èš |
1000 | ã€ã¯ããI.I. | 1 | 3 | IT |
1001 | ããããP.P. | 3 | 3 | IT |
1002 | ã·ãããS.S. | 2 | 3 | IT |
1003 | ã¢ã³ãã¬ãšãA.A. | 3 | 3 | IT |
1004 | ãã³ã©ãšãN.N. | 3 | 3 | IT |
1005 | ã¢ã¬ã¯ãµã³ãããA.A. | ãã« | 3 | IT |
1000 | ã€ã¯ããI.I. | 1 | 4 | ããŒã±ãã£ã³ã°ãšåºå |
1001 | ããããP.P. | 3 | 4 | ããŒã±ãã£ã³ã°ãšåºå |
1002 | ã·ãããS.S. | 2 | 4 | ããŒã±ãã£ã³ã°ãšåºå |
1003 | ã¢ã³ãã¬ãšãA.A. | 3 | 4 | ããŒã±ãã£ã³ã°ãšåºå |
1004 | ãã³ã©ãšãN.N. | 3 | 4 | ããŒã±ãã£ã³ã°ãšåºå |
1005 | ã¢ã¬ã¯ãµã³ãããA.A. | ãã« | 4 | ããŒã±ãã£ã³ã°ãšåºå |
1000 | ã€ã¯ããI.I. | 1 | 5 | ç©æµ |
1001 | ããããP.P. | 3 | 5 | ç©æµ |
1002 | ã·ãããS.S. | 2 | 5 | ç©æµ |
1003 | ã¢ã³ãã¬ãšãA.A. | 3 | 5 | ç©æµ |
1004 | ãã³ã©ãšãN.N. | 3 | 5 | ç©æµ |
1005 | ã¢ã¬ã¯ãµã³ãããA.A. | ãã« | 5 | ç©æµ |
ããŒãã«ã®ãšã€ãªã¢ã¹ãèŠãããšãã§ã
2çªç®ã®ããŒãã®åé ã§èª¬æããããŒãã«ã®ãšã€ãªã¢ã¹ã«ã€ããŠæãåºããŠãã ããã
ãã«ãããŒãã«ã¯ãšãªã§ã¯ããšã€ãªã¢ã¹ã¯ãã£ãŒã«ãã®ååŸå ã®ããŒãã«ãæ瀺çã«ç€ºãã®ã«åœ¹ç«ã¡ãŸãã äŸãèŠãŠã¿ãŸãããïŒ
SELECT emp.ID,emp.Name,emp.DepartmentID,dep.ID,dep.Name FROM Employees emp JOIN Departments dep ON emp.DepartmentID=dep.ID
åŸæ¥å¡ãšéšéã®äž¡æ¹ã®ããŒãã«ã«ãIDãšNameãšããååã®ãã£ãŒã«ããå«ãŸããŠããŸãã ãããŠããããåºå¥ããããã«ããã£ãŒã«ãåã®åã«ãšã€ãªã¢ã¹ãšããããä»ããŸãã ãEmp.IDãããemp.Nameãããdep.IDãããdep.Nameãã
ãšã€ãªã¢ã¹ããªããã°ããªã¯ãšã¹ãã¯æ¬¡ã®ããã«ãªããããçããšã€ãªã¢ã¹ã䜿çšããæ¹ã䟿å©ãªçç±ãæãåºããŠãã ããã
SELECT Employees.ID,Employees.Name,Employees.DepartmentID,Departments.ID,Departments.Name FROM Employees JOIN Departments ON Employees.DepartmentID=Departments.ID
ç§ã«ãšã£ãŠã¯ãèªãã®ãéåžžã«é·ããæªããªã£ãŠããŸãã ãã£ãŒã«ãåã¯ãéè€ããããŒãã«åã®éã§èŠèŠçã«å€±ãããŸãã
ãã«ãããŒãã«ã¯ãšãªã§ã¯ããšã€ãªã¢ã¹ãªãã§ååãæå®ã§ããŸããã2çªç®ã®ããŒãã«ã§ååãéè€ããŠããªãå Žåã¯ãæ¥ç¶ã®å Žåã¯åžžã«ãšã€ãªã¢ã¹ã䜿çšããããšããå§ãããŸãã åãååã®ãã£ãŒã«ããæéã®çµéãšãšãã«2çªç®ã®ããŒãã«ã«è¿œå ãããªãããšã誰ãä¿èšŒãããã¯ãšãªã¯åçŽã«å£ãããã®ãã£ãŒã«ããã©ã®ããŒãã«ãåç §ããŠããã®ãç解ã§ããªããšèªããŸãã
ãšã€ãªã¢ã¹ã®ã¿ã䜿çšãããšãããŒãã«ãããèªäœã«çµåã§ããŸãã ã¿ã¹ã¯ã¯ãååŸæ¥å¡ã®çŽåã«åãå ¥ããããåŸæ¥å¡ã®ããŒã¿ãååŸããããšã§ãã£ããšæ³å®ããŸãïŒåŸæ¥å¡çªå·ã¯1æžããŸãïŒã åŸæ¥å¡çªå·ãé çªã«çºè¡ãããç©Žã空ããŠããªãå Žåãããã次ã®ããã«ãããå®è¡ã§ããŸãã
SELECT e1.ID EmpID1, e1.Name EmpName1, e2.ID EmpID2, e2.Name EmpName2 FROM Employees e1 LEFT JOIN Employees e2 ON e1.ID=e2.ID+1 --
ã€ãŸã ããã«Employeesã®1ã€ã®ããŒãã«ãããããšã€ãªã¢ã¹ãe1ããš2çªç®ã®ãe2ããæå®ããŸããã
åã¿ã€ãã®æ°Žå¹³æ¥ç¶ãå解ããŸã
ãã®ç®çã®ããã«ãLeftTableããã³RightTableãšåŒã°ãã2ã€ã®å°ããªæœè±¡ããŒãã«ãæ€èšããŸãã
CREATE TABLE LeftTable( LCode int, LDescr varchar(10) ) GO CREATE TABLE RightTable( RCode int, RDescr varchar(10) ) GO INSERT LeftTable(LCode,LDescr)VALUES (1,'L-1'), (2,'L-2'), (3,'L-3'), (5,'L-5') INSERT RightTable(RCode,RDescr)VALUES (2,'B-2'), (3,'B-3'), (4,'B-4')
ãããã®è¡šã®å 容ãèŠãŠã¿ãŸãããã
SELECT * FROM LeftTable
LCode | LDescr |
---|---|
1 | L-1 |
2 | L-2 |
3 | L-3 |
5 | L-5 |
SELECT * FROM RightTable
RCode | RDescr |
---|---|
2 | B-2 |
3 | B-3 |
4 | B-4 |
åå ãã
SELECT l.*,r.* FROM LeftTable l JOIN RightTable r ON l.LCode=r.RCode
LCode | LDescr | RCode | RDescr |
---|---|---|---|
2 | L-2 | 2 | B-2 |
3 | L-3 | 3 | B-3 |
ããã§ã¯ãæ¡ä»¶ãæºããããæååçµåãè¿ãããŸããïŒl.LCode = r.RCodeïŒ

å·Šããåå
SELECT l.*,r.* FROM LeftTable l LEFT JOIN RightTable r ON l.LCode=r.RCode
LCode | LDescr | RCode | RDescr |
---|---|---|---|
1 | L-1 | ãã« | ãã« |
2 | L-2 | 2 | B-2 |
3 | L-3 | 3 | B-3 |
5 | L-5 | ãã« | ãã« |
ããã§ã¯ãLeftTableã®ãã¹ãŠã®è¡ãè¿ãããæ¡ä»¶ãæºããããRightTableããã®è¡ããŒã¿ã«ãã£ãŠè£å®ãããŸããïŒl.LCode = r.RCodeïŒ

æ£ããåå
SELECT l.*,r.* FROM LeftTable l RIGHT JOIN RightTable r ON l.LCode=r.RCode
LCode | LDescr | RCode | RDescr |
---|---|---|---|
2 | L-2 | 2 | B-2 |
3 | L-3 | 3 | B-3 |
ãã« | ãã« | 4 | B-4 |
ããã§ã¯ãæ¡ä»¶ãæºããããLeftTableã®è¡ããŒã¿ã§è£å®ããããã¹ãŠã®RightTableè¡ãè¿ãããŸããïŒl.LCode = r.RCodeïŒ

å®éãLeftTableãšRightTableãé©åã«åé 眮ãããšãå·Šçµåã䜿çšããŠåæ§ã®çµæãåŸãããŸãã
SELECT l.*,r.* FROM RightTable r LEFT JOIN LeftTable l ON l.LCode=r.RCode
LCode | LDescr | RCode | RDescr |
---|---|---|---|
2 | L-2 | 2 | B-2 |
3 | L-3 | 3 | B-3 |
ãã« | ãã« | 4 | B-4 |
LEFT JOINãã€ãŸã æåã«ãã©ã®ããŒãã«ããŒã¿ãç§ã«ãšã£ãŠéèŠã§ããããèãã次ã«ã©ã®ããŒãã«ãè£å®ããŒãã«ã®åœ¹å²ãæããããèããŸãã
FULL JOINã¯ãæ¬è³ªçã«LEFT JOINãšRIGHT JOINã®åæåå ã§ãã
SELECT l.*,r.* FROM LeftTable l FULL JOIN RightTable r ON l.LCode=r.RCode
LCode | LDescr | RCode | RDescr |
---|---|---|---|
1 | L-1 | ãã« | ãã« |
2 | L-2 | 2 | B-2 |
3 | L-3 | 3 | B-3 |
5 | L-5 | ãã« | ãã« |
ãã« | ãã« | 4 | B-4 |
LeftTableãšRightTableã®ãã¹ãŠã®è¡ãè¿ãããŸãã æ¡ä»¶ãæºããããè¡ïŒl.LCode = r.RCodeïŒã¯ã1è¡ã«çµåãããŸããã å·ŠåŽãŸãã¯å³åŽã®æ¬ èœããŒã¿ã«ã¯NULLå€ãå ¥åãããŸãã

ã¯ãã¹ãžã§ã€ã³
SELECT l.*,r.* FROM LeftTable l CROSS JOIN RightTable r
LCode | LDescr | RCode | RDescr |
---|---|---|---|
1 | L-1 | 2 | B-2 |
2 | L-2 | 2 | B-2 |
3 | L-3 | 2 | B-2 |
5 | L-5 | 2 | B-2 |
1 | L-1 | 3 | B-3 |
2 | L-2 | 3 | B-3 |
3 | L-3 | 3 | B-3 |
5 | L-5 | 3 | B-3 |
1 | L-1 | 4 | B-4 |
2 | L-2 | 4 | B-4 |
3 | L-3 | 4 | B-4 |
5 | L-5 | 4 | B-4 |
LeftTableã®åè¡ã¯ãRightTableã®ãã¹ãŠã®è¡ã®ããŒã¿ã«æ¥ç¶ãããŠããŸãã

Employeesããã³DepartmentsããŒãã«ã«æ»ããŸã
æ°Žå¹³æ¹åã®ãžã§ã€ã³ããã©ã®ããã«æ©èœããããç解ããŠãã ããã ãã®å Žåã¯ããJOINæ¥ç¶-æ°Žå¹³æ¹åã®ããŒã¿æ¥ç¶æäœãã»ã¯ã·ã§ã³ã®æåã«æ»ã£ãŠãEmployeesããŒãã«ãšDepartmentsããŒãã«ãèªåã§çµåããäŸãç解ããŠãããããã«æ»ã£ãŠè°è«ããŠãã ããã
åãªã¯ãšã¹ãã®æŠèŠãèŠçŽããŠã¿ãŸãããã
ãªã¯ãšã¹ã | ãŸãšã |
---|---|
| æ¬è³ªçã«ããã®ã¯ãšãªã¯ãDepartmentIDå€ãæå®ãããŠããåŸæ¥å¡ã®ã¿ãè¿ããŸãã
ã€ãŸã ä»»æã®éšéã«ç»é²ãããŠããåŸæ¥å¡ïŒextrathatsãé€ãïŒã®ããŒã¿ãå¿ èŠãªå Žåã«ããã®æ¥ç¶ã䜿çšã§ããŸãã |
| ãã¹ãŠã®åŸæ¥å¡ãè¿ããŸãã DepartmentIDãæããªãåŸæ¥å¡ã®å Žåããdep.IDãããã³ãdep.Nameããã£ãŒã«ãã«ã¯NULLãå«ãŸããŸãã
ISNULLïŒdep.Nameã 'off-state'ïŒãªã©ã䜿çšããŠãå¿ èŠã«å¿ããŠNULLå€ãåŠçã§ããããšã«æ³šæããŠãã ããã ãã®ã¿ã€ãã®æ¥ç¶ã¯ãããšãã°çµŠäžãèšç®ããããã®ãªã¹ããååŸãããªã©ããã¹ãŠã®åŸæ¥å¡ã®ããŒã¿ãååŸããããšãéèŠãªå Žåã«äœ¿çšã§ããŸãã |
| ããã§ãå·ŠåŽã«ç©ŽããããŸãã éšçœ²ããããŸããããã®éšçœ²ã«ã¯åŸæ¥å¡ã¯ããŸããã
ãã®ãããªæ¥ç¶ã¯ãããšãã°ãã©ã®éšéãšèª°ãå æãããã©ã®éšéããŸã 圢æãããŠããªããã調ã¹ãå¿ èŠãããå Žåã«äœ¿çšã§ããŸãã ãã®æ å ±ã䜿çšããŠãéšéã圢æããæ°ããåŸæ¥å¡ãæ€çŽ¢ããåãå ¥ããããšãã§ããŸãã |
| ãã®ãªã¯ãšã¹ãã¯ãåŸæ¥å¡ã«é¢ãããã¹ãŠã®ããŒã¿ãšå©çšå¯èœãªéšéã«é¢ãããã¹ãŠã®ããŒã¿ãååŸããå¿
èŠãããå Žåã«éèŠã§ãã ãããã£ãŠãåŸæ¥å¡ãŸãã¯éšéïŒããªãŒã©ã³ãµãŒïŒã®ããããã«ãã£ãŠç©ŽïŒNULLå€ïŒãååŸããŸãã
ããšãã°ããã®ã¯ãšãªã䜿çšããŠããã¹ãŠã®åŸæ¥å¡ãé©åãªéšéã«å±ããŠãããã©ããã確èªã§ããŸãã ããªãŒã©ã³ãµãŒãšããŠãªã¹ããããŠããäžéšã®åŸæ¥å¡ã¯ãåã«éšéã瀺ãã®ãå¿ããŠããŸããã |
| ãã®ãã©ãŒã ã§ã¯ãã©ãã«é©çšã§ãããèããããšããé£ããã®ã§ã以äžã«CROSS JOINã®äŸã瀺ããŸãã |
DepartmentIDå€ãEmployeesããŒãã«ã§ç¹°ãè¿ãããå Žåããã®ãããªåè¡ã¯åãIDãæã€DepartmentsããŒãã«ã®è¡ã«æ¥ç¶ãããŸãããã€ãŸããDepartmentsããŒã¿ã¯æ¡ä»¶ïŒemp.DepartmentID = dep.IDïŒãæºãããããã¹ãŠã®ã¬ã³ãŒããšçµåãããŸããïŒ

ç§ãã¡ã®å Žåããã¹ãŠãæ£ããå€æããŸããã DepartmentsããŒãã«ã®ããŒã¿ã§EmployeesããŒãã«ãè£å®ããŸããã ç§ã¯ããã«ç¹ã«æ³šç®ããŸããããªããªã ãã®åäœãäžèŠãªå ŽåããããŸãã ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ã®ããã«ãã¿ã¹ã¯ãèšå®ããŸããåéšéã«ã€ããŠãæåŸã«åãå ¥ããããåŸæ¥å¡ã衚瀺ããŸããåŸæ¥å¡ãããªãå Žåã¯ãåã«éšéåãå°å·ããŸãã ããããããã®ãœãªã¥ãŒã·ã§ã³ã¯ããèªäœã瀺åããŠããŸã-åã®ãªã¯ãšã¹ããååŸããŠãçµåæ¡ä»¶ãRIGHT JOINã«å€æŽããããã«ãã£ãŒã«ããåé 眮ããŸãã
SELECT dep.ID,dep.Name,emp.ID,emp.Name FROM Employees emp RIGHT JOIN Departments dep ON emp.DepartmentID=dep.ID
ID | ãåå | ID | ãåå |
---|---|---|---|
1 | éå¶ | 1000 | ã€ã¯ããI.I. |
2 | ç°¿èš | 1002 | ã·ãããS.S. |
3 | IT | 1001 | ããããP.P. |
3 | IT | 1003 | ã¢ã³ãã¬ãšãA.A. |
3 | IT | 1004 | ãã³ã©ãšãN.N. |
4 | ããŒã±ãã£ã³ã°ãšåºå | ãã« | ãã« |
5 | ç©æµ | ãã« | ãã« |
ããããæåŸã®åŸæ¥å¡ãæ¿èªãããè¡ã®ã¿ãå¿ èŠãªå ŽåãITéšéçšã«3è¡ãååŸããŸããã ãã³ã©ãšãN.N.
ãã®çš®ã®ã¿ã¹ã¯ã¯ãããšãã°ãµãã¯ãšãªã䜿çšããŠè§£æ±ºã§ããŸãã
SELECT dep.ID,dep.Name,emp.ID,emp.Name FROM Employees emp /* ( - MAX(ID)) (GROUP BY DepartmentID) */ JOIN ( SELECT MAX(ID) MaxEmployeeID FROM Employees GROUP BY DepartmentID ) lastEmp ON emp.ID=lastEmp.MaxEmployeeID RIGHT JOIN Departments dep ON emp.DepartmentID=dep.ID -- Departments
ID | ãåå | ID | ãåå |
---|---|---|---|
1 | éå¶ | 1000 | ã€ã¯ããI.I. |
2 | ç°¿èš | 1002 | ã·ãããS.S. |
3 | IT | 1004 | ãã³ã©ãšãN.N. |
4 | ããŒã±ãã£ã³ã°ãšåºå | ãã« | ãã« |
5 | ç©æµ | ãã« | ãã« |
åŸæ¥å¡ããµãã¯ãšãªããŒã¿ãšäºåã«çµã¿åãããããšã«ãããéšéãžã®æ¥ç¶ã«å¿ èŠãªåŸæ¥å¡ã®ã¿ãæ®ãããšãã§ããŸããã
ããã§ã¯ããµãã¯ãšãªã®äœ¿çšã«ã¹ã ãŒãºã«é²ã¿ãŸãã ãã®åœ¢åŒã§ãããã䜿çšããããšã¯ãçŽæçãªã¬ãã«ã§ããªãã«æããã§ãããšæããŸãã ã€ãŸãããµãã¯ãšãªã¯ããŒãã«ã®ä»£ããã«çœ®ãæãããããã®åœ¹å²ãæãããŸãããè€éãªããšã¯ãããŸããã ãµãã¯ãšãªã®ããŒãã«åå¥ã«æ»ããŸãã
ãµãã¯ãšãªãè¿ãå 容ãåå¥ã«ç¢ºèªããŸãã
SELECT MAX(ID) MaxEmployeeID FROM Employees GROUP BY DepartmentID
MaxEmployeeID |
---|
1005 |
1000 |
1002 |
1004 |
ã€ãŸã 圌ã¯éšéããšã«æåŸã«éçšãããåŸæ¥å¡ã®èå¥åã®ã¿ãè¿ããŸããã
æ¥ç¶ã¯äžããäžã«é çªã«è¡ãããå±±ãã転ããéªçã®ããã«æé·ããŸãã ãŸããæ¥ç¶ãEmployees emp JOINïŒãµãã¯ãšãªïŒlastEmpããçºçããæ°ããåºåã»ããã圢æãããŸãã

次ã«ããEmployees emp JOINïŒãµãã¯ãšãªïŒlastEmpãïŒæ¡ä»¶ä»ãã§ãæåŸã®çµæããšåŒã³ãŸãïŒã«ãã£ãŠååŸãããã»ãããšéšéãã€ãŸã ãLastRIGHT JOIN Departments dep resultãïŒ

ææãçµ±åããç¬ç«ããäœæ¥
åå¿è ã®å Žåãåã¿ã€ãã®æ¥ç¶ãã©ã®ããã«æ©èœãããã100ïŒ ç解ããæçµçã«ã©ã®ã¿ã€ãã®çµæãåŸãããããæ£ãã瀺ããŸã§ãåJOINã³ã³ã¹ãã©ã¯ããå®è¡ããå¿ èŠããããŸãã
JOINæ¥ç¶ã«é¢ããè³æãçµ±åããã«ã¯ã次ã®æé ãå®è¡ããŸãã
-- LeftTable RightTable TRUNCATE TABLE LeftTable TRUNCATE TABLE RightTable GO -- INSERT LeftTable(LCode,LDescr)VALUES (1,'L-1'), (2,'L-2a'), (2,'L-2b'), (3,'L-3'), (5,'L-5') INSERT RightTable(RCode,RDescr)VALUES (2,'B-2a'), (2,'B-2b'), (3,'B-3'), (4,'B-4')
ããŒãã«ã®å 容ãèŠãŠã¿ãŸãããã
SELECT * FROM LeftTable
LCode | LDescr |
---|---|
1 | L-1 |
2 | L-2a |
2 | L-2b |
3 | L-3 |
5 | L-5 |
SELECT * FROM RightTable
RCode | RDescr |
---|---|
2 | B-2a |
2 | B-2b |
3 | B-3 |
4 | B-4 |
ããã§ãã¯ãšãªã®åè¡ãæ¥ç¶ã®çš®é¡ããšã«ã©ã®ããã«ãªã£ãããèªåã§èããŠã¿ãŠãã ããïŒExcelã圹ç«ã¡ãŸãïŒã
SELECT l.*,r.* FROM LeftTable l JOIN RightTable r ON l.LCode=r.RCode
LCode | LDescr | RCode | RDescr |
---|---|---|---|
2 | L-2a | 2 | B-2a |
2 | L-2a | 2 | B-2b |
2 | L-2b | 2 | B-2a |
2 | L-2b | 2 | B-2b |
3 | L-3 | 3 | B-3 |
SELECT l.*,r.* FROM LeftTable l LEFT JOIN RightTable r ON l.LCode=r.RCode
LCode | LDescr | RCode | RDescr |
---|---|---|---|
1 | L-1 | ãã« | ãã« |
2 | L-2a | 2 | B-2a |
2 | L-2a | 2 | B-2b |
2 | L-2b | 2 | B-2a |
2 | L-2b | 2 | B-2b |
3 | L-3 | 3 | B-3 |
5 | L-5 | ãã« | ãã« |
SELECT l.*,r.* FROM LeftTable l RIGHT JOIN RightTable r ON l.LCode=r.RCode
LCode | LDescr | RCode | RDescr |
---|---|---|---|
2 | L-2a | 2 | B-2a |
2 | L-2b | 2 | B-2a |
2 | L-2a | 2 | B-2b |
2 | L-2b | 2 | B-2b |
3 | L-3 | 3 | B-3 |
ãã« | ãã« | 4 | B-4 |
SELECT l.*,r.* FROM LeftTable l FULL JOIN RightTable r ON l.LCode=r.RCode
LCode | LDescr | RCode | RDescr |
---|---|---|---|
1 | L-1 | ãã« | ãã« |
2 | L-2a | 2 | B-2a |
2 | L-2a | 2 | B-2b |
2 | L-2b | 2 | B-2a |
2 | L-2b | 2 | B-2b |
3 | L-3 | 3 | B-3 |
5 | L-5 | ãã« | ãã« |
ãã« | ãã« | 4 | B-4 |
SELECT l.*,r.* FROM LeftTable l CROSS JOIN RightTable r
LCode | LDescr | RCode | RDescr |
---|---|---|---|
1 | L-1 | 2 | B-2a |
2 | L-2a | 2 | B-2a |
2 | L-2b | 2 | B-2a |
3 | L-3 | 2 | B-2a |
5 | L-5 | 2 | B-2a |
1 | L-1 | 2 | B-2b |
2 | L-2a | 2 | B-2b |
2 | L-2b | 2 | B-2b |
3 | L-3 | 2 | B-2b |
5 | L-5 | 2 | B-2b |
1 | L-1 | 3 | B-3 |
2 | L-2a | 3 | B-3 |
2 | L-2b | 3 | B-3 |
3 | L-3 | 3 | B-3 |
5 | L-5 | 3 | B-3 |
1 | L-1 | 4 | B-4 |
2 | L-2a | 4 | B-4 |
2 | L-2b | 4 | B-4 |
3 | L-3 | 4 | B-4 |
5 | L-5 | 4 | B-4 |
JOINæ¥ç¶ã«ã€ããŠããäžåºŠ
è€æ°ã®é 次çµåæäœã䜿çšããå¥ã®äŸã ããã§ã¯ãæå³çã«ç¹°ãè¿ãã¯è¡ãããŸããã§ãããåãçŽ æãæšãŠãªãã§ãã ããã ;ïŒãããããç¹°ãè¿ãã¯åŠç¿ã®æ¯ã§ã¯ãããŸãããã
è€æ°ã®æ¥ç¶æäœã䜿çšãããå Žåããã®å Žåããããã¯äžããäžã«é çªã«é©çšãããŸãã 倧ãŸãã«èšãã°ãåæ¥ç¶ã®åŸã«æ°ããã»ãããäœæããããã®æ¡åŒµã»ããã§æ¬¡ã®æ¥ç¶ããã§ã«è¡ãããŠããŸãã ç°¡åãªäŸãèããŠã¿ãŸãããã
SELECT e.ID, e.Name EmployeeName, p.Name PositionName, d.Name DepartmentName FROM Employees e LEFT JOIN Departments d ON e.DepartmentID=d.ID LEFT JOIN Positions p ON e.PositionID=p.ID
æåã«ãEmployeesããŒãã«ã®ãã¹ãŠã®ãšã³ããªãéžæãããŸããã
SELECT e.* FROM Employees e -- 1
次ã«ãDepartmentsããŒãã«ãžã®æ¥ç¶ããããŸããã
SELECT e.*, -- Employees d.* -- (e.DepartmentID=d.ID) Departments FROM Employees e -- 1 LEFT JOIN Departments d ON e.DepartmentID=d.ID -- 2
次ã¯ããã®ã»ãããšPositionsããŒãã«ã®æ¥ç¶ã§ãã
SELECT e.*, -- Employees d.*, -- (e.DepartmentID=d.ID) Departments p.* -- (e.PositionID=p.ID) Positions FROM Employees e -- 1 LEFT JOIN Departments d ON e.DepartmentID=d.ID -- 2 LEFT JOIN Positions p ON e.PositionID=p.ID -- 3
ã€ãŸã 次ã®ããã«ãªããŸãã

ãããŠæåŸã«ãå°å·ãèŠæ±ããŠããããŒã¿ãè¿ããŸãã
SELECT e.ID, -- 1. e.Name EmployeeName, -- 2. p.Name PositionName, -- 3. d.Name DepartmentName -- 4. FROM Employees e LEFT JOIN Departments d ON e.DepartmentID=d.ID LEFT JOIN Positions p ON e.PositionID=p.ID
ãããã£ãŠãWHEREãã£ã«ã¿ãŒãšORDER BYãœãŒãããååŸãããã®ãã¹ãŠã®ã»ããã«é©çšã§ããŸãã
SELECT e.ID, -- 1. e.Name EmployeeName, -- 2. p.Name PositionName, -- 3. d.Name DepartmentName -- 4. FROM Employees e LEFT JOIN Departments d ON e.DepartmentID=d.ID LEFT JOIN Positions p ON e.PositionID=p.ID WHERE d.ID=3 -- ID Departments AND p.ID=3 -- ID Positions ORDER BY e.Name -- Name Employees
ID | EmployeeName | PositionName | éšçœ²å |
---|---|---|---|
1004 | ãã³ã©ãšãN.N. | ããã°ã©ã㌠| IT |
1001 | ããããP.P. | ããã°ã©ã㌠| IT |
ã€ãŸããæåŸã«åä¿¡ããã»ããã¯ãåºæ¬çãªã¯ãšãªãå®è¡ã§ããåãããŒãã«ã§ãã
SELECT [DISTINCT] _ * FROM WHERE ORDER BY _
ã€ãŸãã以åã«1ã€ã®ããŒãã«ã®ã¿ããœãŒã¹ãšããŠæ©èœããŠããå Žåããã®å ŽæãåŒã«çœ®ãæããã ãã§ãã
Employees e LEFT JOIN Departments d ON e.DepartmentID=d.ID LEFT JOIN Positions p ON e.PositionID=p.ID
ãã®çµæãåãåºæ¬çãªãªã¯ãšã¹ããåãåããŸãïŒ
SELECT e.ID, e.Name EmployeeName, p.Name PositionName, d.Name DepartmentName FROM /* - */ Employees e LEFT JOIN Departments d ON e.DepartmentID=d.ID LEFT JOIN Positions p ON e.PositionID=p.ID /* - */ WHERE d.ID=3 AND p.ID=3 ORDER BY e.Name
ãããŠãã°ã«ãŒãåãé©çšããŸãã
SELECT ISNULL(dep.Name,'') DepName, COUNT(DISTINCT emp.PositionID) PositionCount, COUNT(*) EmplCount, SUM(emp.Salary) SalaryAmount, AVG(emp.Salary) SalaryAvg -- FROM /* - */ Employees emp LEFT JOIN Departments dep ON emp.DepartmentID=dep.ID /* - */ GROUP BY emp.DepartmentID,dep.Name ORDER BY DepName
ã芧ã®ãšãããç§ãã¡ã¯ãŸã åºæ¬çãªæ§é ãäžå¿ã«å±éããŠããŸãããæåã«ããããç解ããããšãéåžžã«éèŠã§ããçç±ãæ確ã«ãªãã°ãšæããŸãã
ãããŠãç§ãã¡ãèŠãããã«ãã¯ãšãªã§ã¯ãããŒãã«ã®ä»£ããã«ãµãã¯ãšãªã䜿çšã§ããŸããåæ§ã«ããµãã¯ãšãªã¯ãµãã¯ãšãªå ã«ãã¹ãã§ããŸãããããŠãããããã¹ãŠã®ãµãã¯ãšãªãåºæ¬çãªæ§é ã§ããã€ãŸããåºæ¬èšèšã¯ããªã¯ãšã¹ããäœæããããªãã¯ã§ãã
CROSS JOINã䜿çšããææãªäŸ
CROSS JOINçµåã䜿çšããŠãåŸæ¥å¡æ°ãéšéãè·äœãã«ãŠã³ãããŸããããåéšéã«ã€ããŠãæ¢åã®ãã¹ãŠã®æçš¿ããªã¹ãããŸãã
SELECT d.Name DepartmentName, p.Name PositionName, e.EmplCount FROM Departments d CROSS JOIN Positions p LEFT JOIN ( /* (DepartmentID,PositionID) */ SELECT DepartmentID,PositionID,COUNT(*) EmplCount FROM Employees GROUP BY DepartmentID,PositionID ) e ON e.DepartmentID=d.ID AND e.PositionID=p.ID ORDER BY DepartmentName,PositionName

ãã®å Žåãæåã«CROSS JOINã䜿çšããŠæ¥ç¶ãè¡ããã次ã«ãçµæã»ããã«å¯ŸããŠLEFT JOINã䜿çšããŠãµãã¯ãšãªããã®ããŒã¿ãšã®æ¥ç¶ãè¡ãããŸãããLEFT JOINã®ããŒãã«ã®ä»£ããã«ããµãã¯ãšãªã䜿çšããŸããã
ãµãã¯ãšãªã¯æ¬åŒ§ã§å²ãŸãããšã€ãªã¢ã¹ïŒãã®å Žåã¯ãeãïŒãå²ãåœãŠãããŸããã€ãŸãããã®å Žåãçµåã¯ããŒãã«ã§ã¯ãªãã次ã®ã¯ãšãªã®çµæã§çºçããŸãã
SELECT DepartmentID,PositionID,COUNT(*) EmplCount FROM Employees GROUP BY DepartmentID,PositionID
DepartmentID | äœçœ®ID | éçšè |
---|---|---|
ãã« | ãã« | 1 |
2 | 1 | 1 |
1 | 2 | 1 |
3 | 3 | 2 |
3 | 4 | 1 |
ãšã€ãªã¢ã¹ãeããšãšãã«ãDepartmentIDãPositionIDãããã³EmplCountãšããååã䜿çšã§ããŸããå®éãããã«ãµãã¯ãšãªã¯ãããŒãã«ããã®å Žæã«ç«ã£ãŠããå Žåãšåãããã«åäœããŸãããããã£ãŠãããŒãã«ãš
åæ§ã«ããµãã¯ãšãªãè¿ããã¹ãŠã®ååã¯æ瀺çã«æå®ããå¿ èŠããããç¹°ãè¿ããªãã§ãã ããã
WHEREå¥ã䜿çšããéä¿¡
ããšãã°ãJOINæ¥ç¶ã䜿çšããŠæ¬¡ã®ã¯ãšãªãæžãæããŸãã
SELECT emp.ID,emp.Name,emp.DepartmentID,dep.ID,dep.Name FROM Employees emp JOIN Departments dep ON emp.DepartmentID=dep.ID -- WHERE emp.DepartmentID=3 --
WHEREå¥ãéããŠã次ã®åœ¢åŒãåããŸãã
SELECT emp.ID,emp.Name,emp.DepartmentID,dep.ID,dep.Name FROM Employees emp, Departments dep WHERE emp.DepartmentID=dep.ID -- AND emp.DepartmentID=3 --
ããã§æªãã®ã¯ãããŒãã«ãçµåããããã®æ¡ä»¶ïŒemp.DepartmentID = dep.IDïŒããã£ã«ã¿ãŒæ¡ä»¶ïŒemp.DepartmentID = 3ïŒãšæ··åšããŠããããšã§ãã
次ã«ãCROSS JOINã®äœææ¹æ³ãèŠãŠã¿ãŸãããã
SELECT emp.ID,emp.Name,emp.DepartmentID,dep.ID,dep.Name FROM Employees emp CROSS JOIN Departments dep -- ( ) WHERE emp.DepartmentID=3 --
WHEREå¥ãéããŠã次ã®åœ¢åŒãåããŸãã
SELECT emp.ID,emp.Name,emp.DepartmentID,dep.ID,dep.Name FROM Employees emp, Departments dep WHERE emp.DepartmentID=3 --
ã€ãŸããã®å Žåãåã«EmployeesããŒãã«ãšDepartmentsããŒãã«ã®çµåæ¡ä»¶ãæå®ããŸããã§ããããªããã®ãªã¯ãšã¹ããæªãã®ã§ããïŒä»ã®èª°ããããªãã®ãªã¯ãšã¹ããèŠãŠãããªã¯ãšã¹ããæžãã人ãããã«æ¡ä»¶ãè¿œå ããã®ãå¿ããããã§ãïŒemp.DepartmentID = dep.IDïŒããšèããŠãåãã§ãã®æ¡ä»¶ãè¿œå ããŸãããã®çµæãããªããèããããšã¯ãããªãã¯CROSS JOINãæå³ããŸãããããã£ãŠããã«ã«ãçµåãäœæããå Žåã¯ããããCROSS JOINã³ã³ã¹ãã©ã¯ãã䜿çšããŠããããšãæ瀺ããããšããå§ãããŸãã
ã¯ãšãªãªããã£ãã€ã¶ãŒã®å Žåãæ¥ç¶ãã©ã®ããã«å®è£ ãããïŒWHEREãŸãã¯JOINã䜿çšïŒã¯åé¡ã§ã¯ãªãããŸã£ããåãæ¹æ³ã§å®è¡ã§ããŸããããããã³ãŒãããããããããšããçç±ãããçŸä»£ââã®DBMSã§ã¯WHEREå¥ã䜿çšããŠããŒãã«ãçµåããªãããã«ããããšããå§ãããŸããæ¥ç¶ã«WHEREæ¡ä»¶ã䜿çšããŸããJOINæ§é ãDBMSã«å®è£ ãããŠããå ŽåããããŒãæªããšæããŸããWHEREæ¡ä»¶ã¯ã»ããã®ãã£ã«ã¿ãŒåŠçã«äœ¿çšãããæ¥ç¶ã«äœ¿çšãããæ¡ä»¶ãšãã£ã«ã¿ãŒåŠçãè¡ãæ¡ä»¶ãæ··åšãããå¿ èŠã¯ãããŸãããããããWHEREãä»ããæ¥ç¶ã®å®è£ ãäžå¯æ¬ ã§ãããšããçµè«ã«éããå Žåããã¡ããåªå é äœã¯è§£æ±ºãããã¿ã¹ã¯ãšããã¹ãŠã®åºç€ã§å°çã«ãã«ãããŸãã
UNIONçµå-ã¯ãšãªçµæã®åçŽçµåã®æäœ
æ°Žå¹³çµåãšåçŽçµåãšãããã¬ãŒãºãå ·äœçã«äœ¿çšããŠããŸããæ°åè ã¯ãã°ãã°ãããã®æäœã®æ¬è³ªã誀解ããæ··ä¹±ãããããšã«æ°ä»ããŸããã
æåã«ããã£ã¬ã¯ã¿ãŒã®ã¬ããŒãã®æåã®ããŒãžã§ã³ãã©ã®ããã«äœæããããæãåºããŸãããã
SELECT '' Info, COUNT(DISTINCT PositionID) PositionCount, COUNT(*) EmplCount, SUM(Salary) SalaryAmount FROM Employees WHERE DepartmentID=1 -- SELECT '' Info, COUNT(DISTINCT PositionID) PositionCount, COUNT(*) EmplCount, SUM(Salary) SalaryAmount FROM Employees WHERE DepartmentID=2 -- SELECT '' Info, COUNT(DISTINCT PositionID) PositionCount, COUNT(*) EmplCount, SUM(Salary) SalaryAmount FROM Employees WHERE DepartmentID=3 -- SELECT '' Info, COUNT(DISTINCT PositionID) PositionCount, COUNT(*) EmplCount, SUM(Salary) SalaryAmount FROM Employees WHERE DepartmentID IS NULL --
ãããã£ãŠãã°ã«ãŒãåæäœãããããšãç¥ããªãã£ãããUNION ALLã䜿çšããŠã¯ãšãªçµæãçµåããæäœãããããšãç¥ã£ãŠããå Žåã次ã®ããã«ããããã¹ãŠã®ã¯ãšãªãæ¥çã§ããŸãã
SELECT '' Info, COUNT(DISTINCT PositionID) PositionCount, COUNT(*) EmplCount, SUM(Salary) SalaryAmount FROM Employees WHERE DepartmentID=1 -- UNION ALL SELECT '' Info, COUNT(DISTINCT PositionID) PositionCount, COUNT(*) EmplCount, SUM(Salary) SalaryAmount FROM Employees WHERE DepartmentID=2 -- UNION ALL SELECT '' Info, COUNT(DISTINCT PositionID) PositionCount, COUNT(*) EmplCount, SUM(Salary) SalaryAmount FROM Employees WHERE DepartmentID=3 -- UNION ALL SELECT '' Info, COUNT(DISTINCT PositionID) PositionCount, COUNT(*) EmplCount, SUM(Salary) SalaryAmount FROM Employees WHERE DepartmentID IS NULL --

ã€ãŸãUNION ALLã䜿çšãããšãããŸããŸãªã¯ãšãªã«ãã£ãŠååŸãããçµæã1ã€ã®å ±éã®çµæã«çµåã§ããŸãã
ãããã£ãŠãåãªã¯ãšã¹ãã®åã®æ°ã¯åãã§ãªããã°ãªããããããã®åã®ã¿ã€ããäºææ§ããªããã°ãªããŸãããè¡ã®äžã®è¡ãçªå·ã®äžã®çªå·ãæ¥ä»ã®äžã®æ¥ä»ãªã©ã
çè«ã®ããã
MS SQLã¯ã次ã®ã¿ã€ãã®åçŽçµåãå®è£ ããŸãã
éå¶ | 説æ |
---|---|
UNION ALL | çµæã«ã¯ãäž¡æ¹ã®ã»ããã®ãã¹ãŠã®è¡ãå«ãŸããŸããïŒA + BïŒ |
UNION | 2ã€ã®ã»ããã®äžæã®è¡ã®ã¿ãçµæã«å«ãŸããŸããDISTINCTïŒA + BïŒ |
ãé€ã | çµæã¯ãäžäœã»ããã«ãªããäžäœã»ããã®äžæã®è¡ã§ãã2ã»ããã®éããDISTINCTïŒABïŒ |
亀差 | äž¡æ¹ã®ã»ããã«ååšããäžæã®æååã®ã¿ãçµæã«å«ãŸããŸãã2ã»ããã®äº€å·®ç¹ãDISTINCTïŒAïŒBïŒ |
ããã¯ãã¹ãŠãè¯ãäŸã§ç解ãããããªã£ãŠããŸãã
2ã€ã®ããŒãã«ãäœæãããããã«ããŒã¿ãå ¥åããŸãã
CREATE TABLE TopTable( T1 int, T2 varchar(10) ) GO CREATE TABLE BottomTable( B1 int, B2 varchar(10) ) GO INSERT TopTable(T1,T2)VALUES (1,'Text 1'), (1,'Text 1'), (2,'Text 2'), (3,'Text 3'), (4,'Text 4'), (5,'Text 5') INSERT BottomTable(B1,B2)VALUES (2,'Text 2'), (3,'Text 3'), (6,'Text 6'), (6,'Text 6')
å 容ãèŠãŠã¿ãŸãããã
SELECT * FROM TopTable
T1 | T2 |
---|---|
1 | ããã¹ã1 |
1 | ããã¹ã1 |
2 | ããã¹ã2 |
3 | ããã¹ã3 |
4 | ããã¹ã4 |
5 | ããã¹ã5 |
SELECT * FROM BottomTable
B1 | B2 |
---|---|
2 | ããã¹ã2 |
3 | ããã¹ã3 |
6 | ããã¹ã6 |
6 | ããã¹ã6 |
UNION ALL
SELECT T1 x,T2 y FROM TopTable UNION ALL SELECT B1,B2 FROM BottomTable

UNION
SELECT T1 x,T2 y FROM TopTable UNION SELECT B1,B2 FROM BottomTable
åºæ¬çã«ãUNIONã¯UNION ALLãšããŠè¡šãããšãã§ããããã«DISTINCTæäœãé©çšãããŸãã

ãé€ã
SELECT T1 x,T2 y FROM TopTable EXCEPT SELECT B1,B2 FROM BottomTable

亀差
SELECT T1 x,T2 y FROM TopTable INTERSECT SELECT B1,B2 FROM BottomTable

UNIONæ¥ç¶ã«é¢ããäŒè©±ãçµäºãã
ããã¯åºæ¬çã«åçŽçµåã«é¢ãããã®ã§ãJOINçµåãããã¯ããã«ç°¡åã§ãã
ã»ãšãã©ã®å ŽåãUNION ALLã¯å®éã«ã¢ããªã±ãŒã·ã§ã³ãèŠã€ããŸãããä»ã®ã¿ã€ãã®åçŽé¢é£ä»ããã¢ããªã±ãŒã·ã§ã³ãèŠã€ããŸãã
ããã€ãã®æäœãåçŽæ¹åã«çµã¿åããããŠãããããäžããäžã«é çªã«å®è¡ããããšã¯éããŸãããå¥ã®ããŒãã«ãäœæããäŸã䜿çšããŠãããæ€èšããŠã¿ãŸãããã
CREATE TABLE NextTable( N1 int, N2 varchar(10) ) GO INSERT NextTable(N1,N2)VALUES (1,'Text 1'), (4,'Text 4'), (6,'Text 6')
ããšãã°ãåçŽã«æ¬¡ã®ããã«èšè¿°ããå ŽåïŒ
SELECT T1 x,T2 y FROM TopTable EXCEPT SELECT B1,B2 FROM BottomTable INTERSECT SELECT N1,N2 FROM NextTable
次ã«ååŸããŸãã
x | y |
---|---|
1 | ããã¹ã1 |
2 | ããã¹ã2 |
3 | ããã¹ã3 |
4 | ããã¹ã4 |
5 | ããã¹ã5 |
ã€ãŸãINTERSECTãæåã«å®è¡ãããEXCEPTã®åŸã«å®è¡ãããããšãããããŸããè«ççã«ã¯éã«ãªã£ãŠããã¯ãã§ãããã€ãŸã äžããäžã«ç§»åããŸãã
ç§ã¯ãã£ãã«ãããã®ãŠããªã³æäœã䜿çšãããããã«å°ãªãã®ã§ãçµåãå®è¡ããé åºãèããªãããã«ãæ¬åŒ§ã§çµåã®ã·ãŒã±ã³ã¹ãæå®ããããšãã§ããŸãã亀差ç¹ïŒ
( SELECT T1 x,T2 y FROM TopTable EXCEPT SELECT B1,B2 FROM BottomTable ) INTERSECT SELECT N1,N2 FROM NextTable
x | y |
---|---|
1 | ããã¹ã1 |
4 | ããã¹ã4 |
ä»ãç§ã¯æ¬²ãããã®ãæã«å ¥ããŸããã
ãã®æ§æãä»ã®DBMSã§æ©èœãããã©ããã¯ããããŸãããããµãã¯ãšãªã䜿çšããå ŽåïŒ
SELECT x,y FROM ( SELECT T1 x,T2 y FROM TopTable EXCEPT SELECT B1,B2 FROM BottomTable ) q INTERSECT SELECT N1,N2 FROM NextTable
ORDER BYã䜿çšããå ŽåããœãŒãã¯æçµã»ããã«é©çšãããŸãã
SELECT T1 x,T2 y FROM TopTable UNION ALL SELECT B1,B2 FROM BottomTable UNION ALL SELECT B1,B2 FROM BottomTable ORDER BY x DESC
䞊ã¹æ¿ãã¿ã¹ã¯ã§ã¯ãæåã®ã¯ãšãªã§æå®ãããåãšã€ãªã¢ã¹ã䜿çšããæ¹ã䟿å©ã§ãã
UNIONãŠããªã³ã§äœãããã¬ã€ããå ŽåãUNIONãŠããªã³ã«ã€ããŠæãéèŠãªããšãæžããã
ã泚æ Oracleã«ãåãçš®é¡ã®æ¥ç¶ããããŸãããå¯äžã®éãã¯EXCEPTæäœã§ãMINUSãšåŒã°ããŸãã
ãµãã¯ãšãªã䜿çšãã
ç§ã¯æåŸã«ãµãã¯ãšãªãæ®ããŸããããªããªã ãããã䜿çšããåã«ãã¯ãšãªãæ£ããäœæããæ¹æ³ãåŠã¶å¿ èŠããããŸããããã«ãå Žåã«ãã£ãŠã¯ããµãã¯ãšãªã®äœ¿çšãå®å šã«åé¿ã§ããåºæ¬çãªæ§é ãçãããšãã§ããŸãã
éæ¥çã«ãFROMãããã¯ã§æ¢ã«ãµãã¯ãšãªã䜿çšããŠããŸããããã§ã¯ããµãã¯ãšãªã«ãã£ãŠè¿ãããçµæã¯ãåºæ¬çã«æ°ããããŒãã«ã®åœ¹å²ãæãããŸããããã§ãããã®ã¯ã»ãšãã©æå³ããªããšæããŸãã2ã€ã®ãµãã¯ãšãªãçµã¿åãããæœè±¡çãªäŸãèããŠã¿ãŸãããã
SELECT q1.x1,q1.y1,q2.x2,q2.y2 FROM ( SELECT T1 x1,T2 y1 FROM TopTable EXCEPT SELECT B1,B2 FROM BottomTable ) q1 JOIN ( SELECT T1 x2,T2 y2 FROM TopTable EXCEPT SELECT N1,N2 FROM NextTable ) q2 ON q1.x1=q2.x2
ããã«ã¯ã£ããããªãå Žåã¯ããã®ãããªèŠæ±ãéšåçã«å解ããŸãã ã€ãŸã æåã®ãµãã¯ãšãªãq1ããè¿ããã®ã次ã«2çªç®ã®ãµãã¯ãšãªãq2ããè¿ããã®ãèŠãŠããããµãã¯ãšãªãq1ããšãq2ãã®çµæã«å¯ŸããŠJOINæäœãå®è¡ããŸãã
WITHå¥
ããã¯ãç¹ã«å€§èŠæš¡ãªãµãã¯ãšãªãåŠçããå Žåã«éåžžã«äŸ¿å©ãªèšèšã§ãã
æ¯èŒïŒ
SELECT q1.x1,q1.y1,q2.x2,q2.y2 FROM ( SELECT T1 x1,T2 y1 FROM TopTable EXCEPT SELECT B1,B2 FROM BottomTable ) q1 JOIN ( SELECT T1 x2,T2 y2 FROM TopTable EXCEPT SELECT N1,N2 FROM NextTable ) q2 ON q1.x1=q2.x2
WITHã§æžãããåããã®ïŒ
WITH q1 AS( SELECT T1 x1,T2 y1 FROM TopTable EXCEPT SELECT B1,B2 FROM BottomTable ), q2 AS( SELECT T1 x2,T2 y2 FROM TopTable EXCEPT SELECT N1,N2 FROM NextTable ) -- SELECT q1.x1,q1.y1,q2.x2,q2.y2 FROM q1 JOIN q2 ON q1.x1=q2.x2
ã芧ã®ãšããã倧ããªãµãã¯ãšãªãã¬ã³ããªã³ã°ãããWITHãããã¯ã«ååãä»ããããŠãããããã¡ã€ã³ãªã¯ãšã¹ãã®ããã¹ããã¢ã³ããŒãããŠç解ã§ããããã«ãªã£ãŠããŸãã
ViewEmployeesInfoãã¥ãŒã䜿çšãããåã®éšåã®äŸãæãåºããŠãã ããã
CREATE VIEW ViewEmployeesInfo AS SELECT emp.*, -- Employees dep.Name DepartmentName, -- Name Departments pos.Name PositionName -- Name Positions FROM Employees emp LEFT JOIN Departments dep ON emp.DepartmentID=dep.ID LEFT JOIN Positions pos ON emp.PositionID=pos.ID
ãããŠããã®ãã¥ãŒã䜿çšããã¯ãšãªïŒ
SELECT DepartmentName, COUNT(DISTINCT PositionID) PositionCount, COUNT(*) EmplCount, SUM(Salary) SalaryAmount, AVG(Salary) SalaryAvg FROM ViewEmployeesInfo emp GROUP BY DepartmentID,DepartmentName ORDER BY DepartmentName
æ¬è³ªçã«ãWITHã䜿çšãããšããã¥ãŒå ã®ããã¹ãããªã¯ãšã¹ãã«çŽæ¥é 眮ã§ããŸããæå³ã¯åãã§ãïŒ
WITH cteEmployeesInfo AS( SELECT emp.*, -- Employees dep.Name DepartmentName, -- Name Departments pos.Name PositionName -- Name Positions FROM Employees emp LEFT JOIN Departments dep ON emp.DepartmentID=dep.ID LEFT JOIN Positions pos ON emp.PositionID=pos.ID ) SELECT DepartmentName, COUNT(DISTINCT PositionID) PositionCount, COUNT(*) EmplCount, SUM(Salary) SalaryAmount, AVG(Salary) SalaryAvg FROM cteEmployeesInfo emp GROUP BY DepartmentID,DepartmentName ORDER BY DepartmentName
äœæããããã¥ãŒã®å Žåã®ã¿ãããŸããŸãªãªã¯ãšã¹ããã䜿çšã§ããŸãããã¥ãŒã¯ããŒã¿ããŒã¹ã¬ãã«ã§äœæãããŸããäžæ¹ãWITHãããã¯ã§å®è¡ããããµãã¯ãšãªã¯ããã®ã¯ãšãªã®ãã¬ãŒã ã¯ãŒã¯å ã§ã®ã¿è¡šç€ºãããŸãã
WITHã®äœ¿çšã¯CTEåŒãšãåŒã°
ããŸããåãã¯ãšãªã«è€æ°åã¢ã¯ã»ã¹ããå¿ èŠãããå ŽåãCommon Table ExpressionsïŒCTEïŒã¯ã³ãŒãã®éãå€§å¹ ã«åæžã§ããŸããCTEã¯ãåäžã®èŠæ±ã®äžéšãšããŠäœæãããã¹ããŒããªããžã§ã¯ããšããŠä¿åãããªããã¥ãŒã®åœ¹å²ãæãããŸãã
CTEã«ã¯å¥ã®éèŠãªç®çãããããã®å©ããåããŠãååž°ã¯ãšãªãäœæã§ããŸãã
ååž°ã¯ãšãªã®å°ããªäŸã玹ä»ããŸããå¥ã®åŸæ¥å¡ãžã®åŸå±ãèæ ®ã«å ¥ããåŸæ¥å¡ã衚瀺ããŸãïŒèŠããŠããå ŽåãåãããŒãã«ãåç §ããEmployeesããŒãã«ã«ããŒããããŸãïŒã
WITH cteEmpl AS( SELECT ID,CAST(Name AS nvarchar(300)) Name,1 EmpLevel FROM Employees WHERE ManagerID IS NULL -- UNION ALL SELECT emp.ID,CAST(SPACE(cte.EmpLevel*5)+emp.Name AS nvarchar(300)),cte.EmpLevel+1 FROM Employees emp JOIN cteEmpl cte ON emp.ManagerID=cte.ID ) SELECT * FROM cteEmpl
ID | ãåå | 瀟å¡ã¬ãã« |
---|---|---|
1000 | ã€ã¯ããI.I. | 1 |
1002 | _____ Sidorov S.S. | 2 |
1003 | _____ Andreev A.A. | 2 |
1005 | _____ã¢ã¬ã¯ãµã³ãããA.A. | 2 |
1001 | __________ Petrov P.P. | 3 |
1004 | __________ Nikolaev N.N. | 3 |
æ確ã«ããããã«ãã¹ããŒã¹ã¯ã¢ã³ããŒã¹ã³ã¢ã«çœ®ãæããããŸãã
ãã®æç§æžã®æ çµã¿ã®äžã§ãååž°ã¯ãšãªãã©ã®ããã«æ§ç¯ããããã¯èããŸãããããã¯åå¿è ã«ãšã£ãŠã¯ããªãå ·äœçãªãããã¯ã§ãããä»ã®ãšããå®å šã«åœ¹ã«ç«ããªããšæããŸããååž°ã¯ãšãªã®ç 究ã«çæããåã«ãç§ã説æãããã¹ãŠã®åºæ¬æ§é ã䜿çšããæ¹æ³ãå¿ ãåŠç¿ããå¿ èŠããããŸãããã®åºç€ããªããã°ããã以äžå ã«é²ãã¹ãã§ã¯ãããŸãããã»ãšãã©ã®å Žåãè€éãªã¯ãšãªãäœæããã«ã¯åºæ¬çãªæ§é ã®ç¥èã§ååã§ãã
ãµãã¯ãšãªã«é¢ããäŒè©±ãç¶ãã
ãµãã¯ãšãªã®äœ¿çšæ¹æ³ãèŠãŠã¿ãŸãããããŸããã¡ã€ã³ãªã¯ãšã¹ãã®ãšã€ãªã¢ã¹ã䜿çšããŠãµãã¯ãšãªã«ãã©ã¡ãŒã¿ãæž¡ããŸãã
ããã§ã¯ã説æãæ·±ãæãäžããŸããããã®æ®µéãŸã§ã«ãããŒã¿ãæ±ãååãèããŠç解ããããšãæ¢ã«åŠãã§ããã¯ãã§ããå¿ ãç·Žç¿ããäŸã«åŸã£ãŠçµæãè©ŠããŠç解ããŠãã ãããç解ããã«ã¯ãåäŸãèªåã§æããå¿ èŠããããŸãã
SELECTãããã¯ã§ãµãã¯ãšãªã䜿çšã§ããŸã
ã¬ããŒãã«æ»ãïŒ
SELECT DepartmentID, COUNT(DISTINCT PositionID) PositionCount, COUNT(*) EmplCount, SUM(Salary) SalaryAmount, AVG(Salary) SalaryAvg -- FROM Employees GROUP BY DepartmentID
ããã§ãéšéã®ååã¯ããã©ã¡ãŒã¿ãŒä»ãã®ãµãã¯ãšãªã䜿çšããŠååŸããããšãã§ããŸãã
SELECT /* */ (SELECT Name FROM Departments dep WHERE dep.ID=emp.DepartmentID) DepartmentName, COUNT(DISTINCT PositionID) PositionCount, COUNT(*) EmplCount, SUM(Salary) SalaryAmount, AVG(Salary) SalaryAvg FROM Employees emp -- GROUP BY DepartmentID ORDER BY DepartmentName
ãã®å Žåããµãã¯ãšãªïŒSELECT Name FROM Departments dep WHERE dep.ID = emp.DepartmentIDïŒã4åå®è¡ãããŸããåemp.DepartmentIDå€ã«å¯ŸããŠã
ãã®å Žåã®ãµãã¯ãšãªã¯1è¡ãš1åã®ã¿ãè¿ãå¿ èŠããããŸãããµãã¯ãšãªã«å€æ°ã®è¡ãããå Žåã¯ãTOPãŸãã¯ãã®äžã®éçŽé¢æ°ã䜿çšããŠãæçµçã«1è¡ã«ãªããŸããããšãã°ãéšéããšã«ãæåŸã«åãå ¥ããããåŸæ¥å¡ã®IDãååŸããŸãã
SELECT ID, Name, -- 1 - ID (SELECT MAX(ID) FROM Employees emp WHERE emp.DepartmentID=dep.ID) LastEmpID_var1, -- 1 - ID (SELECT TOP 1 ID FROM Employees emp WHERE emp.DepartmentID=dep.ID ORDER BY ID DESC) LastEmpID_var2, -- 2 - (SELECT TOP 1 Name FROM Employees emp WHERE emp.DepartmentID=dep.ID ORDER BY ID DESC) LastEmpName FROM Departments dep
è¯ããªãã§ãããïŒ ãªããªã3ã€ã®ãµãã¯ãšãªã¯ããããïŒè¿ãããè¡ããšã«ïŒ4åå®è¡ãããåèš12ã®ãµãã¯ãšãªãå®è¡ãããŸãã
ãããã£ãŠãå°ãªããšããã©ã¡ãŒã¿ãŒãæå®ãããµãã¯ãšãªã䜿çšããããšããå§ãããŸãã次ã®ããã«ãåçŽãªçµåæäœã䜿çšããŠãªã¯ãšã¹ããè¡šçŸã§ããªãå Žå ãã®ãããªå Žåã«ãµãã¯ãšãªã䜿çšãããšãã¯ãšãªã®å®è¡é床ãå€§å¹ ã«äœäžããå¯èœæ§ããããŸãããã©ã¡ãŒã¿ãŒãæå®ãããµãã¯ãšãªã¯ãæž¡ããããã©ã¡ãŒã¿ãŒããšã«å®è¡ãããããã§ãã
ãµãã¯ãšãªãé©çšãã
æåŸã®äŸã®MS SQLïŒ
SELECT ID, Name, -- 1 - ID (SELECT TOP 1 ID FROM Employees emp WHERE emp.DepartmentID=dep.ID ORDER BY ID DESC) LastEmpID, -- 2 - (SELECT TOP 1 Name FROM Employees emp WHERE emp.DepartmentID=dep.ID ORDER BY ID DESC) LastEmpName FROM Departments dep
APPLYæ§é ãé©çšã§ããŸããããã«ã¯ã2ã€ã®åœ¢åŒããããŸã-çžäºé©çšãšå€éšé©çšã
APPLYæ§æã䜿çšãããšããã®äŸã®ããã«ãåéšéã§åãå ¥ããããæåŸã®åŸæ¥å¡ã®IDãšååã®äž¡æ¹ãååŸããå¿ èŠãããå Žåã«ãå€ãã®ãµãã¯ãšãªãåé€ã§ããŸãã
SELECT ID, Name, empInfo.LastEmpID, empInfo.LastEmpName FROM Departments dep CROSS APPLY ( SELECT TOP 1 ID LastEmpID,Name LastEmpName FROM Employees emp WHERE emp.DepartmentID=dep.ID ORDER BY emp.ID DESC ) empInfo
ID | ãåå | Lastempid | LastEmpName |
---|---|---|---|
1 | éå¶ | 1000 | ã€ã¯ããI.I. |
2 | ç°¿èš | 1002 | ã·ãããS.S. |
3 | IT | 1004 | ãã³ã©ãšãN.N. |
ããã§ã¯ãCROSS APPLYãããã¯ã®ãµãã¯ãšãªããDepartmentsããŒãã«ã®åè¡ã®å€ã«å¯ŸããŠå®è¡ãããŸããè¡ã®ãµãã¯ãšãªãè¿ãããªãå Žåããã®éšéã¯çµæãªã¹ãããé€å€ãããŸãã
DepartmentsããŒãã«ã®ãã¹ãŠã®è¡ãè¿ãå Žåã¯ããã®OUTER APPLYã¹ããŒãã¡ã³ãã®æ¬¡ã®åœ¢åŒã䜿çšããŸãã
SELECT ID, Name, empInfo.LastEmpID, empInfo.LastEmpName FROM Departments dep OUTER APPLY ( SELECT TOP 1 ID LastEmpID,Name LastEmpName FROM Employees emp WHERE emp.DepartmentID=dep.ID ORDER BY emp.ID DESC ) empInfo
ID | ãåå | Lastempid | LastEmpName |
---|---|---|---|
1 | éå¶ | 1000 | ã€ã¯ããI.I. |
2 | ç°¿èš | 1002 | ã·ãããS.S. |
3 | IT | 1004 | ãã³ã©ãšãN.N. |
4 | ããŒã±ãã£ã³ã°ãšåºå | ãã« | ãã« |
5 | ç©æµ | ãã« | ãã« |
äžè¬ã«ãããªã䟿å©ãªæŒç®åã§ãç¶æ³ã«ãã£ãŠã¯ãªã¯ãšã¹ããå€§å¹ ã«ç°¡çŽ åããŸãããã®ãµãã¯ãšãªã¯ãçµæã»ããã®åè¡ã«å¯ŸããŠãæ©èœããŸããæž¡ãããåãã©ã¡ãŒã¿ãŒã«å¯ŸããŠãå€ãã®ãµãã¯ãšãªã䜿çšããå Žåãããã¯ããã«å¹ççã«æ©èœããŸããAPPLYã䜿çšããå Žåã®ãã®ä»ã®è©³çŽ°ã«ã€ããŠã¯ãããšãã°ããµãã¯ãšãªãè€æ°ã®è¡ãè¿ãå Žåã®ããã«ãèªåã§ç解ã§ãããšæããŸããããŠãç§ã¯ããã«ã€ããŠè©±ãå§ããã®ã§ãèªå·±åæã®å°ããªäŸãæããŸãã
SELECT dep.ID,dep.Name,pos.PositionID,pos.PositionName FROM Departments dep CROSS APPLY ( SELECT ID PositionID,Name PositionName FROM Positions ) pos
WHEREãããã¯ã§ã®ãµãã¯ãšãªã®äœ¿çš
ããšãã°ã3人以äžã®åŸæ¥å¡ãããéšéãååŸããŸãã
SELECT * FROM Departments dep WHERE (SELECT COUNT(*) FROM Employees emp WHERE emp.DepartmentID=dep.ID)>2
ããã§ã¯æ¯èŒæŒç®åã䜿çšããŠããããããµãã¯ãšãªã¯æ倧ã§1ã€ã®è¡ãš1ã€ã®å€ãè¿ãå¿ èŠããããŸãããŸããSELECTãããã¯ã§ãµãã¯ãšãªã䜿çšãããŠããå Žåã
EXISTSããã³NOT EXISTSã³ã³ã¹ãã©ã¯ã
ãµãã¯ãšãªã®æ¡ä»¶ã«äžèŽããã¬ã³ãŒãããããã©ããã確èªã§ããŸãã
-- SELECT * FROM Departments dep WHERE EXISTS(SELECT * FROM Employees emp WHERE emp.DepartmentID=dep.ID)
-- SELECT * FROM Departments dep WHERE NOT EXISTS(SELECT * FROM Employees emp WHERE emp.DepartmentID=dep.ID)
ããã§ã¯ãã¹ãŠãåçŽã§ãããµãã¯ãšãªãå°ãªããšã1ã€ã®è¡ãè¿ãå ŽåãEXISTSã¯Trueãè¿ãããµãã¯ãšãªãè¡ãè¿ããªãå Žåã¯Falseãè¿ããŸããNOT EXISTS-çµæã®éã
ãµãã¯ãšãªã䜿çšããINããã³NOT INæ§æ
ãã®åã«ãå€ã®åæã§INã調ã¹ãŸããããããã®å€ã®ãªã¹ããè¿ããµãã¯ãšãªã§äœ¿çšããããšãã§ããŸãã
-- SELECT * FROM Departments WHERE ID IN(SELECT DISTINCT DepartmentID FROM Employees WHERE DepartmentID IS NOT NULL)
-- SELECT * FROM Departments WHERE ID NOT IN(SELECT DISTINCT DepartmentID FROM Employees WHERE DepartmentID IS NOT NULL)
ãµãã¯ãšãªã§æ¡ä»¶ïŒDepartmentID IS NOT NULLïŒã䜿çšããŠNULLå€ãé€å€ããããšã«æ³šæããŠãã ããããã®å Žåã®NULLå€ã¯åæ§ã«å±éºã§ã-詳现ã«ã€ããŠã¯ã第2éšã®INæ§é ã®èª¬æãåç §ããŠãã ããã
ã°ã«ãŒãæ¯èŒæäœALLããã³ANY
ãããã®æŒç®åã¯éåžžã«æ±ãã«ãããããæ éã«äœ¿çšããå¿ èŠããããŸããäžè¬çã«ãç§ã®ç·Žç¿ã§ã¯ããããã»ãšãã©äœ¿çšãããæ¡ä»¶ã§INãŸãã¯EXISTSæŒç®åã䜿çšããããšã奜ã¿ãŸãã
ALLããã³ANYæŒç®åã¯ããµãã¯ãšãªãè¿ããåå€ãšã®é©åæ§ã確èªããå¿ èŠãããå Žåã«äœ¿çšãããŸããEXISTSæŒç®åãšåæ§ã«ããµãã¯ãšãªã§ã®ã¿æ©èœããŸãã
ããšãã°ãåéšéã§ãåãéšéã§åããã¹ãŠã®åŸæ¥å¡ã«å¯ŸããŠè€æ°ã®RFPãæã€åŸæ¥å¡ãéžæããŸãããã®ç®çã®ããã«ããã¹ãŠãé©çšããŸãã
SELECT ID,Name,DepartmentID,Salary FROM Employees e1 WHERE e1.Salary>ALL( SELECT e2.Salary FROM Employees e2 WHERE e2.DepartmentID=e1.DepartmentID -- AND e2.ID<>e1.ID -- AND e2.Salary IS NOT NULL -- NULL )
ID | ãåå | DepartmentID | 絊æ |
---|---|---|---|
1000 | ã€ã¯ããI.I. | 1 | 5000 |
1002 | ã·ãããS.S. | 2 | 2500 |
1003 | ã¢ã³ãã¬ãšãA.A. | 3 | 2000幎 |
1005 | ã¢ã¬ã¯ãµã³ãããA.A. | ãã« | 2000幎 |
ããã§ã¯ãe1.Salaryããµãã¯ãšãªãè¿ããe2.Salaryã®å€ããã倧ããããšã確èªããŸãã
ãµãã¯ãšãªãåäžã®è¡ãè¿ããªãã£ãåŸæ¥å¡ã§ãããæ»ã£ãŠããã®ã¯ãªãã ãšæããŸããïŒããžãã¯ãããã§ãããã-ãšã³ããªããªãããããã§ãã¯ãããã®ããããŸãããããã¯ãç§ããã§ã«æãå€ãããšãæå³ããŸãã ïŒïŒïŒãã®ããªãã¯ã¯ããã«é ãããŠããŸãã
ããããç解ããããã«ãããã§ALLæŒç®åãNOT EXISTSæŒç®åã«çœ®ãæããæ¹æ³ãèŠãŠã¿ãŸãããã
SELECT ID,Name,DepartmentID,Salary FROM Employees e1 WHERE NOT EXISTS( SELECT * FROM Employees e2 WHERE e2.DepartmentID=e1.DepartmentID -- AND e2.Salary>e1.Salary -- )
ã€ãŸãããã§ã¯ãåãããšãä»ã®èšèã§ã®ã¿è¡šçŸããŸããããåãéšéã®åŸæ¥å¡ãããªãåŸæ¥å¡ãã圌ãããé«ã絊æã§æ»ããã
ããã§ããµãã¯ãšãªãããŒã¿ãè¿ããªãå Žåã«ALLãçã®å€ãè¿ãçç±ãæããã«ãªããŸãã
ãŸããALLã®å Žåããµãã¯ãšãªããNULLå€ãé€å€ããããšãéèŠã§ããããããªããšãåå€ã®ãã§ãã¯çµæãæªå®çŸ©ã«ãªãå¯èœæ§ããããŸãããã®å ŽåãANDã䜿çšãããšãã®ããžãã¯ALLãšããžãã¯ãæ¯èŒããŸããåŒïŒSalary> 1000 AND Salary> 1500 AND Salary> NULLïŒã¯NULLãè¿ããŸãã
ããããANYïŒå¥åSOMEïŒã§ã¯ãããã¯ç°ãªããŸãïŒ
SELECT ID,Name,DepartmentID,Salary FROM Employees e1 WHERE e1.Salary>ANY( -- ANY = SOME SELECT e2.Salary FROM Employees e2 WHERE e2.DepartmentID=e1.DepartmentID -- AND e2.ID<>e1.ID -- )
ID | ãåå | DepartmentID | 絊æ |
---|---|---|---|
1003 | ã¢ã³ãã¬ãšãA.A. | 3 | 2000幎 |
ANYæŒç®åã§ã¯ããµãã¯ãšãªãæ¡ä»¶ãšæ¯èŒã§ããã¬ã³ãŒããè¿ãããšãéèŠã§ãã ãªããªã ITéšéãé€ãããã¹ãŠã®éšéã§1人ã®åŸæ¥å¡ã®ã¿ã座ããAndreev AAã®ã¿ãæ»ããŸããããã®RFPã¯åãéšéã®ä»ã®åŸæ¥å¡ã®RFPãšæ¯èŒã§ããŸããã ã€ãŸãããã§ã¯ãåãéšéã®ã©ã®RFPåŸæ¥å¡ãããRFPã倧ãã人ãåŒãæããŸããã
ç解ãæ·±ããããã«ãEXISTSã®ãããã®ãèŠãŠã¿ãŸãããã
SELECT ID,Name,DepartmentID,Salary FROM Employees e1 WHERE EXISTS( SELECT * FROM Employees e2 WHERE e2.DepartmentID=e1.DepartmentID -- AND e2.Salary<e1.Salary -- )
ããã§ã®æå³ã¯ãããã®éšéã®RFPããã®åŸæ¥å¡ã®RFPãããäœãåŸæ¥å¡ãå°ãªããšãäœäººãããŸããã«ãªããŸããã
ãã®åœ¢åŒã§ã¯ããµãã¯ãšãªãããŒã¿ãè¿ããªãå Žåã«ANYãfalseå€ãè¿ãçç±ãæããã«ãªããŸãã
ããã§ã¯ããµãã¯ãšãªå ã®NULLå€ã®ååšã¯ããã»ã©å±éºã§ã¯ãããŸãããä»»æã®å€ãšæ¯èŒããŸãããã®å ŽåãORã䜿çšãããšãã®ããžãã¯ãšä»»æã®ããžãã¯ãæ¯èŒããŸããexpressionïŒSalary> 1000 OR Salary> 1500 OR Salary> NULLïŒã¯ãå°ãªããšã1ã€ã®æ¡ä»¶ãæºããããå Žåã«trueãè¿ãããšãã§ããŸãã
ANYã䜿çšããŠåçæ§ãæ¯èŒããå ŽåãINã䜿çšããŠè¡šãããšãã§ããŸãã
SELECT * FROM Departments WHERE ID=ANY(SELECT DISTINCT DepartmentID FROM Employees)
ããã§ã¯ãåŸæ¥å¡ããããã¹ãŠã®éšéãè¿ããŸãããããã£ãŠãããã¯æ¬¡ãšåçã«ãªããŸãã
SELECT * FROM Departments WHERE ID IN(SELECT DISTINCT DepartmentID FROM Employees)
ã芧ã®ãšãããALLããã³ANYã¯ä»ã®æŒç®åã䜿çšããŠè¡šçŸã§ããŸããããããå Žåã«ãã£ãŠã¯ããããã䜿çšããããšã§ãªã¯ãšã¹ããèªã¿ãããããããšãã§ãããããç¶æ³ãææ¡ããããã«ãé©åãªã±ãŒã¹ã§ããããèªèããŠé©çšããå¿ èŠããããŸããã€ãŸã ãªã¯ãšã¹ããäœæãããšãããPOãæãå€ãåŸæ¥å¡ãéžæãããããã«æ±ããããããããªã¯ãšã¹ããäœæã§ããŸãã
SELECT * FROM Employees e1 WHERE e1.Salary>ALL(SELECT e2.Salary FROM Employees e2 WHERE e2.ID<>e1.ID AND e2.Salary IS NOT NULL)
æå³ãåæ§ã®ãèªåã®ã¹ã¿ãã以äžã®åŸæ¥å¡ãããªãåŸæ¥å¡ãéžæãããã«çœ®ãæããŸããã
SELECT * FROM Employees e1 WHERE NOT EXISTS(SELECT * FROM Employees e2 WHERE e2.Salary>e1.Salary)
ããããŸããSQLèšèªã¯ããšããšäžè¬ãŠãŒã¶ãŒåãã®èšèªãšããŠèããããŠãããããããŸããŸãªæ¹æ³ã§èªåã®èããè¡šçŸã§ããããšã瀺ããŠããŸãã
ãµãã¯ãšãªã«ã€ããŠã®ããå°ãã®èšè
ãµãã¯ãšãªã¯ãCASEã³ã³ã¹ãã©ã¯ãããã§ãã¯ã€ã³ããããã«ãä»ã®å€ãã®ãããã¯ïŒHAVINGãããã¯ãªã©ïŒã§ã䜿çšã§ããŸããäžè¬çã«ãããªãã®æ³ååã¯ãã§ã«ååã«ãããŸãã
ãããããŸã第äžã«ãSELECTæŒç®åã®æšæºçãªæ§é ã«é¢ããåé¡ãåžžã«è§£æ±ºããããšããããšããå§ãããŸãããããæ©èœããªãå Žåã¯ããµãã¯ãšãªã®å©ããåããŸãã
ãããã£ãŠããã®æç§æžã§ã¯ã3ã€ã®éšåãåºæ¬æ§é ã®æ€èšã«åœãŠã1ã€ã®ã»ã¯ã·ã§ã³ã®ã¿ããµãã¯ãšãªã«å²ãåœãŠãŸããã次ã®ããã«ããµãã¯ãšãªã§SELECTã®èª¬æãéå§ã§ããªããšæããŸãããµãã¯ãšãªãããããšãç¥ã£ãŠããããåºæ¬æ§é ãææããŠããªããããåå¿è ã§ããã®ãããª3é建ãŠã®æ§é ïŒãµãã¯ãšãª-ãµãã¯ãšãªã®ãµãã¯ãšãªïŒãç©ã¿äžããããšãã§ããŸããããããåºæ¬ãç¥ã£ãŠããå Žåããããã®3é建ãŠã®æ§é ã¯ãã¹ãŠãããšãã°ååç©ãã°ã«ãŒãåã䜿çšããåäžã®ã¯ãšãªã§è¡šçŸã§ããŸãã
ç§ã¯ãµãã¯ãšãªãæªããšèšã£ãŠããã®ã§ã¯ãããŸããããªããªã ãããã®å©ããåããŠãç¹å®ã®åé¡ããããšã¬ã¬ã³ãã«è§£æ±ºã§ããå ŽåããããŸããããã§ã¯ããŸããµãæ§é ãæ§ç¯ãããŠãããããåºæ¬æ§é ãèªä¿¡ãæã£ãŠäœ¿çšããæ¹æ³ãåŠã¶å¿ èŠããããšèšããŸãããã®ããããã¹ãŠã®èšèšã¯ãæå³ããç®çã«äœ¿çšãããå Žåã«åªããŠããŸãã
ãããã«
ããã§ãSELECTã¹ããŒãã¡ã³ãã®ãã¹ãŠã®åºæ¬çãªæ§æãå®äºããŸãããæ°ããã°ãããã»ã©å€ãã¯ãããŸããããããããã確å®ã«ææããããããäžç·ã«äœ¿çšããèœåããããããã»ãšãã©ãã¹ãŠã®æ å ±ãããŒã¿ããŒã¹ã«ä¿åããããšãã§ããŸãã
ãã®è³æã¯ãããŸããŸãªDBMSïŒParadox DBMSããå§ãŸãïŒã§æ¢ã«10幎以äžåã«äœ¿çšãããŠããSQLèšèªã®å®éã®çµéšã«åºã¥ããŠäœæãããŸããããã®ãã¥ãŒããªã¢ã«ã§ã¯ãããŒã¿ãµã³ããªã³ã°ã«äœ¿çšãããSQLèšèªã®ãã¹ãŠã®åºæ¬æ§é ã®æ¬è³ªãå¯èœãªéãç°¡åãªæ¹æ³ã§èª¬æããããšããŸãããç§ã¯ããã®ãã¥ãŒããªã¢ã«ãITå°é家ã ãã§ãªããå¹ åºã人ã ã«ç解ã§ããããã«èª¬æããããšããŸãããç§ãæåãããã®è³æãããªããæåã®äžæ©ãèžã¿åºãã®ã«åœ¹ç«ã€ããããªãããããŸã§ã«äžããããªãã£ãç¹å®ã®ãã¶ã€ã³ãç解ããã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãããããã«ããããã®è³æã«æ £ããããã«æéãå²ããŠãããçããã«æè¬ããŸãã
次ã®ããŒãã§ã¯ãããŒã¿å€æŽæŒç®åã«é¢ããäžè¬çãªçšèªã®æŠèŠã説æããŸããäžè¬çã«ããã®æ å ±ãšDDLã®ç¥èã¯èª°ããå¿ èŠãšããªãããïŒäž»ã«ITå°é家ïŒ-ã»ãšãã©ã®äººã¯SELECTã¹ããŒãã¡ã³ãã䜿çšããŠããŒã¿ãéžæããæ¹æ³ãåŠã¶ããã«SQLãæ£ç¢ºã«åŠã³ãŸãã次ã®éšåã¯æçµçã«ãªããšæããŸãããã®æç¹ãŸã§ã«åŸããããã¹ãŠã®ç¥èã¯ã次ã®ããŒãã§ã圹ç«ã¡ãŸããããŒã¿ãå€æŽããããã®è€éãªæ§é ãæ£ããèšè¿°ããããã«ã¯ãå¿ ãSELECTã¹ããŒãã¡ã³ãã®æ§é ã䜿çšããå¿ èŠããããŸããããšãã°ãããŒãã«å ã®è¡ã®ã°ã«ãŒããåé€ãŸãã¯å€æŽããåã«ããã®ããŒã¿ãæ£ããéžæããå¿ èŠããããŸãããããã£ãŠã次ã®éšåã«ã¯SELECTæ§é ãå«ãŸããŸããSELECTã¹ããŒãã¡ã³ãã®ããã«SQLãæ£ç¢ºã«ç 究ããŠãã人ã ã«ãšã£ãŠã¯èå³æ·±ããšæããŸãã
èªä¿¡ãæã£ãŠã¯ãšãªãäœæããã«ã¯ãçè«ãç解ããã ãã§ã¯ååã§ã¯ãããŸããããŸã ããããç·Žç¿ããå¿ èŠããããŸãããã®ç®çã®ããã«ããSQL-EX.RU-SQLèšèªã®å®è·µçç¥èããšããæåãªãµã€ãããå§ãããŸãããã®ãµã€ãã«ã¯ãããã€ãã®ãã¢ããŒã¿ããŒã¹ãå«ãŸããŠãããæãåçŽãªã¿ã¹ã¯ã®è§£æ±ºããå§ããŠãæãããªãããŒãªã¯ãšãªã®äœæãç·Žç¿ããæ©äŒãæäŸããŸããSQLèšèªã«é¢ãããã¬ãŒãã³ã°è³æãå€æ°ãããŸããããã«ãæ Œä»ãã®åé¡ã解決ããããã«ç«¶ãåããæçµçã«ã¯çè«ã®ç¥èã ãã§ãªããå®è·µçãªã¹ãã«ã蚌æãã蚌ææžãååŸã§ããŸãã
åºæ¬æ§é ã®äœ¿çšæ¹æ³ãèªä¿¡ãæã£ãŠåŠãã åŸã以äžãåå¥ã«åŠç¿ããããšããå§ãããŸãã
- 以äžã䜿çšã§ããããã«ããOVERå¥ã
- GROUP BYã䜿çšããªãéèšé¢æ°ïŒCOUNTãSUMãMINãMAXãAVGïŒã
- ã©ã³ãã³ã°é¢æ°ïŒROW_NUMBERïŒïŒãRANKïŒïŒããã³DENSE_RANKïŒïŒ;
- åæé¢æ°ïŒLAGïŒïŒããã³LEADïŒïŒãFIRST_VALUEïŒïŒããã³LAST_VALUEïŒïŒ;
- GROUP BY ROLLUPïŒ...ïŒãGROUP BY GROUPING SETSïŒ...ïŒã...ããã³ãããã®ç®çã§äœ¿çšãããè£å©é¢æ°ãèšç®ã§ããæ§é ãç 究ããããïŒGROUPING_IDïŒïŒããã³GROUPINGïŒïŒ;
- PIVOTãUNPIVOTãæ§ç¯ããŸãã
ããã«é¢ãããã¹ãŠã®ç°¡åãªæ å ±ã¯ããä»é²1-SELECTãªãã¬ãŒã¿ãŒã®ããŒãã¹ãããã³ãä»é²2-OVERããã³åæé¢æ°ãã®5çªç®ã®ããŒãã«èšèŒãããŠããŸããããããã¹ãŠã«é¢ããè¿œå æ å ±ã¯ãåãMSDNã©ã€ãã©ãªã§ã€ã³ã¿ãŒãããäžã§ç°¡åã«èŠã€ããããšãã§ããŸãã
åŠç¿ã§é 匵ã£ãŠãã ããã
ããŒã5-habrahabr.ru/post/256169