Date post: | 13-Apr-2018 |
Category: |
Documents |
Upload: | shravan-kumar |
View: | 215 times |
Download: | 0 times |
of 122
7/26/2019 2010_01MySQLJoins
1/122
Writing Joins in MySQLPresented by:
Sheeri K. Cabral
7/26/2019 2010_01MySQLJoins
2/122
Topics CoveredJOINs
OUTER
LEFT, RIGHT, FULL OUTER
INNER
INNER, NATURAL, comma (,)
CROSS
Su!ueries
"E#EN"ENT SU$%UER&
"ERI'E" TA$LE
Ca*i* a su!uer+ o a JOIN
7/26/2019 2010_01MySQLJoins
3/122
E-amp.e/01ee2 iesive course
Home1or2 ever+ Frida+
Eac assi*me is /3 o4 +our *rade
Lo1es *rade is dropped
563 o4 +our *rade, oa.
7ee2.+ ess ever+ 8oda+
Same *radi* srucure as 18iderm 9 7ed: ;3 o4 +our *rade
Fia. e-am 9 Frida+ =3 o4 +our *rade
7/26/2019 2010_01MySQLJoins
4/122
Samp.e daa
1or2 a.eCREATE TABLE work (work_id tinyint(3) unsigned NOT NULL AUTO_INCREMENT,wn!e "r#$r(%&&) 'EAULT NULL,gi"en dte 'EAULT NULL,#t_o*_grde tinyint(3) unsigned NOT NULL,+RIMAR -E (work_id)) EN.INE/Inno'B 'EAULT C0AR1ET/2tin
7/26/2019 2010_01MySQLJoins
5/122
Samp.e daa!ys425 1ELECT 6 ROM work7
8999999999899999999989999999999998999999999999998: work_id : wn!e : gi"en : #t_o*_grde :8999999999899999999989999999999998999999999999998
: : $w : %;;9;9; : < :: % : test : %;;9;9;= : < :: 3 : $w% : %;;9;9;> : < :: = : test% : %;;9;9 : < :: & : $w3 : %;;9;9& : < :: < : test3 : %;;9;9> : < :: ? : !idter! : %;;9;9%; : & :: > : $w= : %;;9;9%% : < :: @ : test= : %;;9;9%& : < :: ; : $w& : %;;9;9%@ : < :: : test& : %;;9;%9; : < :: % : $w< : %;;9;%9;& : < :: 3 : test< : %;;9;%9;> : < :: = : *in2 : %;;9;%9% : %& :8999999999899999999989999999999998999999999999998
7/26/2019 2010_01MySQLJoins
6/122
Samp.e daasude a.e
CREATE TABLE student (student_id tinyint(3) unsigned NOT NULL AUTO_INCREMENTn!e "r#$r(%&&) 'EAULT NULL,e!i2 "r#$r(%&&) 'EAULT NULL,+RIMAR -E (student_id)) EN.INE/Inno'B 'EAULT C0AR1ET/2tin7
Eries
899999999999989999999999999999989999999999999999998: student_id : n!e : e!i2 :
899999999999989999999999999999989999999999999999998: : 1$eeri Cr2 : s$eeri*ooedu :: % : .iusee MDi : giusee*ooedu :: 3 : Co2in C$r2es : #o2in*ooedu :: = : Ron2d Brd*ord : ron2d*ooedu :899999999999989999999999999999989999999999999999998
7/26/2019 2010_01MySQLJoins
7/122
Samp.e daasude?1or2 a.e
Crete T2e CREATE TABLE student_work (student_id tinyint(3) unsigned NOT NULL,work_id tinyint(3) unsigned NOT NULL,grde_nu! tinyint(3) unsigned 'EAULT NULL,grde_2etter #$r(%) 'EAULT NULL,*or_grde enu!(FyF,FnF) 'EAULT FyF,-E student_id (student_id),-E work_id (work_id),CON1TRAINT student_work_i*k_ OREI.N -E (student_id)
REERENCE1 student (student_id),
CON1TRAINT student_work_i*k_% OREI.N -E (work_id)REERENCE1 work (work_id)) EN.INE/Inno'B 'EAULT C0AR1ET/2tin7
7/26/2019 2010_01MySQLJoins
8/122
Samp.e daasude?1or2 eries
IN1ERT INTO student_work (student_id,work_id,grde_nu!)GALUE1H9 1$eeri $d >> *or e#$ $wtest eD#et $w< (?%),H9 !idter! >>, *in2 @;, nd s$e did not tke test3(,,>>),(,%,>>),(,3,>>),(,=,>>),(,&,>>),(,?,>>),(,@,>>),(,;,>>),(,,>>),(,%,?%),(,3,>>),(,=,@;),H9 .iusee #o!2eted 22 ssign!entstests(%,,;;),(%,%,;;),(%,3,@;),(%,=,>>),(%,&,>>),(%,&),(%,?,@&),(%,>,;;),(%,@,;;),(%,;,>%),(%,,>&),
(%,%,>@),(%,3,@;),(%,=,@
7/26/2019 2010_01MySQLJoins
9/122
Samp.e daasude?1or2 eries
IN1ERT INTO student_work (student_id,work_id,grde_nu!)GALUE1H9 Co2in is usy 2nning %;; User Con*eren#e, ndH9 did not #o!2ete ny $w ssign!ents, nd s resu2tH9 did not do we22 on t$e tests(3,%,?&),(3,=,??),(3,@),(3,?,>&),(3,@,?%),(3,,>@),(3,3,?;),(3,=,>;)H9 Ron2d knew $is stu** ut got usy s t$e #ourseH9 went on(=,,;;),(=,%,;;),(=,3,@&),(=,=,@&),(=,&,@;),(=,,>&),(=,@,>&),(=,;,>;),(=,,>;),(=,%,?&),(=,3,?&),(=,=,>3)7
7/26/2019 2010_01MySQLJoins
10/122
Samp.e daaG.oa. *rade?um?.eer a.e
CREATE TABLE grde_nu!_2etter (grde_nu! tinyint(3) unsigned NOT NULL,grde_2etter #$r(%) NOT NULL 'EAULT FF,+RIMAR -E (grde_nu!)
) EN.INE/MyI1AM 'EAULT C0AR1ET/2tin7
!ys425 se2e#t !in(grde_nu!),!D(grde_nu!),#ount(6) *ro!grde_nu!_2etter78999999999999999989999999999999999899999999998: !in(grde_nu!) : !D(grde_nu!) : #ount(6) :
8999999999999999989999999999999999899999999998: ; : ;; : ; :8999999999999999989999999999999999899999999998 row in set (;;; se#)
7/26/2019 2010_01MySQLJoins
11/122
7/26/2019 2010_01MySQLJoins
12/122
8+S%L JOINsA JOIN c.ause is opioa.
ON (.;:co.; .=:co.= AN" :::)
Ca a.so speci4+ .;:co.; e-pr, (.;:co.;B;6)
USING (co.;,co.=,:::)
Same as .;:co.;@.=:co.; AN" .;:co.=@.=:co.=
INNER, CROSS, comma (,) a.. do e same i*
As o4 8+S%L >:6, CO88A oi is .o1er
precedece a oer JOINS
SELECT:::FRO8 .;, .= ON (.;:co.@.=:co.)INNER JOIN .5 ON (.=:[email protected]:co.) 7HERE.;:co.@.=:co.D
7/26/2019 2010_01MySQLJoins
13/122
CROSS JOIN
Caresia produc
A.. comiaios
1ELECT n!e, wn!eROM student CRO11 JOIN work7
Usua..+ o desired
7/26/2019 2010_01MySQLJoins
14/122
INNER JOIN
a.e ; over.ap a.e =
;:co.; ;:co.=@ =:co.=
;:co.5 =:co.; =:co.5
7/26/2019 2010_01MySQLJoins
15/122
7/26/2019 2010_01MySQLJoins
16/122
CROSS, INNER are semaic
CROSS JOIN aci* as a INNER JOIN
1ELECT sgrde_nu!, ggrde_2etterROM student_work A1 sCRO11 JOIN grde_nu!_2etter A1 gON (sgrde_nu!/ggrde_nu!)7
INNER JOIN aci* as a CROSS JOIN1ELECT n!e, wn!e ROM student INNER JOINwork7
7/26/2019 2010_01MySQLJoins
17/122
I 4ac +ou do o eed eier
JOIN aci* as a INNER JOIN
1ELECT sgrde_nu!, ggrde_2etterROM student_work A1 sJOIN grde_nu!_2etter A1 gON (sgrde_nu!/ggrde_nu!)7
JOIN aci* as a CROSS JOIN1ELECT n!e, wn!e ROM student JOIN work7
7/26/2019 2010_01MySQLJoins
18/122
JOIN c.ause
ON () or USING(:::)
Ca speci4+ i e 7HERE c.ause
Same resu.s
7/26/2019 2010_01MySQLJoins
19/122
8+ $es #racices
"o use a comma o oi
Ue-peced eavior 1i oer JOINs i a !uer+
Never use JOIND a.1a+s use INNER JOIN orCROSS JOIN
7oever deu*s 1i.. 2o1 +our ieio
Use a JOIN c.ause isead o4 a 7HERE c.ause 8ore c.ear 1a is a 4i.er ad 1a is a oi
7/26/2019 2010_01MySQLJoins
20/122
7/26/2019 2010_01MySQLJoins
21/122
OUTER JOIN
So1 a.. ro1s a mac o oe side
*e a.. *rades 4or es5
1ELECT n!e, wn!e, grde_nu!ROM student CRO11 JOIN workLET OUTER JOIN student_workU1IN. (student_id,work_id)
K0ERE wn!e/Ftest3F7
7/26/2019 2010_01MySQLJoins
22/122
OUTER JOIN
LEFT OUTER JOIN
RIGHT OUTER JOIN
OUTER is reduda
7/26/2019 2010_01MySQLJoins
23/122
LEFT JOIN, ic.usive
a.e ; over.ap a.e =
;:co.; ;:co.=@ =:co.=
;:co.5 =:co.; =:co.5
7/26/2019 2010_01MySQLJoins
24/122
LEFT JOIN, e-c.usive
a.e ; over.ap a.e =
;:co.; ;:co.=@ =:co.=
;:co.5 =:co.; =:co.5
::::7HERE =:co.; IS NULL
7/26/2019 2010_01MySQLJoins
25/122
FULL OUTER JOIN
"oes o e-is i 8+S%L
Ca e simu.aed
7/26/2019 2010_01MySQLJoins
26/122
FULL OUTER JOIN, ic.usive
a.e ; over.ap a.e =
;:co.= ;:co.;@ =:co.=
;:co.5 =:co.; =:co.5
SELECT FRO8 .; LEFT JOIN .= :::
UNION KALL FRO8 .; RIGHT JOIN .=
7/26/2019 2010_01MySQLJoins
27/122
FULL OUTER JOIN
I4 i is a.read+ i e 4irs resu., do o pu i i e
secod resu.
SELECT FRO8 .; LEFT JOIN .= :::
UNION ALL FRO8 .; RIGHT JOIN .=
7HERE .;:co. IS NULL
I e =d!uer+ i e uio, o.+ ro1s a ave omac i .; are a2e:
7/26/2019 2010_01MySQLJoins
28/122
FULL OUTER JOIN, e-c.usive
a.e ; over.ap a.e =
;:co.= ;:co.;@ =:co.=
;:co.5 =:co.; =:co.5
SELECT FRO8 .; LEFT JOIN .= :::7HERE .=:co.; IS NULLUNION ALL SELECT FRO8 .; RIGHT JOIN .= 7HERE .;:co. IS NULL
7/26/2019 2010_01MySQLJoins
29/122
NATURAL modi4ier
"oes o use a JOIN c.ause
JOIN c.ause is allmaci* 4ie.d ames
7or2s 4or
NATURAL JOIN
NATURAL LEFT JOIN
NATURAL RIGHT JOIN
7/26/2019 2010_01MySQLJoins
30/122
NATURAL JOIN e-amp.e
Isead o4
1ELECT n!e,grde_nu!ROM student INNER JOIN student_work U1IN.(student_id)K0ERE n!e/F1$eeri Cr2F7
7rie1ELECT n!e,grde_nu!ROM student NATURAL JOIN student_workK0ERE n!e/F1$eeri Cr2F7
7/26/2019 2010_01MySQLJoins
31/122
NATURAL JOIN *oe a1r+Havi* e same 4ie.d ames 1e e 4ie.ds areo e!ua.
1ELECT swgrde_nu!, gn2grde_2etter ROMstudent_work A1 sw INNER JOINgrde_nu!_2etter A1 gn2 U1IN. (grde_nu!)7
Is NOT e!uiva.e o
1ELECT swgrde_nu!, gn2grde_2etter ROMstudent_work A1 sw NATURAL JOINgrde_nu!_2etter A1 gn27
Tis is 1+ e 4ie.d is ca..ed 1or2:1ame
7/26/2019 2010_01MySQLJoins
32/122
Su!ueries
A su!uer+ is a !uer+ 1ii a !uer+
8ore aura. 1a+ o4 i2i* 4or procedura.i2ers
S%L is dec.araive, ad opimiMed a 1a+
7/26/2019 2010_01MySQLJoins
33/122
#rocedura. Ti2i*
Ho1 o *e e ames ad *rades 4or es;
7/26/2019 2010_01MySQLJoins
34/122
#rocedura. Ti2i* Ge e amesad *rades 4or es;
Ge ames ad *rades
SELECT ame, *rade?um
7/26/2019 2010_01MySQLJoins
35/122
#rocedura. Ti2i* Ge e amesad *rades 4or es;
SELECT ame, *rade?um
sar 1i e oi a.e
FRO8 sude?1or2
7/26/2019 2010_01MySQLJoins
36/122
#rocedura. Ti2i* Ge e amesad *rades 4or es;
SELECT ame, *rade?um
FRO8 sude?1or2
*e e ame
INNER JOIN sude USING (sude?id)
7/26/2019 2010_01MySQLJoins
37/122
#rocedura. Ti2i* Ge e amesad *rades 4or es;
SELECT ame, *rade?um
FRO8 sude?1or2
INNER JOIN sude USING (sude?id)
$u o.+ *e es;
7HERE 1or2?id IN (SELECT 1or2?id FRO8 1or2
7HERE 1ame@es;)
7/26/2019 2010_01MySQLJoins
38/122
#rocedura. Ti2i* Ge e amesad *rades 4or es;
SELECT ame, *rade?um
FRO8 sude?1or2
INNER JOIN sude USING (sude?id)
7HERE 1or2?id IN (SELECT 1or2?id FRO8 1or27HERE 1ame@es;)D
7/26/2019 2010_01MySQLJoins
39/122
#rocedura. Ti2i* Ge e amesad *rades 4or es;
SELECT ame, *rade?um
FRO8 sude?1or2
INNER JOIN sude USING (sude?id)
7HERE 1or2?id IN (SELECT 1or2?id FRO8 1or27HERE 1ame@es;)D
7/26/2019 2010_01MySQLJoins
40/122
"ec.araive Ti2i* Ge e amesad *rades 4or es;
I ave 5 ses o4 daa
sude as e ame
sude?1or2 as e *rades
1or2 as e ame o4 e assi*me
SELECT ame, *rade?um FRO8 :::: 7HERE
1ame@es;
7/26/2019 2010_01MySQLJoins
41/122
"ec.araive Ti2i* Ge e amesad *rades 4or es;
sude ad sude?1or2 re.ae + sude?id
SELECT ame, *rade?um FRO8
sude INNER JOIN sude?1or2 USING(sude?id)
::::
7HERE 1ame@es;D
7/26/2019 2010_01MySQLJoins
42/122
7/26/2019 2010_01MySQLJoins
43/122
7/26/2019 2010_01MySQLJoins
44/122
Ge a.. *rades 4or es5
Sar 1i
SELECT ame, *rade?um FRO8::::
7HERE 1ame@es5D
7/26/2019 2010_01MySQLJoins
45/122
Ge a.. *rades 4or es5
7e 1a a .isi* 4or eac ro1 i 1or2 a*ais
eac ro1 i sude
SELECT ame, *rade?um
FRO8 sude CROSS JOIN 1or2
::::
7HERE 1ame@es5D
7/26/2019 2010_01MySQLJoins
46/122
Ge a.. *rades 4or es5
We want a listing for each row in work against
each row in student
7a 1e 1a, o o1 o *e i: Tas dec.araive
7/26/2019 2010_01MySQLJoins
47/122
Ge a.. *rades 4or es5
Grades mi* o e-is 4or a.. e ro1s
:::so 1e.. eed a ouer oi
Fi.. i e va.ues 4rom sude?1or2 4or e *radesa do e-is, oii* o sude?id ad 1or2?id
SELECT ame, *rade?um
FRO8 sude CROSS JOIN 1or2
LEFT JOIN sude?1or2 USING (sude?id,1or2?id) 7HERE 1ame@es5D
7/26/2019 2010_01MySQLJoins
48/122
"rop e .o1es es score
Ho1
7/26/2019 2010_01MySQLJoins
49/122
"rop e .o1es es score
For our purposes, NULL @ 6:
So 1e.. eed o 2eep e CROSS JOIN as i eprevious !uer+
SELECT ame, *rade?um
FRO8 sude CROSS JOIN 1or2
LEFT JOIN sude?1or2 USING (sude?id,1or2?id)
7/26/2019 2010_01MySQLJoins
50/122
"rop e .o1es es score
Ge a.. ess
SELECT ame, *rade?um
FRO8 sude CROSS JOIN 1or2
LEFT JOIN sude?1or2 USING (sude?id,1or2?id) 7HERE 1ame .i2e es?D
7e e-pec = ro1s reured::::
7/26/2019 2010_01MySQLJoins
51/122
"rop e .o1es es score
Ge miimum *rade 4rom a.. ess perperso
SELECT ame, mi(*rade?um)
FRO8 sude CROSS JOIN 1or2
LEFT JOIN sude?1or2 USING (sude?id,1or2?id) 7HERE 1ame .i2e es?
GROU# $& sude?idD
7e e-pec ro1s
7/26/2019 2010_01MySQLJoins
52/122
"rop e .o1es es score
Cover o a U#"ATE saeme:::::
SELECT ame, mi(*rade?um)
FRO8 sude CROSS JOIN 1or2
LEFT JOIN sude?1or2 USING (sude?id,1or2?id) 7HERE 1ame .i2e es?
GROU# $& sude?idD
Tis is ard
7/26/2019 2010_01MySQLJoins
53/122
"rop e .o1es es scoreNo1 add i e res:::
U#"ATE sude?1or2 as upd
INNER JOIN sude?1or2 as se. USING(sude?id, 1or2?id)
RIGHT JOIN sude USING (sude?id, 1or2?id)
CROSS JOIN 1or2
SET upd:4or?*rade@ 7HERE 1ame .i2e es?
AN" upd:*rade?um@mi(se.:*rade?um)
GROU# $& se.:sude?idD
7/26/2019 2010_01MySQLJoins
54/122
Ta does 1or2::::Someimes +ou eed a su!uer+:::::
U#"ATE sude?1or2
SET 4or?*rade@ 7HERECONCAT(sude?id,1or2?id) IN (SELECTCONCAT(sude?id,1or2?id) FRO8
sude CROSS JOIN 1or2
LEFT JOIN sude?1or2 USING (sude?id,1or2?id) 7HERE 1ame .i2e es?
GROU# $& sude?id)D
7/26/2019 2010_01MySQLJoins
55/122
Ta does 1or2 eier::::Someimes +ou eed o do i i ; !uer+
Someimes is o ecessar+, u more opima.
#ro.em is e mi(*rade?um)::::GROU# $&
So use a emporar+ a.e
CREATE TE8#ORAR& TA$LE *rade?o?dropSELECT mi(coa.esce(*rade?um,6)) FRO8
sude CROSS JOIN 1or2 LEFT JOIN sude?1or2USING (sude?id,1or2?id) 7HERE 1ame .i2ees? *roup + sude?idD
7/26/2019 2010_01MySQLJoins
56/122
Temporar+ a.e
CREATE TEM+ORAR TABLE grde_to_dro (
student_id tinyint unsigned not nu22,work_id tinyint unsigned de*u2t nu22,grde_nu! tinyint unsigned de*u2t nu22)7
7/26/2019 2010_01MySQLJoins
57/122
Temporar+ a.e
IN1ERT INTO grde_to_dro (student_id,grde_nu!)
1ELECT student_id,!in(#o2es#e(grde_nu!,;))ROM student CRO11 JOIN workLET JOIN student_work U1IN.(student_id,work_id)K0ERE wn!e 2ike Ftest_F.ROU+ B student_id7
7/26/2019 2010_01MySQLJoins
58/122
Temporar+ a.eU+'ATE grde_to_dro A1 gtd INNER JOINstudent_work A1 sw U1IN.(student_id,grde_nu!)
1ET gtdwork_id / swwork_id 7
U+'ATE student_work A1 sw INNER JOINgrde_to_dro A1 gtd U1IN.(student_id,work_id)1ET sw*or_grde/FnF 7
7/26/2019 2010_01MySQLJoins
59/122
Temporar+ a.e
Reet *or droing t$e 2owest $o!ework
'RO+ TABLE I EI1T1 grde_to_dro7
7/26/2019 2010_01MySQLJoins
60/122
8ore es pracices
EP#LAIN a.. +our !ueries, ad *e e es +pe
possi.e
Avoid JOIN is (ide- is, STRAIGHT?JOIN)
Tr+ o opimiMe su!ueries io JOINs i4 possi.e
7/26/2019 2010_01MySQLJoins
61/122
Tas i
%uesios
Commes
7/26/2019 2010_01MySQLJoins
62/122
01/29/10
01/29/10 1
Writing Joins in MySQLPresented by:
Sheeri K. Cabral
7/26/2019 2010_01MySQLJoins
63/122
2
Topics CoveredJOINs
OUTER LEFT, RIGHT, FULL OUTER
INNER
INNER, NATURAL, comma (,)
CROSS
Su!ueries
"E#EN"ENT SU$%UER&
"ERI'E" TA$LE
Ca*i* a su!uer+ o a JOIN
7/26/2019 2010_01MySQLJoins
64/122
3
E-amp.e/01ee2 iesive course
Home1or2 ever+ Frida+ Eac assi*me is /3 o4 +our *rade
Lo1es *rade is dropped
563 o4 +our *rade, oa.
7ee2.+ ess ever+ 8oda+
Same *radi* srucure as 1
8iderm 9 7ed: ;3 o4 +our *rade
Fia. e-am 9 Frida+ =3 o4 +our *rade
H1 due e 4irs da+ o4 c.ass, o1 crue.
7/26/2019 2010_01MySQLJoins
65/122
4
Samp.e daa
1or2 a.eCREATE TABLE work (work_id tinyint(3) unsigned NOT NULL AUTO_INCREMENT,wn!e "r#$r(%&&) 'EAULT NULL,gi"en dte 'EAULT NULL,#t_o*_grde tinyint(3) unsigned NOT NULL,+RIMAR -E (work_id)) EN.INE/Inno'B 'EAULT C0AR1ET/2tin
7/26/2019 2010_01MySQLJoins
66/122
5
Samp.e daa!ys425 1ELECT 6 ROM work7
8999999999899999999989999999999998999999999999998: work_id : wn!e : gi"en : #t_o*_grde :
8999999999899999999989999999999998999999999999998: : $w : %;;9;9; : < :: % : test : %;;9;9;= : < :: 3 : $w% : %;;9;9;> : < :: = : test% : %;;9;9 : < :: & : $w3 : %;;9;9& : < :: < : test3 : %;;9;9> : < :: ? : !idter! : %;;9;9%; : & :: > : $w= : %;;9;9%% : < :: @ : test= : %;;9;9%& : < :: ; : $w& : %;;9;9%@ : < :: : test& : %;;9;%9; : < :: % : $w< : %;;9;%9;& : < :
: 3 : test< : %;;9;%9;> : < :: = : *in2 : %;;9;%9% : %& :8999999999899999999989999999999998999999999999998
7/26/2019 2010_01MySQLJoins
67/122
6
Samp.e daasude a.e
CREATE TABLE student (student_id tinyint(3) unsigned NOT NULL AUTO_INCREMENTn!e "r#$r(%&&) 'EAULT NULL,e!i2 "r#$r(%&&) 'EAULT NULL,+RIMAR -E (student_id)) EN.INE/Inno'B 'EAULT C0AR1ET/2tin7
Eries
899999999999989999999999999999989999999999999999998: student_id : n!e : e!i2 :899999999999989999999999999999989999999999999999998: : 1$eeri Cr2 : s$eeri*ooedu :: % : .iusee MDi : giusee*ooedu :
: 3 : Co2in C$r2es : #o2in*ooedu :: = : Ron2d Brd*ord : ron2d*ooedu :899999999999989999999999999999989999999999999999998
7/26/2019 2010_01MySQLJoins
68/122
7
Samp.e daasude?1or2 a.e
Crete T2e CREATE TABLE student_work ( student_id tinyint(3) unsigned NOT NULL, work_id tinyint(3) unsigned NOT NULL, grde_nu! tinyint(3) unsigned 'EAULT NULL, grde_2etter #$r(%) 'EAULT NULL, *or_grde enu!(FyF,FnF) 'EAULT FyF, -E student_id (student_id), -E work_id (work_id), CON1TRAINT student_work_i*k_ OREI.N -E (student_id)REERENCE1 student (student_id), CON1TRAINT student_work_i*k_% OREI.N -E (work_id)REERENCE1 work (work_id)) EN.INE/Inno'B 'EAULT C0AR1ET/2tin7
7/26/2019 2010_01MySQLJoins
69/122
8
Samp.e daasude?1or2 eries
IN1ERT INTO student_work (student_id,work_id,grde_nu!)GALUE1H9 1$eeri $d >> *or e#$ $wtest eD#et $w< (?%),H9 !idter! >>, *in2 @;, nd s$e did not tke test3(,,>>),(,%,>>),(,3,>>),(,=,>>),(,&,>>),(,?,>>),(,@,>>),(,;,>>),(,,>>),(,%,?%),(,3,>>),(,=,@;),H9 .iusee #o!2eted 22 ssign!entstests(%,,;;),(%,%,;;),(%,3,@;),(%,=,>>),(%,&,>>),(%,&),(%,?,@&),(%,>,;;),(%,@,;;),(%,;,>%),(%,,>&),(%,%,>@),(%,3,@;),(%,=,@
7/26/2019 2010_01MySQLJoins
70/122
9
Samp.e daasude?1or2 eries
IN1ERT INTO student_work (student_id,work_id,grde_nu!)GALUE1H9 Co2in is usy 2nning %;; User Con*eren#e, ndH9 did not #o!2ete ny $w ssign!ents, nd s resu2tH9 did not do we22 on t$e tests(3,%,?&),(3,=,??),(3,@),(3,?,>&),(3,@,?%),(3,,>@),(3,3,?;),(3,=,>;)H9 Ron2d knew $is stu** ut got usy s t$e #ourseH9 went on(=,,;;),(=,%,;;),(=,3,@&),(=,=,@&),(=,&,@;),(=,,>&),(=,@,>&),(=,;,>;),(=,,>;),(=,%,?&),(=,3,?&),(=,=,>3)7
7/26/2019 2010_01MySQLJoins
71/122
10
Samp.e daaG.oa. *rade?um?.eer a.e
CREATE TABLE grde_nu!_2etter ( grde_nu! tinyint(3) unsigned NOT NULL, grde_2etter #$r(%) NOT NULL 'EAULT FF, +RIMAR -E (grde_nu!)) EN.INE/MyI1AM 'EAULT C0AR1ET/2tin7
!ys425 se2e#t !in(grde_nu!),!D(grde_nu!),#ount(6) *ro!grde_nu!_2etter78999999999999999989999999999999999899999999998: !in(grde_nu!) : !D(grde_nu!) : #ount(6) :8999999999999999989999999999999999899999999998: ; : ;; : ; :8999999999999999989999999999999999899999999998
row in set (;;; se#)
7/26/2019 2010_01MySQLJoins
72/122
11
'e "ia*ram
a.e ; over.ap a.e =
;:co.; ;:co.=@ =:co.=
;:co.5 =:co.; =:co.5
Te over.ap is o.+ 1a is e!ua., eve ou* erema+ e = 4ie.ds 1i e same ame:
7/26/2019 2010_01MySQLJoins
73/122
12
8+S%L JOINsA JOIN c.ause is opioa.
ON (.;:co.; .=:co.= AN" :::) Ca a.so speci4+ .;:co.; e-pr, (.;:co.;B;6)
USING (co.;,co.=,:::)
Same as .;:co.;@.=:co.; AN" .;:co.=@.=:co.=
INNER, CROSS, comma (,) a.. do e same i*
As o4 8+S%L >:6, CO88A oi is .o1erprecedece a oer JOINS
SELECT:::FRO8 .;, .= ON (.;:co.@.=:co.)
INNER JOIN .5 ON (.=:[email protected]:co.) 7HERE.;:co.@.=:co.D
7/26/2019 2010_01MySQLJoins
74/122
13
CROSS JOIN
Caresia produc A.. comiaios
1ELECT n!e, wn!eROM student CRO11 JOIN work7
Usua..+ o desired
7/26/2019 2010_01MySQLJoins
75/122
14
INNER JOIN
a.e ; over.ap a.e =
;:co.; ;:co.=@ =:co.=
;:co.5 =:co.; =:co.5
So1 o.+ ro1s a maces o o sides Noe a e SELECT ma+ so1 e co.ums, u
e ve dia*ram is so1i* e matching:
7/26/2019 2010_01MySQLJoins
76/122
15
INNER JOIN
So1 o.+ ro1s a maces o o sides1ELECT sgrde_nu!, ggrde_2etterROM student_work A1 sINNER JOIN grde_nu!_2etter A1 g ON (sgrde_nu!/ggrde_nu!)7
7/26/2019 2010_01MySQLJoins
77/122
16
CROSS, INNER are semaic
CROSS JOIN aci* as a INNER JOIN1ELECT sgrde_nu!, ggrde_2etterROM student_work A1 sCRO11 JOIN grde_nu!_2etter A1 g ON (sgrde_nu!/ggrde_nu!)7
INNER JOIN aci* as a CROSS JOIN
1ELECT n!e, wn!e ROM student INNER JOIN
work7
7/26/2019 2010_01MySQLJoins
78/122
17
I 4ac +ou do o eed eier
JOIN aci* as a INNER JOIN1ELECT sgrde_nu!, ggrde_2etterROM student_work A1 sJOIN grde_nu!_2etter A1 g ON (sgrde_nu!/ggrde_nu!)7
JOIN aci* as a CROSS JOIN
1ELECT n!e, wn!e ROM student JOIN work7
7/26/2019 2010_01MySQLJoins
79/122
18
JOIN c.ause
ON () or USING(:::)
Ca speci4+ i e 7HERE c.ause
Same resu.s
7/26/2019 2010_01MySQLJoins
80/122
19
8+ $es #racices
"o use a comma o oi Ue-peced eavior 1i oer JOINs i a !uer+
Never use JOIND a.1a+s use INNER JOIN orCROSS JOIN
7oever deu*s 1i.. 2o1 +our ieio
Use a JOIN c.ause isead o4 a 7HERE c.ause
8ore c.ear 1a is a 4i.er ad 1a is a oi
7/26/2019 2010_01MySQLJoins
81/122
20
Gei* e .eer *rades
sude?1or2 *rade?um?.eer
AS s AS *
sude?id *rade?um?.eer
1or2?id s:*rade?um@
*rade?um?.eer *:*rade?um
4or?*rade
7/26/2019 2010_01MySQLJoins
82/122
21
OUTER JOIN
So1 a.. ro1s a mac o oe side*e a.. *rades 4or es5
1ELECT n!e, wn!e, grde_nu!ROM student CRO11 JOIN workLET OUTER JOIN student_workU1IN. (student_id,work_id)K0ERE wn!e/Ftest3F7
7/26/2019 2010_01MySQLJoins
83/122
22
OUTER JOIN
LEFT OUTER JOIN
RIGHT OUTER JOIN
OUTER is reduda
7/26/2019 2010_01MySQLJoins
84/122
23
LEFT JOIN, ic.usive
a.e ; over.ap a.e =
;:co.; ;:co.=@ =:co.=
;:co.5 =:co.; =:co.5
7/26/2019 2010_01MySQLJoins
85/122
24
LEFT JOIN, e-c.usive
a.e ; over.ap a.e =
;:co.; ;:co.=@ =:co.=
;:co.5 =:co.; =:co.5
::::7HERE =:co.; IS NULL
RIGHT JOIN is us a mirror ima*e
7/26/2019 2010_01MySQLJoins
86/122
25
FULL OUTER JOIN
"oes o e-is i 8+S%L
Ca e simu.aed
7/26/2019 2010_01MySQLJoins
87/122
26
FULL OUTER JOIN, ic.usive
a.e ; over.ap a.e =
;:co.= ;:co.;@ =:co.=
;:co.5 =:co.; =:co.5
SELECT FRO8 .; LEFT JOIN .= :::
UNION KALL FRO8 .; RIGHT JOIN .=
UNION 1i.. e.imiae dup.icae ro1s UNION ALL us adds o*eer e = ses
7/26/2019 2010_01MySQLJoins
88/122
27
FULL OUTER JOIN
I4 i is a.read+ i e 4irs resu., do o pu i i esecod resu.
SELECT FRO8 .; LEFT JOIN .= :::
UNION ALL FRO8 .; RIGHT JOIN .=
7HERE .;:co. IS NULL
I e =d!uer+ i e uio, o.+ ro1s a ave omac i .; are a2e:
7/26/2019 2010_01MySQLJoins
89/122
28
FULL OUTER JOIN, e-c.usive
a.e ; over.ap a.e =
;:co.= ;:co.;@ =:co.=
;:co.5 =:co.; =:co.5
SELECT FRO8 .; LEFT JOIN .= :::7HERE .=:co.; IS NULL
UNION ALL SELECT FRO8 .; RIGHT JOIN .= 7HERE .;:co. IS NULL
7/26/2019 2010_01MySQLJoins
90/122
29
NATURAL modi4ier
"oes o use a JOIN c.ause JOIN c.ause is allmaci* 4ie.d ames
7or2s 4or
NATURAL JOIN
NATURAL LEFT JOIN
NATURAL RIGHT JOIN
7/26/2019 2010_01MySQLJoins
91/122
30
NATURAL JOIN e-amp.e
Isead o41ELECT n!e,grde_nu!ROM student INNER JOIN student_work U1IN.(student_id)K0ERE n!e/F1$eeri Cr2F7
7rie
1ELECT n!e,grde_nu!
ROM student NATURAL JOIN student_workK0ERE n!e/F1$eeri Cr2F7
7/26/2019 2010_01MySQLJoins
92/122
31
NATURAL JOIN *oe a1r+Havi* e same 4ie.d ames 1e e 4ie.ds are
o e!ua.1ELECT swgrde_nu!, gn2grde_2etter ROMstudent_work A1 sw INNER JOINgrde_nu!_2etter A1 gn2 U1IN. (grde_nu!)7
Is NOT e!uiva.e o
1ELECT swgrde_nu!, gn2grde_2etter ROMstudent_work A1 sw NATURAL JOINgrde_nu!_2etter A1 gn27
Tis is 1+ e 4ie.d is ca..ed 1or2:1ame
7/26/2019 2010_01MySQLJoins
93/122
32
Su!ueries
A su!uer+ is a !uer+ 1ii a !uer+8ore aura. 1a+ o4 i2i* 4or procedura.i2ers
S%L is dec.araive, ad opimiMed a 1a+
7/26/2019 2010_01MySQLJoins
94/122
33
#rocedura. Ti2i*
Ho1 o *e e ames ad *rades 4or es;
7/26/2019 2010_01MySQLJoins
95/122
34
#rocedura. Ti2i* Ge e amesad *rades 4or es;
Ge ames ad *radesSELECT ame, *rade?um
7/26/2019 2010_01MySQLJoins
96/122
35
#rocedura. Ti2i* Ge e amesad *rades 4or es;
SELECT ame, *rade?umsar 1i e oi a.e
FRO8 sude?1or2
7/26/2019 2010_01MySQLJoins
97/122
36
#rocedura. Ti2i* Ge e amesad *rades 4or es;
SELECT ame, *rade?umFRO8 sude?1or2
*e e ame
INNER JOIN sude USING (sude?id)
7/26/2019 2010_01MySQLJoins
98/122
37
#rocedura. Ti2i* Ge e amesad *rades 4or es;
SELECT ame, *rade?umFRO8 sude?1or2
INNER JOIN sude USING (sude?id)
$u o.+ *e es;
7HERE 1or2?id IN (SELECT 1or2?id FRO8 1or27HERE 1ame@es;)
7/26/2019 2010_01MySQLJoins
99/122
38
#rocedura. Ti2i* Ge e amesad *rades 4or es;
SELECT ame, *rade?umFRO8 sude?1or2
INNER JOIN sude USING (sude?id)
7HERE 1or2?id IN (SELECT 1or2?id FRO8 1or27HERE 1ame@es;)D
7/26/2019 2010_01MySQLJoins
100/122
39
#rocedura. Ti2i* Ge e amesad *rades 4or es;
SELECT ame, *rade?umFRO8 sude?1or2
INNER JOIN sude USING (sude?id)
7HERE 1or2?id IN (SELECT 1or2?id FRO8 1or27HERE 1ame@es;)D
7/26/2019 2010_01MySQLJoins
101/122
40
"ec.araive Ti2i* Ge e amesad *rades 4or es;
I ave 5 ses o4 daasude as e ame
sude?1or2 as e *rades
1or2 as e ame o4 e assi*me
SELECT ame, *rade?um FRO8 :::: 7HERE1ame@es;
7/26/2019 2010_01MySQLJoins
102/122
41
"ec.araive Ti2i* Ge e amesad *rades 4or es;
sude ad sude?1or2 re.ae + sude?idSELECT ame, *rade?um FRO8
sude INNER JOIN sude?1or2 USING(sude?id)
::::
7HERE 1ame@es;D
7/26/2019 2010_01MySQLJoins
103/122
42
"ec.araive Ti2i* Ge e amesad *rades 4or es;
1or2 ad sude?1or2 re.ae + 1or2?idSELECT ame, *rade?um FRO8
sude INNER JOIN sude?1or2 USING(sude?id)
INNER JOIN 1or2 USING (1or2?id)
7HERE 1ame@es;D
1ELECT n!e, wn!e, grde_nu!
ROM student CRO11 JOIN workLET OUTER JOIN student_workU1IN. (student_id,work_id)K0ERE wn!e/Ftest3F7
7/26/2019 2010_01MySQLJoins
104/122
43
$u:::::
Ta 4a..s apar 4or es5, ecause Seeri did oa2e es5:
So o1 1a
7/26/2019 2010_01MySQLJoins
105/122
44
Ge a.. *rades 4or es5
Sar 1iSELECT ame, *rade?um FRO8::::
7HERE 1ame@es5D
7/26/2019 2010_01MySQLJoins
106/122
45
Ge a.. *rades 4or es5
7e 1a a .isi* 4or eac ro1 i 1or2 a*aiseac ro1 i sude
SELECT ame, *rade?um
FRO8 sude CROSS JOIN 1or2
::::
7HERE 1ame@es5D
7/26/2019 2010_01MySQLJoins
107/122
46
Ge a.. *rades 4or es5
We want a listing for each row in work againsteach row in student
7a 1e 1a, o o1 o *e i: Tas dec.araive
7/26/2019 2010_01MySQLJoins
108/122
47
Ge a.. *rades 4or es5
Grades mi* o e-is 4or a.. e ro1s:::so 1e.. eed a ouer oi
Fi.. i e va.ues 4rom sude?1or2 4or e *radesa do e-is, oii* o sude?id ad 1or2?id
SELECT ame, *rade?um
FRO8 sude CROSS JOIN 1or2
LEFT JOIN sude?1or2 USING (sude?id,1or2?id) 7HERE 1ame@es5D
7/26/2019 2010_01MySQLJoins
109/122
48
"rop e .o1es es score
Ho1
7/26/2019 2010_01MySQLJoins
110/122
7/26/2019 2010_01MySQLJoins
111/122
50
"rop e .o1es es score
Ge a.. essSELECT ame, *rade?um
FRO8 sude CROSS JOIN 1or2
LEFT JOIN sude?1or2 USING (sude?id,1or2?id) 7HERE 1ame .i2e es?D
7e e-pec = ro1s reured::::
7/26/2019 2010_01MySQLJoins
112/122
51
"rop e .o1es es score
Ge miimum *rade 4rom a.. ess perpersoSELECT ame, mi(*rade?um)
FRO8 sude CROSS JOIN 1or2
LEFT JOIN sude?1or2 USING (sude?id,1or2?id) 7HERE 1ame .i2e es?
GROU# $& sude?idD
7e e-pec ro1s
7/26/2019 2010_01MySQLJoins
113/122
52
"rop e .o1es es score
Cover o a U#"ATE saeme:::::SELECT ame, mi(*rade?um)
FRO8 sude CROSS JOIN 1or2
LEFT JOIN sude?1or2 USING (sude?id,1or2?id) 7HERE 1ame .i2e es?
GROU# $& sude?idD
Tis is ard
7/26/2019 2010_01MySQLJoins
114/122
53
"rop e .o1es es scoreNo1 add i e res:::
U#"ATE sude?1or2 as updINNER JOIN sude?1or2 as se. USING(sude?id, 1or2?id)
RIGHT JOIN sude USING (sude?id, 1or2?id)
CROSS JOIN 1or2
SET upd:4or?*rade@ 7HERE 1ame .i2e es?
AN" upd:*rade?um@mi(se.:*rade?um)
GROU# $& se.:sude?idD
7/26/2019 2010_01MySQLJoins
115/122
54
Ta does 1or2::::Someimes +ou eed a su!uer+:::::
U#"ATE sude?1or2SET 4or?*rade@ 7HERECONCAT(sude?id,1or2?id) IN (SELECTCONCAT(sude?id,1or2?id) FRO8
sude CROSS JOIN 1or2
LEFT JOIN sude?1or2 USING (sude?id,1or2?id) 7HERE 1ame .i2e es?
GROU# $& sude?id)D
7/26/2019 2010_01MySQLJoins
116/122
55
Ta does 1or2 eier::::Someimes +ou eed o do i i ; !uer+
Someimes is o ecessar+, u more opima.#ro.em is e mi(*rade?um)::::GROU# $&
So use a emporar+ a.e
CREATE TE8#ORAR& TA$LE *rade?o?dropSELECT mi(coa.esce(*rade?um,6)) FRO8sude CROSS JOIN 1or2 LEFT JOIN sude?1or2USING (sude?id,1or2?id) 7HERE 1ame .i2e
es? *roup + sude?idD
7/26/2019 2010_01MySQLJoins
117/122
56
Temporar+ a.e
CREATE TEM+ORAR TABLE grde_to_dro (student_id tinyint unsigned not nu22,work_id tinyint unsigned de*u2t nu22,grde_nu! tinyint unsigned de*u2t nu22)7
7/26/2019 2010_01MySQLJoins
118/122
57
Temporar+ a.e
IN1ERT INTO grde_to_dro (student_id,
grde_nu!)1ELECT student_id,!in(#o2es#e(grde_nu!,;))ROM student CRO11 JOIN workLET JOIN student_work U1IN.(student_id,work_id)K0ERE wn!e 2ike Ftest_F.ROU+ B student_id7
7/26/2019 2010_01MySQLJoins
119/122
58
Temporar+ a.eU+'ATE grde_to_dro A1 gtd INNER JOINstudent_work A1 sw U1IN.
(student_id,grde_nu!)1ET gtdwork_id / swwork_id 7
U+'ATE student_work A1 sw INNER JOINgrde_to_dro A1 gtd U1IN.(student_id,work_id)1ET sw*or_grde/FnF 7
7/26/2019 2010_01MySQLJoins
120/122
59
Temporar+ a.e
Reet *or droing t$e 2owest $o!ework
'RO+ TABLE I EI1T1 grde_to_dro7
7/26/2019 2010_01MySQLJoins
121/122
60
8ore es pracices
EP#LAIN a.. +our !ueries, ad *e e es +pepossi.e
Avoid JOIN is (ide- is, STRAIGHT?JOIN)
Tr+ o opimiMe su!ueries io JOINs i4 possi.e
7/26/2019 2010_01MySQLJoins
122/122
61
Tas i
%uesios
Commes