เมื่อปีที่โควิดระบาดหนัก Lockdown ไปไหนไม่ได้ มีเวลามากขึ้น เกิดอยากพัฒนาตัวเอง ให้เก่งขึ้นๆ อยากฝึกทักษะ อยากทำได้มากกว่าแผนที่ หรือ วิเคราะห์เชิงพื้นที่
ค้นหาข้อมูลไปเรื่อยๆ จนได้มาเจอ Data Science Bootcamp ของเพจดัง DataRockie ของแอดทอย ไม่รอช้ารีบลงเรียนเลย ตอนนั้น Batch5
ได้ทำอะไรครั้งแรกเยอะมากๆ ไม่ว่าจะเป็น Python, R, Google Sheet, Tableau, Power BI, Looker Studio(Data Studio), Static, Website และอื่นๆ อีกมากมาย
แต่บทความนี้จะขอเล่าถึง SQL ก่อนนะครับ 5555+ เดี๋ยวเนื้อหาจะยาวไป เรียนครั้งแรกจะยากเสมอ แต่ไม่ต้องกังวลไป เมื่อเราตั้งใจ ฝึกทำ เราจะผ่านมาได้แน่นอน

เนื้อหามีอะไรบ้าง
- SQL คืออะไร
- อ่านได้ไม่ยาก ถ้าเข้าใจความหมายภาษาอังกฤษ
- เรียนคำสั่งแรกเลย
- ลองทำ
- ความเชื่อมโยงกับทำแผนที่
- ความรู้สึกที่ได้เรียน
- สรุป
- แนะนำที่เรียนเพิ่มเติม
SQL คืออะไร
SQL ย่อมาจาก Structured Query Language หรือ ภาษาคิวรีโครงสร้าง บางทีเราก็จะได้ยิน Sequel เป็นโปรแกมที่ใช้ในการจัดการฐานข้อมูลที่มีความสัมพันธ์(Relational Database)
จะมี Primary key, Foreign key ไว้เชื่อมกันระหว่าง Table โดยเราใช้ SQL ทำอะไรบ้าง เช่น เพิ่ม แก้ไข ลบ รวมทั้งดึงข้อมูลมาดู (อ่านเพิ่มเติม)
เอาง่ายๆ ก็คือ โปรแกรมเอาไว้ดึงข้อมูลตามเงื่อนไขของเรา เลือกได้ตารางไหน คอลัมถ์ไหน กี่แถว กี่คอลัมถ์ หรือเอาเฉพาะพื้นที่ๆ นั้น เราเพียงเขียนคำสั่งให้ถูกตามโครงสร้าง จากนั้นเราก็ Export มาเป็น Excel ทำงานต่อไป
อ่านได้ไม่ยาก ถ้าเข้าใจความหมายภาษาอังกฤษ
แค่เข้าใจภาษาอังกฤษ ก็จะพอเข้าใจว่าคำสั่งนี้ทำอะไร นี่คือคำสั่งที่เจอบ่อยๆ ตอนเรียน
| คำสั่ง | ความหมาย |
|---|---|
| SELECT | เลือกข้อมูลยังไง ทั้งหมด หรือ เฉพาะคอลัมถ์ |
| FROM | จากตารางไหน |
| WHERE | กรองเอาเฉพาะเงื่อนไข เหมือน Filter เหมือน IF ใน Excel |
| INSERT INTO | นำเข้าข้อมูลไปใส่ตาราง |
| UPDATE | แก้ไขข้อมูล |
| DELETE | ลบข้อมูล |
| GROUP BY | จัดกลุ่มตามเงื่อนไข เช่น ตามเพศ ตามประเทศ ตามภาค |
| ORDER BY | เรียงลำดับ จากมากไปน้อย(Descending) หรือ น้อยไปมาก (Ascending) |
| LIMIT | จำกัดจำนวนแถวที่ต้องการ เช่น 10 rows |
| AS | ย่อมาจาก alias เปลี่ยนชื่อคอลัมถ์ใหม่ให้เข้าใจง่ายขึ้น เช่น As Province |
| Aggregate Function | ใช้คำนวณได้ COUNT, MAX, MIN, AVG, SUM |
เรียนคำสั่งแรกเลย
SELCET * FROM Table1 >> วิธีอ่าน เลือกข้อมูลมาทั้งหมด(*)จากตารางที่ชื่อ table1 แต่การใช้งานจริง ไม่ค่อยได้ใช้ เนื่องจากข้อมูลเรามีจำนวนมาก ส่งผลให้เวลาใช้คำสั่งนี้ระบบจะ Run คำสั่งนานมาก
แต่ในหลังบ้าน จะ Run โดยเริ่มจาก FROM > WHERE > SELECT
-- select all
SELECT * FROM menu;
SELECT * FROM customer;
SELECT * FROM member;
SELECT * FROM supplier;
SELECT * FROM invoice;
ลองทำ
สร้าง Database เอง เข้าข้อมูลเอง ทำการ Query ข้อมูลออกมาด้วยคำสั่งต่างๆ เอง สร้างเองทำเอง เพื่อให้เห็นภาพยิ่งขึ้น เมื่อทำบ่อยเราก็เริ่มจะเข้าใจยิ่งขึ้น
สร้าง Database
เริ่มจากสร้าง Database ร้านอาหาร และได้สร้างตารางชื่อ menu ที่ประกอบด้วย 3 คอลัมถ์ ที่มีชื่อคอลัมถ์, ประเภทข้อมูล และให้ menu_id เป็น Primary Key คือ คีย์หลัก ที่ค่าต้องไม่ซ้ำกันและเอาไว้หากมีการ Join Table อื่น
-- create table menu which 4 columns
CREATE TABLE menu (
menu_id int,
menu_name text,
price numeric,
primary key(menu_id)
);
นำเข้าข้อมูล
- จากนั้นก็ลองนำเข้าข้อมูล โดยใช้ Insert Into นำเข้าจำนวน 10 เมนู ประกอบด้วย ลำดับ, ชื่อเมนู, ราคา
--insert data in table menu
INSERT INTO menu values
(1,"Papaya salad", 100),
(2,"Stewrd pork leg on rice", 60),
(3,"Tom Yum Kung", 120),
(4, "Fried pork crackling", 200),
(5, "Massa man Curry", 150),
(6, "Beer Thai", 70),
(7, "Water", 20),
(8, "Iced Tea", 50),
(9, "Black Coffee", 90),
(10, "Soda water", 55);
ฝึกดึงข้อมูล(Query)
จงดึงข้อมูลในตารางเมนู ที่มีราคามากกว่า 100 หน่วย เอาออกมาแค่ 3 คอลัมถ์ menu.menu_id, menu.menu_nam, menu.price แล้วให้เรียงจากมากไปน้อย
-- select in table menu price > 100
SELECT
menu.menu_id as Menu_ID,
menu.menu_name as Name_menu,
menu.price as Price
FROM menu
WHERE price > 100
ORDER BY price desc;
จงดึงข้อมูลในตาราง menu ที่เปลี่ยนชื่อเป็น ตารางA โดยมีการ Join data ออกมาก ในที่นี่เป็นการ Join แบบ inner join หากไม่ได้เขียนระบบจะ Default ให้เป็น Inner Join(เอาเฉพาะค่าที่ Match กัน)

A กับ B เป็นการย่อชื่อตาราง ดังข้อมูลด้านล่าง เพื่อสะดวกในการเขียน แต่ข้อควรระวังหากเราทำงานกับคนอื่นแล้วควรเขียน Comment อธิบายไว้ หรือจะย่อให้สื่อความหมายที่ง่ายๆ ชัดเจนไปเลยก็ได้
-- Select and Join
SELECT
A.menu_name,
A.price,
B.menu_id,
B.invoice_id,
B.inovice_date
FROM menu as A
JOIN invoice B ON A.menu_id = B.menu_id
ORDER BY A.price;
ความเชื่อมโยงกับทำแผนที่

ซึ่งทั้ง 2 ก็มีความเหมือนและคล้ายกันอยู่ เช่น การ Join เหมือนกับการ Union การ Query Data ก็เหมือนกัน รวมทั้งประเภทของข้อมูลก็มีความคล้ายๆ กัน แถมยังมีพวก Login เช่น OR, AND, IN, NOT และอื่นๆ อีก
Join vs Union
join กับ Union ในภาษาของนักภูมิศาสตร์เรามีการเชื่อมข้อมูลเช่นกัน ตัวอย่าง
- Union การรวมข้อมูลของ 2 Shape File ก็จะเหมือน Full Join
- Intersect เอาเฉพาะข้อมูลที่มีค่าเหมือนกัน ก็จะเหมือน Inner Join
Query data
query data แสดงเฉพาะข้อมูลนั้น กับ ดึงข้อมูลตามคำสั่ง SQL เช่นในทางภูมิศาสตร์ต้องการให้แสดงแค่จังหวัดขอนแก่น เราก็จะ ใช้คำสั่ง Definition Query เลือก ชื่อ”ADM1_TH” = ‘ขอนแก่น’
ส่วนใน SQL ก็จะเป็น SELECT ชื่อคอลัมถ์ FROM province WHERE = ‘ขอนแก่น’
ArcGIS
"ADM1_TH" = 'ขอนแก่น'
SQL
SELECT
Column name
FROM province
WHERE = 'ขอนแก่น';
Data Type
Data type | ArcGIS (SQL) แบบคร่าวๆ นะครับ เพราะในรายละเอียดที่มาค่อนข้างซับซ้อน
- TEXT (CHAR) ตัวหนังสือ ตัวอักษร นั่นเอง
- Short Integer (INTEGER) ตัวเลขจำนวนเต็มจะเก็บค่าได้น้อยกว่าแบบ Long
- Long Integer (INTEGER) ตัวเลขจำนวนเต็มจะเก็บค่าได้มากกว่าแบบ Short
- Float (FLOAT) ตัวเลขที่แสดงค่าทศนิยม 1 ตำแหน่ง
- Double (DOUBLE) ตัวเลขที่แสดงค่าทศนิยม 2 ตำแหน่ง
- Date (DATE) แสดงวันที่ mm/dd/yyyy แต่ใน SQL format แตกต่างกัน YYYY-MM-DD

Definition Query
Definition Query คำสั่ง และ(AND) หรือ(OR) ไม่(NOT) เหมือน(LIKE)
ArcGIS จะใช้คำสั่งแบบนี้เลยครับ ADM1 คือชื่อฟิลด์(column)
- OR >> “ADM1_TH” = ‘ขอนแก่น’ OR “ADM1_TH” = ‘กรุงเทพมหานคร’
- AND >> “ADM1_TH” = ‘ขอนแก่น’ AND “ADM1_TH” = ‘กรุงเทพมหานคร’
- NOT >>””ADM1_TH” NOT LIKE ‘นคร%’
- LIKE >> “ADM1_TH” LIKE ‘นคร%’ (pattern matching)
- NULL >> “ADM1_TH” IS NULL
ส่วนใน SQL จะเขียนดังนี้
OR
SELECT
ADM1
FROM provinces
WHERE ADM1 = 'ขอนแก่น' OR ADM1 = 'กรุงเทพมหานคร';
AND
SELECT
ADM1
FROM provinces
WHERE ADM1 = 'ขอนแก่น' AND ADM1 = 'กรุงเทพมหานคร';
NOT
SELECT
ADM1
FROM provinces
WHERE ADM1 IS NOT 'ขอนแก่น';
LIKE
SELECT
ADM1
FROM provinces
WHERE ADM1 LIKE 'นคร%';
NULL
SELECT
ADM1
FROM provinces
WHERE ADM1 IS NOT NULL;
Geodatabase vs Database
ฐานข้อมูลคล้ายๆ กัน geodatabase กับ database ใน geodatabase จะมี Spatial data & Attribute data อยู่ด้วย
- Spatial data ประกอบด้วยข้อมูล จุดตำแหน่ง(Point) เส้น(Line) (พื้นที่)Polygon ส่วน
- Attribute data ก็จะเป็นข้อมูลอธิบาย spatial data เช่น ชื่อจังหวัด, อำเภอ, ตำบล, ยอดขาย, สถานที่ ,ละติจูด ลองจิจูด เป็นต้น
ซึ่งใน Attribute data นี่แหล่ะจะมีความคล้ายกับ SQL ข้อมูลอยู่ในรูปตารางประกอบด้วย Field กับ Row ใน SQL จะเรียกคล้ายกัน Column กับ Row

ความรู้สึกที่ได้เรียน
ช่วงแรกที่ได้เรียน โอ้ว งงมาก ก.ไก่ ล้านตัว 555555+ เรียนไปสักพักก็แบบเอ้ยก็ไม่ได้ยากนี่น๊าาาาาาาา เราเรียนได้ เราทำได้ แต่ยังต้องฝึกอีกเยอะเลยครับ นี่เรียนเบื้องต้นเอง
ตอนนั้นฝึกเขียนคำสั่งใน SQL LITE

สรุป
ตอนเห็นครั้งแรกก็แอบคิดว่ายากแน่ๆ เลย พอได้ทำความเข้าใจและเรียน เราก็มองว่าก็ไม่ได้ยากนะ เอาจริงๆ เราแอบมีพื้นฐานจากการทำแผนที่ของ ArcGIS อยู่บ้างแล้ว
ถ้าใครอยากเรียนก็ลองเรียนได้เลย เปิดใจเรียนรู้ ฝึกตั้งคำถามที่อยากได้ข้อมูล แล้วก็แปลงมาเป็น SQL ดูผมว่าทุกคนทำได้ ลุยครัชชชชชชชชชชชชชชชชชช !!!

Leave a comment