สรุปการเปรียบเทียบฐานข้อมูล SQL ชนิดต่างๆ
1.คำสั่ง Join
ทุกฐานข้อมูลสามารถใช้ INNER JOINs ได้ แต่ join types ประเภทอื่นๆ ไม่สามารถใช้ได้ทุกฐานข้อมูลแต่ขึ้นอยู่กับชนิดของฐานข้อมูล
yes = สามารถใช้งานได้
| Join type/feature |
PostgreSQL
|
DB2
|
MSSQL
|
MySQL
|
Oracle
|
Informix
|
| Natural joins (only tested: NATURAL LEFT JOIN) |
yes
|
|
|
yes
|
yes
|
|
| USING-clause |
yes
|
|
|
yes
|
yes
|
|
| FULL joins1 (tested: SELECT…FULL JOIN…ON…=…) |
yes
|
yes
|
yes
|
|
yes
|
yes
|
| Explicit CROSS JOIN (cartesian product) |
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
2. การเรียงลำดับข้อมูล
บางฐานข้อมูลจัดเรียงโดยค่าที่เป็น NULLs ถือว่ามีค่ามากกว่า non-NULL values เช่น PostgreSQL, DB2, Oracle และบางฐานข้อมูลจัดเรียงโดยค่าที่เป็น NULLs ถือว่ามีค่าน้อยกว่า
non-NULL values เช่น MSSQL, MySQL, Informix เป็นต้น
รูปแบบคำสั่ง:
DECLARE cursorname CURSOR FOR
SELECT ... FROM ... WHERE ...
ORDER BY column_name1,column_name2,…
3.การใช้คำสั่ง SELECT
คำสั่ง SELECT ใช้ในการเลือกข้อมูลที่ต้องการ โดยการใช้คำสั่งเพื่อดึงข้อมูลที่เราต้องการออกมานั้นมีรูปแบบคำสั่งมาตรฐานหลายรูปแบบให้เลือกใช้ ขึ้นอยู่กับการสนับสนุนของฐานข้อมูล ซึ่งบางฐานข้อมูลไม่สนับสนุนรูปแบบมาตรฐานใดๆเลยและมีชุดคำสั่งเป็นของตัวเอง แบ่งเป็น 3 แบบ ได้แก่
Simple limit, Top-n, Limit—with offset
3.1 SELECT Simple limit มีคำสั่งมาตรฐาน 3 รูปแบบ ดังนี้
รูปแบบคำสั่ง:
SELECT … FROM … WHERE … ORDER BY … FETCH FIRST n ROWS ONLY
- ใช้ Window function: ใช้ฟังก์ชัน ROW_NUMBER() OVER
รูปแบบคำสั่ง:
SELECT * FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY key ASC) AS rownumber,
columns
FROM tablename
) AS foo
WHERE rownumber <= n
- ใช้ cursor:
- DECLARE cursor-name CURSOR FOR …
- OPEN cursor-name
- FETCH …
- CLOSE cursor-name
3.2 SELECT Top-n หรือ quota-queries มีคำสั่งมาตรฐาน 2 รูปแบบ ดังนี้
- The fast variant: ใช้ window function ชื่อ RANK() OVER
รูปแบบคำสั่ง:
SELECT * FROM (
SELECT
RANK() OVER (ORDER BY age ASC) AS ranking,
person_id,
person_name,
age
FROM person
) AS foo
WHERE ranking <= 3
ในกรณีที่ DBMS ไม่สนับสนุน elementary OLAP features
รูปแบบคำสั่ง:
SELECT * FROM person AS px
WHERE (
SELECT COUNT(*)
FROM person AS py
WHERE py.age < px.age
) < 3
3.3 SELECT Limit—with offset
- ใช้ OFFSET and FETCH FIRST:
รูปแบบคำสั่ง:
SELECT…
FROM …
WHERE …
ORDER BY …
OFFSET skip ROWS
FETCH FIRST n ROWS ONLY
- Using a window function: ใช้ฟังก์ชัน ROW_NUMBER() OVER
รูปแบบคำสั่ง:
SELECT * FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY key ASC) AS rownum,
columns
FROM tablename
) AS foo
WHERE rownum > skip AND rownum <= (n+skip)
รูปแบบคำสั่ง:
-
- DECLARE cursor-name CURSOR FOR …
- OPEN cursor-name
- FETCH RELATIVE number-of-rows-to-skip …
- CLOSE cursor-name
4. การใช้คำสั่ง INSERT
บางฐานข้อมูลสนับสนุนการใช้คำสั่งเพื่อ INSERT ข้อมูลทีละหลายๆแถวได้ เช่น PostgreSQL, DB2, MySQL
รูปแบบคำสั่ง:
INSERT INTO tablename VALUES (0,'foo') , (1,'bar') , (2,'baz');
มีค่าเท่ากับการใช้คำสั่ง
INSERT INTO tablename VALUES (0,'foo');
INSERT INTO tablename VALUES (1,'bar');
INSERT INTO tablename VALUES (2,'baz');
5. ข้อมูลชนิด Boolean
Boolean สามารถมีค่าดังต่อไปนี้
- True
- False
- UNKNOWN หรือ NULL (ถ้าไม่มีข้อจำกัดว่าห้ามมีค่า Null)
โดย True จะมีค่ามากกว่า False บางฐานข้อมูลมีตัวแปรชนิดนี้ และบางฐานข้อมูลไม่มีตัวแปรชนิดนี้ แต่มีการใช้ตัวแปรอื่นเพื่อเก็บค่าเหมือนกับตัวแปร Boolean เช่นในฐานข้อมูล DB2 ใช้ฟิลด์ข้อมูล CHAR(1) เพื่อเก็บค่า 0 กับ 1
6. ข้อมูลชนิด char
บางฐานข้อมูลมีรูปแบบตามมาตรฐานของข้อมูลชนิดนี้ และบางฐานข้อมูลรายละเอียดบางอย่างที่แตกต่างกันออกไป
7.ข้อมูลชนิด TIMESTAMP
มาตรฐานมี 2 แบบ ได้แก่
1. TIMESTAMP เช่น TIMESTAMP '2003-07-29 13:19:30'
2. TIMESTAMP WITH TIME ZONE เช่น TIMESTAMP '2003-07-29 13:19:30+02:00'
บางฐานข้อมูลสนับสนุนทั้ง 2 แบบ และบางฐานข้อมูลสนับสนุน TIMESTAMP เพียงอย่างเดียว เช่น PostgreSQL
8. SQL functions
แต่ละฐานข้อมูลมีรูปแบบการเขียนคำสั่งแตกต่างกันไป โดยอาจยึดตามรูปแบบคำสั่งมาตรฐาน หรือมีความแตกต่างออกไป เช่น อาจมีชื่อคำสั่ง และพารามิเตอร์ที่ต่างกัน เช่น ตัวอย่างคำสั่งคืนค่าความยาวของข้อมูล CHARACTER
ตัวอย่างคำสั่ง รูปแบบมาตรฐาน:
CHARACTER_LENGTH(argument)
ตัวอย่างคำสั่ง ฐานข้อมูล Oracle:
LENGTH(TRIM(TRAILING FROM foo))
9. การเชื่อม string
รูปแบบมาตรฐาน: string1 || string2
แต่ละฐานข้อมูลมีรูปแบบคำสั่งและ syntax แตกต่างกันออกไป ตัวอย่างเช่น MSSQL ใช้เครื่องหมาย + แทนเครื่องหมาย ||
10. Automatic key generation
ตัวแปรที่ใช้ในการระบุ IDENTITY แตกต่างกันในแต่ละฐานข้อมูล เช่น PostgreSQL ไม่สนับสนุนคำสั่งมาตรฐานแต่จะประกาศชนิดของคอลัมน์เป็น SERIAL เพื่อให้ข้อมูล auto-generated
ตัวอย่างคำสั่ง รูปแบบมาตรฐาน:
CREATE TABLE tablename (
tablename_id INTEGER GENERATED ALWAYS AS IDENTITY
...
)
ตัวอย่างคำสั่ง ฐานข้อมูล PostgreSQL:
CREATE TABLE tablename (
tablename_id SERIAL,
...
)
11. TRUNCATE TABLE operations
คำสั่ง TRUNCATE ของแต่ละฐานข้อมูลอาจมีรายละเอียดบางอย่างต่างไปจากรูปแบบมาตรฐาน และบางฐานข้อมูลไม่มีคำสั่ง TRUNCATE เช่น ใน DB2 จะใช้คำสั่ง IMPORT statement แทนโดยขึ้นอยู่กับชนิดระบบปฏิบัติการ
ตัวอย่างคำสั่ง
On unix-like systems: IMPORT FROM /dev/null OF DEL REPLACE INTO tablename
On Windows: IMPORT FROM NUL OF DEL REPLACE INTO tablename
12. Command line operations
มีรูปแบบการเขียน และชื่อคำสั่งที่แตกต่างกันออกไป เช่น ตัวอย่างในการดึงรายชื่อฐานข้อมูล
ตัวอย่างคำสั่ง ฐานข้อมูล MSSQL:
EXEC SP_HELPDB
ตัวอย่างคำสั่ง ฐานข้อมูล MySQL:
SHOW DATABASES