กระทู้เก่าบอร์ด อ.สุภาพ ไชยา
301 2
URL.หัวข้อ /
URL
MySQL 4.1.0 alpha สนับสนุน Subqueries?
วันนี้ผมได้มีโอกาสลองใช้ MySQL 4.1.0 alpha ซึ่งเขาอ้างว่าสนันสนุนการสร้าง Subqueries
ผมลองสร้าง Query ดังนี้
select qnumber from question where qnumber not in (select distinct qnumbe
r from answer);
จะเห็นว่ามีการเรียก query ซ้อน query
ข่าวดี: MySQL 4.1.0 alpha ซึ่งยังไม่ใช่ตัวสมบูรณ์ สนับสนุน Suqueries แล้วครับ
แต่ข่าวร้ายคือ: ยังไม่สามารถใช้ 'LIMIT & IN/ALL/ANY/SOME’ ใน Suqueries ได้ในเวอร์ชันนี้
ผมลองแบบนี้ เพื่อหา Top 3 ของราคาสินค้าทุกตัว
mysql> select product, price
-> from sales as b
-> where price in (
-> select price from sales as b
-> where a.product = b.product
-> order by price desc limit 3)
-> order by product, price desc;
จะได้ข้อความนี้ฟ้องออกมา
ERROR 1235: This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
การเล่น Subqueries ถ้าจะให้ดีควรสร้าง Index ในฟีลด์ที่ต้องค้นหาของตารางที่เกี่ยวข้องด้วย
การสร้าง Index ใน MySQL ให้ดูเพิ่มเติมที่ http://www.mysql.com/doc/en/CREATE_INDEX.html
ผมสร้าง Index ในฟีลด์ qnumber ของตาราง answer อย่างนี้
mysql> create index myq on answer (qnumber);
Query OK, 3737 rows affected (0.13 sec)
Records: 3737 Duplicates: 0 Warnings: 0
และสร้าง index ในฟีลด์ qnumber ของตาราง question เช่นกัน
mysql> create index myq on question (qnumber);
Query OK, 1648 rows affected (0.06 sec)
Records: 1648 Duplicates: 0 Warnings: 0
ก่อนทำ Index ลองเรียก Subqueries ข้างต้น จะใช้เวลา 1 นาทีกว่า
319 rows in set (1 min 0.86 sec)
พอสร้าง index ในฟีลด์ qnumber ของทั้ง 2 ตาราง จะใช้เวลาน้อยลงอย่างเห็นได้ชัดครับ
แค่ประมาณ 6 วิ เองครับ
319 rows in set (5.89 sec)
และถ้าเข้า MySQL แล้วสั่งคำสั่งอะไร แล้วเจอข้อความนี้
Access denied for user: '@127.0.0.1' (Using password: NO)
ลองเข้าแบบนี้ดูครับ
mysql –u root
จะหาย
ผมลองสร้าง Query ดังนี้
select qnumber from question where qnumber not in (select distinct qnumbe
r from answer);
จะเห็นว่ามีการเรียก query ซ้อน query
ข่าวดี: MySQL 4.1.0 alpha ซึ่งยังไม่ใช่ตัวสมบูรณ์ สนับสนุน Suqueries แล้วครับ
แต่ข่าวร้ายคือ: ยังไม่สามารถใช้ 'LIMIT & IN/ALL/ANY/SOME’ ใน Suqueries ได้ในเวอร์ชันนี้
ผมลองแบบนี้ เพื่อหา Top 3 ของราคาสินค้าทุกตัว
mysql> select product, price
-> from sales as b
-> where price in (
-> select price from sales as b
-> where a.product = b.product
-> order by price desc limit 3)
-> order by product, price desc;
จะได้ข้อความนี้ฟ้องออกมา
ERROR 1235: This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
การเล่น Subqueries ถ้าจะให้ดีควรสร้าง Index ในฟีลด์ที่ต้องค้นหาของตารางที่เกี่ยวข้องด้วย
การสร้าง Index ใน MySQL ให้ดูเพิ่มเติมที่ http://www.mysql.com/doc/en/CREATE_INDEX.html
ผมสร้าง Index ในฟีลด์ qnumber ของตาราง answer อย่างนี้
mysql> create index myq on answer (qnumber);
Query OK, 3737 rows affected (0.13 sec)
Records: 3737 Duplicates: 0 Warnings: 0
และสร้าง index ในฟีลด์ qnumber ของตาราง question เช่นกัน
mysql> create index myq on question (qnumber);
Query OK, 1648 rows affected (0.06 sec)
Records: 1648 Duplicates: 0 Warnings: 0
ก่อนทำ Index ลองเรียก Subqueries ข้างต้น จะใช้เวลา 1 นาทีกว่า
319 rows in set (1 min 0.86 sec)
พอสร้าง index ในฟีลด์ qnumber ของทั้ง 2 ตาราง จะใช้เวลาน้อยลงอย่างเห็นได้ชัดครับ
แค่ประมาณ 6 วิ เองครับ
319 rows in set (5.89 sec)
และถ้าเข้า MySQL แล้วสั่งคำสั่งอะไร แล้วเจอข้อความนี้
Access denied for user: '@127.0.0.1' (Using password: NO)
ลองเข้าแบบนี้ดูครับ
mysql –u root
จะหาย
2 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R04206
และใช้ Select ... From Dual ด้วย เหมือนใน Oracle เลยครับ
mysql> select round(456.45,1) from dual;
+-----------------+
| round(456.45,1) |
+-----------------+
| 456.4 |
+-----------------+
1 row in set (0.00 sec)
ลองแแบบเดิม ก็ได้
mysql> select round(456.45,1);
+-----------------+
| round(456.45,1) |
+-----------------+
| 456.4 |
+-----------------+
1 row in set (0.00 sec)
อันข้างล่างนี้มาจาก Oracle SQL *Plus
SQL> select round(456.45,1) from dual;
ROUND(456.45,1)
---------------
456.5
จะเห็นว่า BUG ใน Round() ของ MySQL ในเวอร์ชันนี้ยังคงอยู่!!!
mysql> select round(456.45,1) from dual;
+-----------------+
| round(456.45,1) |
+-----------------+
| 456.4 |
+-----------------+
1 row in set (0.00 sec)
ลองแแบบเดิม ก็ได้
mysql> select round(456.45,1);
+-----------------+
| round(456.45,1) |
+-----------------+
| 456.4 |
+-----------------+
1 row in set (0.00 sec)
อันข้างล่างนี้มาจาก Oracle SQL *Plus
SQL> select round(456.45,1) from dual;
ROUND(456.45,1)
---------------
456.5
จะเห็นว่า BUG ใน Round() ของ MySQL ในเวอร์ชันนี้ยังคงอยู่!!!
Time: 0.1468s
ลองสร้างดูครับ
mysql> create table inventory (
-> idnum serial,
-> description varchar(50),
-> qty integer);
Query OK, 0 rows affected (0.02 sec)
ลองใส่ข้อมูล 1 รายการ
mysql> insert into inventory (description,qty) values ('Test',10);
Query OK, 1 row affected (0.03 sec)
แล้วดูผล
mysql> select * from inventory;
+-------+-------------+------+
| idnum | description | qty |
+-------+-------------+------+
| 1 | Test | 10 |
+-------+-------------+------+
1 row in set (0.02 sec)
จะเห็นว่า idnum จะใส่ให้เราเอง เหมือนตอนใช้ AUTO_INCREMENT ในเวอร์ชันเก่า
ลองลบดู
mysql> delete from inventory;
Query OK, 1 row affected (0.02 sec)
แล้วใส่ข้อมูลเดิมเข้ามาใหม่
mysql> insert into inventory (description,qty) values ('Test',10);
Query OK, 1 row affected (0.00 sec)
จะเห็นว่า idnum จะเพิ่มต่อไปเรื่อยๆ
mysql> select * from inventory;
+-------+-------------+------+
| idnum | description | qty |
+-------+-------------+------+
| 2 | Test | 10 |
+-------+-------------+------+
1 row in set (0.00 sec)
ถ้าใครอยากอ่านว่าในเวอร์ชัน 4.1.0 นี้มีอะไรใหม่อีก ก็อ่านได้ที่
http://www.mysql.com/doc/en/News-4.1.0.html