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. Dina iki kita bakal ngomong babagan jinis sambungan lan gabungan.
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) ); Saiki 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) ); Ing kene kita nggunakake sawetara fitur anyar sing kudu dikomentari kanthi kapisah:
Jinis sesambetan ing database
Kanggo 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 iki 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: Ana 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. |
- 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.
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; Ing 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; Ana 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; Saiki 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: Ing 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.
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:
- Tulis skrip SQL kanggo nggawe tabel 'Siswa' kanthi kolom ing ngisor iki: id (kunci utama), jeneng, jeneng_paling, e_mail (unik).
- 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'.
- Tulis skrip SQL kanggo nggawe tabel 'Guru' kanthi kolom ing ngisor iki: id (kunci utama), jeneng, jeneng_paling, e_mail (unik), subyek.
- Link 'Siswa' lan 'Guru' karo 'Siswa' akeh-kanggo-akeh Guru sesambetan.
- Pilih 'Siswa' sing duwe 'oro' ing jeneng mburi, contone 'Sid oro v', 'V oro novsky'.
- 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 - 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 - 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> - 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 - 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 - 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 - Tambah kolom 'tingkat' menyang tabel 'Siswa' sing wis ana, sing bakal nyimpen kursus sing saiki ditindakake siswa (nilai angka saka 1 nganti 6).
- Item iki ora dibutuhake, nanging bakal dadi plus. Tulis fungsi sing bakal mbukak kabeh 'Buku' lan output kabeh 'judhul' sing dipisahake karo koma.
GO TO FULL VERSION