บทความจากซีรีส์เกี่ยวกับการสร้างโปรเจ็กต์ Java (ลิงก์ไปยังเนื้อหาอื่นอยู่ท้ายสุด) เป้าหมายคือการวิเคราะห์เทคโนโลยีที่สำคัญ ผลลัพธ์คือการเขียนบอทโทรเลข
สวัสดีท่านสุภาพสตรีและสุภาพบุรุษ เรามาพูดถึงฐานข้อมูล SQL และเรื่องอื่นๆ กันต่อ เนื้อหาในวันนี้จะประกอบด้วยทฤษฎีส่วนหนึ่งและการปฏิบัติบางส่วน ฉันขอเตือนคุณว่าครั้งที่แล้วเราคุยกันเกี่ยวกับวิธีการตั้งค่าทุกอย่าง วิธีสร้างฐานข้อมูล ตารางและรับข้อมูลจากฐานข้อมูล ถึงเวลาดูว่ามีอะไรเกิดขึ้นกับการสำรวจระยะไกลหรือไม่ ในความคิดของฉัน ครึ่งหนึ่งสามารถทำได้โดยอ้างอิงจากบทความที่แล้วเท่านั้น ปรากฎว่าในการประกอบแอปพลิเคชันอย่างเหมาะสมและทำให้ทุกอย่างสวยงามมากขึ้นหรือน้อยลงคุณต้องพูดถึงฐานข้อมูลและคุณต้องใช้เวลามากในการพูดคุยเกี่ยวกับฐานข้อมูลเหล่านั้น
MySQL และมีวิธีดังกล่าว - เพิ่มอัตโนมัติ . เราจำเป็นต้องเพิ่มสิ่งนี้ลงในฟิลด์ดิจิทัล และหากเราไม่ส่งผ่านค่าอย่างชัดเจน MySQL เองก็จะเพิ่ม ID ขึ้นหนึ่งรายการเมื่อเทียบกับอันก่อนหน้า ดังนั้นการสร้างตารางจะมีลักษณะดังนี้: $ CREATE TABLE city ( id INT AUTO_INCREMENT, ชื่อ VARCHAR(30), country_id INT, ประชากร INT, PRIMARY KEY (id)); ลองดูแผนภาพตารางเพื่อดูว่าทุกอย่างถูกต้องหรือไม่: $ DESC city; ดังที่คุณเห็นจากแผนภาพตาราง เรามีคำอธิบายใหม่สำหรับฟิลด์ id - auto_increation ดังนั้นเราจึงทำทุกอย่างถูกต้อง มาตรวจสอบข้อมูลในตารางที่กำหนดค่าไว้ครบถ้วนแล้ว ในการดำเนินการนี้ เราจะดำเนินการส่วนสุดท้ายของงาน - คีย์ต่างประเทศ
ตรวจการบ้าน
ขอแสดงความนับถืออย่างสูงต่อทุกคนที่ทำภารกิจสำเร็จ ซึ่งหมายความว่าคุณเข้าใจว่ามีเพียงคุณเท่านั้นที่ต้องการสิ่งนี้และมันจะช่วยคุณเท่านั้น สำหรับผู้ที่ละเลยงานของฉัน ฉันขอเตือนคุณถึงเงื่อนไข:- คุณต้องเพิ่มคีย์หลัก (PRIMARY KEY) จากฟิลด์ ID ลงในสคีมาตารางประเทศ
- เพิ่มประเทศอื่นลงในตารางประเทศ - มอลโดวา
- ตามโครงร่างของบทความก่อนหน้านี้ ให้สร้างเมืองตารางซึ่งจะมีฟิลด์ทั้งหมดที่อธิบายไว้ ชื่อฟิลด์จะเป็นดังนี้: id, ชื่อ, country_id, ประชากร
- เพิ่มคีย์หลักลงในตารางเมือง
- เพิ่มคีย์ต่างประเทศลงในตารางเมือง
การเพิ่มคีย์หลัก
คุณสามารถเพิ่มคีย์หลัก (PRIMARY KEY) ได้สองวิธี: ทันทีเมื่อสร้างตาราง หรือหลังการสร้าง โดยใช้ ALTER TABLEคีย์หลักระหว่างการสร้างตาราง
เนื่องจากเราได้สร้างตารางแล้ว และหากไม่ลบออก เราจะไม่สามารถแสดงแนวทางนี้ภายในฐานข้อมูลนี้ได้ เราเพียงแต่สร้างฐานข้อมูลทดสอบชั่วคราวซึ่งเราจะทำทุกอย่าง มาป้อนคำสั่งต่อไปนี้:-
สร้างฐานข้อมูลใหม่:
$ สร้างการทดสอบฐานข้อมูล;
-
สร้างตารางโดยเพิ่มคีย์หลัก:
$ สร้างตารางประเทศ (id INT ชื่อ VARCHAR (30) คีย์หลัก (id));
คีย์หลักหลังการสร้างตาราง
อย่างที่ผมบอกไปก่อนหน้านี้ คุณสามารถกำหนดคีย์แรกหลังจากสร้างตารางได้โดยใช้ALTER TABLE เราจะเรียกใช้ตัวอย่างนี้ใน ฐานข้อมูลเมือง ของเรา :-
ไปที่ฐานข้อมูลของเราจากการทดสอบ:
$USE เมือง;
-
ตรวจสอบว่าเราอยู่ในฐานข้อมูลของเราอย่างแน่นอน (ควรมีฟิลด์อื่นอยู่ที่นั่น - ประชากร) เพื่อทำสิ่งนี้เราเขียน:
$ ประชากร DESC;
-
และตรวจสอบได้ทันทีด้วยคำสั่ง:
$ประเทศ DESC;
ทุกอย่างถูกต้อง โต๊ะเป็นของเรา มาเขียนสิ่งต่อไปนี้:
$ เปลี่ยนประเทศตารางเพิ่มคีย์หลัก (id);
เพิ่มมอลโดวา
ก่อนอื่นเราต้องตัดสินใจว่าเราจะบันทึกอะไร ID ถัดไปของเราคือ 4 ชื่อจะเป็นมอลโดวาและมีประชากร 3550900 ดังนั้นเราจึงดำเนินการคำสั่ง INSERT INTO ที่เรารู้อยู่แล้ว: $ INSERT INTO country VALUES (4, 'Moldova', 3550900); และเราตรวจสอบว่าค่านี้อยู่ในฐานข้อมูลทุกประการหรือไม่: $ SELECT * FROM country WHERE id = 4; ในคำขอข้อมูล ฉันกำหนดได้ทันทีว่าจะต้องค้นหาฟิลด์ใด ดังนั้นเราจึงมีเพียงบันทึกเดียวเท่านั้น ซึ่งเป็นสิ่งที่เราต้องการสร้างตารางเมือง
การใช้ไดอะแกรมจากบทความแรกเกี่ยวกับฐานข้อมูล เราได้รับข้อมูลที่จำเป็นเกี่ยวกับตาราง โดยจะมีฟิลด์ดังต่อไปนี้:- id — ตัวระบุที่ไม่ซ้ำ
- ชื่อ — ชื่อเมือง;
- Country_id - รหัสต่างประเทศของประเทศ
- ประชากร - ประชากรของเมือง
เพิ่มคีย์ต่างประเทศให้กับเมือง
สำหรับคีย์ต่างประเทศ จะมีคำสั่งนี้: $ ALTER TABLE city ADD FOREIGN KEY (country_id) REFERENCES country(id); และมาตรวจสอบทันทีว่ามีอะไรผิดปกติกับสคีมาของตาราง: มันเปลี่ยนแปลงไปในหนึ่งชั่วโมงหรือไม่? $เมือง DESC;ส่วนโบนัส. การทดสอบ
ฉันลืมเพิ่มลงในงาน - กรอกข้อมูลที่อยู่ในภาพหน้าจอของส่วนแรก ฉันลืมไป ตอนนี้ฉันจะทำเอง และสำหรับผู้ที่สนใจคุณสามารถทำได้ด้วยตัวเองโดยไม่มีฉันแล้วเราจะตรวจสอบ ;) มีคาร์คอฟ, เคียฟ, มินสค์, โอเดสซา, โวโรเนซ และเราจะเพิ่มคีชีเนาด้วย แต่คราวนี้ เราจะไม่ส่ง ID เราจะข้าม: $ INSERT INTO city (ชื่อ, country_id, ประชากร) VALUES ('Kharkov', 1, 1443000), ('Kyiv', 1, 3703100), ('Minsk' , 3, 2545500), ('โอเดสซา', 1, 1017699), ('โวโรเนจ', 2, 1058261), ('คิชิเนฟ', 4, 695400); อย่างที่คุณเห็น คุณสามารถสร้างหลายรายการพร้อมกันได้โดยใช้คำสั่ง INSERT INTO เพียงคำสั่งเดียว สิ่งที่สะดวกจำไว้) และมาดูกันว่ามีอะไรอยู่ในตารางทันที: $ SELECT * FROM city; AUTO_INCREMENT - ทำงานตรงตามที่เราต้องการ ไฟล์ ID ได้รับการกรอกเรียบร้อยแล้ว แม้ว่าเราจะไม่ได้ส่งก็ตาม คีย์ต่างประเทศเป็นสิ่งที่ขึ้นอยู่กับ หากต้องการตรวจสอบว่าทำงานถูกต้องหรือไม่ คุณสามารถลองเขียนคีย์ต่างประเทศที่ไม่มีอยู่ในตารางต่างประเทศได้ สมมติว่าเราตัดสินใจว่า id = 5 คือคาซัคสถาน แต่ในความเป็นจริงมันไม่อยู่ในตารางประเทศ และเพื่อตรวจสอบว่าฐานข้อมูลสาบานหรือไม่ ให้เพิ่มเมือง - Astana: $ INSERT INTO city (ชื่อ, country_id, ประชากร) VALUES ('Astana', 5, 1136156); และเราได้รับข้อผิดพลาดโดยธรรมชาติ: ตอนนี้คีย์ต่างประเทศทำให้แน่ใจว่าเราไม่ได้พยายามกำหนดประเทศให้กับเมืองที่ไม่ได้อยู่ในฐานข้อมูลของเรา การบ้านส่วนนี้ถือว่าสมบูรณ์แล้ว - ส่งต่ออันใหม่ได้เลย :)คำสั่งเลือก
ทุกอย่างดูไม่น่ากลัวอีกต่อไปใช่ไหม? ฉันอยากจะทราบอีกครั้งว่าสำหรับนักพัฒนา Java ความรู้เกี่ยวกับฐานข้อมูลเป็นสิ่งจำเป็น หากไม่มีฐานข้อมูลคุณจะไม่สามารถไปไหนได้ ใช่ ฉันต้องการเริ่มเขียนใบสมัครแล้ว ฉันเห็นด้วย แต่มันจำเป็น ดังนั้นเราจะทำเช่นนี้ต่อไป การใช้คำสั่ง SELECT เราดึงข้อมูลจากฐานข้อมูล นั่นคือนี่คือการดำเนินการ DML ทั่วไป (คุณลืมไปแล้วว่ามันคืออะไร...))) อ่านบทความซ้ำก่อน) ประโยชน์ของฐานข้อมูลเชิงสัมพันธ์คืออะไร? มีฟังก์ชันการทำงานที่ยอดเยี่ยมสำหรับการรวบรวมและเรียกข้อมูล นี่คือสิ่งที่คำสั่ง SELECT ใช้สำหรับ ดูเหมือนว่าจะไม่มีอะไรซับซ้อนเกี่ยวกับเรื่องนี้ใช่ไหม? แต่ปรากฎว่ายังมีอะไรที่ต้องเข้าใจอีกมาก) สิ่งสำคัญสำหรับเราคือการเข้าใจพื้นฐานที่เราต่อยอดได้ แบบสอบถามที่ง่ายที่สุดด้วยคำสั่ง SELECT คือการเลือกข้อมูลทั้งหมดจากตารางเดียว ฉันชอบคำอธิบายจากวิกิมากเกี่ยวกับลำดับที่ตัวดำเนินการควรเรียงลำดับในการสืบค้น SELECT ดังนั้นฉันจะคัดลอกมันอย่างโจ่งแจ้งที่นี่:SELECT
[DISTINCT | DISTINCTROW | ALL]
select_expression,...
FROM table_references
[WHERE where_definition]
[GROUP BY {unsigned_integer | col_name | formula}]
[HAVING where_definition]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC], ...]
ที่นี่คุณจะเห็นว่าคุณไม่สามารถใส่ตัวดำเนินการ GROUP BY ก่อนแล้วจึงใส่ตัวดำเนินการ WHERE สิ่งนี้จะต้องถูกจดจำเพื่อที่ภายหลังจะได้ไม่รู้สึกขุ่นเคืองกับข้อผิดพลาดที่ไม่ชัดเจนว่ามาจากไหน $SELECT * จากเมือง; แต่การขูดข้อมูลทั้งหมดออกไปนั้นไม่ใช่เรื่องสนุกสำหรับเราอย่างชัดเจน สิ่งนี้จะเหมือนกันทุกประการหากเราต้องการตอกตะปูด้วยกล้องจุลทรรศน์[1] , [2] . เนื่องจากฐานข้อมูลดำเนินการกรอง การเรียงลำดับ และการรวมกลุ่มได้เร็วกว่าโค้ด Java มาก จึงควรปล่อยเรื่องนี้ไว้กับฐานข้อมูลจะดีกว่า ดังนั้นการทำให้งานซับซ้อนขึ้นเราจะเปิดฟังก์ชันใหม่
พารามิเตอร์ที่ไหน
หากต้องการกรองส่วนที่เลือกจะ ใช้คำ WHERE สิ่งนี้ควรตีความดังนี้: SELECT * FROM tablename (เลือกฟิลด์ทั้งหมดจากชื่อตารางของตาราง) WHERE talbe_row = 1 (โดยที่ในบันทึก ฟิลด์ table_row เท่ากับ 1) สิ่งสำคัญคือต้องทราบว่าลำดับของคำหลักในแบบสอบถามเป็นสิ่งสำคัญ คุณไม่สามารถเขียน WHERE a =1 FROM table_name SELECT *. สำหรับภาษารัสเซียถือว่าใช้ได้ และสำหรับบางคนอาจดูไม่แย่นัก แต่สำหรับ SQL นี่ถือว่ายอมรับไม่ได้ เราเขียนแบบสอบถามต่อไปนี้: $ SELECT * FROM city WHERE Country_id = 1; และเราเลือกเมืองในยูเครน ไม่เลวใช่มั้ย? จะเป็นอย่างไรถ้าเราไม่เพียงต้องการภาษายูเครนเท่านั้น แต่ยังต้องการชาวเบลารุสด้วย? เพื่อจุดประสงค์นี้ เราสามารถแสดงรายการชุดของค่าที่ฟิลด์สามารถใช้ได้: $SELECT * FROM city WHERE country_id IN(1, 3); และเรามีเมืองต่างๆ จากสองประเทศคอยตอบรับอยู่แล้ว จะเกิดอะไรขึ้นหากมีหลายเงื่อนไขที่ต้องกรอง สมมติว่าเราต้องการเมืองที่มีประชากรมากกว่าสองล้านคน? หากต้องการทำสิ่งนี้ ให้ใช้คำว่า ORและAND : $ SELECT * FROM city WHERE Country_id IN (1, 3) AND ประชากร > 2000000; เยี่ยมมาก แต่จะเกิดอะไรขึ้นถ้าเราจำเป็นต้องเพิ่มเงื่อนไขอีกหนึ่งข้อ - เพื่อค้นหาชื่อผ่านนิพจน์ทั่วไป (ฉันจะไม่อธิบายนิพจน์ทั่วไปที่นี่: นี่คือคนที่ ทำสิ่งนี้ "สั้น ๆ" ใน 4 ส่วน )? ตัวอย่างเช่น เราจำวิธีสะกดเมืองได้ แต่ไม่ทั้งหมด... ในการดำเนินการนี้ คุณสามารถเพิ่มคีย์เวิร์ด LIKEลงในนิพจน์การกรองได้: $ SELECT * FROM city WHERE country_id IN (1, 3) AND allowance > 2000000 OR ชื่อ LIKE “%hark%”; และด้วยวิธีนี้ เราก็ได้คาร์คอฟด้วย เป็นผลให้เราสามารถพูดได้ว่าการค้นหาของเราดีมาก แต่ฉันไม่ต้องการเรียงลำดับตาม ID แต่เรียงตามประชากร แต่อย่างไร? ใช่ ง่ายมาก...เรียงตามพารามิเตอร์
เมื่อใช้ ORDER BY เราสามารถจัดเรียงบันทึกที่เราได้รับตามฟิลด์เฉพาะได้ มันเรียงลำดับทั้งตัวเลขและสตริง มาขยายแบบสอบถามก่อนหน้านี้ จัดเรียงตามประชากร โดยเพิ่ม ORDER BY ประชากร: $ SELECT * FROM city WHERE Country_id IN (1, 3) AND ประชากร > 2000000 หรือชื่อ LIKE “%hark%” ORDER BY ประชากร; ดังที่เราเห็นการเรียงลำดับเกิดขึ้นตามลำดับธรรมชาตินั่นคือจากน้อยไปหามาก ถ้าเราต้องการสิ่งที่ตรงกันข้ามล่ะ? ในการดำเนินการนี้ คุณต้องเพิ่มคำว่า DESC: $ SELECT * FROM city WHERE Country_id IN (1, 3) AND ประชากร > 2000000 หรือชื่อ LIKE “%hark%” เรียงตามประชากร DESC; ตอนนี้การเรียงลำดับจะขึ้นอยู่กับการลดจำนวนประชากร และฐานข้อมูลทำสิ่งนี้ได้อย่างรวดเร็ว: ไม่มีCollections.sort ที่ สามารถเปรียบเทียบได้ ตอนนี้ให้เรียงลำดับตามแถวตามชื่อในลำดับย้อนกลับ: $ SELECT * FROM city WHERE Country_id IN (1, 3) AND ประชากร > 2000000 หรือชื่อ LIKE “%hark%” เรียงตามชื่อ DESC;จัดกลุ่มตามพารามิเตอร์
ใช้เพื่อจัดกลุ่มบันทึกตามฟิลด์เฉพาะ โดยปกติจำเป็นต้องใช้ฟังก์ชันรวม... ฟังก์ชันรวมคืออะไร)) เหมาะสมที่จะจัดกลุ่มตามบางฟิลด์หากเหมือนกันสำหรับเรกคอร์ดที่ต่างกัน ลองดูว่านี่หมายถึงอะไรโดยใช้ตัวอย่างของเรา สมมติว่าเมืองต่างๆ มีรหัสต่างประเทศ - รหัสประเทศ ดังนั้น ID จะเหมือนกันสำหรับเมืองที่มาจากประเทศเดียวกัน ดังนั้น คุณสามารถถ่ายและจัดกลุ่มบันทึกตาม: $ SELECT Country_id, COUNT(*) FROM city GROUP BY Country_id; แต่หากไม่มีฟังก์ชันการรวมกลุ่ม มันดูขาดความดแจ่มใสเล็กน้อย คุณต้องยอมรับ ดังนั้น เรามาดูฟังก์ชันทั่วไปบางส่วนกัน:- COUNT - จำนวนระเบียนที่สามารถใช้ได้โดยไม่ต้องจัดกลุ่ม ใช้เป็นCOUNT(* ) ในกรณีที่จัดกลุ่มตามบางฟิลด์ - COUNT(groupped_field);
- MAX - ค้นหาค่าสูงสุดสำหรับฟิลด์เฉพาะ
- MIN - ค้นหาค่าต่ำสุดสำหรับฟิลด์เฉพาะ
- SUM - ค้นหาผลรวมของฟิลด์เฉพาะ
- AVG - ค้นหาค่าเฉลี่ย
การบ้าน
จากผลลัพธ์ของบทความที่แล้วชัดเจนว่าทำการบ้านเสร็จแล้วมาทำต่อ)) ใช่ทุกคนที่ทำการบ้านจะยังคงใส่เครื่องหมาย "+" ในความคิดเห็นต่อไป เป็นสิ่งสำคัญสำหรับฉันที่หัวข้อการบ้านน่าสนใจสำหรับคุณ เพื่อที่ฉันจะได้ทำต่อไปในอนาคต ใช่ ฉันอ่านความคิดเห็นของคุณเป็นประจำ แน่นอนว่าฉันตอบไม่บ่อยนัก ฉันเห็นว่าพวกเขาขอให้ระบุปัญหา SQL ที่ยากขึ้น จะไม่มีปัญหาที่น่าสนใจจนกว่าเราจะเรียนรู้การเข้าร่วม ดังนั้นจึงมีปัญหาที่ฉันต้องการสำหรับเนื้อหาเพิ่มเติมงาน:
-
ทำความเข้าใจกับ ตัวดำเนินการHAVINGและเขียนแบบสอบถามตัวอย่างสำหรับตารางจากตัวอย่างของเรา หากคุณต้องการเพิ่มช่องบางช่องหรือค่าอื่นๆ เพื่อให้ชัดเจนยิ่งขึ้น ให้เพิ่มช่องเหล่านั้น หากใครต้องการ เขียนวิธีแก้ปัญหาตัวอย่างของคุณในความคิดเห็น ด้วยวิธีนี้ ฉันสามารถตรวจสอบได้ด้วยหากฉันมีเวลา
- ติดตั้ง MySQL Workbench เพื่อทำงานกับฐานข้อมูลผ่าน UI ฉันคิดว่าเราฝึกฝนการทำงานจากคอนโซลมามากพอแล้ว เชื่อมต่อกับฐานข้อมูล หากคุณใช้อย่างอื่นเพื่อทำงานกับฐานข้อมูล คุณสามารถข้ามงานนี้ได้เลย ฉันจะใช้เฉพาะ MySQL Workbench เท่านั้น
- เขียนคำขอเพื่อรับโดยใช้ข้อมูลของเรา:
- ประเทศที่เล็กที่สุด/มีประชากรมากที่สุด
- จำนวนประชากรโดยเฉลี่ยในประเทศ
- จำนวนประชากรโดยเฉลี่ยในประเทศที่ชื่อลงท้ายด้วย "a";
- จำนวนประเทศที่มีประชากรมากกว่าสี่ล้านคน
- จัดเรียงประเทศโดยการลดจำนวนประชากร
- จัดเรียงประเทศตามชื่อตามลำดับธรรมชาติ
GO TO FULL VERSION