MySQL 4.1.0 alpha สนับสนุน Subqueries?
กระทู้เก่าบอร์ด อ.สุภาพ ไชยา

 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

จะหาย

2 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R04205
Serial ใน MySQL 4.1.0 จะใช้แทน AUTO_INCREMENT

ลองสร้างดูครับ

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
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 ในเวอร์ชันนี้ยังคงอยู่!!!
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.1468s