วันพฤหัสบดีที่ 18 มีนาคม พ.ศ. 2553

คำสั่ง SQL , SQL Command

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)

6 ความคิดเห็น:

  1. ไม่ระบุชื่อ16 เมษายน 2553 เวลา 10:23

    ขอบคุณสำหรับข้อมูลนะค่ะ

    ตอบลบ
  2. รบกวนสอบถามค่ะ กรณีที่เราสั่งจ่ายยาในจุดบริการเดียวกัน แต่ยอดไม่รวมกัน ต้องทำยังไงค่ะ

    ตอบลบ
  3. 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

    ตอบลบ
  4. เดี๋ยววันจันทร์ช่วยดูให้ครับ

    ตอบลบ
  5. -- ข้อแนะนำ
    * กรณีใช้ 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

    ตอบลบ