มาเพิ่ม Skill การเขียน SQL Command กัน(1) เนื่องจาก การเขียนโปรแกรมส่วนใหญ่ ก็ต้องมีการทำงานกับ Database
เนื่องจาก การเขียนโปรแกรมส่วนใหญ่ ก็ต้องมีการทำงานกับ Database
แล้วก็คง หนีไม่พ้นต้องเขียน SQL command กัน เห็นใน board ก้ถามเรื่อง
SQL กันเยอะ ก็เลยเอามาให้ศึกษาดูครับ
ตัวอย่างเอามาจากหนังสือเล่มนี้ครับ ลองหาโหลดมาอ่านดูครับ
เริ่มกันที่ SELECT,INSERT,UPDATE กันก่อนเลยครับ
มาเริ่มกันที่ SQL Select
เราสามารถ คำนวน ข้อมูลต่างๆ เช่น ร้อยละ,ภาษี,ค่า commision หรือแม้แต่การเชื่อม string ภายใน
sql ได้เลย ซึงหากเราไม่รู้ sql หรือยังไม่แม่น ก็ต้องเขียนโปรแกรมในการคำนวนใน application เพิ่ม
มาดูตัวอย่ากัน จากตัวอย่าง table contract มี 2 fileds คือ income กับ overhead
ต้องการคิดยอดที่ (100-overhead) % ของ income คือ residual จากนั้นก็มาคิด ค่า com ให้
3 ส่วน ESt = 20%,Admin=10%,Rsrv=5%
สามารถเขียน SQL ได้ดังนี้
mysql> SELECT income,
-> overhead,
-> (income-income*overhead/100) AS residual,
-> 0.20*(income-income*overhead/100) AS Est,
-> 0.10*(income-income*overhead/100) AS Admin,
-> 0.05*(income-income*overhead/100) AS Rsrv
-> FROM contract;
+--------+----------+----------+------+-------+------+
| income | overhead | residual | Est | Admin | Rsrv |
+--------+----------+----------+------+-------+------+
| 1000 | 20 | 800 | 160 | 80 | 40 |
| 2000 | 10 | 1800 | 360 | 180 | 90 |
| 1000 | 20 | 500 | 100 | 50 | 25 |
+--------+----------+----------+------+-------+------+
หรือเขียนในรูปแบบ sub query แบบนี้ก็ได้, sql ดูเมพขึ้น
แต่อย่าลืมว่า sub query ทำงานช้า.......
mysql> SELECT income,
-> overhead,
-> residual,
-> 0.20*residual AS Est,
-> 0.10*residual AS Admin,
-> 0.05*residual AS Rsrv
-> FROM
-> (SELECT income, overhead, (income-income*overhead/100) AS residual
-> FROM contract) subquery;
+--------+----------+----------+------+-------+------+
| income | overhead | residual | Est | Admin | Rsrv |
+--------+----------+----------+------+-------+------+
| 1000 | 20 | 800 | 160 | 80 | 40 |
| 2000 | 10 | 1800 | 360 | 180 | 90 |
| 1000 | 20 | 500 | 100 | 50 | 25 |
+--------+----------+----------+------+-------+------+
ต่อไปเป็น SQL INSERT SELECT
เราสามารถใช้ SELECT แทน VALUES ได้
INSERT INTO roomBooking(whn,wht,who)
VALUES ('2006-07-13','Ballroom','Col. Mustard');
INSERT INTO roomBooking(whn,wht,who)
SELECT '2006-07-13','Ballroom','Col. Mustard';
มาดูวิธีใช้งานกัน
ตัวอย่างต่อไปนี้ เป็นการ Insert ลงตาราง โดย check ก่อนว่ามีข้อมูลในตารางไหม
หากยังไม่มี ให้ insert
หลายท่านอาจเขียนแบบ เขียน comand select ค่าที่จะ insert ลง database ก่อน
หากไม่พบ recode ให้ insert ได้ ทำให้ต้องใช้ query 2 ครั้ง
แต่เราสามารถเขียนอย่างนี้ได้
mysql> INSERT INTO roomBooking(whn,wht,who)
-> SELECT DATE '2006-07-13','Billiard Room','Prof. Plum'
-> FROM dual
-> WHERE NOT EXISTS (SELECT who FROM roomBooking
-> WHERE whn = DATE '2006-07-13'
-> AND wht='Billiard room');
หากเป็น SQL SERVER
INSERT INTO roomBooking(whn,wht,who)
SELECT '2006-07-13','Billiard Room','Prof. Plum'
WHERE NOT EXISTS (SELECT who FROM roomBooking
WHERE whn = '2006-07-13'
AND wht='Billiard room')
สุดท้าย UPDATE command
หลายคนคงเคยใช้ command UPDATE update recode เพียง recode เดียว
หรือหลาย Recode แต่ paramiter เดียว แต่เราสามารถเขียน อย่างนี้ได้ด้วยนะครับ
ใครเข้าใจว่ามันทำงานอย่างไง บอกหน่อยครับ
mysql> SELECT * FROM offenceTeamN;
+----------+-------------+------------+------------+
| teamName | goalShooter | goalAttack | wingAttack |
+----------+-------------+------------+------------+
| A | 101 | 102 | 103 |
+----------+-------------+------------+------------+
1 row in set (0.00 sec)
mysql> UPDATE offenceTeamN
-> SET goalShooter = goalShooter+wingAttack
-> , wingAttack = goalShooter-wingAttack
-> , goalShooter = goalShooter-wingAttack;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql>
mysql> SELECT * FROM offenceTeamN;
+----------+-------------+------------+------------+
| teamName | goalShooter | goalAttack | wingAttack |
+----------+-------------+------------+------------+
| A | 103 | 102 | 101 |
+----------+-------------+------------+------------+
1 row in set (0.00 sec)Tag : MySQL, Ms SQL Server 2005, Web (ASP.NET)
Date :
2010-08-19 13:44:47
By :
superpheak
View :
3020
Reply :
2
ถามหรือว่าอะไรครับ
Date :
2010-08-19 17:39:49
By :
webmaster
ไม่รู้ว่าผมอ่านไม่รู้เรื่อง
หรือ จขกท เค้าอธิบายละเอียดไป
ประวัติการแก้ไข 2010-08-19 19:54:05
Date :
2010-08-19 19:52:02
By :
3rds
Load balance : Server 05