JavaRush /Blog Jawa /Random-JV /Kita nganalisa database lan basa SQL. (Part 5 - sambungan...

Kita nganalisa database lan basa SQL. (Part 5 - sambungan lan gabung) - "Proyek Jawa saka A nganti Z"

Diterbitake ing grup
Artikel saka seri babagan nggawe proyek Jawa (pranala menyang materi liyane ana ing pungkasan). Tujuane kanggo nganalisa teknologi kunci, asile nulis bot telegram. Hello everyone, mangsa Senior lan Senioritas saka piranti lunak. Kaya sing dakkandhakake ing bagean sadurunge ( nyemak PR ), dina iki bakal ana materi anyar. Kanggo sing sregep banget, aku wis ndhudhuk tugas PR sing menarik supaya sing wis ngerti kabeh lan sing ora ngerti nanging pengin google bisa latihan lan nyoba katrampilan. "Proyek Jawa saka A nganti Z": kita nganalisa database lan basa SQL.  Part 5 - sambungan lan gabung - 1Dina iki kita bakal ngomong babagan jinis sambungan lan gabungan.

Jinis sesambetan ing database

"Proyek Jawa saka A nganti Z": kita nganalisa database lan basa SQL.  Part 5 - sambungan lan gabung - 2Kanggo mangerteni apa hubungan, sampeyan kudu ngelingi apa kunci asing. Kanggo sing lali, sugeng rawuh ing wiwitan seri .

Siji-kanggo-akeh

Ayo elinga conto kita karo negara lan kutha. Cetha yen kutha kudu duwe negara. Kepiye cara nyambungake negara menyang kutha? Sampeyan kudu masang pengenal unik (ID) ing saben kutha ing negara kasebut: kita wis nindakake iki. Iki diarani salah siji saka jinis sambungan - siji kanggo akeh (uga bakal apik kanggo ngerti versi Inggris - siji-kanggo-akeh). Kanggo paraphrase, kita bisa ngomong: sawetara kutha bisa dadi kagungane siji negara. Mangkene carane sampeyan kudu ngelingi: hubungan siji-kanggo-akeh. Nganti saiki wis jelas, ta? Yen ora, banjur "Proyek Jawa saka A nganti Z": kita nganalisa database lan basa SQL.  Part 5 - sambungan lan gabung - 3iki gambar pisanan saka Internet: Iku nuduhake yen ana pelanggan lan pesenan. Iku ndadekake pangertèn sing siji customer bisa duwe luwih saka siji pesenan. Ana siji-kanggo-akeh :) Utawa conto liyane: "Proyek Jawa saka A nganti Z": kita nganalisa database lan basa SQL.  Part 5 - sambungan lan gabung - 4Ana telung tabel: penerbit, penulis lan buku. Saben penerbit sing ora pengin bangkrut lan kepengin sukses duwe penulis luwih saka siji, apa sampeyan setuju? Sabanjure, saben penulis bisa uga duwe luwih saka siji buku - ora ana keraguan babagan iki. Lan iki tegese, maneh, sambungan saka siji penulis menyang akeh buku, siji penerbit kanggo akeh penulis . Ana akeh conto liyane sing bisa diwenehake. Kangelan ing pemahaman ing wiwitan mung bisa dumunung ing sinau kanggo mikir abstrak: kanggo katon saka njaba ing meja lan interaksi.

Siji-siji (siji-siji)

Iki bisa diarani minangka kasus khusus saka komunikasi siji-kanggo-akeh. Kahanan sing siji rekaman ing siji tabel mung ana hubungane karo siji rekaman ing tabel liyane. Apa conto saka urip? Yen kita ora kalebu poligami, banjur kita bisa ngomong yen ana hubungan siji-kanggo-siji antarane bojo lan bojo. Sanadyan kita ngomong poligami iku diijini, nanging saben garwa isih bisa duwe bojo siji. Semono uga wong tuwa. Saben wong bisa duwe mung siji bapak kandung lan mung siji ibu kandung. Hubungan siji-kanggo-siji sing eksplisit. Nalika aku nulis iki, aku mikir: kenapa banjur dibagi hubungan siji-kanggo-siji dadi rong cathetan ing tabel sing beda-beda, yen wis duwe hubungan siji-kanggo-siji? Aku teka munggah karo jawaban dhewe. Cathetan iki bisa uga disambung karo cathetan liya kanthi cara liya. Aku ngomong apa? Conto liyane hubungan siji-kanggo-siji yaiku antarane negara lan presiden. Apa bisa nulis kabeh data babagan presiden ing tabel "negara"? Ya, sampeyan bisa, SQL ora bakal ngomong apa-apa. Nanging yen sampeyan mikir yen presiden uga wong ... Lan bisa uga duwe bojo (hubungan siji-siji) lan anak (hubungan siji-kanggo-akeh liyane) lan banjur dadi. perlu kanggo nyambungake negara karo bojo lan anak presiden…. Muni edan, bener? : D Ana bisa uga akeh conto liyane kanggo sambungan iki. Menapa malih, ing kahanan kaya mengkono, sampeyan bisa nambah tombol manca kanggo loro tabel, ora kaya hubungan siji-kanggo-akeh.

Akeh-kanggo-akeh

Wis adhedhasar jeneng, sampeyan bisa guess apa kita bakal ngomong bab. Asring ing urip, lan kita program urip kita, ana kahanan nalika jinis sambungan ndhuwur ora cukup kanggo njlèntrèhaké bab kita kudu. Kita wis ngomong babagan penerbit, buku lan penulis. Ana mung akeh sambungan ing kene... Saben publikasi bisa duwe sawetara penulis - sambungan siji-kanggo-akeh. Ing wektu sing padha, saben penulis bisa uga duwe sawetara penerbit (kok ora, penulis diterbitake ing sak panggonan, padha perang kanggo dhuwit, pindhah menyang penerbitan liyane, contone). Lan iki maneh hubungan siji-kanggo-akeh. Utawa iki: saben penulis bisa duwe sawetara buku, nanging saben buku uga duwe sawetara penulis. Maneh, hubungan siji-kanggo-akeh antarane penulis lan buku, buku lan penulis. Saka conto iki, kita bisa nggawe kesimpulan sing luwih resmi:

Yen kita duwe rong tabel A lan B.

A bisa hubungane B minangka siji kanggo akeh.

Nanging B bisa uga ana hubungane karo A amarga ana hubungane karo akeh.

Iki tegese padha duwe hubungan akeh-kanggo-akeh.

Cetha carane nyetel jinis sambungan sadurunge ing SQL: kita mung ngirim ID kasebut menyang cathetan kasebut, sing ana akeh, ta? Siji negara menehi ID minangka kunci asing kanggo akeh kutha. Apa sing kudu dilakoni karo hubungan sing akeh-kanggo-akeh ? Cara iki ora cocok. Kita kudu nambah tabel liyane sing bakal nyambungake loro tabel. Contone, ayo menyang MySQL, nggawe database anyar manytomany, nggawe loro tabel, penulis lan buku, kang bakal mung ngemot jeneng lan ID sing: Nggawe DATABASE manytomany; USE manytomany; Gawe tabel pengarang( id INT AUTO_INCREMENT, jeneng VARCHAR(100), KUNCI UTAMA (id) ); BUAT TABEL buku( id INT AUTO_INCREMENT, name VARCHAR(100), PRIMARY KEY (id) ); "Proyek Jawa saka A nganti Z": kita nganalisa database lan basa SQL.  Part 5 - sambungan lan gabung - 5Saiki ayo nggawe tabel katelu sing bakal duwe rong kunci asing saka penulis lan tabel buku, lan link iki bakal unik. Tegese, ora bakal bisa nambah rekaman kanthi tombol sing padha kaping pindho: GIPTA TABLE authors_x_books ( book_id INT NOT NULL, author_id INT NOT NULL, FOREIGN KEY (book_id) REFERENCES book(id), FOREIGN KEY (author_id) REFERENCES author (id ), UNIK (id_buku, id_pengarang) ); "Proyek Jawa saka A nganti Z": kita nganalisa database lan basa SQL.  Part 5 - sambungan lan gabung - 6Ing kene kita nggunakake sawetara fitur anyar sing kudu dikomentari kanthi kapisah:
  • NOT NULL tegese lapangan kudu tansah kapenuhan ing, lan yen kita ora, SQL marang kita supaya;
  • UNIQUE ujar manawa lapangan utawa pirang-pirang lapangan kudu unik ing tabel. Asring kedadeyan yen saliyane pengenal unik, siji lapangan liyane kudu unik kanggo saben rekaman. Lan UNIQUE tanggung jawab kanggo masalah iki.
Saka praktikku: nalika pindhah saka sistem lawas menyang sistem anyar, kita, minangka pangembang, kudu nyimpen ID sistem lawas kanggo nggarap lan nggawe dhewe. Napa nggawe dhewe lan ora nggunakake sing lawas? Bisa uga ora cukup unik, utawa pendekatan iki kanggo nggawe ID bisa uga ora relevan lan diwatesi maneh. Kanggo maksud iki, kita digawe lawas ID-jeneng uga unik ing meja. Kanggo mriksa iki, sampeyan kudu nambah data. Tambah buku lan penulis: NSERT INTO buku (jeneng) NILAI ("buku1"); INSERT INTO penulis (jeneng) VALUES ("penulis1"); Kita wis ngerti saka artikel sadurunge sing bakal duwe ID 1 lan 1. Mula, kita bisa langsung nambah rekaman menyang tabel katelu: INSERT INTO authors_x_books VALUES (1,1); Lan kabeh bakal apik nganti kita pengin mbaleni maneh printah pungkasan: yaiku, nulis maneh ID sing padha: "Proyek Jawa saka A nganti Z": kita nganalisa database lan basa SQL.  Part 5 - sambungan lan gabung - 7Asil bakal alami - kesalahan. Bakal ana duplikat. Entri ora bakal direkam. Iki carane akeh-kanggo-akeh sambungan bakal digawe ... Kabeh iki apik banget lan menarik, nanging pitakonan logis muncul: carane njaluk informasi iki? Kepiye cara nggabungake data saka tabel sing beda-beda lan entuk siji jawaban? Iki sing bakal kita bahas ing bagean sabanjure))

Sambungan (Gabung)

Ing bagean sadurunge, aku nyiapake sampeyan langsung ngerti apa gabung lan ing ngendi nggunakake. Amarga aku yakin banget yen nalika pangerten teka, kabeh bakal dadi gampang banget, lan kabeh artikel babagan gabung bakal jelas kaya mata bayi :D Secara umum lan umume, gabung entuk asil saka sawetara tabel kanthi cara. saka JOIN (gabung saka Inggris gabung). Lan kabeh ...) Lan kanggo gabung, sampeyan kudu nemtokake lapangan sing tabel bakal digabung. Iblis ora medeni kaya sing dicet, ta?) Sabanjure, kita bakal ngomong babagan jinis gabungan lan cara nggunakake. Ana akeh jinis gabungan, lan kita ora bakal nimbang kabeh. Mung sing kita butuhake. Pramila kita ora kasengsem ing gabungan eksotis kaya Cross lan Natural. Aku lali, kita kudu ngelingi siji nuansa liyane: tabel lan lapangan bisa duwe alias - pseudonyms. Padha digunakake kanthi trep kanggo gabung. Contone, sampeyan bisa nindakake iki: SELECT * FROM table1; yen pitakonan bakal kerep nggunakake table1, sampeyan bisa menehi alias: SELECT * FROM table1 minangka t1; utawa malah luwih gampang kanggo nulis: PILIH * FROM table1 t1; banjur mengko ing pitakonan bakal bisa nggunakake t1 minangka alias kanggo tabel iki.

GABUNGAN BATIN

Gabungan sing paling umum lan prasaja. Ngandika yen kita duwe rong tabel lan lapangan sing bisa digabung, kabeh cathetan sing ana hubungane ing rong tabel bakal dipilih. Iku angel ngomong piye wae. Ayo ndeleng conto: Ayo nambah siji rekaman menyang database kutha kita. Siji entri kanggo kutha lan siji kanggo negara: $ INSERT INTO NILAI negara(5, "Uzbekistan", 34036800); lan $ INSERT INTO kutha (jeneng, populasi) VALUES("Tbilisi", 1171100); Kita wis nambah negara sing ora duwe kutha ing meja kita, lan kutha sing ora digandhengake karo negara ing meja kita. Dadi, INNER JOIN melu nerbitake kabeh cathetan kanggo sambungan sing ana ing rong tabel. Iki minangka sintaksis umum nalika kita pengin nggabungake rong tabel table1 lan table2: PILIH * FROM table1 t1 INNER JOIN table2 ON t1.id = t2.t1_id; banjur kabeh cathetan sing duwe hubungan ing loro tabel bakal bali. Kanggo kasus kita, nalika kita pengin nampa informasi kanggo negara bebarengan karo kutha, bakal dadi kaya iki: $ PILIH * FROM kutha ci INNER JOIN negara co ON ci.country_id = co.id; "Proyek Jawa saka A nganti Z": kita nganalisa database lan basa SQL.  Part 5 - sambungan lan gabung - 8Ing kene, sanajan jenenge padha, sampeyan bisa ndeleng kanthi jelas yen lapangan kutha luwih dhisik, banjur lapangan negara. Nanging loro entri sing ditambahake ing ndhuwur ora ana. Amarga pancen kaya ngono INNER JOIN.

NINGGAL GABUNGAN

Ana kasus, lan cukup asring, nalika kita ora wareg karo mundhut saka kothak tabel utama amarga kasunyatan sing ora ana cathetan kanggo ing meja jejer. Iki apa GABUNGAN KIRI kanggo. Yen ing panyuwunan sadurunge kita nemtokake KIRI tinimbang INNER, kita bakal nambah kutha liyane ing respon - Tbilisi: $ PILIH * FROM kutha ci KIRI GABUNG negara co ON ci.country_id = co.id; "Proyek Jawa saka A nganti Z": kita nganalisa database lan basa SQL.  Part 5 - sambungan lan gabung - 9Ana entri anyar babagan Tbilisi lan kabeh sing ana hubungane karo negara kasebut ing null . Iki asring digunakake.

TEngen gabung

Ing kene bakal ana prabédan saka LEFT JOIN amarga kabeh lapangan bakal dipilih ora ing sisih kiwa, nanging ing sisih tengen ing sambungan kasebut. Tegese, dudu kutha, nanging kabeh negara bakal dijupuk: $ SELECT * FROM city ci RIGHT JOIN country co ON ci.country_id = co.id; "Proyek Jawa saka A nganti Z": kita nganalisa database lan basa SQL.  Bagean 5 - sambungan lan gabung - 10Saiki wis jelas yen ing kasus iki ora bakal ana Tbilisi, nanging kita bakal duwe Uzbekistan. Sing kaya ngono…))

Ngamanake Gabung

Saiki aku arep kanggo nuduhake gambar khas sing juniors cram sadurunge Interview kanggo gawe uwong yakin sing padha ngerti inti saka gabung: "Proyek Jawa saka A nganti Z": kita nganalisa database lan basa SQL.  Bagean 5 - sambungan lan gabung - 11Ing kene kabeh ditampilake ing wangun set, saben bunder minangka meja. Lan panggonan sing dicet yaiku bagean sing bakal ditampilake ing PILIH. Ayo katon:
  • INNER JOIN mung persimpangan saka set, yaiku, cathetan sing duwe sambungan menyang rong tabel - A lan B;
  • LEFT JOIN yaiku kabeh cathetan saka tabel A, kalebu kabeh cathetan saka tabel B sing duwe persimpangan (sambungan) karo A;
  • RIGHT JOIN persis ngelawan saka LEFT JOIN - kabeh cathetan ing tabel B lan cathetan saka A sing duwe hubungan.
Sawise kabeh iki, gambar iki kudu jelas))

Peer

Wektu iki tugas bakal menarik banget lan kabeh wong sing bisa ngatasi masalah kasebut bisa yakin manawa dheweke wis siyap miwiti kerja ing sisih SQL! Tugas ora dikunyah lan ditulis kanggo siswa menengah, dadi ora gampang lan mboseni kanggo sampeyan :) Aku bakal menehi sampeyan seminggu kanggo nindakake tugas dhewe, banjur aku bakal nerbitake artikel sing kapisah kanthi analisis rinci saka solusi kanggo tugas sing dakwenehake.

Tugas nyata:

  1. Tulis skrip SQL kanggo nggawe tabel 'Siswa' kanthi kolom ing ngisor iki: id (kunci utama), jeneng, jeneng_paling, e_mail (unik).
  2. Tulis skrip SQL kanggo nggawe tabel 'Buku' kanthi kolom ing ngisor iki: id, judhul (id + judhul = kunci utama). Link 'Siswa' lan 'Buku' karo 'Siswa' siji-kanggo-akeh sesambetan 'Buku'.
  3. Tulis skrip SQL kanggo nggawe tabel 'Guru' kanthi kolom ing ngisor iki: id (kunci utama), jeneng, jeneng_paling, e_mail (unik), subyek.
  4. Link 'Siswa' lan 'Guru' karo 'Siswa' akeh-kanggo-akeh Guru sesambetan.
  5. Pilih 'Siswa' sing duwe 'oro' ing jeneng mburi, contone 'Sid oro v', 'V oro novsky'.
  6. Pilih saka tabel 'Siswa' kabeh jeneng mburi ('last_name') lan nomer repetitions. Coba sing ana namesakes ing database. Urut miturut jumlah ing urutan mudhun. Iku kudu katon kaya iki:
    jeneng_pungkasan jumlah
    Petrov 15
    Ivanov 12
    Sidorov 3
  7. Pilih paling ndhuwur 3 jeneng paling bola saka 'Siswa'. Urut miturut jumlah ing urutan mudhun. Iku kudu katon kaya iki:
    jeneng jumlah
    Alexander 27
    Sergey 10
    Petrus 7
  8. Pilih 'Siswa' sing nduweni jumlah 'Buku' paling akeh lan 'Guru' sing gegandhengan. Urut miturut jumlahe kanthi urutan mudhun. Iku kudu katon kaya iki:
    Jeneng mburi guru Jeneng_lase siswa Jumlah buku
    Petrov Sidorov 7
    Ivanov Smith 5
    Petrov Kankava 2>
  9. Pilih 'Guru' sing paling akeh 'Buku' saka kabeh 'Siswa'. Urut miturut jumlah ing urutan mudhun. Iku kudu katon kaya iki:
    Jeneng mburi guru Jumlah buku
    Petrov 9
    Ivanov 5
  10. Pilih 'Guru' sing nomer 'Buku' kanggo kabeh 'Siswa' antarane 7 lan 11. Urut miturut jumlah ing urutan mudhun. Iku kudu katon kaya iki:
    Jeneng mburi guru Jumlah buku
    Petrov sewelas
    Sidorov 9
    Ivanov 7
  11. Print kabeh 'last_name' lan 'jeneng' kabeh 'Guru' lan 'Siswa' karo lapangan 'jinis' (siswa utawa guru). Urut miturut abjad miturut 'last_name'. Iku kudu katon kaya iki:
    jeneng_pungkasan jinis
    Ivanov murid
    Kankava guru
    Smith murid
    Sidorov guru
    Petrov guru
  12. Tambah kolom 'tingkat' menyang tabel 'Siswa' sing wis ana, sing bakal nyimpen kursus sing saiki ditindakake siswa (nilai angka saka 1 nganti 6).
  13. Item iki ora dibutuhake, nanging bakal dadi plus. Tulis fungsi sing bakal mbukak kabeh 'Buku' lan output kabeh 'judhul' sing dipisahake karo koma.

Kesimpulan

Seri bab database wis nyeret ing dicokot. Setuju. Nanging, kita wis adoh banget lan minangka asil kita muncul kanthi kawruh babagan perkara kasebut! Matur nuwun kanggo kabeh sing maca, Aku ngelingake yen saben wong sing pengin nerusake lan ngetutake proyek kasebut kudu nggawe akun ing GitHub lan langganan akunku :) More teka - ayo ngomong babagan Maven lan Docker. Matur nuwun kanggo kabeh sing wis maca. Aku mbaleni maneh: sing mlaku bakal nguwasani dalan;)

Dhaptar kabeh materi ing seri kasebut ana ing wiwitan artikel iki.

Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION