ฐานข้อมูลขับเคลื่อนเว็บสมัยใหม่ เว็บไซต์ขนาดใหญ่หรือไดนามิกทุกแห่งใช้ฐานข้อมูลในทางใดทางหนึ่ง และเมื่อรวมกับ ภาษาคิวรีที่มีโครงสร้าง (SQL) ความเป็นไปได้ในการจัดการข้อมูลนั้นไม่มีที่สิ้นสุดจริงๆ หากคุณรู้จัก SQL อยู่แล้ว อย่าลืมตรวจสอบทักษะการเขียนโปรแกรมเหล่านี้ที่นักพัฒนาเว็บไซต์ทุกคนควรรู้
วันนี้จะมานำเสนอบางส่วนของ คำสั่ง SQL หลัก คุณจำเป็นต้องรู้ในฐานะโปรแกรมเมอร์
มีหลายชื่อสำหรับข้อมูลที่ส่งคืนจากตารางฐานข้อมูล ข้อมูลโดยทั่วไปจะเรียกว่า แถว , บันทึก , หรือ ทูเปิลส์ . ฉันจะใช้คำศัพท์เหล่านี้แทนกันได้ตลอดทั้งบทความนี้
คำนำ
ตัวอย่างทั้งหมดในวันนี้จะอิงตามตารางสมมติสี่ตาราง NS ลูกค้า ตารางประกอบด้วยชื่อและอายุของลูกค้า:
NS ความสูง ตารางมีชื่อและความสูงของบุคคลใด ๆ :
NS พนักงาน ตารางมีชื่อและอายุของพนักงาน - เหมือนกับตารางลูกค้า:
ตารางสุดท้ายเรียกว่า ผู้คน มีชื่อและอายุของคน เช่นเดียวกับตารางลูกค้าและพนักงาน:
1. เลือก
NS เลือก คำสั่งนั้นง่ายที่สุด และจำเป็นอย่างยิ่งที่คุณจะต้องเข้าใจมัน เนื่องจากมันสนับสนุนคำสั่งอื่นๆ เกือบทั้งหมด ถือเป็นแนวทางปฏิบัติที่ดีที่สุดในการเขียนคำ SQL ที่สงวนไว้ด้วยตัวพิมพ์ใหญ่ เนื่องจากจะทำให้อ่านและเข้าใจคำสั่งได้ง่ายขึ้น
ตามชื่อของมัน เลือก ถูกใช้เพื่อ เลือก ข้อมูลจากฐานข้อมูล นี่คือการใช้งานที่ง่ายที่สุด:
SELECT * FROM table;
มีสองส่วนนี้ ส่วนแรก ( เลือก * ) ระบุคอลัมน์ที่คุณต้องการเลือก เครื่องหมายดอกจันแสดงว่าคุณต้องการเลือกคอลัมน์ทั้งหมดในตาราง ส่วนที่สอง ( จากตาราง ) บอกกลไกฐานข้อมูลของคุณว่าคุณต้องการดึงข้อมูลนี้จากที่ใด แทนที่ 'table' ด้วยชื่อของตารางฐานข้อมูลของคุณ
การเลือกนี้เรียกว่า 'เลือกดาว' การใช้เครื่องหมายดอกจันเป็นวิธีที่ดีในการค้นหาว่าข้อมูลใดอยู่ในตาราง แต่ฉันไม่แนะนำให้คุณใช้มันสำหรับรหัสการผลิตใดๆ เมื่อใช้ Select Star จะขึ้นอยู่กับกลไกจัดการฐานข้อมูลในการนำเสนอข้อมูลที่คุณต้องการ คุณไม่สามารถควบคุมลำดับของข้อมูลที่ส่งคืนได้ ดังนั้นหากมีใครเพิ่มคอลัมน์ใหม่ลงในตาราง คุณอาจพบว่าตัวแปรในภาษาการเขียนโปรแกรมของคุณไม่ได้แสดงถึงข้อมูลที่ถูกต้องอีกต่อไป โชคดีที่มีวิธีแก้ปัญหา
คุณสามารถระบุได้อย่างชัดเจนว่าคอลัมน์ใดที่คุณต้องการดึงข้อมูลดังนี้:
SELECT age, name FROM people;
แบบสอบถามนี้ดึงคอลัมน์ 'อายุ' และ 'ชื่อ' จากตาราง 'ผู้คน' การแสดงความชัดเจนนี้อาจเป็นเรื่องที่น่าเบื่อเล็กน้อยหากคุณมีข้อมูลจำนวนมาก แต่การทำเช่นนี้จะช่วยลดปัญหาในอนาคต ควบคู่ไปกับการทำให้โปรแกรมเมอร์ในอนาคตเข้าใจ SQL ของคุณได้ง่ายขึ้น
หากคุณต้องการเลือกข้อมูลเพิ่มเติม แต่ไม่ได้จัดเก็บไว้ในตารางใดๆ ของคุณ คุณสามารถทำได้ดังนี้:
SELECT age, '1234' FROM people;
สตริงใดๆ ภายในเครื่องหมายคำพูดเดี่ยวจะถูกส่งกลับแทนที่จะจับคู่ชื่อคอลัมน์
2. ที่ไหน
คำสั่ง select นั้นยอดเยี่ยมสำหรับการดึงข้อมูล แต่ถ้าคุณต้องการกรองผลลัพธ์อีกเล็กน้อยล่ะ แล้วการดึงเฉพาะคนที่มีตาสีฟ้าล่ะ? แล้วคนที่เกิดในเดือนมกราคมที่ทำงานเป็นช่างยนต์ล่ะ? นี่คือที่ที่ ที่ไหน คำสั่งเข้ามา สิ่งนี้ทำให้คุณสามารถใช้เงื่อนไขกับการเลือก และคุณเพียงแค่ผนวกเข้ากับส่วนท้ายของคำสั่ง:
SELECT age, name FROM people WHERE age > 10;
ขณะนี้ แบบสอบถามนี้จำกัดเฉพาะผู้ที่มีอายุมากกว่า 10 ปี คุณสามารถรวมหลายเงื่อนไขโดยใช้คำสั่ง และ โอเปอเรเตอร์:
SELECT age, name FROM people WHERE age > 10 AND age <20;
NS และ คำสั่งทำงานเหมือนกับในภาษาอังกฤษ: ใช้เงื่อนไขอื่นกับคำสั่ง ในตัวอย่างนี้ ข้อมูลที่ส่งคืนจะเป็นบันทึกใดๆ ที่มีอายุระหว่าง 10 ถึง 20 ปี เนื่องจากไม่มีผลลัพธ์ที่ตรงกัน จึงไม่มีการส่งคืนข้อมูล
windows ตรวจไม่พบการตั้งค่าพร็อกซีของเครือข่ายนี้โดยอัตโนมัติ windows 10
คำสั่งอื่นที่สามารถใช้ร่วมกับคำสั่งนี้คือ หรือ . นี่คือตัวอย่าง:
SELECT age, name FROM people WHERE age > 10 OR name = 'Joe';
แบบสอบถามนี้ส่งกลับระเบียนที่อายุมากกว่า 10 หรือชื่อเท่ากับ 'Joe' สังเกตว่ามีเครื่องหมายเท่ากับเพียงตัวเดียวได้อย่างไร? ภาษาโปรแกรมส่วนใหญ่ใช้ double equals (==) เพื่อตรวจสอบความเท่าเทียมกัน สิ่งนี้ไม่จำเป็นสำหรับเอ็นจิ้นฐานข้อมูลส่วนใหญ่ (แต่สามารถทำได้ตามสภาพแวดล้อม ดังนั้นให้ตรวจสอบอีกครั้งก่อน)
3. สั่งซื้อ
NS คำสั่ง คำสั่งใช้เพื่อจัดเรียงผลลัพธ์ที่ส่งคืน เป็นอีกอันที่ใช้งานง่าย เพียงต่อท้ายใบแจ้งยอดของคุณ:
SELECT name, age FROM people ORDER BY age DESC;
คุณต้องระบุคอลัมน์และลำดับซึ่งสามารถ ASC สำหรับขึ้นหรือ รายละเอียด สำหรับการลง คุณสามารถสั่งซื้อได้หลายคอลัมน์ดังนี้:
SELECT name, age FROM people ORDER BY name ASC, age DESC
สั่งโดย อาจมีประโยชน์มากที่สุดเมื่อรวมกับคำสั่งอื่นๆ ไม่ใช่ทุกการสืบค้นข้อมูลจะส่งคืนข้อมูลในลักษณะที่เป็นตรรกะหรือเป็นลำดับ -- คำสั่งนี้ให้คุณเปลี่ยนแปลงได้
4. เข้าร่วม
NS เข้าร่วม คำสั่งใช้เพื่อ เข้าร่วม ข้อมูลที่เกี่ยวข้องที่จัดเก็บไว้ในตารางอย่างน้อยหนึ่งตาราง คุณ เข้าร่วม ตารางที่สองไปยังตารางแรก และระบุวิธีการเชื่อมต่อข้อมูล นี่คือตัวอย่างพื้นฐาน:
แอพฟิตเนสที่ดีที่สุดสำหรับ apple watch 2
SELECT age, name, height FROM people LEFT JOIN heights USING (name);
มีบางสิ่งเกิดขึ้นที่นี่ คุณต้องเริ่มต้นด้วยไวยากรณ์ 'LEFT JOIN' ซึ่งระบุว่าคุณต้องการเข้าร่วมตารางโดยใช้การรวมประเภทด้านซ้าย ถัดไป ระบุตารางที่คุณต้องการเข้าร่วม (ความสูง) NS การใช้ (ชื่อ) ไวยากรณ์ระบุว่าคอลัมน์ 'ชื่อ' สามารถพบได้ในทั้งสองตาราง และควรใช้เป็นคีย์ในการรวมตารางเข้าด้วยกัน
อย่ากังวลหากคอลัมน์ของคุณมีชื่อต่างกันในแต่ละตาราง คุณสามารถใช้ 'ON' แทน 'USING':
SELECT age, name, height FROM people LEFT JOIN heights ON (namea = nameb);
คำสั่ง on ระบุอย่างชัดเจนว่าควรใส่คอลัมน์ใด การเข้าร่วมมีหลายประเภท และใช้เวลานานในการลงรายละเอียดสำหรับแต่ละประเภท ดังนั้นนี่คือข้อมูลสรุปโดยย่อของการใช้งาน:
- (ด้านใน) เข้าร่วม -- ส่งกลับแถวที่มีการจับคู่ในทั้งสองตาราง
- ซ้าย (นอก) เข้าร่วม -- ส่งกลับแถวทั้งหมดจากตารางด้านซ้าย โดยมีรายการที่ตรงกันจากตารางด้านขวา หากไม่มีรายการที่ตรงกัน ระเบียนตารางด้านซ้ายจะถูกส่งกลับ
- ขวา (ด้านนอก) เข้าร่วม -- นี่คือสิ่งที่ตรงกันข้ามกับการรวมกันทางซ้าย: แถวทั้งหมดจากตารางด้านขวาจะถูกส่งคืน พร้อมกับรายการที่ตรงกันในตารางด้านซ้าย
- เต็ม (นอก) เข้าร่วม -- ส่งกลับระเบียนใด ๆ ที่มีการจับคู่ในตารางใดตารางหนึ่ง
ไวยากรณ์ 'INNER' หรือ 'OUTER' เป็นทางเลือก มันสามารถช่วยให้เข้าใจสิ่งต่าง ๆ ได้ง่ายขึ้น แต่คุณไม่จำเป็นต้องระบุเป็นส่วนใหญ่
5. นามแฝง
ตอนนี้คุณรู้พื้นฐานแล้ว มาดูที่ นามแฝง สั่งการ. ใช้เพื่อเปลี่ยนชื่อตารางชั่วคราว ซึ่งเป็นชื่อเล่นมากกว่าอย่างอื่น เนื่องจากชื่อใหม่นี้มีอยู่ในธุรกรรมแต่ละรายการที่คุณกำลังเรียกใช้เท่านั้น วิธีใช้งานมีดังนี้
SELECT A.age FROM people A;
คุณสามารถใช้ชื่อที่ถูกต้องตามต้องการ แต่ฉันชอบใช้ตัวอักษรของตัวอักษร ก่อนชื่อคอลัมน์แต่ละชื่อ นามแฝงจะถูกนำหน้า นามแฝงนี้ถูกกำหนดให้กับตารางทันทีหลังจากมีการประกาศ สิ่งนี้เหมือนกับการทำสิ่งนี้:
SELECT people.age FROM people;
แทนที่จะต้องพิมพ์ชื่อตารางยาวๆ คุณสามารถพิมพ์ตัวอักษรที่เรียบง่ายและจดจำได้ง่าย แต่ประเด็นคืออะไร ถ้าคุณเลือกจากตารางมากกว่าหนึ่งตาราง คุณจะสับสนได้ง่ายว่าคอลัมน์ใดเป็นของตารางใด ถ้าทั้งสองตารางของคุณมีคอลัมน์ที่มีชื่อเหมือนกัน คิวรีฐานข้อมูลของคุณอาจทำงานล้มเหลวโดยไม่ได้อ้างอิงชื่อตารางหรือนามแฝงอย่างชัดเจน นี่คือตัวอย่างที่มีสองตาราง:
SELECT staff.age, staff.name, customers.age, customers.name FROM staff, customers;
และนี่คือข้อความค้นหาเดียวกันกับที่ใช้นามแฝง:
SELECT A.age, A.name, B.age, B.name FROM staff A, customers B;
ตารางพนักงานมีนามแฝงของ 'A' และตารางลูกค้าจะได้รับนามแฝงของ 'B' ตารางนามแฝงช่วยให้โค้ดของคุณเข้าใจง่ายขึ้นจริงๆ และลดจำนวนการพิมพ์ที่คุณต้องทำ
คุณยังสามารถเปลี่ยนชื่อคอลัมน์ด้วยนามแฝงโดยใช้คำสั่ง 'AS':
SELECT age AS person_age FROM people;
เมื่อเรียกใช้แบบสอบถามนี้ คอลัมน์จะเรียกว่า 'person_age' แทนที่จะเป็น 'age'
6. ยูเนี่ยน
ยูเนี่ยน เป็นคำสั่งที่ดี ช่วยให้คุณสามารถผนวกแถวเข้าด้วยกัน ไม่เหมือนการรวมที่ผนวกคอลัมน์ที่ตรงกัน union สามารถผนวกแถวที่ไม่เกี่ยวข้องได้หากมีหมายเลขและชื่อของคอลัมน์เหมือนกัน วิธีใช้งานมีดังนี้
SELECT age, name FROM customers
UNION
SELECT age, name FROM staff;
คุณสามารถนึกถึงการรวมเป็นวิธีการรวมผลลัพธ์ของแบบสอบถามสองรายการ ยูเนี่ยนจะส่งกลับเฉพาะผลลัพธ์ที่มีแถวที่ไม่ซ้ำระหว่างสองคิวรี คุณสามารถใช้ไวยากรณ์ 'UNION ALL' เพื่อส่งคืนข้อมูลทั้งหมด โดยไม่คำนึงถึงข้อมูลที่ซ้ำกัน:
SELECT age, name FROM customers
UNION ALL
SELECT age, name FROM staff;
สังเกตว่าลำดับของแถวเปลี่ยนไปอย่างไร? ยูเนี่ยนดำเนินการอย่างมีประสิทธิภาพสูงสุด ดังนั้นข้อมูลที่ส่งคืนอาจแตกต่างกันไปตามลำดับ
กรณีการใช้งานที่เป็นไปได้สำหรับยูเนี่ยนเป็นผลรวมย่อย: คุณสามารถรวมคิวรีของยอดรวมเข้ากับคิวรีของยอดรวมแต่ละรายการสำหรับสถานการณ์เฉพาะได้
7. แทรก
ตอนนี้คุณรู้ทุกอย่างเกี่ยวกับการดึงข้อมูลจากฐานข้อมูลแล้ว แต่การแทรกข้อมูลล่ะ นี่คือที่ที่ แทรก คำสั่งเข้ามา นี่คือตัวอย่าง:
INSERT INTO people(name, age) VALUES('Joe', 102);
คุณต้องระบุชื่อตาราง (คน) และคอลัมน์ที่คุณต้องการใช้ (ชื่อและอายุ) ไวยากรณ์ 'VALUES' จะถูกนำมาใช้เพื่อระบุค่าที่จะแทรก ต้องอยู่ในลำดับเดียวกับคอลัมน์ที่ระบุไว้ก่อนหน้านี้
คุณไม่สามารถระบุส่วนคำสั่ง where สำหรับการแทรก และคุณต้องแน่ใจว่าคุณปฏิบัติตามข้อจำกัดของตารางที่จำเป็นที่มีอยู่
8. อัพเดท
หลังจากแทรกข้อมูลบางอย่างแล้ว เป็นเรื่องปกติที่จะต้องเปลี่ยนแถวเฉพาะ นี่คือ อัปเดต ไวยากรณ์คำสั่ง:
UPDATE people SET name = 'Joe', age = 101;
คุณต้องระบุตารางที่คุณต้องการเปลี่ยนแปลง จากนั้นใช้ไวยากรณ์ 'SET' เพื่อระบุคอลัมน์และค่าใหม่ ตัวอย่างนี้เป็นสิ่งที่ดี แต่จะอัปเดตทุกระเบียน ซึ่งเป็นสิ่งที่ไม่พึงปรารถนาเสมอไป!
เพื่อให้มีความเฉพาะเจาะจงมากขึ้น คุณสามารถใช้ส่วนคำสั่ง 'WHERE' ได้เหมือนกับเมื่อทำการเลือก:
UPDATE people SET name = 'Joe', age = 101 WHERE name = 'James';
คุณยังสามารถระบุหลายเงื่อนไขโดยใช้ 'AND' และ 'OR':
UPDATE people SET name = 'Joe', age = 101 WHERE (name = 'James' AND age = 100) OR name = 'Ryan';
สังเกตว่าวงเล็บถูกใช้เพื่อจำกัดเงื่อนไขอย่างไร
โฆษณาป๊อปอัปบนหน้าจอหลักของ Android
9. อัพเสิร์ท
อ๊ะ เป็นคำที่ฟังดูแปลกๆ แต่เป็นคำสั่งที่มีประโยชน์อย่างเหลือเชื่อ สมมติว่าคุณมีข้อจำกัดในตาราง และคุณได้ระบุว่าคุณต้องการเฉพาะระเบียนที่มีชื่อไม่ซ้ำกันเท่านั้น เช่น คุณไม่ต้องการเก็บสองแถวที่มีชื่อเดียวกัน เป็นต้น หากคุณพยายามแทรกค่า 'Joe' หลายค่า กลไกฐานข้อมูลของคุณจะส่งข้อผิดพลาดและปฏิเสธที่จะทำ (ค่อนข้างถูกต้อง) UPSERT ช่วยให้คุณอัปเดตบันทึกได้หากมีอยู่แล้ว สิ่งนี้มีประโยชน์อย่างเหลือเชื่อ! หากไม่มีคำสั่งนี้ คุณจะต้องเขียนตรรกะจำนวนมากเพื่อตรวจสอบก่อนว่ามีระเบียนหรือไม่ ให้แทรกหากไม่มี หรือดึงคีย์หลักที่ถูกต้องแล้วจึงอัปเดต
น่าเสียดายที่ upserts ถูกนำมาใช้แตกต่างกันในกลไกฐานข้อมูลที่แตกต่างกัน PostgreSQL เพิ่งได้รับความสามารถนี้ในขณะที่ MySQL มีมาระยะหนึ่งแล้ว นี่คือไวยากรณ์ MySQL สำหรับการอ้างอิง:
INSERT INTO people(name, age)
VALUES('Joe', 101)
ON DUPLICATE KEY UPDATE age = 101;
สังเกตว่านี่คือการปรับปรุงและคำสั่งแทรก ซึ่งสามารถสรุปได้ว่าเป็น 'อัปเดตหากการแทรกล้มเหลว'
10. ลบ
ลบ ใช้เพื่อลบบันทึกทั้งหมด - อาจสร้างความเสียหายได้หากถูกละเมิด! ไวยากรณ์พื้นฐานใช้งานง่ายมาก:
DELETE FROM people;
เช่นเดียวกับคำสั่งอื่นๆ ส่วนใหญ่จะลบ ทุกอย่าง ! คุณต้องใช้ตำแหน่งที่จะ จำกัด จำนวนแถวที่เหมาะสมกว่าเล็กน้อย - อย่างใดอย่างหนึ่ง:
DELETE FROM people WHERE name = 'Joe';
หากคุณกำลังพัฒนาระบบ ขอแนะนำให้ใช้ 'soft delete' คุณไม่เคยเรียกใช้คำสั่ง delete จริง ๆ แล้ว แทนที่จะสร้างคอลัมน์ที่ถูกลบ แล้วตรวจสอบคอลัมน์นั้นในการเลือกของคุณ มันสามารถหลีกเลี่ยงความลำบากใจที่อาจเกิดขึ้นได้หากคุณสามารถเรียกข้อมูลที่ถูกลบได้อย่างรวดเร็วและง่ายดาย อย่างไรก็ตาม วิธีนี้ใช้แทนการสำรองข้อมูลที่เหมาะสมไม่ได้
11. สร้างตาราง
NS สร้างตาราง คำสั่งใช้สร้างตาราง เป็นอีกสิ่งหนึ่งที่ง่ายมาก:
CREATE TABLE people (
name TEXT,
age, INTEGER,
PRIMARY KEY(name)
);
สังเกตว่าชื่อคอลัมน์และข้อจำกัดอยู่ภายในวงเล็บอย่างไร และคอลัมน์จะได้รับประเภทข้อมูลที่เหมาะสม มีการระบุคีย์หลัก ตามความจำเป็นในการออกแบบฐานข้อมูลที่ดี
12. เปลี่ยนตาราง
NS เปลี่ยนตาราง คำสั่งใช้เพื่อแก้ไขโครงสร้างของตาราง ซึ่งมีข้อ จำกัด เล็กน้อย เนื่องจากฐานข้อมูลของคุณจะไม่อนุญาตให้คุณแก้ไขตารางหากข้อมูลที่มีอยู่จะทำให้เกิดข้อขัดแย้ง เช่น การเปลี่ยนสตริงเป็นจำนวนเต็ม เป็นต้น ในกรณีดังกล่าว ให้แก้ไขข้อมูลก่อน แล้วจึงแก้ไขตาราง นี่คือตัวอย่าง:
ALTER TABLE people ADD height integer;
ตัวอย่างนี้จะเพิ่มคอลัมน์ชื่อ 'ความสูง' ของจำนวนเต็มประเภทลงในตารางบุคคล ไม่มีข้อจำกัดในสิ่งที่คุณสามารถเปลี่ยนแปลงได้
13. วางตาราง
คำสั่งสุดท้ายคือ วางโต๊ะ . คิดว่านี่เป็นการลบ แต่แทนที่จะลบระเบียนเดียว มันจะลบทุกระเบียนเดียวพร้อมกับตาราง! วิธีใช้งานมีดังนี้
DROP TABLE people;
เป็นคำสั่งที่ค่อนข้างรุนแรง และไม่มีเหตุผลที่จะต้องตั้งโปรแกรมไว้ในระบบของคุณ ควรดำเนินการด้วยตนเองในกรณีส่วนใหญ่เท่านั้น และสามารถทำได้ มาก ทำลายล้าง
นั่นคือทั้งหมดสำหรับวันนี้ ฉันหวังว่าคุณจะได้เรียนรู้เคล็ดลับที่เป็นประโยชน์! คุณสามารถเรียนรู้วิธีการ ทำเว็บไซต์ จากนั้นใช้ทักษะที่คุณเพิ่งค้นพบเพื่อทำให้เป็นไดนามิก เพียงให้แน่ใจว่าคุณไม่ได้ทำผิดพลาดเหล่านี้หรือปล่อยให้เสี่ยงต่อการฉีด SQL หากคุณไม่แน่ใจว่าจำเป็นต้องเรียนรู้ SQL คุณได้พิจารณาตัวสร้างไซต์แบบคงที่หรือไม่
ทำไมไม่แสดงความคิดเห็นด้านล่างด้วยเคล็ดลับและลูกเล่น SQL ที่คุณชื่นชอบ?
เครดิตรูปภาพ: HYS_NP/Shutterstock
แบ่งปัน แบ่งปัน ทวีต อีเมล การอัพเกรดเป็น Windows 11 คุ้มค่าหรือไม่?Windows ได้รับการออกแบบใหม่ แต่นั่นเพียงพอที่จะโน้มน้าวให้คุณเปลี่ยนจาก Windows 10 เป็น Windows 11 หรือไม่
อ่านต่อไป หัวข้อที่เกี่ยวข้อง- การเขียนโปรแกรม
- การเขียนโปรแกรม
- SQL
โจสำเร็จการศึกษาด้านวิทยาการคอมพิวเตอร์จากมหาวิทยาลัยลินคอล์น ประเทศอังกฤษ เขาเป็นนักพัฒนาซอฟต์แวร์มืออาชีพ และเมื่อเขาไม่ได้ขับโดรนหรือเขียนเพลง เขามักจะถูกมองว่าถ่ายภาพหรือผลิตวิดีโอ
เพิ่มเติมจาก Joe Coburnสมัครรับจดหมายข่าวของเรา
เข้าร่วมจดหมายข่าวของเราสำหรับเคล็ดลับทางเทคนิค บทวิจารณ์ eBook ฟรี และดีลพิเศษ!
คลิกที่นี่เพื่อสมัครสมาชิก