กระทู้เก่าบอร์ด อ.สุภาพ ไชยา
301 1
URL.หัวข้อ /
URL
Subqueries ใน MySQL และ PostgreSQL
ที่ผมชอบ PostgreSQL กว่า MySQL จุดหนึ่งคือ Postgres สนับสนุน Subqueries
ซึ่งใน MySQL 4.0.13 สำหรับ Windows ยังไม่สนับสนุน feature นี้ครับ แต่จะมีในเวอร์ชัน 4.1
ผมขอยกตัวอย่างการใช้ Subqueries แบบง่ายๆ ให้ดูครับ
เงื่อนไข ค้นหากระทู้ในเว็บบอร์ดนี้ว่ามีคำถามไหนบ้างที่ยังไม่มีคนตอบ
PostgreSQL
mydb=# select qnumber from question where qnumber not in (select distinct qnumber from answer);
จะเห็นว่าผมใช้ Distinct ช่วยในการแสดงเฉพาะคำตอบที่ไม่ซ้ำกัน
ซึ่งจะทำงานเร็วกว่าการไม่ใช้ Distinct แบบข้างล่างนี้ครับ
mydb=# select qnumber from question where qnumber not in (select qnumber from answer);
ส่วน MySQL ก็ทำได้ครับ แต่ต้องใช้ Left Join ช่วยเอา แต่ผมสังเกตุว่าจะทำงานช้ากว่า PostgreSQL นะครับ
mysql> select question.qnumber from question left join answer on question.qnumber=answer.qnumber where answer.qnumber is null;
319 rows in set (58.27 sec)
ลองศึกษาการแก้ไขปัญหา Subqueries ของ MySQL เพิ่มเติมได้ที่
http://www.mysql.com/doc/en/ANSI_diff_Sub-selects.html
แล้วถ้ามีเวลาลองไปดูกระทู้ http://www.pantip.com/tech/developer/topic/DD1296347.html นี้ครับว่าจะประยุกต์ใช้อย่างไรได้บ้าง
และถ้าจะหาว่าคำถามไหนมีคนตอบแล้วบ้าง ให้ใช้อย่างนี้ครับ
Postgres:
mydb=# select qnumber from question where qnumber in (select distinct qnumber from answer);
=
MySQL:
mysql> select question.qnumber from question, answer where question.qnumber=answer.qnumber;
ซึ่งใน MySQL 4.0.13 สำหรับ Windows ยังไม่สนับสนุน feature นี้ครับ แต่จะมีในเวอร์ชัน 4.1
ผมขอยกตัวอย่างการใช้ Subqueries แบบง่ายๆ ให้ดูครับ
เงื่อนไข ค้นหากระทู้ในเว็บบอร์ดนี้ว่ามีคำถามไหนบ้างที่ยังไม่มีคนตอบ
PostgreSQL
mydb=# select qnumber from question where qnumber not in (select distinct qnumber from answer);
จะเห็นว่าผมใช้ Distinct ช่วยในการแสดงเฉพาะคำตอบที่ไม่ซ้ำกัน
ซึ่งจะทำงานเร็วกว่าการไม่ใช้ Distinct แบบข้างล่างนี้ครับ
mydb=# select qnumber from question where qnumber not in (select qnumber from answer);
ส่วน MySQL ก็ทำได้ครับ แต่ต้องใช้ Left Join ช่วยเอา แต่ผมสังเกตุว่าจะทำงานช้ากว่า PostgreSQL นะครับ
mysql> select question.qnumber from question left join answer on question.qnumber=answer.qnumber where answer.qnumber is null;
319 rows in set (58.27 sec)
ลองศึกษาการแก้ไขปัญหา Subqueries ของ MySQL เพิ่มเติมได้ที่
http://www.mysql.com/doc/en/ANSI_diff_Sub-selects.html
แล้วถ้ามีเวลาลองไปดูกระทู้ http://www.pantip.com/tech/developer/topic/DD1296347.html นี้ครับว่าจะประยุกต์ใช้อย่างไรได้บ้าง
และถ้าจะหาว่าคำถามไหนมีคนตอบแล้วบ้าง ให้ใช้อย่างนี้ครับ
Postgres:
mydb=# select qnumber from question where qnumber in (select distinct qnumber from answer);
=
MySQL:
mysql> select question.qnumber from question, answer where question.qnumber=answer.qnumber;
1 Reply in this Topic. Dispaly 1 pages and you are on page number 1
Time: 0.1253s
ถ้าดูที่ความเร็ว จะเห็นว่า MS SQL Server จะทำงานเร็วกว่าเพื่อนๆ รองลงมาคือ PostgreSQL ครับ