วันอาทิตย์ที่ 1 กุมภาพันธ์ พ.ศ. 2558

คำสั่ง SQL SQL Query


SQL Query

หัวข้อสรุป SQL Query ครอบคลุมรายละเอียดการสร้างประโยคคำสั่ง SELECT ในการประยุกต์ต่างๆ ประโยคคำสั่ง SELECT เป็นแกนการทำงานของภาษา SQL และเหมือนกับคำสั่ง SQL ส่วนใหญ่ ประโยคคำสั่ง SELECT มีตัวเลือกในการเขียนคำสั่ง ซึ่งมีประโยชน์มากเมื่อนำตัวเลือกต่างในการสร้าง SQL query ( ด้วยประโยคคำสั่ง SELECT) รวมทั้งสามารถสร้างชุดคำสั่งได้มีประสิทธิภาพ หรือมากกว่า สรุป

1. SELECT Statement

ประโยคคำสั่ง SELECT ได้รับการนำไปใช้ในการค้นหาข้อมูลในฐานข้อมูล และดึงข้อมูลที่เลือกตรงตามเกณฑ์ที่กำหนด
ประโยคคำสั่ง SELECT มี 5 clause ให้เลือกใช้ แต่มีเฉพาะ FROM เป็น clause บังคับ แต่ละ clause มีตัวเลือก พารามิเตอร์ เป็นต้น ให้เลือก

ไวยากรณ์

ประโยคคำสั่ง SELECT
SELECT [ALL | DISTINCT] column1[,column2]
FROM table1[,table2]
[WHERE conditions ]
[GROUP BY column-list ]
[HAVING conditions ]
[ORDER BY column-list   [ASC | DESC] ];
[ ] ตัวเลือก

ตัวอย่าง

SELECT name, age, salary
FROM employee
WHERE age > 50;
ประโยคคำสั่งนี้จะเลือกค่าทั้งหมดในคอลัมน์ name, age และ salary จาก table “employee ที่ age มีค่ามากกว่า 50
NOTE: ต้องมีเครื่องหมาย semicolon(;) ปิดท้ายประโยค เพื่อชี้ว่าประโยคคำสั่ง SQL จบสมบูรณ์และพร้อมที่จะแปล

เครื่องหมายเปรียบเทียบ (comparison operator)

=เท่ากับ
>มากกว่า
<น้อยกว่า
>=มากกว่า หรือเท่ากับ
<=น้อยกว่า หรือเท่ากับ
<> หรือ !=ไม่เท่ากับ

เครื่องหมายเปรียบเทียบอื่นๆ

LIKEทดสอบเปรียบเทียบข้อความ
NOT LIKEหาค่าที่อยู่นอกเหนือจาก LIKE
NULLทดสอบเปรียบเทียบค่าว่าง
NOT NULLทดสอบเปรียบเทียบค่าที่ไม่ใช่ค่าว่าง

ตัวอย่าง

SELECT name, title, dept
FROM employee
WHERE title LIKE 'Pro%';
ประโยคคำสั่งข้างบนจะเลือก แถว/ค่า ในคอลัมน์ name, title และ dept จาก table “employee” ที่มี title เริ่มต้นด้วย ‘Pro’ ซึ่งจะส่งตำแหน่งงานของ Programmer หรือตำแหน่งอื่นที่ขึ้นต้นด้วย Pro ออกมา

ตัวอย่าง

SELECT name, title, dept
FROM employee
WHERE title = NULL;
ประโยคคำสั่งข้างบนจะเลือก แถว/ค่า ในคอลัมน์ name, title และ dept จาก table “employee” ที่มี title ไม่ใช่ค่าว่าง
ALL และ DISTINCT เป็นคีย์เวิร์ดที่ใช้ในการควบคุมเลือกข้อมูลให้แสดง ทั้งหมด (ALL) หรือเฉพาะเรคคอร์ดแบบไม่ซ้ำ (DISTINCT) ในคิวรี่ ถ้าต้องการดึงเฉพาะเรคคอร์ดในคอลัมน์ที่ระบุแบบไม่ซ้ำให้ใช้คีย์เวิร์ด DISTINCT โดย DISTINCT จะคัดเรคคอร์ดซ้ำออกไปสำหรับคอลัมน์ที่ระบุ หลังจากประโยคคำสั่ง

ตัวอย่าง

SELECT DISTINCT age
FROM employee;
ประโยคคำสั่งนี้ส่งออกค่า age ที่ไม่ซ้ำกันจาก table “employee”]

2. GROUP BY

ไวยากรณ์

GROUP BY clause
SELECT column1, SUM(column2 )
FROM list-of-tables
GROUP BY column-list ;
GROUP BY clause ใช้หาผลรวมของคอลัมน์จากแถวในคอลัมน์ที่ระบุ และทำงานร่วมกับ aggregate function ที่ทำงานกับคอลัมน์ 1 คอลัมน์หรือมากกว่า เพื่อหาผลรวมของกลุ่มของแถวข้อมูล
SELECT max(salary), dept
FROM employee
GROUP BY dept;
ประโยคคำสั่งนี้จะเลือกค่า salary มากที่สุด ในแต่ละฝ่าย

ตัวอย่าง

การจัดกลุ่มภายในคอลัมน์ เช่น table ‘item_order’ มีคอลัมน์ quantity ที่เก็บค่า 1, 2, 3 และอื่นๆ โดยต้องการหาค่าราคาสูงสุดของละค่าใน quantity สามารถเขียนคำสั่งได้ดังนี้
SELECT quantity, max(price)
FROM items_ordered
GROUP BY quantity;

3. HAVING

ไวยากรณ์

HAVING clause
SELECT column1, SUM(column2 )
FROM list-of-tables
GROUP BY column-list
HAVING condition ;
HAVING clause ยินยอมให้ระบุเงื่อนไขบนแถวของแต่ละกลุ่ม หรือสามารถเลือกแถวตามเงื่อนไขที่ระบุ HAVING clause ควรตามหลัง GROUP BY clause

ตัวอย่าง

สมมติให้ table “employee” มีคอลัมน์เก็บข้อมูล ชื่อ (name), ฝ่าย (dept), เงินเดือน (salary) และ อายุ (age) ถ้าต้องการเลือกค่าเฉลี่ยเงินเดือนของพนักงานในแต่ละฝ่าย สามารถใช้คำสั่งนี้
SELECT dept, avg(salary)
FROM employee
GROUP BY dept;

ตัวอย่าง

ถ้าต้องการคำนวณและแสดงข้อมูลเฉพาะค่าเฉลี่ยของพนักงาน ที่มีเงินเดือนมากกว่า 20,000
SELECT dept, avg(salary)
FROM employee
GROUP BY dept
HAVING avg(salary) > 20000;

4. ORDER BY

ไวยากรณ์

ORDER BY clause
SELECT column1, SUM(column2 )
FROM list-of-tables
ORDER BY olumn-list  [ASC | DESC];
[ ] ตัวเลือก
ORDER BY clause เป็น clause ตัวเลือกซึ่งยินยอมให้แสดงผลลัพธ์ของคิวรี่ที่เรียงลำดับ (ทั้งเรียงลำดับจากน้อยไปมาก หรือ จากมากไปน้อย) ตามคอลัมน์ที่ระบุให้เรียงลำดับ
ASC = Ascending order (เรียงลำดับจากน้อยไปมาก) - เป็นค่าเริ่มต้น
DESC = Descending order (เรียงลำดับจากมากไปน้อย)
ตัวอย่าง
SELECT employee_id, dept, name, age, salary
FROM employee
WHERE dept = 'Sales'
ORDER BY salary;
ประโยคคำสั่งนี้จะเลือก employee_id, dept, name, age และ salary จาก table “employee” ที่ค่า dept เท่ากับ ‘Sales’ และแสดงผลลัพธ์ในลำดับจากน้อยไปมากตาม salary
ถ้าต้องการเรียงลำดับแบบหลายคอลัมน์ ต้องแยกคอลัมน์ด้วยเครื่องหมายจุลภาค
SELECT employee_id, dept, name, age, salary
FROM employee
WHERE dept = 'Sales'
ORDER BY salary, age DESC;

5. การรวมเงื่อนไข และ Boolean Operator

AND operator

AND operator ใช้เชื่อม 2 เงื่อนไข หรือมากกว่าและแสดงผลลัพธ์เฉพาะที่สอดคล้องกับเงื่อนไขที่กำหนดทั้งหมด

ไวยากรณ์

AND operator
SELECT column1, SUM(column2 )
FROM list-of-tables
WHERE condition1  AND condition2 ;
AND สามารถใช้เชื่อมเงื่อนไขใน WHERE clause ตั้งแต่ 2 เงื่อนไขขึ้นไป โดยการแสดงแถวข้อมูลตามเงื่อนไขต้องเป็นจริงทุกค่า

ตัวอย่าง

SELECT employee_id, name, title, salary
FROM employee
WHERE salary >= 50000.00 AND title = 'Programmer';
ประโยคคำสั่งนี้แสดงข้อมูล employee_id, name, title และ salary จาก table “employee” ที่เงินเดือน (salary) มากกว่าหรือเท่ากับ 50,000 และ ตำแหน่ง (title) เท่ากับ Programmer’ ซึ่งข้อมูลสามารถแสดงออกมา เมื่อเงื่อนไขทั้งสองเป็นจริง ถ้าเงื่อนไขใดเงื่อนไขหนึ่งเป็นจริงจะไม่แสดงออกมา

OR operator

OR operator ใช้เชื่อม 2 เงื่อนไข หรือมากกว่าและแสดงผลลัพธ์เมื่อข้อมูลสอดคล้องกับเงื่อนไขใดเงื่อนไขจากเงื่อนไขที่กำหนดทั้งหมด

ไวยากรณ์

OR operator
SELECT column1, SUM(column2 )
FROM list-of-tables
WHERE condition1  OR condition2 ;
OR สามารถใช้เชื่อมเงื่อนไขใน WHERE clause ตั้งแต่ 2 เงื่อนไขขึ้นไป โดยสามารถแสดงแถวข้อมูล เมื่อข้อมูลมีเงื่อนไขใดเงื่อนไขหนึ่งเป็นจริง หรือทุกเงื่อนไขเป็นจริง

ตัวอย่าง

SELECT employee_id, name, title, salary
FROM employee
WHERE (title = 'Sales') OR (title = 'Programmer');
ประโยคคำสั่งนี้จะเลือก employee_id, name, title และ salary จาก table “employee” โดยตำแหน่ง (title) เท่ากับ ‘Sales’ หรือตำแหน่ง เท่ากับ ‘Programmer’
หมายเหตุ การเขียนเงื่อนไขในวงเล็บช่วยให้การอ่านคำสั่งง่ายขึ้น

6. IN และ BETWEEN

IN และ BETWEEN ใช้กับการกำหนดหลายเงื่อนไขได้ดี

IN

ไวยากรณ์

IN conditional operator
SELECT column1, SUM(column2 )
FROM list-of-tables
WHERE column3  IN (list-of-values );
IN เป็น operator ที่ใช้ทดสอบข้อมูลกับชุดของสมาชิก โดยทดสอบว่าค่าในคอลัมน์ (ที่ระบุก่อนคีย์เวิร์ด IN) อยู่ในรายการของค่าที่กำหนดให้หลังคีย์เวิร์ด IN

ตัวอย่าง

SELECT employee_id, name, salary
FROM employee
WHERE name IN ('Somchai', 'Sompong', 'Wanchai', 'Pornchai');
ประโยคคำสั่งนี้แสดงข้อมูล employee_id, name และ salary จาก table “employee” เฉพาะชื่อ (name) เป็นชื่อใดชื่อหนึ่งของ 'Somchai', 'Sompong', 'Wanchai', 'Pornchai' ผลลัพธ์แสดงแถวข้อมูลจากการส่งออกค่าใดค่าหนึ่งในค่าเหล่านี้
IN สามารถเขียนในรูปของ OR ได้ดังนี้
SELECT employee_id, name, salary
FROM employee
WHERE (name = 'Somchai') OR (name = 'Sompong ') OR (name = ' Wanchai') OR (name = 'Pornchai');
NOT IN สามารถใช้ดึงข้อมูลที่ภายนอกค่าของ IN
SELECT employee_id, name, salary
FROM employee
WHERE name NOT IN ('Somchai', 'Sompong', 'Wanchai', 'Pornchai');

BETWEEN

ไวยากรณ์

BETWEEN conditional operator
SELECT column1, SUM(column2 )
FROM list-of-tables
WHERE column3  BETWEEN value1  AND value2 ;
BETWEEN ใช้ทอสอบค่า (ที่ระบุก่อนคีย์เวิร์ด BETWEEN) อยู่ภายในช่วงของค่า 2 ค่าที่ระบุหลังคีย์เวิร์ด BETWEEN

ตัวอย่าง

SELECT employee_id, age, name, salary
FROM employee
WHERE age BETWEEN 30 AND 40;
ประโยคคำสั่งนี้เลือก employee_id, age, name และ salary จาก table “employee” ที่ age อยู่ระหว่าง 30 ถึง 40
เขียนประโยคคำสั่งใหม่โดยไม่ใช่ BETWEEN
SELECT employee_id, age, name, salary
FROM employee
WHERE age >= 30 AND age <= 40;
NOT BETWEEN สามารถใช้ดึงข้อมูลที่ภายนอกค่าของ BETWEEN
SELECT employee_id, age, name, salary
FROM employee
WHERE age NOT BETWEEN 30 AND 40;

7. Function

ฟังก์ชันที่ทำงานกับข้อมูลของแต่ละแถว เป็นฟังก์ชันที่สามารถทำงานใช้ประโยชน์ได้ดี แต่ไม่อยู่ในมาตรฐาน ANSI SQL-92 ซึ่งฟังก์ชันเหล่านี้อาจจะมีให้หรือไม่มีให้ขึ้นระบบฐานข้อมูลที่ใช้ ฐานข้อมูลหลักส่วนใหญ่มีให้ใช้

ฟังก์ชัน String

LEFT(<string>,x)ส่งออกตัวอักษรซ้ายสุด x ตัวอักษรของข้อความ เช่น LEFT(‘America’,2) = Am
RIGHT(<string>,x)ส่งออกตัวอักษรขวาสุด x ตัวอักษรของข้อความ เช่น RIGHT(‘America’,2) = ca
UPPER(<string>)แปลงข้อความทั้งหมดให้เป็นตัวอักษรใหญ่ เช่น UPPER(‘america’) = AMERICA
LOWER(<string>)แปลงข้อความทั้งหมดให้เป็นตัวอักษรเล็ก เช่น LOWER(‘AMERICA’)=america
INITCAP(<string>)แปลงข้อความทั้งหมดให้ขึ้นต้นด้วยอักษรตัวใหญ่ เช่น INITCAP(‘america’) = America
LENGTH(<string>)ส่งออกตัวอักษรในข้อความ เช่น LENGTH (‘America’) = 7
<string>||<string>ต่อ 2 ข้อความเป็นข้อความเดียวกัน (concatenated)
SUBSTR(<string>,x,y)ดึงตัวอักษรตั้งแต่ตำแหน่งที่ x จำนวน y ตัวอักษร เช่น SUBSTR(‘ABCDEF’, 3,3) = CDE
NVL(<column>, <value>)ฟังก์ชันที่ใช้เปลี่ยนค่า Null ในคอลัมน์ column ที่ระบุเป็นค่าใหม่ตาม value เช่น NVL(salary,0) หมายถึง ค่าที่เป็น Null ในคอลัมน์ salary ให้เปลี่ยนเป็น ศูนย์

ฟังก์ชันคณิตศาสตร์

ABS(x)ส่งออกค่าสัมบูรณ์ของ x
SIGN(x)ส่งออกค่าเครื่องหมายของ x เป็น -1, 0, or 1 (ค่าลบ, ศูนย์ หรือค่าบวก)
MOD(x,y)modulo - ส่งออกค่าจำนวนเต็มของการหาร x ด้วย y (เหมือนกับ x%y)
FLOOR(x)ส่งออกค่าจำนวนเต็มใหญ่ที่สุดที่น้อยกว่าหรือเท่ากับ x
CEILING(x) or CEIL(x)ส่งออกค่าจำนวนเต็มเล็กที่สุดที่มากกว่าหรือเท่ากับ x
POWER(x,y)ส่งออกค่าของ x ยกกำลัง y
ROUND(x)ส่งออกค่าที่ปรับเป็นจำนวนเต็มที่ใกล้ที่สุดของ x
ROUND(x,d)ส่งออกค่าที่ปรับตามจำนวนตำแหน่งทศนิยมที่ระบุด้วยค่า d
SQRT(x)ส่งออกค่ารากที่ 2 ของ x
  

ตัวอย่าง

SELECT round(salary), name
FROM employee;
ประโยคคำสั่งนี้ปรับค่า salary ให้เป็นจำนวนเต็มที่ใกล้ที่สุด และ name จาก table “employee”

Mathematical Operators

ตามมาตรฐาน ANSI SQL-92 สนับสนุน arithmetic operators 4 ตัวแรก

+การบวก
-การลบ
*การคูณ
/การหาร
%modulo
  

modulo ใช้หาค่าจำนวนเต็มจากการหาร โดย modulo ไม่สนับสนุนมาตรฐาน ANSI SQL แต่ฐานข้อมูลส่วนใหญ่สนับสนุน

8. Aggregate Function

Aggregate function ในคำสั่ง SQL ได้แก่

MINส่งออกค่าน้อยที่สุดของคอลัมน์ที่กำหนด
MAXส่งออกค่ามากที่สุดของคอลัมน์ที่กำหนด
SUMส่งออกผลรวมค่าตัวเลขของคอลัมน์ที่กำหนด
AVGส่งออกค่าเฉลี่ยของคอลัมน์ที่กำหนด
COUNTส่งออกผลรวมจำนวนของค่าของคอลัมน์ที่กำหนด
COUNT(*)ส่งออกจำนวนแถวใน table

aggregate function ใช้คำนวณเทียบกับการส่งออกคอลัมน์ของข้อมูลตัวเลขจากประโยคคำสั่ง SELECT ฟังก์ชันกลุ่มนี้ใช้หาผลรวมพื้นฐานของคอลัมน์ที่เจาะจงจากข้อมูลที่เลือกมา การทำงานของฟังก์ชันต้องใช้ GROUP BY clause เพื่อครอบคลุมการทำงาน แต่ฟังก์ชันสามารถใช้ได้โดยไม่มี GROUP BY clause

ตัวอย่าง

SELECT AVG(salary)
FROM employee;
ประโยคคำสั่งจะส่งออกผลลัพธ์ที่เก็บค่าเฉลี่ยของทุกข้อมูลที่ส่งออกมาในคอลัมน์ salary จาก table “employee”

ตัวอย่าง

SELECT AVG(salary)
FROM employee;
WHERE title = 'Programmer';
ประโยคคำสั่งจะส่งออกผลลัพธ์ที่เก็บค่าเฉลี่ยเงินเดือน (salary) ของพนักงานที่มีตำแหน่ง (title) เป็น ‘Programmer’

ตัวอย่าง

SELECT Count(*)
FROM employee;
ประโยคคำสั่งนี้แตกต่างจากฟังก์ชันอื่น เพราะไม่ต้องระบุคอลัมน์ให้ฟังก์ชัน COUNT(*) ผลลัพธ์ของคำสั่ง คือ การส่งออกจำนวนแถวใน table “employee”

9. JOIN

การค้นหาและเลือกข้อมูลตามหัวข้อที่ผ่านมาเป็นการทำงานกับ table เดียว ในขณะที่การทำงานจริงต้องมีการเลือกข้อมูลจากหลาย table เพื่อแสดงสารสนเทศที่ต้องการได้ เนื่องจากหลักการพื้นฐานของ Relational Database System ให้ออกแบบการจัดเก็บข้อมูลในแต่ละ table สำหรับ entity เดียว เพื่อขจัดการเก็บข้อมูลที่ซ้ำซ้อน แล้วใช้ความสัมพันธ์ของ table แสดงผลเป็นสารสนเทศที่ต้องการ
JOIN สามารถรับรู้ในประโยคคำสั่ง SQL ถ้ามี table มากกว่า 1 table หลังคีย์เวิร์ด FROM

ไวยากรณ์

SELECT list-of-columns
FROM table1,table2,..
WHERE search-condition1 = search-condition2, ..
สมมติว่า ในการเก็บข้อมูลการซื้อสินค้า ประกอบด้วย 3 table คือ
1. customer_info เก็บรายละเอียดของลูกค้า
2. purchase_order เก็บรายละเอียดรายการสั่งซื้อ
”customer_info”

customer_numberfirstnamelastnameaddresscityprovincezip
       

”purchases”

customer_numberbuydateitemquantityprice
     

Key

ในการเชื่อม table ของ SQL มีส่วนสำคัญที่เกี่ยวข้อง คือ Key ซึ่งมีแนวคิด ดังนี้
primary key เป็นคอลัมน์หรือชุดของคอลัมน์ที่ระบุแบบไม่ซ้ำ ตัวอย่างเช่น table “customer_info” มีคอลัมน์ customer_number เป็นคอลัมน์ที่ระบุแบบไม่ซ้ำของ ซึ่งมีความหมาย 2 อย่าง คือ ประการแรก ไม่มีข้อมูล 2 แถวสามารถมี customer_number เดียวกัน ถึงแม้ว่า 2 customer_number มีชื่อแรกและชื่อหลังเหมือนกัน ประการที่ 2 คอลัมน์ customer_number ทำให้มั่นใจว่าลูกค้า 2 รายนี้ไม่มีความสับสนต่อกัน เพราะการค้นหาข้อมูลใช้คอลัมน์ customer_number แทนการใช้ชื่อ
foreign key เป็นคอลัมน์ใน table ที่ primary key อยู่ table อื่น ซึ่งหมายความว่า ข้อมูลในคอลัมน์ foreign key ต้องตรงกับข้อมูลของ primary key ใน table อื่น ใน RDBMS ข้อมูลที่ตรงกัน รู้จักในฐานะ Reference Integrity ตัวอย่างเช่น table “purchases” มีคอลัมน์ customer_number เป็น foreign key โดยมี primary key อยู่ใน table “customer_info”
JOIN ที่กล่าวถึงนี้ เป็น INNER JOIN ซึ่งเป็นประเภทการเชื่อมปกติ

ตัวอย่าง

SELECT customer_info.firstname, customer_info.lastname, purchases.item
FROM customer_info, purchases
WHERE customer_info.customer_number = purchases.customer_number;
ประโยคคำสั่งนี้ แสดงผลลัพธ์ของคอลัมน์ firstname และ lastname จาก table “customer_info” และคอลัมน์ item จาก table “purchases” โดยเชื่อมระหว่าง table ด้วยคอลัมน์ customer_number ของ 2 table
Notice: แต่ละคอลัมน์นำหน้าด้วย ชื่อ table และจุด ซึ่งไม่มีความจำเป็นในทุกกรณี แต่จำเป็นถ้าคอลัมน์ที่เรียกมีอยู่ใน 2 table การเขียนด้วยรูปแบบนี้เป็นแบบแผนการเขียนที่ดีในการป้องกันความสับสนในเรื่องที่มาของคอลัมน์และ table
การเขียนคำสั่งตามมาตรฐานไวยากรณ์ ANSI SQL-92
SELECT customer_info.firstname, customer_info.lastname, purchases.item
FROM customer_info INNER JOIN purchases
ON customer_info.customer_number = purchases.customer_number;

ตัวอย่าง

SELECT employee.employee_id, employee.lastname, employee_sales.comission
FROM employee, employee_sales
WHERE employee.employeeid = employee_sales.employeeid;
ประโยคคำสั่งนี้เลือก employee_id และ lastname จาก table “employee” และ comission จาก table “employee_sales” สำหรับทุกแถวที่ employee_id ใน table “employee” ตรงกับ employee_id ใน table “employee_sales”

10. OUTER JOIN

OUTER JOIN เป็นการเชื่อม table ที่ต้องการแสดงข้อมูลจาก table นั้น โดยค่าที่ใช้เชื่อมไม่จำเป็นต้องมีค่าเท่ากับอีก table หนึ่ง การเขียนคำสั่งให้ใช้ (+) หน้าข้อมูลที่ต้องการแสดงรายการออกมา และจะแสดงค่าว่างสำหรับกรณีที่ไม่มีข้อมูล
SELECT cloumn1, column2,..
FROM table1, table2
WHERE table1.column1 (+) = table2.column2;
NOTE: เป็นการแสดงข้อมูลทั้งหมดของ table2
ตัวอย่าง สมมติมี 2 table คือ Employee และ Department

“Employee”

NameDept
110
210
320
420
530

“Department”

Dept
10
20
30
40

ในฐานข้อมูล Oracle สามารถเขียนได้ดังนี้
SELECT E.Name, D.Dept
FROM Employee E, Department D
WHERE E.Dept (+) = D.Dept;

ผลลัพธ์

NameDept
110
210
320
420
530
 40

Microsoft มีมาตรฐานการเขียน OUTER JOIN ซึ่งสามารถใช้กับ Microsoft Access, Visual Basic เป็นต้น
LEFT JOIN ใช้สำหรับการแสดงเรคคอร์ดของ table แรกทั้งหมดถึงแม้จะมีเรคคอร์ดของ table แรกมีค่าของฟิลด์ที่ไม่ตรงกับฟิลด์เชื่อมของ table ที่สอง
ไวยากรณ์ OUTER JOIN 1 สำหรับการเชื่อมตาม ด้านซ้ายของความสัมพันธ์
SELECT list-of-columns
FROM table1,table2,..
LEFT JOIN table1 ON table1.column1 = table2.column2
RIGHT JOIN ใช้สำหรับการแสดงเรคคอร์ดของ table ที่สองทั้งหมด ถึงแม้ว่าจะมีเรคคอร์ดของ table ที่สองมีค่าของฟิลด์ที่ไม่ตรงกับฟิลด์เชื่อมของ table แรก
ไวยากรณ์ OUTER JOIN 2 สำหรับการเชื่อมตาม ด้านขวาของความสัมพันธ์
SELECT list-of-columns
FROM table1,table2,..
RIGHT JOIN table2 ON table1.column1 = table2.column2
จากตัวอย่าง ฐานข้อมูล Access สามารถเขียนได้ดังนี้
SELECT Employee.Name, Department.Dept
FROM Department LEFT JOIN Employee ON Department.Dept = Employee.Dept;

11. Sub Query และ UNION

Sub Queries

คิวรี่ย่อย (sub queries) หมายถึง การสร้างประโยคคำสั่ง SELECT ภายในอีก ประโยคคำสั่ง SELECT หนึ่ง ซึ่งมักจะใช้ใน WHERE clause เช่น การเลือกลูกค้าที่ซื้อสินค้าแพงกว่าค่าเฉลี่ย 100
SELECT customer_number
FROM purchases
WHERE price >(SELECT avg(price) + 100 FROM purchases);
คิวรี่ย่อยคำนวณค่าเฉลี่ยของ price แล้วบวก 100 และใช้เป็นค่าอ้างอิง โดยการแสดง customer_number ที่มีค่า price มากกว่าค่าคำนวณจากคิวรี่ย่อย

UNION

UNION เป็นการนำหลายคิวรี่ ให้มาแสดงผลเป็นคิวรี่เดียวที่ใช้คอลัมน์ร่วมกัน
SELECT list-of-column FROM table1
UNION
SELECT list-of-column FROM table2
. . .
UNION
SELECT list-of-column FROM tablen
[ORDER BY columnname];

ตัวอย่าง

SELECT name, phone FROM employee
UNION SELECT lastname, phone FROM customer_info;
ประโยคคำสั่งนี้เลือก name, phone จาก table “employyee” และ lastname, phone จาก table “customer_info” เพื่อแสดงผลคอลัมน์ name เป็นรายชื่อของพนักงานและลูกค้า ส่วนคอลัมน์ phone แสดงหมายเลขโทรศัพท์ของพนักงานและลูกค้า

12. สรุป

สรุปคำสั่ง SQL

ในส่วนการสรุปรูปแบบทั่วไปของประโยคคำสั่ง SQL แต่ระบบฐานข้อมูลแต่ละระบบอาจจะสนับสนุนหรือไม่สนับสนุนต้องดูคู่มือของ่ระบบฐานข้อมูลนั้นประกอบด้วย
ALTER TABLE tablename [ADD| DROP| MODIFY] columnname; (ดูเพิ่มเติม1, ดูเพิ่มเติม2 ) ใช้สำหรับการเพิ่ม, แก้ไข หรือลบ คอลัมน์ของ table และเปลี่ยนข้อความ เช่น ประเภทข้อมูล ของคอลัมน์ที่มีอยู่ การเลือก ADD, DROP หรือ MODIFY เลือกได้อย่างเดียว
COMMIT; (ดูเพิ่มเติม) บันทึกการเปลี่ยนแปลงเข้าสู่ฐานข้อมูล
CREATE [UNIQUE] INDEX indexname
ON tablename (columnname); (ดูเพิ่มเติม1, ดูเพิ่มเติม2 ) UNIQUE เป็นตัวเลือกการสร้างดัชนีแบบไม่ซ้ำ
CREATE TABLE tablename
(columnname1 datatype [size] [constraint], columnname2 datatype [size] [constraint], . .); (ดูเพิ่มเติม1, ดูเพิ่มเติม2) เป็นคำสั่งสร้าง table การกำหนด size ขึ้นกับประเภทข้อมูล constraint ที่สามารถกำหนดได้ คือ NULL หรือ NOT NULL, UNIQUE (บังคับให้ค่าไม่ซ้ำ), PRIMARY KEY (ระบุ primary key ของ table), CHECK (การยอมให้ตรวจสอบข้อมูลที่มีการเปลี่ยนแปลง), DEFULT (ให้แทรกค่าเมื่อมีการเพิ่มแถวข้อมูล), FOREIGN KEY (กำหนด foreign key ของ table)
CREATE VIEW tablename AS select statement; (ดูเพิ่มเติม) สร้าง view
DELETE FROM tablename WHERE condition; (ดูเพิ่มเติม) ลบข้อมูล
INSERT INTO tablename (column1, column2,..)
VALUES (value1, value2,..); (ดูเพิ่มเติม)
ROLLBACK;(ดูเพิ่มเติม) เรียกข้อมูลเดิมกลับมา จากการเปลี่ยนแปลงข้อมูลที่เกิดขึ้น โดยสามารถเรียกกลับจาก COMMIT ครั้งสุดท้าย
SELECT [ALL | DISTINCT] column1[,column2]
FROM table1[,table2]
[WHERE conditions]
[GROUP BY column-list]
[HAVING conditions]
[ORDER BY column-list [ASC | DESC] ]; (ดูเพิ่มเติม) โดย ASC | DESC ให้เลือกวิธีเรียงลำดับข้อมูล
UPDATE tablename
SET column1 = value1, column2 = value2, ..
[WHERE condition]; (ดูเพิ่มเติม) ถ้าไม่มี WHERE clause จะเปลี่ยนค่าตามที่กำหนดทั้งหมด

ตัวอย่างคำสั่ง SQL ใน Visual Basic

คำสั่ง Select

คำสั่ง Select ใช้เป็นประโยคคำสั่งในการส่งออกเรคคอร์ด ตามเกณฑ์ในการเลือก
ไวยากรณ์
SELECT fieldname1, fieldname2,...
FROM tablename1, tablename2,...
[Where Condition]
[Group By]
[Having]
[Order By];
[ ] – ตัวเลือก
แสดงทุกฟิลด์และทุกเรคคอร์ด ใน table เดียว เช่นการข้อทั้งหมดใน table ชื่อ publishers
SELECT * FROM Publishers ;
แสดงบางฟิลด์ ซึ่งชื่อฟิลด์ ที่มีเครื่องหมายพิเศษ หรือมีการเว้นวรรคให้อยู่ในวงเว็บก้ามปู [ ]
SELECT PubID, [Company Name], Address FROM Publishers;
แสดงฟิลด์ที่เป็น expression และตั้งชื่อใหม่ (ให้ใช้ As)
SELECT Author, 2000 - [Year Born] As Age FROM Authors;
การใช้ฟังก์ชัน aggregate
SELECT COUNT ([Year Born]) FROM Authors;
การเลือกเฉพาะเรคคอร์ด ที่ต้องการด้วย WHERE clause
SELECT Name, City FROM Publishers WHERE State = ‘CA’;
การเลือกเฉพาะเรคคอร์ดด้วย WHERE Clause หลายเงื่อนไขต้องเชื่อมด้วย AND หรือ OR เช่น state เป็น CA และ Name ขึ้นต้นด้วย M
SELECT * FROM Publishers WHERE State = ‘CA’ AND name LIKE ‘m%’;

การเรียงและจัดกลุ่ม

การเรียงใช้ ORDER BY clause
SELECT * FROM Publishers ORDER BY [Company Name] ;
การเรียงจากน้อยไปมากให้ใช้คีย์เวิร์ด DESC ต่อท้ายฟิลด์ต้องการเรียงจากน้อยไปมาก
SELECT * FROM Publishers ORDER BY State, City DESC;
การจัดกลุ่มใช้ GROUP BY Clause
SELECT [Year Published], Count (*) As Title In Year FROM Titles
GROUP BY [Year Published];
ให้แสดงจำนวนหนังสือใน 10 ปีสุดท้าย
SELECT TOP 10 [Year Published], COUNT (*) As Title In Year FROM Titles
GROUP BY [Year Published] ORDER BY [Year Published] DESC;
การคัดเลือกด้วยเขื่อนไขของ HAVING Clause เช่น แสดงเฉพาะที่มีจำนวนหนังสือมากกว่า 50
SELECT [Year Published], COUNT (*) As Title In Year FROM Titles
GROUP BY [Year Published] HAVING COUNT ((*) >50);

คิวรี่ย่อย

คิวรี่ย่อย เป็นการใช้ประโยคคำสั่ง Select ภายในประโยคคำสั่ง Select อีกคำสั่งสำหรับการค้นหาที่ซับซ้อน
SELECT * FROM Title WHERE Pub ID =
(SELECT pubID FROM Publishers WHERE Name = ‘MACMILLIAN’);

JOIN

JOIN ใช้สำหรับการดึงข้อมูลจาก 2 table ที่สัมพันธ์กับผ่านฟิลด์ร่วม ถ้าแถวของ table แรกแสดงตามฟิลด์ของ table ที่สอง ให้ใช้ ON clause ในคำสั่ง JOIN
SELECT Title.Title, Titles. [Year Published], Publishers.Name FROM Titles
INNER JOIN Publishers ON Titles.PubID = Publishers.PubID
การใช้ไวยากรณ์ tablename.fieldname เช่น Titles.PubID เมื่อชื่อฟิลด์มีอยู่ใน 2 table ที่เชื่อมกัน
นอกจากมี LEFT JOIN สำหรับการแสดงเรคคอร์ดของ table แรกทั้งหมดถึงแม้จะมีเรคคอร์ดของ table แรกมีค่าของฟิลด์ที่ไม่ตรงกับฟิลด์เชื่อมของ table ที่สอง
SELECT Titles.Title, Titles.[Year Published], Publishers.Name FROM Titles
LEFT JOIN Publishers ON Titles.PubID = Publishers.PubID;
RIGHT JOIN สำหรับการแสดงเรคคอร์ดของ table ที่สองทั้งหมด ถึงแม้ว่าจะมีเรคคอร์ดของ table ที่สองมีค่าของฟิลด์ที่ไม่ตรงกับฟิลด์เชื่อมของ table แรก

UNION

การนำ table 2 ต่อกัน สามารถทำได้โดยใช้คีย์เวิร์ด UNION
SELECT Name, Address, City FROM Customers
UNION SELECT CompanyName, Address, City FROM Suppliers

คำสั่ง Insert Into

คำสั่ง INERT INTO ใช้ในประโยคคำสั่งสำหรับการเพิ่มเรคคอร์ดใหม่
ไวยากรณ์
INERT INTO tablename [(fieldname1, fieldname2,...)]
VALUES (value1, value 2,...);
[ ] ตัวเลือก
หมายเหตุจำนวน value ต้องเท่ากับ fieldname
INERT INTO Authors (Author, [Year Born] VALUES (‘Frank Whale’, 1960);

คำสั่ง Update

คำสั่ง UPDATE ใช้ในประโยคคำสั่งสำหรับการปรับปรุงค่าในเรคคอร์ด
ไวยากรณ์
UPDATE tablename
SET fieldname = expression
WHERE [condition];
[ ] ตัวเลือก
UPDATE Authors SET [Year Born] = 1961 WHERE Author = ‘Frank Whale’;











ไม่มีความคิดเห็น:

แสดงความคิดเห็น