+ All Categories
Home > Documents > 2010_01MySQLJoins

2010_01MySQLJoins

Date post: 13-Apr-2018
Category:
Upload: shravan-kumar
View: 215 times
Download: 0 times
Share this document with a friend

of 122

Transcript
  • 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