SQL คือ Simple Query Language (ย่อมาจาก) แปลตรง ๆ ก็คือ ภาษาพื้นฐานที่ใช้ในการสืบค้นข้อมูลนั่นเอง
SQL Query ส่วนใหญ่แล้วจะมี Syntax ที่คล้าย ๆ แตกต่างกันเพียงรายละเอียดปลีกย่อยเท่านั้น
การที่จะทำความเข้าใจกับ SQL ไม่ใช่เรื่องยาก เพียงแต่จะต้องมีความเข้าใจพื้นฐานสักเล็กน้อย
เกี่ยวกับฐานข้อมูล ซึ่งก็มีมากมายให้เลือกใช้ครับ ตั้งแต่ของฟรีไปยังที่ต้องจ่ายเงิน(มาก)
ตัวอย่าง Free Database ก็เช่น Mysql , SQL Server Express Edition,
ส่วนที่ต้องเสียเงินก็เช่น SQL Server 2005,2008 , Microsoft Access, ORACLE , DB2
คำสั่ง SQL พื้นฐาน
SELECT FROM WHERE ORDER BY
SELECT : คือ "การเลือก" ความหมายก็ตรงตัว
FROM : คือ "จาก"
WHERE : คือ "ที่ตรงตามเงื่อนไข"
ORDER BY : คือ "การเรียงลำดับข้อมูล" ASC (Ascendant) คือจากน้อยไปหามาก , DESC (Descendant) คือ จากมากไปหาน้อย
หากไม่ใส่ ASC / DESC ค่า Default จะเป็น ASC
ดังนั้น SELECT FROM WHERE + ORDER BY ก็คือ การเลือกข้อมูลจากแหล่งข้อมูล (ตาราง / Table,View) ที่ต้องการ
โดยสามารถระบุเงื่อนไขลงไปนั่นเอง
ตัวอย่างเช่น
SELECT * FROM employee ORDER BY emp_id ASC
ก็หมายความว่าเลือกทุกคอลัมน์จากตาราง employee โดยเรียงลำดับด้วยฟิลด์ emp_id จากน้อยไปหามาก
การใช้ WHERE ใน SQL
SELECT * FROM employee
WHERE emp_id ='100234'
หมายความว่า เลือกข้อมูลทุกคอลัมน์จากตาราง employee ที่ค่าในคอลัมน์ emp_id เท่ากับ '100234'
SELECT * FROM employee
WHERE emp_id LIKE '100%'
หมายความว่า เลือกข้อมูลทุกคอลัมน์จากตาราง employee ที่ค่าในคอลัมน์ emp ขึ้นต้นด้วย '100'
ค่าที่เหลือจะเป็นอะไรก็ได้
SELECT emp_id,emp_name,tel_no,salary,(salary *1.1) as new_salary
FROM employee
ORDER BY salary DESC
หมายความว่า เลือกข้อมูล ตาม column ที่ระบุ และมีการคำนวนค่าจาก column เงินเดือนเพิ่มเติม
จากตาราง employee โดยขึ้นเงินเดือน 10% (salary *1.1)
ขอบคุณสำหรับข้อมูลนะค่ะ
ตอบลบยินดีครับ
ตอบลบรบกวนสอบถามค่ะ กรณีที่เราสั่งจ่ายยาในจุดบริการเดียวกัน แต่ยอดไม่รวมกัน ต้องทำยังไงค่ะ
ตอบลบSELECT distinct
ตอบลบitem.item_id,
item.common_name as ชื่อยา,
base_service_point.description as จุดบริการสั่งจ่าย,
order_item.quantity as จำนวนยาที่จ่าย,
base_unit.description_th as หน่วย
FROM
visit,order_item, item, base_unit,base_service_point
WHERE
order_item.item_id = item.item_id
AND order_item.fix_item_type_id = '0'
AND item.common_name like '%Paracetamol .-tab (500 mg.)%'
AND base_service_point.base_service_point_id = order_item.dispense_spid
AND order_item.base_unit_id = base_unit.base_unit_id
AND visit.visit_id = order_item.visit_id
AND order_item.dispense_date BETWEEN '2013-01-01' AND '2013-01-15'
Group By
item.item_id,
item.common_name,
base_service_point.description,
order_item.quantity,
base_unit.description_th
เดี๋ยววันจันทร์ช่วยดูให้ครับ
ตอบลบ-- ข้อแนะนำ
ตอบลบ* กรณีใช้ Aggregate function เช่น Sum,count,min,max,avg ไม่จำเป็นต้องใช้ Distinct อีกครับ เพียงแต่ต้อง Group by field ให้ครบ
* จาก Query เดิม ผมไม่เห็นการใช้ Function sum เลย แต่เห็นมีการใช้ Group by
* ทำไมเก็บข้อมูล Visit_id ใน table order_item ครับ ดูแปลกๆ จริงๆ table order_item ควรเป็น details table ซึ่ง visit_id น่าจะเก็บอยู่อีก Table ที่เป็น header ของ order_item รึป่าว
ลองใช้ Query นี้ดูครับว่าได้ผลแตกต่างจากเดิมหรือไม่
SELECT
i.item_id,
i.common_name as medication_name,
s.description as service_point_name,
SUM(o.quantity) as qty,
u.description_th as unit_name
FROM order_item o INNER JOIN item i ON o.item_id = i.item_id
INNER JOIN base_unit u ON o.base_unit_id = u.base_unit_id
--- No selected field that reference to table visit ?. That's no need to join table visit
--INNER JOIN visit v ON o.visit_id = v.visit_id
INNER JOIN base_service_point s ON o.dispense_spid = s.base_service_point_id
--visit v ,order_item o, item i, base_unit u,base_service_point s
WHERE o..fix_item_type_id = '0'
AND i.common_name like '%Paracetamol .-tab (500 mg.)%'
AND o.dispense_date BETWEEN '2013-01-01' AND '2013-01-15'
-- I'm not sure data type of dispense_date is varchar or date , just test this script to test result na kub
-- AND CONVERT(varchar(8),o.dispense_date,112) BETWEEN '20130101' AND '20130115'
order_item.item_id = item.item_id
Group By
i.item_id,
i.common_name ,
s.description ,
o.quantity ,
u.description_th