BMS-HOSxP Community

HOSxP => การเขียน SQL Script => ข้อความที่เริ่มโดย: doramon ที่ ตุลาคม 11, 2006, 08:09:02 AM

หัวข้อ: Mysql
เริ่มหัวข้อโดย: doramon ที่ ตุลาคม 11, 2006, 08:09:02 AM
Introduction to…

MySQL

Database Server

1.! บทที่ 1 Database Management System
1.1.!ความหมายของระบบฐานข้อมูล
ระบบฐานข้อมูลคือ โครงสร้างสารสนเทศ (Information) ที่ประกอบด้วยข้อมูลต่างๆ เช่น ข้อมูลของ
ลูกค้าของบริษัท ข้อมูลรายการสินค้า เป็นต้น ซึ่งข้อมูลเหล่านี้สามารถรวมเป็นหัวข้อที่สัมพันธ์กันได้ ระบบ
ฐานขอ้ มลู ไดส้ รา้ งวธิ กี ารสํ าหรับการรวบรวมรายการ ข้อมูลที่เกี่ยวข้องกับงานนั้นๆเข้าด้วยกัน สร้างวิธี
สํ าหรับการเก็บและบํ ารุงรักษาข้อมูลเหล่านั้น
ระบบฐานข้อมูลประกอบด้วยส่วนประกอบ 2 ส่วนคือ
1.ระบบจัดการฐานข้อมูล (Database Management System (DBMS)) เป็นโปรแกรมที่ใช้เพื่อจัด
ระเบียบและบํ ารุงรักษารายการของข้อมูลเหล่านี้
2.แอปพลเิ คชนั่ ฐานขอ้ มลู (Database Application) เปน็ โปรแกรมที่ช่วยให้เราดู และแก้ไขข้อมูลที่
ถูกเก็บอยู่ใน DBMS
โดยปกติทั่ง DBMS และ Database Application จะทํ างานอยู่บนเครื่องเดียวกัน ส่วนมากทั้งสอง
สว่ นจะถูกรวมอยู่ภายในโปรแกรมเดียวกัน แต่ขณะนี้ความสนใจส่วนมากได้มุ่งไปที่เทคโนโลยีในการปฎิวัติ
DBMS คือเทคโนโลยี Client/Server นั่นเอง
1.2.!ข้อดีในการใช้โปรแกรมระบบจัดการฐานข้อมูล
(1)! ลดความซํ้ าซ้อนของฐานข้อมูล
(2)! ลดความผิดพลาดของข้อมูล ในกรณีที่เรามีการจัดเก็บข้อมูลไว้หลายๆแห่ง การเปลี่ยนแปลงแก้ไข
ขอ้ มลู จะเกิดปัญหาว่าข้อมูลไม่เหมือนกัน ท าํ ให้การทํ างานผดิ พลาดและเกดิ ความเสยี หายได้ ซงึ่
ระบบฐานข้อมูลสามารถลดปัญหาเหล่านี้ได้อย่างดี
(3)! สามารถใช้ข้อมูลร่วมกันได้ ทํ าให้ประหยัดค่าใช้จ่ายและลดความผิดพลาด
(4)! ควบคมุ ความเปน็ มาตรฐานของขอ้ มลู ได้ การจัดเก็บข้อมูลที่มีศูนย์กลางที่เดียวทํ าให้สามารถควบ
คุมรูปแบบของข้อมูลได้ ทํ าให้ข้อมูลเป็นอันหนึ่งอันเดียวกัน ง่ายต่อการดูแลรักษา
(5)! ความปลอดภัยในการเก็บรักษาข้อมูล เนื่องจากการเก็บข้อมูลไว้ที่ศูนย์กลางข้อมูลที่เดียวจึงทํ าให้
สามารถควบคุมและจัดสรรระดับของผู้ใช้ที่เข้ามาขอใช้ข้อมูลได้ เช่นการกํ าหนดรหัสผ่านให้การเข้า
มาใช้ข้อมูล แบ่งระดับความปลอดภัยของผู้เข้ามาใช้ข้อมูล
(6)!สามารถควบคุมความถูกต้องของข้อมูลได้โดยง่าย
1.3.!Relational Database
เปน็ DBMS ประเภทหนึ่งที่นิยมใช้ในปัจจุบัน ในระบบ RDM ขอ้ มลู จะถูกจัดระเบียบเป็นเซตในทาง
คณติ ศาสตรใ์ นโครงสรา้ งของตาราง ฟิลด์ข้อมูลแต่ละตัวจะเป็นคอลัมน์ในตาราง และแตล่ ะเรคอรด์ จะกลาย
เป็นแถวในตาราง
Relation Database มขี อ้ ดที สี่ าํ คัญคือ ความยืดหยุ่นที่สมบูรณ์ในการกล่าวถึงความสัมพันธ์ระหว่าง
รายการข้อมูลที่แตกต่างกัน การตัดสินใจหลักๆของผู้ออกแบบฐานข้อมูลคือการกํ าหนดตาราง Relation
Database ถือว่าเป็นฐานข้อมูลแบบที่นํ าไปสู่การพัฒนาระบบ Client/Server ซึ่งจะ
กล่าวถึงในหัวข้อต่อไป
2.! บทที่ 2 ระบบฐานข้อมูลแบบ Client/Server
ระบบ Client/Server นี้เป็นการแยกการทํ างานของ Font-end กับ Back-end ออกจากกันโดยผู้ใช้
สามารถที่จะทํ าการทํ างานกับฐานข้อมูลได้โดยไม่จํ าเป็นต้องทํ างานอยู่ที่เครื่องที่ทํ าหน้าที่เก็บฐานข้อมูลอยู่
นั้นเราจะเรียกว่า Back-end ในการนํ าเสนอระบบนี้อย่างไรนั้นขึ้นกับ Platform ที่ Font-end กับ Back-end
ทํ างานอยู่ และระดับการจัดการที่ถูกแบ่งออกเป็น 2 ส่วน
รูปที่ 2.1 แสดงโครงสร้างของระบบ Client/Server Database
2.1.!ข้อดี ของระบบฐานข้อมูลแบบ Client/Server
(1)! การแบ่งแยกการจัดการระหว่างระบบของ Client และ Database Server ออกจากกันโดยการ
จัดการฐานข้อมูลจะถูกทํ าที่ส่วนของ Back-end ส่วน DBMS จะถูกจัดการอยู่ที่ Server ทํ าให้
สามารถทํ าการขยายการใช้งานของเครื่องคอมพิวเตอร์ที่มีขนาดเล็กหรือช้าเกินกว่าที่จะ
สามารถทํ าการ Run DBMS ที่ซับซ้อนบนเครื่องนั้น
(2)! ช่วยลดโหลด(Load)ให้กับระบบ Nerwork ที่เชื่อมต่อได้ด้วยแทนที่จะต้องทํ าการส่งข้อมูลทั้ง
หมดไปและกลับผ่านทางสายแลน(LAN) ไปยังเครื่องที่ทํ าการติดต่อเข้ามาทํ าให้การจราจรบน
สายส่งลดน้อยลงเหลือเพียงแค่การส่ง Query มาจาก Client มายังตัวที่เป็นฐานข้อมูล เพื่อ
ทํ างานอย่างใดอย่างหนึ่ง เมื่อ Server ได้รับ Query ที่ส่งมาก็จะทํ าการคํ านวณและส่งผลลัพธ์
กลับไปยัง Client เพียงเท่านั้น
"#$#%#&'!(')*')
+,-'.$
+,-'.$
+,-'.$
(3)! การทํ างานของโปรแกรมไม่ขึ้นกับเครื่องที่ทํ างาน ผู้ใช้จะไม่ถูกจํ ากัดบนเครื่องระบบใดระบบ
หนึ่งเท่านั้น สามารถนํ าเอาโปรแกรมไปทํ างานบนเครื่องคอมพิวเตอร์เครื่องไหนก็ได้และ
สามารถทํ างานได้กับระบบปฎิบัติการได้หลายตัวไม่ว่าจะเป็น MS-Windows,IBM
OS/2,MS/PC-Dos เป็นต้นนอกจากนี้ Client และ Server ก็ไม่จํ าเป็นต้องใช้ฐานข้อมูลเดียวกัน
(4)! การรกั ษาความถูกต้องของข้อมูล ในปัจจุบันระบบ Database Server สว่ นมากทํ างานบน
DBMS ทใี่ ช้การจัดการแบบ Relation DBMS เมอื่ ผใู้ ช้ต้องการที่จะทํ าการแก้ไขค่าของข้อมูล
จะต้องทํ าการ Log In เขา้ มาใช้งานที่ Server กอ่ นทํ าให้ข้อมูลไม่กระจัดกระจาย และมีความถูก
ต้องอยู่เสมอ
(5)!การปกป้องข้อมูล ที่เครื่องที่ทํ าหน้าที่ในการเก็บข้อมูล (Server) บางครั้งอาจมีการเข้ารหัสที่
เกบ็ ไฟลโ์ ดยขอ้ มลู ถกู เขา้ รหสั เพอื่ ปอ้ งกนั การดจู ากภายนอก DBMS ได้
2.2.!ข้อเสียของระบบ Client/Server
(1)! การเพิ่มค่าใช้จ่ายในการจัดการและเตรียมบุคลากรที่จะทํ าหน้าที่บํ ารุงรักษา Database Server
เมื่อจํ านวนผู้ใช้มีมากขึ้นหรือเมื่อฐานข้อมูลมีขนาดใหญ่มากขึ้น นอกจากนี้การฝึกฝนผู้ควบคุม
ระบบยงั เปน็ ค่าใช้จ่ายที่เพิ่มขึ้นในตอนเริ่มต้นด้วย เนื่องจากคนที่เข้ามาทํ างานอาจจะไม่คุ้นเคย
กับระบบที่ทํ าอยู่
(2)! การเพิ่มค่าใช้จ่ายทางด้าน Hardware ก็จะเพิ่มขึ้น
3.! บทที่ 3 เกี่ยวกับ MySQL
MySQL เป็น SQL ( Structured Queries Language ) database server ซึ่ง SQL เป็น database
language ทนี่ ยิ มมากภาษาหนึ่ง เป็น database server ขนาดเลก็ ซึ่งเหมาะกับ applications ทีม่ ขี นาด
เล็ก และ ปานกลาง อีกทั้งยังสนับสนุน standard SQL (ANSI) MySQL ถูกเขียนขึ้นมาใช้ได้ในหลาย
platform ของคอมพิวเตอร์ ทั้ง Unix และ Windows
ในโลก MySQL เป็นการสร้าง client/server ที่ประกอบด้วย server daemon ‘mysqld’ และ client
programs/libraries ที่แตกต่างกัน ความสามารถที่สํ าคัญของ MySQL คือ ความเร็ว และ ความทนทาน (
robustness ) MySQL ถูกสร้างเป็นกลุ่มของ routine ที่ใช้สํ าหรับตอบสนองการใช้งานซึ่งในปัจจุบัน MySQL
ยังคงทํ าการพัฒนาอยู่อย่างต่อเนื่อง คุณสามารถดูรายละเอียดเพิ่มเติมของ MySQL ได้จาก web site หลัก
ของ MySQL http://www.mysql.com
การติดตั้ง MySQL ในปัจจุบัน นั้นทํ าได้ง่ายมาก โดยเฉพาะ หากคุณใช้ Mandrake 7 เมื่อคุณ
install mandrake 7 MySQL จะถูกติดตั้งมาให้เรียบร้อยแล้ว
หากต้องการติดตั้ง MySQL binary version ให้พิมพ์คํ าสั่ง ดังนี้
shell> gunzip < mysql-VERSION-OS.tar.gz | tar xvf -
shell> ln -s mysql-VERSION-OS mysql
shell> cd mysql
shell> scripts/mysql_install_db
shell> bin/safe_mysqld &
หากต้องการติดตั้ง MySQL แบบ RPM ต้องใช้ file ดังนี้
•! MySQL-VERSION.i386.rpm สํ าหรับโปรแกรม MySQL server.
•! MySQL-client-VERSION.i386.rpm สํ าหรับโปรแกรม MySQL client
วิธีการติดตั้งโปรแกรม ให้พิมพ์ดังนี้
shell> rpm -i MySQL-VERSION.i386.rpm MySQL-client-VERSION.i386.rpm
หากต้องการติดตั้งเพียงแค่โปรแกรม client ให้พิมพ์
shell> rpm -i MySQL-client-VERSION.i386.rpm
4.! บทที่ 4 ระบบการจัดการกับสิทธิการเข้าถึงข้อมูล
4.1!ความรู้พื้นฐานเกี่ยวกับ user-name และ รหัสผ่าน ใน MySQL
•! User-name ใน MySQL ไม่ใช่ user-name ที่ใช้ในระบบ UNIX แต่โดยปกติเมื่อมีการ connect
ไปยัง MySQL server แล้ว user-name บน UNIX จะถกู ใช้เป็นค่า user-name เรมิ่ ตน้ โดยผใู้ ช้
สามารถระบุ user-name ของ MySQL โดยใช้ option –u username ได้
User-name ใน MySQL มีความยาวได้สูงสุด 16 ตัวอักษร
•! รหัสผ่านของ user ใน MySQL ไม่ใช่รหัสผ่านของ user ที่ใช้ในระบบ UNIX
4.2!ความรู้พื้นฐานเกี่ยวกับการ connect MySQL server
MySQL client สามารถ connect ไปยัง MySQL server โดยใช้คํ าสั่งดังนี้
Shell> mysql [-h hostname] [-u username] [-pyourpassword]
Shell> mysql [--host=hostname] [--user=username] [--password=yourpassword]
โดยค่ามาตรฐานสํ าหรับ client มีดังนี้
หากไม่มีการระบุ option –h hostname มาตรฐานจะเป็น localhost
หากไม่มีการระบุ option –u username มาตรฐานจะเป็น UNIX user-name
การใช้ option –p โดยไม่ระบุ password MySQL client จะให้ผู้ใช้ป้อน password ดังนี้
Shell> mysql –u username –p
Enter password: *********
ในระบบ UNIX ผู้ใช้สามารถระบุค่าเริ่มต้นในการ connect MySQL server ได้โดยระบุภายในไฟล์ .my.cnf ใน
home directory เช่น
[client]
host=hostname
user=username
password=yourpassword
เมื่อมีการระบุ password ในไฟล์ดังกล่าว ควรกํ าหนดสิทธิในการเข้าถึงไฟล์ให้เป็น 400 หรือ 600
4.3!ความรู้พื้นฐานเกี่ยวกับ Privileges system
หน้าที่หลักของ privileges system คือการตรวจสอบสิทธิของ user ในการ connect MySQL
server,การใช้ query พื้นฐานเช่น select, insert, update และ delete นอกจากนั้น privileges system
ยังใชใ้ นการจดั การสทิ ธิของ anonymous user, การเพิ่มสิทธิในการใช้ function พเิ ศษ เชน่ LOAD DATA
INFILE และการบริหารระบบ MySQL
4.4!ความรู้พื้นฐานเกี่ยวกับ Privileges table
Privileges table ประกอบไปด้วย 3 table หลักๆ คือ
(1)! host table ใช้ในการกํ าหนดสิทธิว่า host ใดมีสิทธิทํ าอะไรกับ database ใดบ้าง โดยมี field ดัง
นี้
•! Host – สามารถ connect จาก client ใดได้บ้าง
•! Db – database ใดที่สามารถใช้งานได้
•! Select_priv – สามารถใช้ query SELECT ได้หรือไม่ (Y/N)
•! Insert_priv – สามารถใช้ query INSERT ได้หรือไม่ (Y/N)
•! Update_priv – สามารถใช้ query UPDATE ได้หรือไม่ (Y/N)
•! Delete_priv – สามารถใช้ query DELETE ได้หรือไม่ (Y/N)
•! Create_priv – สามารถใช้ query CREATE ได้หรือไม่ (Y/N)
•! Drop_priv – สามารถใช้ query DROP ได้หรือไม่ (Y/N)
เช่น client host ชื่อ cpe, database ที่ต้องการใช้งานชื่อ student จะใช้คํ าสั่งดังนี้เพื่อให้ client
จากcpe สามารถใช้งาน student ได้
mysql> insert into
-> host(host,db,Select_priv,Insert_priv,Update_priv,
-> Delete_priv,Create_priv,Drop_priv)
-> values('localhost','student','Y', 'Y', 'Y', 'Y', 'Y', 'Y');
mysql> insert into
-> host(host,db,Select_priv,Insert_priv,Update_priv,
-> Delete_priv,Create_priv,Drop_priv)
values('cpe','student','Y', 'Y', 'Y', 'Y', 'Y', 'Y');
โดยรูปแบบ field host ที่ใช้ได้คือ localhost, hostname, เลข IP, ตัวอักษรที่ใช้ wildcard เช่น
cp% หมายถึงชื่อ host ที่ขึ้นต้นด้วย cp เป็นต้น
(2)! user table ใช้ในการกํ าหนดสิทธิว่า user ใด สามารถใช้งาน client ได้จาก host ใด และ
สามารถจะทํ าอะไรได้บ้าง โดยมี field ดังนี้
Host – สามารถ connect จาก client ใดได้บ้าง
User – username ใดสามารถ connect ได้
Select_priv – สามารถใช้ query SELECT ได้หรือไม่ (Y/N)
Insert_priv – สามารถใช้ query INSERT ได้หรือไม่ (Y/N)
Update_priv – สามารถใช้ query UPDATE ได้หรือไม่ (Y/N)
Delete_priv – สามารถใช้ query DELETE ได้หรือไม่ (Y/N)
Create_priv – สามารถใช้ query CREATE ได้หรือไม่ (Y/N)
Drop_priv – สามารถใช้ query DROP ได้หรือไม่ (Y/N)
Reload_priv – สามารถใช้ query RELOAD ได้หรือไม่ (Y/N)
Shutdown_priv – สามารถสั่ง shutdown MySQL server ได้หรือไม่ (Y/N)
Process_priv – สามารถสั่ง list คํ าสั่งที่กํ าลังประมวลผลบน server ได้หรือไม่ (Y/N)
File_priv – user สามารถเขียนไฟล์ลงบน server ได้หรือไม่ (Y/N)
(3)! db table ใช้ในการกํ าหนดสิทธิว่า database ใด สามารถใช้งานโดย user ใด จาก client ใด
และสามารถจะทํ าอะไรได้บ้าง โดยมี field ดังนี้
•! Host – สามารถ connect จาก client ใดได้บ้าง
•! Db – database ใดที่สามารถใช้งานได้
•! User – username ใดสามารถ connect ได้
•! Select_priv – สามารถใช้ query SELECT ได้หรือไม่ (Y/N)
•! Insert_priv – สามารถใช้ query INSERT ได้หรือไม่ (Y/N)
•! Update_priv – สามารถใช้ query UPDATE ได้หรือไม่ (Y/N)
•! Delete_priv – สามารถใช้ query DELETE ได้หรือไม่ (Y/N)
•! Create_priv – สามารถใช้ query CREATE ได้หรือไม่ (Y/N)
•! Drop_priv – สามารถใช้ query DROP ได้หรือไม่ (Y/N)
4.5!ระบบรักษาความปลอดภัยทั่วไป
ระบบรกั ษาความปลอดภัยใน MySQL จะสามารถกํ าหนด หรอื ปรบั เปลยี่ น ได้จาก Access Control
Lists (ACL-s), SSL แต่สิ่งที่สํ าคัญที่สุดก็คือการใช้งาน MySQL อย่างปลอดภัย เมื่อ MySQL
หลักการการใช้งาน MySQL ให้ปลอดภัย
(1)! ทํ าความเข้าใจกับ ACL-s การ GRANT หรือ REVOKE ควรทํ าโดยระมัดระวัง ไม่ควร GRANT
สิทธิใด ๆ ให้แก่ผู้ใช้โดยไม่จํ าเป็น ควรตั้งรหัสผ่านสํ าหรับการเข้าสู่ระบบโดย account root
เสมอ การตรวจสอบสิทธิต่าง ๆ ของผู้ใช้สามารถทํ าได้โดยใช้คํ าสั่ง SHOW GRANTS
(2)! การเกบ็ รหสั ผา่ นควรมีการเข้ารหัสเสมอ ท าํ ได้โดยใช  MD5( ) หรือ hashing function
(3)! รหัสผ่านไม่ควรมีคํ าศัพท์ที่มีอยู่ในพจนานุกรมภาษาอังกฤษ เช่น xfish98
(4)! MySQL server ควรทํ างานอยู่หลังระบบ firewall โดยป้องกัน port 3306 ของ MySQL ให้มี
การเข้าถึงจาก client เท่าที่จํ าเป็น
(5)! การพฒั นาโปรแกรมประยุกต์ซึ่งติดต่อกับ MySQL ควรมีการตรวจสอบความถูกต้องเสมอ การ
ตรวจสอบที่จํ าเป็นสํ าหรับแต่ละประเภทของโปรแกรมประยุกต์มีดังนี้
(5.1)! โปรแกรมประยุกต์ซึ่งทํ างานผ่าน www
-! ทดสอบการป้อนค่า %22 (“), %27(‘)
-! ทดสอบการป้อนค่าที่เป็นตัวอักษร, space, สัญลักษณ์ต่าง ๆ ลงใน field ที่เป็นตัวเลข
-! ทดสอบขนาดของ data ก่อนส่งไปประมวลผลยัง MySQL server
(5.2)! โปรแกรมประยุกต์ซึ่งมีการใช้งาน PHP3
-! ตรวจสอบการใช้ function addslashes()
(5.3)! โปรแกรมประยุกต์ซึ่งมีการใช้งาน MySQL C API
-! ตรวจสอบการเรียกใช้ API mysql_escape()
(5.4)! โปรแกรมประยุกต์ซึ่งมีการใช้งาน MySQL++
-! ตรวจสอบการใช้ escape และ quote ในการ query
(6)! การส่งข้อมูลผ่านระบบเน็ตเวิร์กควรมีการเข้ารหัสโดยใช้ SSL
4.6!การป้องกัน MySQL ให้ปลอดภัยจาก crackers
(1)! ตั้งรหัสผ่านสํ าหรับผู้ใช้ทุกคนเสมอ โดยการตั้งหรือเปลี่ยนรหัสผ่านสามารถทํ าได้ดังนี้
Shell> mysql –u username mysql
Mysql> UPDATE user SET Password=PASSWORD(‘new_password’) WHERE
user=’username’;
Mysql> FLUSH PRIVILEGES;
(2)! ไม่ควรสั่งให้ MySQL deamon ทํ างาน โดยเป็น process ของ root
(3)! กํ าหนดสิทธิ Script ไฟล์ mysql.server ให้สามารถอ่านได้เฉพาะ root เท่านั้น เมื่อมีการ
กํ าหนดรหัสผ่านของ UNIX root ใน script ดังกล่าว
(4)! กํ าหนดสิทธิในการอ่าน/เขียน directory ที่ใช้เก็บ database ให้แก่ UNIX user ที่เป็นเจ้าของ
process MySQL deamon เท่านั้น
(5)! ไม่ควรกํ าหนดสิทธิ process ให้แก่ user ทุกคน
(6)! ไม่ควรกํ าหนดสิทธิ file ให้แก่ user ทุกคน
4.7!เมื่อสิทธิของผู้ใช้ถูกเปลี่ยนแปลง จะมีผลต่อผู้ใช้เมื่อใด ?
เมื่อ mysqld start , ข้อมูลใน grant table จะถูกอ่านเก็บไว้ในหน่วยความจํ า เพื่อนํ าไปใช้งาน
การแก้ไขข้อมูลใน grant tables โดยใช้คํ าสั่ง GRANT, REVOKE หรือ SET PASSWORD จะทํ าให้สิทธิที่ถูก
แก้ไขมีผลใช้ได้ทันที
ถ้าคุณแก้ไข grant tables โดยการใช้คํ าสั่ง INSERT หรือ UPDATE คุณจํ าเป็นต้องใช้คํ าสั่ง
FLUSH PRIVILEGES หรือ run mysqladmin flush-privileges เพื่อบอกให้ server reload grant tables ไม่
เช่นนั้นสิทธิต่างๆ ที่คุณแก้ไขจะไม่มีผลใดๆ จนกว่าคุณจะ restart server
เมื่อ server รับรู้ว่า grant tables ถูกเปลี่ยนแปลง, client ที่ติดต่ออยู่กับ server ในขณะนั้นๆ จะได้
รับผลกระทบดังนี้
•! สิทธิการใช้งาน Table และ column จะมีผลต่อ client เมื่อ client request ครั้งต่อไป
•! สิทธิการใช้งาน Database จะมีผลต่อ client เมื่อ client เรียกใช้คํ าสั่ง USE db_name ในครั้งต่อไป
สว่ นการเปลยี่ นแปลงสทิ ธอิ นื่ ๆ นอกเหนือจากนี้จะมีผลต่อ client เมื่อ client connect มายัง server ครั้งต่อไป
4.8!การ set up สิทธิการใช้ MySQL เริ่มต้น
หลังจากติดตั้ง MySQL, คุณสามารถ set up access privileges เริ่มต้นของ MySQL ได้โดยการ
run script/mysql_install_db ซึ่ง script/mysql_install_db จะทํ าการ start up mysqld server จากนั้นก็จะ
กํ าหนดค่าเริ่มต้นของ grant table ดังนี้ :
•! The MySQL root user จะเป็น superuser ซึ่งสามารถทํ าทุกอย่างได้ และการติดต่อกับ server จะ
ต้องทํ าจาก localhost เท่านั้น Note: password เริ่มต้นของ root จะถูกกํ าหนดเป็นว empty นั้นคือ
ทุกๆ คนสามารถ connect มายัง server โดยใช้ user root แบบไม่ต้องใช้ password ได้
•! An anonymous user ถูกสร้างให้สามารถทํ าอะไรก็ได้กับ databases ที่ชื่อ ‘test’ หรือ ขึ้นต้นด้วย
‘test_’ การติดต่อกับ server ต้องทํ าจาก local host เท่านั้น
•! สิทธิ อื่น เช่น user ธรรมดาไม่สามารถ ใช้ mysqladmin shutdown หรือ mysqladmin processlist
ได้
เมื่อคุณ install MySQL เสร็จ สิ่งแรกที่คุณควรทํ าคือการกํ าหนด password สํ าหรับ root user โดยใช้วิธีการ
ดังนี้
shell> mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('new_password')
WHERE user='root';
mysql> FLUSH PRIVILEGES;
ใน MySQL 3.22 , คุณสามารถใช้คํ าสั่ง SET PASSWORD ได้ดังนี้
shell> mysql -u root mysql
mysql> SET PASSWORD FOR root=PASSWORD('new_password');
อีกวิธีในการ set password ของ root คือ
shell> mysqladmin -u root password new_password
4.9!การเพิ่มผู้ใช้ และ การจัดการกับสิทธิของผู้ใช้
คุณสามารถเพิ่ม user ได้โดยใช้ 2 วิธี คือ
(1)! ใช้ GRANT statement
(2)! เปลี่ยนแปลง MySQL grant tables โดยตรง
ซึ่งวิธีที่สมควรใช้มากกว่า คือ วิธีที่ (1) เพราะเป็นวิธีที่รัดกุม และ เกิดข้อผิดพลาดได้น้อยกว่า
ตัวอย่างการ add new user โดยใช้วิธีที่ (1) ซึ่งผู้ที่สามารถ add new user ได้ จะต้อง connect เป็น
root ก่อน, root user จะต้อง insert สิทธิ สํ าหรับ mysql database และ reload administrative privilege
คุณสามารถเพิ่มผู้ใช้ได้โดยการใช้คํ าสั่ง GRANT ดังนี้ :
shell> mysql --user=root mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO ooh@localhost
IDENTIFIED BY 'something' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO ooh@"%"
IDENTIFIED BY 'something' WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;
mysql> GRANT USAGE ON *.* TO dummy@localhost;
คํ าสั่ง GRANT เหล่านี้เป็นการสร้าง new users ขึ้นมาใหม่ 3 users
ooh
เป็น full superuser ซึ่งสามารถ connect มายัง server จากที่ไหนก็ได้ แต่ต้องใช้ password
‘something’ ในการติดต่อกับ server
admin
เป็น user ที่สามารถ connect จาก local host โดยไม่ใช่ password และสามารถใช้สิทธิในการ
reload และ process MySQL ได้ นั้นคือ admin สามารถ run คํ าสั่ง mysqladmin reload, mysqladmin
refresh และ mysql flush-* ได้ แต่ไม่สามารถใช้ Database ไหนได้ ซึ่งมันสามารถถูก grant ไดภ้ ายหลังโดย
ใช้ GRANT statement
dummy
user สามารถ connect โดยไม่ใช้ password แต่ต้องจาก local host เท่านั้น สิทธิทั่วไปถูก set ให้
เป็น ‘N’
คุณสามารถ add ข้อมูลของ user เหล่านี้ได้โดยตรง โดยใช้ INSERT statements และ บอกให้ server reload
grant tables
shell> mysql --user=root mysql
mysql> INSERT INTO user VALUES('localhost','ooh',PASSWORD('something'),
'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')
mysql> INSERT INTO user VALUES('%','ooh',PASSWORD('something'),
'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')
mysql> INSERT INTO user SET Host='localhost',User='admin',
Reload_priv='Y', Process_priv='Y';
mysql> INSERT INTO user (Host,User,Password)
VALUES('localhost','dummy','');
mysql> FLUSH PRIVILEGES;
ตัวอย่างต่อไปนี้ เป็นการเพิ่ม user ชื่อ “custom” ซึ่งสามารถ connect เข้า server จาก host
localhost, server.domain และ cpe.cmu. user นี้ ต้องการเข้าถึง (access) เพียง database stuinfo จาก
localhost, database lecturerinfo จาก cpe.cmu และ database transcript จากทั้ง 3 host โดยใช้ password
‘manager’
การ setup สิทธิต่างๆ ของ user โดยการใช้ GRANT statements , ทํ าได้ดังนี้ :
shell> mysql --user=root mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON stuinfo.*
TO custom@localhost
IDENTIFIED BY 'manager';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON lecturerinfo.*
TO custom@cpe.cmu
IDENTIFIED BY 'manager';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON transcript.*
TO custom@'%'
IDENTIFIED BY 'manager';
หรือจะ set up สิทธิของ user จากการแก้ไขที่ grant table โดยตรงก็ได้ ดังนี้ :
shell> mysql --user=root mysql
mysql> INSERT INTO user (Host,User,Password)
VALUES('localhost','custom',PASSWORD('manager'));
mysql> INSERT INTO user (Host,User,Password)
VALUES('server.domain','custom',PASSWORD('manager'));
mysql> INSERT INTO user (Host,User,Password)
VALUES('cpe.cmu','custom',PASSWORD('manager'));
mysql> INSERT INTO db
(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
Create_priv,Drop_priv)
VALUES
('localhost','stuinfo','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
Create_priv,Drop_priv)
VALUES
('whitehouse.gov','lecturerinfo','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
Create_priv,Drop_priv)
VALUES('%','transcript','custom','Y','Y','Y','Y','Y','Y');
mysql> FLUSH PRIVILEGES;
คํ าสั่ง INSERT 3 คํ าสั่งแรก เป็นการ add ข้อมูลลงใน user table เพื่ออนุญาติให้ user custom สามารถ
connect มายัง server โดยมาจาก host ทแี่ ตกตา่ งกนั ได้ ด้วย password ‘stupid’ แตย่ งั ไม่ให้สิทธิต่างๆ แก่
custom
คํ าสั่งINSERT อีก 2 คํ าสั่งต่อมา เป็นการ add ข้อมูลลงใน db table เพื่อให้สิทธิต่างๆ แก้ custom สํ าหรับ
database ชื่อ bankaccount, expenses and customer โดยการ access เข้ามาใช้ database กระทํ าได้จาก
host ที่เจาะจงไว้เท่านั้น ซึ่งวิธีนี้จะต้องทํ าการ reload grant table ให้กับ server ใหม่ โดยการใช้คํ าสั่ง
FLUSH PRIVILEGES ในบรรทัดสุดท้าย เพื่อให้สิทธิต่างๆ สามารถใช้ได้เลย
ถ้าคุณต้องการเจาะจง user ในการ access จากเครื่องใดๆ ก็ได้ใน domain เดียวกัน คุณสามารถใช้คํ าสั่ง
GRANT ดังนี้ :
mysql> GRANT ...
ON *.*
TO myusername@"%.mydomainname.com"
IDENTIFIED BY 'mypassword';
   g r ant tables    :
mysql> INSERT INTO user VALUES ('%.mydomainname.com', 'myusername',
PASSWORD('mypassword'),...);
mysql> FLUSH PRIVILEGES;
4.10! วิธีการกํ าหนด passwords
จากตวั อย่างในหัวข้อที่ผ่านมาจะเห็นได้ว่าเมื่อคุณ INSERT หรอื UPDATE password คณุ ต้องใช้
function PASSWORD() เพื่อเข้ารหัส password เนื่องจากการกระทํ าเช่นนี้ ทํ าให้ password ถูกเก็บลง
table ในแบบที่ถูกเข้ารหัส เพื่อความปลอดภัยของข้อมูล
หากคุณลืมใช้ function PASSWORD() , password ก็จะถูกเก็บในรูปแบบของตัวหนังสือ
(plaintext)
shell> mysql -u root mysql
mysql> INSERT INTO user (Host,User,Password)
VALUES('%','jeffrey','biscuit');
mysql> FLUSH PRIVILEGES;
จากคํ าสั่งนี้ ผลลัพธ์ที่ได้คือ คํ าว่า ‘biscuit’ จะถูกเก็บเป็น password ใน user table เมื่อ user jeffrey
พยายาม connect มายัง server โดยใช้ password นี้, mysql client จะ encrypt password ที่ส่งเข้ามาโดยใช้
function PASSWORD() และสง่ ผลลพั ธก์ ลบั ไปให  server และ server กจ็ ะท าํ การเปรียบเทียบค่าใน user
table ซงึ่ เปน็ คา่ ‘biscuit’ กบั password ทถี่ กู สง่ มาแบบเข้ารหัสซึ่งไม่ใช่ค่า ‘biscuit’ ผลลพั ธข์ องการเปรยี บ
เทียบก็ผิด ดังนั้น server จึงไม่ยอมให้ user login เข้ามาได้
shell> mysql -u jeffrey -pbiscuit test
Access denied
วิธีการใช้ INSERT statement ที่ถูกต้อง ควรเขียนดังนี้ :
mysql> INSERT INTO user (Host,User,Password)
VALUES('%','jeffrey',PASSWORD('biscuit'));
หรือคุณจะใช้ PASSWORD() สํ าหรับ SET PASSWORD statements ก็ได้ ดังนี้ :
mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit');
ถ้าคุณ set password โดยใช้ GRANT ... IDENTIFIED BY statement หรือ ใช้ คํ าสั่ง mysqladmin
password ก็ไม่จํ าเป็นต้องใช้ function PASSWORD() เนื่องจากมันจะทํ าการเข้ารหัสให้โดยอัตโนมัติ ดังนี้ :
mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit';
หรือ ใช้ mysqladmin
shell> mysqladmin -u jeffrey password biscuit
5.! บทที่ 5 Language Reference
5.1.! วิธีการเขียนสตริง และ ตัวเลข
5.1.1.! สตริง
สตริง คือ ตัวอักขระที่นํ ามาเขียนเรียงกัน ซึ่งจะถูกล้อมด้วยเครื่องหมาย single quote (‘’)
หรือ double quote (“”) ก็ได้ เช่น
'a string'
"another string"
สํ าหรับสัญลักษณ์พิเศษบางอย่างที่ใช้ใน string ที่เรียกว่า escape character นั้น ต้องใช้
เครื่องหมาย backslash (‘\’) ซึ่ง escape character ใน MySQL นั้น มีดังต่อไปนี้
Escape character Meaning
\0 NULL character
\n newline character
\t Tab character
\r Carriage return character
\b Backspace character
\’ Single quote character
\” Double quote character
\\ Backslash character
\% Wildcard character
\_ Wildcard character
วิธีการที่จะเขียน string ที่มี quotes รวมอยู่ด้วย มีหลายวิธี ดังนี้
•! เครื่องหมาย ‘ ใน string ที่อยู่ในเครื่องหมาย ‘’ สามารถเขียนด้วย ’’
•! เครื่องหมาย “ ใน string ทอี่ ย่ใู นเครื่องหมาย “” สามารถเขียนด้วย "".
•! คุณสามารถใช้เครื่องหมาย ‘\’ อยู่ข้างหน้า quote character ก็ได้
•! เครื่องหมาย ‘ ใน string ที่อยู่ในเครื่องหมาย !" สามารถเขียนได้เลย
•! เครื่องหมาย “ ใน string ทอี่ ย่ใู นเครื่องหมาย ‘’ กส็ ามารถเขยี นไดเ้ ลย
mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+---------+-----------+--------+--------+
mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";
+-------+---------+-----------+--------+--------+
| hello | 'hello' | ''hello'' | hel"lo | "hello |
+-------+---------+-----------+--------+--------+
mysql> SELECT "This\nIs\nFour\nlines";
+--------------------+
| This
Is
Four
lines |
+--------------------+
5.1.2.! ตัวเลข
interger number คอื กลุ่มของตัวเลขที่เรียงต่อกัน สว่ น float number นนั้ จะมีการใช้
เครื่องหมาย . เพอื่ ทํ าการแยกสว่ นทศนยิ มออก โดยทั้ง interger และ float numbers นั้นสามารถมี
ค่าเป็นลบได้ กํ าหนดโดยใช้เครื่องหมาย – นํ าหน้า ดังตัวอย่างต่อไปนี้
1221
0
-32
294.42
-32032.6809e+10
148.00
จะเห็นได้ว่าเลขจํ านวนเต็มนั้นสามารถอ้างอยู่ในรูปของ float number ได้เช่นกัน
5.1.3.! เลขฐานสิบหก
MySQL นั้นสามารถอ้างถึงตัวเลขฐานสิบหกได้ เมื่อ MySQL ทํ าการประมวลผลแล้วจะ
สามารถแปลงเลขฐานสิบหกเป็นเลขฐานสิบ หรือแปลงเป็นอักขระก็ได้ โดยเลขฐานสิบหกสองตัวติด
กนั จะถกู แปลงเปน็ อกั ขระหนงึ่ ตวั ดังตัวอย่างต่อไปนี้
mysql> SELECT 0xa+0
-> 10
mysql> select 0x5061756c;
-> Paul
5.1.4.! NULL value
NULL values หมายถึง ไม่มีค่า ซึ่งแตกต่างจากค่าศูนย์ในระบบตัวเลข หรือ empty string
ในข้อมูลประเภท string โดย NULL สามารถอ้างได้โดยใส่เครื่องหมาย backslash นํ าหน้า ดังนี้ \N
5.1.5.! Database, table, index, column, alias names
ในการตั้งชื่อ database, table, index, column และ alias นั้น มีกฎในการตั้งชื่อ ดังตารางต่อไปนี้
Identifier max length Allowed characters
Database 64 ใช้อักขระใดก็ได้ที่อนุญาตให้ใช้ในการตั้ง directory name ยกเว้นเครื่องหมาย /
Table 64 ใช้อักขระใดก็ได้ที่อนุญาตให้ใช้ในการตั้ง file name ยกเว้นเครื่องหมาย / หรือ .
Column 64 ใช้อักขระใดก็ได้
Alias 255 ใช้อักขระใดก็ได้
หมายเหตุ หากว่าชื่อของ database หรือ table หรือ column หรือ alias นั้นไปตรงกับชื่อคํ าสั่งเฉพาะของ
MySQL แล้ว จะสามารถอ้างถึงได้โดยต้องใส่เครื่องหมาย ' ' ครอบชื่อนั้นๆไว้เสมอ ดังตัวอย่างต่อไปนี้
SELECT * from `select` where `select`.id > 100;
สํ าหรับการอ้างถึง columns นั้นสามารถทํ าได้ตามกฎเกณฑ์ดังในตารางต่อไปนี้
Column reference Meaning
col_name เป็นการอ้างถึง Column col_name ใน table ที่กํ าลังถูกใช้อยู่
tbl_name.col_name อ้างถึง Column col_name จาก table tbl_name ของ database ที่กํ าลังเรียกใช้อยู่
db_name.tbl_name.
col_name
อ้างถึง Column col_name จาก table tbl_name ของ database db_name. สามารถ
อ้างแบบนี้ได้เฉพาะ MySQL 3.22 หรือรุ่นที่ใหม่กว่า
`column_name` เป็นการอ้างถึง column ที่มีชื่อเหมือนกับคํ าสั่งเฉพาะของ MySQL
เราไม่จํ าเป็นที่จะต้องอ้างถึง tbl_name หรือ db_name.tbl_name นอกเสียจากว่าเกิดกรณี
ทที่ า ํ ให้เกิดความสับสนขึ้นมาได้ ยกตัวอย่างเช่น table t1 และ t2 นั้นม ี column ชอื่ c เหมือนกัน ดงั
นั้นในการอ้างถึงในการทํ า query นั้นเราทํ าการเลือกใช้ทั้งสอง table แล้วจะทํ าให้เกิดความสับสน
หากทํ าการอา้ งถงึ column c เนื่องจากไม่ได้ม ี column c เพยี งอนั เดยี ว ดงั นนั้ เวลาอา้ งถงึ column c
นั้นจํ าเป็นต้องอ้างว่าเป็น t1.c หรือ t2.c ในทํ านองเดียวกัน ถ้าหากมี table t ใน database db1 และ
db2 เราต้องทํ าการอ้างถึง columns ในทั้งสอง table นั้นก็จํ าเป็นต้องทํ าการอ้างชื่อ database ด้วย
ดังเช่น db1.t.col_name หรือ db2.t.col_name
5.1.6.! Case sensitivity in names
ใน MySQL นั้น databases และ tables จะมีลักษณะเช่นเดียวกับ directory และ file ใน
directory นั้น ดังนั้นในการตั้งชื่อ databases และ tables นั้น สํ าหรับระบบปฏิบัติการ unix นั้น
อกั ขระตวั พมิ พ์ใหญ่และตัวพิมพ์เล็กจะมีความแตกต่างกัน ถอื เปน็ คนละตวั กนั แต่ในระบบปฏิบัติ
การ Win32 นั้นอักขระตัวพิมพ์ใหญ่หรือเล็กนั้นเหมือนกัน
หมายเหตุ ถึงแม้ว่าชื่อของ database และ table นั้นจะไม่เกิดปัญหาในการอ้างชื่อด้วยตัว
พิมพ์เล็กหรือตัวพิมพ์ใหญ่ก็ตาม เราไม่ควรที่จะอ้างถึง database และ table โดยใช้ทั้งตัวพิมพ์เล็ก
และตัวพิมพ์ใหญ่พร้อมๆกันในการทํ า query ครงั้ หนงึ่ ๆ จากตัวอย่างต่อไปนี้เราไม่สามารถอ้างถึง
table ด้วยชื่อ my_table และ MY_TABLE ในการทํ า query อันเดียวกันได้
mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
ส่วน Column names นั้นจะสามารถอ้างถึงได้โดยต้องระบุถึงชื่อของ column ให้ถูกต้อง
โดยอกั ขระตวั พิมพ์เล็กและตัวพิมพ์ใหญ่นั้นมีความแตกต่างกัน ไม่ว่าจะเป็นระบบ unix หรือ Win32
การทํ า alias บน table กต็ อ้ งอา้ งถงึ ด้วยตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่อย่างใดอย่างหนึ่ง
เท่านั้นในการทํ า query ครั้งหนึ่ง ดังตัวอย่างต่อไปนี้ จะเห็นได้ว่าไม่สามารถอ้างถึง table เดียวกัน
ด้วยชื่อ A และ a ได้
mysql> SELECT col_name FROM tbl_name AS a
WHERE a.col_name = 1 OR A.col_name = 2;
แต่การทํ า alias บน column นนั้ จะไมเ่ กิดปัญหาถึงแม้ว่าเราจะอ้างด้วยทั้งตัวพิมพ์เล็กหรือ
ตัวพิมพ์ใหญ่
5.2.! ชนิดของข้อมูลคอลัมน์
Column ทสี่ ามารถมีได้ใน MySQL แตล่ ะชนดิ ตอ้ งการเนอื้ ทใี่ นการเกบ็ ขอ้ มลู ตา่ งกนั ดงั นี้
5.2.1.! ข้อมูลชนิดตัวเลข
Column type Storage required
TINYINT 1 byte
SMALLINT 2 bytes
MEDIUMINT 3 bytes
INT 4 bytes
INTEGER 4 bytes
BIGINT 8 bytes
FLOAT(X) 4 if X <= 24 or 8 if 25 <= X <= 53
FLOAT 4 bytes
DOUBLE 8 bytes
DOUBLE PRECISION 8 bytes
REAL 8 bytes
DECIMAL(M,D) M bytes (D+2, if M < D)
NUMERIC(M,D) M bytes (D+2, if M < D)
5.2.2.! ขอ้ มูลชนิดวันที่ และ เวลา
Column type Storage required
DATE 3 bytes
DATETIME 8 bytes
TIMESTAMP 4 bytes
TIME 3 bytes
YEAR 1 byte
หากไม่มีข้อมูลใน column ชนิด date และ time (Zero value) ค่าที่เก็บลงใน column แสดงดังตารางต่อไปนี้
Column type ``Zero'' value
DATETIME '0000-00-00 00:00:00'
DATE '0000-00-00'
TIMESTAMP 00000000000000 (length depends on display size)
TIME '00:00:00'
YEAR 0000
5.2.3.! ข้อมูลชนิดสตริง
Column type Storage required
CHAR(M) M bytes, 1 <= M <= 255
VARCHAR(M) L+1 bytes, where L <= M and 1 <= M <= 255
TINYBLOB, TINYTEXT L+1 bytes, where L < 2^8
BLOB, TEXT L+2 bytes, where L < 2^16
MEDIUMBLOB,
MEDIUMTEXT L+3 bytes, where L < 2^24
LONGBLOB,
LONGTEXT L+4 bytes, where L < 2^32
ENUM('value1','value2',...
)
1 or 2 bytes, depending on the number of enumeration values (65535
values maximum)
SET('value1','value2',...) 1, 2, 3, 4 or 8 bytes, depending on the number of set members (64
members maximum)
5.3.! Functions for use in SELECT and WHERE clauses
select_expression หรือ where_definition ในประโยค SQL สามารถจะใส่นิพจน์ใดที่ใช้ฟังก์ชันดัง
ที่จะอธิบายต่อไปได้ นิพจน์ที่มี NULL จะได้ค่าที่เป็น NULL เสมอ เว้นแต่ว่าในนิพจน์นั้นจะมีฟังก์ชันและ
ตัวกระทํ าตัวอื่นอยู่ในนั้น (หมายเหตุ ห้ามมีช่องว่างหรือวงเล็บในชื่อฟังก์ชัน)
ตัวอย่าง
mysql> select MOD(29,9);
-> 2
5.3.1 ฟังก์ชันการรวมกลุ่ม
( ... ) วงเล็บ ใช้ในการจัดลํ าดับของการประมวลผลในนิพจน์ ตัวอย่างเช่น
mysql> select 1+2*3;
-> 7
mysql> select (1+2)*3;
-> 9
5.3.2 ตัวกระทํ าทางคณิตศาสตร์ทั่วไป
ประกอบด้วยตัวกระทํ าทางคณิตศาสตร์ที่ใช้กันบ่อยๆ เช่น +, -, * , /
ตัวอย่าง
+ : การบวก
mysql> select 3+5;
-> 8
- : การลบ
mysql> select 3-5;
-> -2
* : การคูณ
mysql> select 3*5;
-> 15
mysql> select 18014398509481984*18014398509481984.0;
-> 324518553658426726783156020576256.0
mysql> select 18014398509481984*18014398509481984;
-> 0
ผลลพั ธข์ องนพิ จนส์ ดุ ทา้ ยไมถ่ กู ตอ้ งเพราะวา่ ผลลพั ธข์ องการคณู เลขจํ านวนเต็มเกินค่าในช่วงการ
คํ านวณของ BIGINT 64 บิท
/ : การหาร
mysql> select 3/5;
-> 0.60
การหารด้วยค่าศูนย์ ผลลัพธ์จะได้เป็นค่า NULL
mysql> select 102/(1-1);
-> NULL
5.3.3 Bit functions
MySQL ใช้ BIGINT 64 บิทในการกระทํ าแบบบิทดังนั้นตัวกระทํ าจึงมีขนาดใหญ่สุดได้
64 บิท
ตัวกระทํ าทางบิท ได้แก่
|###$##Bitwise OR
mysql> select 29 | 15;
-> 31
& : Bitwise AND
mysql> select 29 & 15;
-> 13
<< : การเลื่อนตัวเลขจํ านวนเต็มไปทางซ้าย
mysql> select 1 << 2
-> 4
>> : การเลื่อนตัวเลขจํ านวนเต็มไปทางซ้าย
mysql> select 4 >> 2
-> 1
~ : เปลี่ยนค่าบิททั้งหมดให้เป็นค่าตรงกันข้าม
mysql> select 5 & ~1
-> 4
BIT_COUNT(N)
ส่งกลับจํ านวนบิทที่ใช้ในการนับเลขจํ านวน N
mysql> select BIT_COUNT(29);
-> 4
5.3.4 Logical operations
ฟงั ก์ชันตรรกทั้งหมดจะส่งค่ากลับเป็น 1 (จริง) หรือ 0 (เทจ็ ) เทา่ นนั้
ฟังก์ชันทางตรรก ได้แก่
NOT : !
NOT จะส่งค่า 1 กลับถ้าอาร์กิวเมนต์เป็น 0 และส่ง 0 กลับถ้าอาร์กิวเมนต์เป็นหนึ่ง ถ้าเป็น NOT
NULL จะส่งกลับค่า NULL เช่น
mysql> select NOT 1;
-> 0
mysql> select NOT NULL;
-> NULL
mysql> select ! (1+1);
-> 0
mysql> select ! 1+1;
-> 1
OR : ||
OR จะส่งค่า 0 ถ้ามีอาร์กิวเมนต์ที่เป็น 1 หรือ NULL มิฉะนั้นจะส่งค่า 1 ตัวอย่างเช่น
mysql> select 1 || 0;
-> 1
mysql> select 0 || 0;
-> 0
mysql> select 1 || NULL;
-> 1
AND : &&
AND จะส่งค่า 0 ถ้ามีอาร์กิวเมนต์ที่เป็น 0 หรือ NULL มิฉะนั้นจะส่งค่า 1 ตัวอย่างเช่น
mysql> select 1 && NULL;
-> 0
mysql> select 1 && 0;
-> 0
5.3.5 Comparison operators
ผลการเปรียบเทียบได้ค่าเป็น 1 หรือ 0 หรือ NULL เท่านั้น ฟังก์ชันเหล่านี้ใช้ได้กับตัว
เลขและตัวอักษร ถ้าเป็นตัวอักษรมันจะถูกแปลงให้เป็นตัวเลขและจากตัวเลขเป็นตัวอักษรถ้าจํ า
เป็น
MySQL จะทํ าการเปรียบเทียบโดยอาศัยกฎต่อไปนี้
•! ถา้ มอี ารก์ วิ เมนต์หนึ่งตัวหรือมากกว่าเป็น NULL ผลลพั ธจ์ ะออกมาเปน็ NULL ยกเว้นตัว
กระทํ า <=>
•! ถา้ อารก์ ิวเมนต์ทั้งสองตัวในการเปรียบเทียบเป็นตัวอักษร มันก็จะถูกเปรียบเทียบเป็นตัว
อักษร
•! ถา้ อารก์ วิ เมนตท์ งั้ สองตวั เปน็ ตวั เลข กจ็ ะเปรยี บเทยี บเปน็ ตวั เลข
•! ค่าเลขฐานสิบหกจะถูกทํ าเป็นเลขฐานสองของตัวอักษรในกรณีที่ไม่ได้ทํ าการเปรียบเทียบ
กับตัวเลข
•! ถ้าอาร์กิวเมนต์ตัวหนึ่งเป็นคอลัมน์ TIMESTAMP หรือ DATETIME และอาร์กิวเมนต์ตัว
อนื่ เปน็ คา่ คงท่ ี คา่ คงที่จะถูกแปลงเป็น timestamp ก่อนที่จะทํ าการเปรยี บเทยี บ
ตัวอย่าง
mysql> SELECT 1 > '6x';
-> 0
mysql> SELECT 7 > '6x';
-> 1
mysql> SELECT 0 > 'x6';
-> 0
mysql> SELECT 0 = 'x6';
-> 1
ตัวกระทํ าเปรียบเทียบ ได้แก่
= : Equal
mysql> select 1 = 0;
-> 0
mysql> select '0' = 0;
-> 1
mysql> select '0.0' = 0;
-> 1
mysql> select '0.01' = 0;
-> 0
mysql> select '.01' = 0.01;
-> 1
<> : != : Not equal
mysql> select '.01' <> '0.01';
-> 1
mysql> select .01 <> '0.01';
-> 0
mysql> select 'zapp' <> 'zappp';
-> 1
<= : Less than or equal
mysql> select 0.1 <= 2;
-> 1
< : Less than
mysql> select 2 <= 2;
-> 1
>= : Greater than or equal
mysql> select 2 >= 2;
-> 1
> : Greater than
mysql> select 2 > 2;
-> 0
<=> : Null safe equal
mysql> select 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1 1 0
IS NULL และ IS NOT NULL
ใช้ตรวจสอบว่าค่าเป็น NULL หรือ NOT NULL
mysql> select 1 IS NULL, 0 IS NULL, NULL IS NULL:
-> 0 0 1
mysql> select 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;
-> 1 1 0
expr BETWEEN min AND max
ถ้า expr มคี า่ มากกว่าหรือเท่ากับค่า min และ expr มีค่าน้อยกว่าหรือเท่ากับค่า max
BETWEEN จะส่งค่า 1 มิฉะนั้นเป็น 0
การเปรียบเทียบแบบนี้มีค่าเท่ากับนิพจน์ (min <= expr AND expr <= max)
mysql> select 1 BETWEEN 2 AND 3;
-> 0
mysql> select 'b' BETWEEN 'a' AND 'c';
-> 1
mysql> select 2 BETWEEN 2 AND '3';
-> 1
mysql> select 2 BETWEEN 2 AND 'x-3';
-> 0
expr IN (value,...)
การเปรียบเทียบนี้จะส่งค่า 1 ถ้า expr คือค่าใดๆ ในรายการที่อยู่ข้างหลังคํ าว่า IN มิฉะนั้นก็จะส่ง
ค่า 0 ตัวอย่าง
mysql> select 2 IN (0,3,5,'wefwf');
-> 0
mysql> select 'wefwf' IN (0,3,5,'wefwf');
-> 1
expr NOT IN (value,...)
มีค่าเท่ากับ NOT (expr IN (value,...)).
ISNULL(expr)
ถ้า expr เป็น NULL, ISNULL() จะส่งค่า 1, มิฉะนั้นจะส่งค่า 0.
mysql> select ISNULL(1+1);
-> 0
mysql> select ISNULL(1/0);
-> 1
COALESCE(list)
สง่ ค่าของตัวแรกในวงเล็บที่ไม่ใช่ NULL ตวั อย่าง
mysql> select COALESCE(NULL,1);
-> 1
mysql> select COALESCE(NULL,NULL,NULL);
-> NULL
INTERVAL(N,N1,N2,N3,...)
ส่งกลับค่า 0 ถ้า N < N1, และ 1 ถ้า N < N2 อาร์กิวเมนต์ทุกตัวจะถูกมองเป็นตัวเลขจํ านวน
เต็ม และมีข้อกํ าหนดว่า N1 < N2 < N3 < ... < Nn เพื่อให้ฟังก์ชันนี้ทํ างานได้อย่างถูกต้อง ตัวอย่าง
mysql> select INTERVAL(23, 1, 15, 17, 30, 44, 200);
-> 3
mysql> select INTERVAL(10, 1, 10, 100, 1000);
-> 2
mysql> select INTERVAL(22, 23, 30, 44, 200);
-> 0
5.3.6 การเปรยี บเทียบสตริง
โดยทั่วไปแล้ว การเปรียบเทียบสตริงจะแบ่งแยกตัวใหญ่ตัวเล็ก
การเปรียบเทียบสตริงจะได้ค่า 0(เท็จ) หรือ 1 (จริง) โดยการใช้ LIKE ในการเปรียบเทียบ คุณ
สามารถใช้อักขระ ตอ่ ไปนใี้ นรปู แบบการเปรยี บเทยี บได้
% แทนตวั อักขระตั้งแต่ศูนย์ตัวขึ้นไป
_ แทนอักขระตัวเดียว
ตัวอย่าง
mysql> select 'David!' LIKE 'David_';
-> 1
mysql> select 'David!' LIKE '%D%v%';
-> 1
ถ้าต้องการเปรียบเทียบอักขระตัวเดียวด้วยการระบุอักขระ ให้ใช้ “\” นํ าหน้าอักขระที่ต้องการจะ
เปรียบเทียบในรูปแบบ
\% แทนอักขระ % หนึ่งตัว
\_ แทนอักขระ _ หนึ่งตัว
ตัวอย่าง
mysql> select 'David!' LIKE 'David\_';
-> 0
mysql> select 'David_' LIKE 'David\_';
-> 1
ในการกํ าหนกอกั ขระ ESCAPE ตัวอื่น ใหใ้ ช้ประโยค ESCAPE ในการก าํ หนด เชน่
mysql> select 'David_' LIKE 'David|_' ESCAPE '|';
-> 1
expr NOT LIKE pat [ESCAPE 'escape-char'] มีความหมายเช่นเดียวกับประโยค
NOT (expr LIKE pat [ESCAPE 'escape-char']).
expr REGEXP pat
expr RLIKE pat
ทั้งสี่ประโยคข้างต้นนี้ ใช้ในการเปรียบเทียบนิพจน์สตริง expr กับรูปแบบ pat RLIKE เป็นคํ า
เหมือนของ REGEXP ใช้ได้กับ mSQL ตัวอย่าง
mysql> select 'Monty!' REGEXP 'm%y%%';
-> 0
mysql> select 'Monty!' REGEXP '.*';
-> 1
mysql> select 'new*\n*line' REGEXP 'new\\*.\\*line';
-> 1
mysql> select "a" REGEXP "A", "a" REGEXP BINARY "A";
-> 1 0
expr NOT REGEXP pat
expr NOT RLIKE pat
มีความหมายเหมือนกับประโยค NOT (expr REGEXP pat).
STRCMP(expr1,expr2)
STRCMP()
จะให้ค่า 0 ถา้ สตรงิ เหมือนกนั ใหค้ า่ -1 ถา้ อาร์กิวเมนต์ตัวแรกมีค่าน้อยกว่าตัวที่สอง มิฉะนั้นได้
ค่า 1 ตัวอย่าง
mysql> select STRCMP('text', 'text2');
-> -1
mysql> select STRCMP('text2', 'text');
-> 1
mysql> select STRCMP('text', 'text');
-> 0
5.3.7 Cast operators
BINARY
ตัวกระทํ า BINARY ใช้ในการกํ าหนดสตริงที่ต่อท้ายให้เป็นเลขฐานสองของสตริง วิธีช่วยให้การ
เปรียบเทียบคอลัมน์เป็นแบบ case sensitive ตัวอย่าง
mysql> select "a" = "A";
-> 1
mysql> select BINARY "a" = "A";
-> 0
5.3.8 ฟังก์ชันควบคุมทิศทางการทํ างาน
IFNULL(expr1,expr2)
ถ้า expr1 ไม่ใช่ NULL, IFNULL() จะให้ค่า expr1, มิฉะนั้นจะให้ค่า expr2. IFNULL() จะให้ค่า ตัว
เลขหรือสตริง ขึ้นอยู่กับว่าใช้แบบไหน ตัวอย่าง
mysql> select IFNULL(1,0);
-> 1
mysql> select IFNULL(0,10);
-> 0
mysql> select IFNULL(1/0,10);
-> 10
mysql> select IFNULL(1/0,'yes');
-> 'yes'
IF(expr1,expr2,expr3)
ถ้า expr1 เป็นจริง (TRUE) โดยที่ (expr1 <> 0 and expr1 <> NULL) แล้ว IF() จะให้ค่า expr2,
มิฉะนั้นจะให้ค่า expr3. IF() จะให้ค่าตัวเลขหรือสตริงขึ้นอยู่กับว่าค่าไหนถูกใช้ ต้วอย่าง
mysql> select IF(1>2,2,3);
-> 3
mysql> select IF(1<2,'yes','no');
-> 'yes'
mysql> select IF(strcmp('test','test1'),'yes','no');
-> 'no'
expr1 ถูกคํ านวนโดยใช้เปน็ เลขจ าํ นวนเตม็ ซงึ่ หมายความวา่ ถา้ คณุ ใชเ้ ปน็ floating-point หรือ
สตริงคุณก็สามารถใช้ฟังก์ชันนี้ด้วยการเปรียบเทียบได้ ตัวอย่าง
mysql> select IF(0.1,1,0);
-> 0
mysql> select IF(0.1<>0,1,0);
-> 1
5.3.9 ฟังก์ชันทางคณิตศาสตร์
ฟงั กช์ นั ทางคณิตศาสตร์ทั้งหมดจะให้ค่าเป็น NULL หากเกดิ ขอ้ ผดิ พลาดขนึ้
- : เครื่องหมายลบ เปลี่ยนค่าเลขลบให้เป็นบวก และเปลี่ยนค่าบวกให้เป็นลบ ตัวอย่าง
mysql> select - 2;
-> -2
ABS(X)
ให้ค่าสัมบูรณ์ของ X ตัวอย่างเช่น
mysql> select ABS(2);
-> 2
mysql> select ABS(-32);
-> 32
SIGN(X)
ให้ค่าบวกหรือลบของอาร์กิวเมนต์ ขึ้นอยู่กับว่าค่านั้นเป็นลบหรือบวก ตัวอย่าง
mysql> select SIGN(-32);
-> -1
mysql> select SIGN(0);
-> 0
mysql> select SIGN(234);
-> 1
MOD(N,M) : %
ให้ค่าเศษจากการหาร N ด้วย M ตัวอย่าง เช่น
mysql> select MOD(234, 10);
-> 4
mysql> select 253 % 7;
-> 1
mysql> select MOD(29,9);
-> 2
FLOOR(X)
ให้ค่าเลขจํ านวนเต็มที่ใหญ่ที่สุดที่ไม่มากเกิน X ตัวอย่างเช่น
mysql> select FLOOR(1.23);
-> 1
mysql> select FLOOR(-1.23);
-> -2
CEILING(X)
ให้ค่าเลขจํ านวนเต็มที่เล็กที่สุดที่ไม่น้อยกว่า X ตัวอย่างเช่น
mysql> select CEILING(1.23);
-> 2
mysql> select CEILING(-1.23);
-> -1
ROUND(X)
ให้ค่าเลขจํ านวนเต็มที่เอา X มาปัดเศษแแล้ว ตัวอย่างเช่น
mysql> select ROUND(-1.23);
-> -1
mysql> select ROUND(-1.58);
-> -2
mysql> select ROUND(1.58);
-> 2
ROUND(X,D)
ให้ค่าเลข X ที่มีจํ านวนทศนิยมเท่ากับ D ตํ าแหน่ง ตัวอย่างเช่น
mysql> select ROUND(1.298, 1);
-> 1.3
mysql> select ROUND(1.298, 0);
-> 1
EXP(X)
ให้ค่าเอกซ์โพเนนเชียลของ X เช่น
mysql> select EXP(2);
-> 7.389056
mysql> select EXP(-2);
-> 0.135335
LOG(X)
ให้ค่าลอการิทึมของ X ตัวอย่างเช่น
mysql> select LOG(2);
-> 0.693147
mysql> select LOG(-2);
-> NULL
LOG10(X)
ให้ค่าลอการิทึมฐาน 10 ของ X ตัวอย่างเช่น
mysql> select LOG10(2);
-> 0.301030
mysql> select LOG10(100);
-> 2.000000
mysql> select LOG10(-100);
-> NULL
POW(X,Y)
POWER(X,Y)
ให้ค่าของ X ยกกํ าลัง Y ตัวอย่างเช่น
mysql> select POW(2,2);
-> 4.000000
mysql> select POW(2,-2);
-> 0.250000
SQRT(X)
ให้ค่าสแคว์รูทของ X ตัวอย่างเช่น
mysql> select SQRT(4);
-> 2.000000
mysql> select SQRT(20);
-> 4.472136
PI()
ให้ค่าของ PI ตัวอย่างเช่น
mysql> select PI();
-> 3.141593
COS(X)
ให้ค่าโคซายของ X, เมื่อ X มีหน่วยเป็นเรเดียน ตัวอย่าง
mysql> select COS(PI());
-> -1.000000
SIN(X)
ให้ค่าซายของ X, เมื่อ X มีหน่วยเป็นเรเดียน ตัวอย่าง
mysql> select SIN(PI());
-> 0.000000
TAN(X)
ให้ค่าแทนของ X, เมื่อ X มีหน่วยเป็นเรเดียน ตัวอย่าง
mysql> select TAN(PI()+1);
-> 1.557408
ACOS(X)
ให้ค่าอาร์คโคซายอง X ตัวอย่าง
mysql> select ACOS(1);
-> 0.000000
mysql> select ACOS(1.0001);
-> NULL
mysql> select ACOS(0);
-> 1.570796
ASIN(X)
ให้ค่าอาร์คซายของ X ตัวอย่างเช่น
mysql> select ASIN(0.2);
-> 0.201358
mysql> select ASIN('foo');
-> 0.000000
ATAN(X)
ให้ค่าอาร์คแทนเจนท์ของ X ตัวอย่าง
mysql> select ATAN(2);
-> 1.107149
mysql> select ATAN(-2);
-> -1.107149
ATAN2(X,Y)
ให้ค่าอาร์คแทนเจนท์ของตัวแปร X และ Y ตัวอย่างเช่น
mysql> select ATAN(-2,2);
-> -0.785398
mysql> select ATAN(PI(),0);
-> 1.570796
COT(X)
ให้ค่าโคแทนเจนท์ของ X ตัวอย่างเช่น
mysql> select COT(12);
-> -1.57267341
mysql> select COT(0);
-> NULL
RAND()
RAND(N)
ให้ค่าเลข floating-point สุ่มในช่วงของ 0 ถึง 1.0 ค่า N ถ้าใส่จะเป็น seed value ตัวอย่างเช่น
mysql> select RAND();
-> 0.5925
mysql> select RAND(20);
-> 0.1811
mysql> select RAND(20);
-> 0.1811
mysql> select RAND();
-> 0.2079
mysql> select RAND();
-> 0.7888
5.3.1.! ฟังก์ชันเกี่ยวกับสตริง
ASCII(str)
Return รหัส ASCII ของตัวอักษรที่อยู่ซ้ายสุดของ string str
Return NULL ถ้า str เป้น empty string
mysql> select ASCII('2');
-> 50
mysql> select ASCII(2);
-> 50
mysql> select ASCII('dx');
-> 100
BIN(N)
Return ค่า Binary ของ N ซึ่ง N สามารถมีค่าได้เท่ากับ BIGINT
Returns NULL ถ้า N เป็น NULL
mysql> select BIN(12);
-> '1100'
OCT(N)
Return ค่า Octal ของ N ซึ่ง N สามารถมีค่าได้เท่ากับ BIGINT
Return NULL ถ้า N เป็น NULL
mysql> select OCT(12);
-> '14'
HEX(N)
Return ค่า Hexadecimal ของ N ซึ่ง N สามารถมีค่าได้เท่ากับ BIGINT
Return NULL ถ้า N เป็น NULL
mysql> select HEX(255);
-> 'FF'
CHAR(N,...)
Return string ของรหัส ASCII N
mysql> select CHAR(77,121,83,81,'76');
-> 'MySQL'
mysql> select CHAR(77,77.3,'77.3');
-> 'MMM'
LENGTH(str)
Return ความยาวของ string str
mysql> select LENGTH('text');
-> 4
LOCATE(substr,str)
POSITION(substr IN str)
Return ตํ าแหน่งของ ตัวอักษรตัวแรกของ substring substr ใน string str.
Return 0 ถ้า substr ไม่อยู่ใน str
mysql> select LOCATE('bar', 'foobarbar');
-> 4
mysql> select LOCATE('xbar', 'foobar');
-> 0
LOCATE(substr,str,pos)
Return ตํ าแหน่งของ ตัวอักษรตัวแรกของ substring substr ใน string str โดยเริ่มค้นหาตั้งแต่
ตํ าแหน่ง pos
Return 0 ถ้า substr ไม่อยู่ใน str
mysql> select LOCATE('bar', 'foobarbar',5);
-> 7
INSTR(str,substr)
เหมือนกบั LOCATE เพยี งแต่สลับที่ argument
Return ตํ าแหน่งของ ตัวอักษรตัวแรกของ substring substr ใน string str
Return 0 ถ้า substr ไม่อยู่ใน str
mysql> select INSTR('foobarbar', 'bar');
-> 4
mysql> select INSTR('xbar', 'foobar');
-> 0
LPAD(str,len,padstr)
Return string str ซงึ่ จะเตมิ ตวั อกั ษรทางซา้ ยของ str ดว้ ยเครื่องหมาย padstr จน string มคี วาม
ยาวเท่ากับ len ตัวอักษร
mysql> select LPAD('hi',4,'??');
-> '??hi'
RPAD(str,len,padstr)
Return string str ซงึ่ จะเติมตัวอักษรทางขวาของ str ดว้ ยเครื่องหมาย padstr จน string มคี วาม
ยาวเท่ากับ len ตัวอักษร
mysql> select RPAD('hi',5,'?');
-> 'hi???'
LEFT(str,len)
Return ตัวอักษรที่อยู่ด้านซ้ายสุดของ string str จํ านวน len ตัวอักษร
mysql> select LEFT('foobarbar', 5);
-> 'fooba'
RIGHT(str,len)
Return ตัวอักษรที่อยู่ด้านขวาสุดของ string str จํ านวน len ตัวอักษร
mysql> select RIGHT('foobarbar', 4);
-> 'rbar'
SUBSTRING(str,pos,len)
SUBSTRING(str FROM pos FOR len)
MID(str,pos,len)
Return string ที่มีความยาวเท่ากับ len ตัวอักษร จาก str เริ่มจากตํ าแหน่ง pos
mysql> select SUBSTRING('Quadratically',5,6);
-> 'ratica'
SUBSTRING(str,pos)
SUBSTRING(str FROM pos)
Returns substring จาก str โดยเริ่มตั้งแต่ตํ าแหน่งที่ pos
mysql> select SUBSTRING('Quadratically',5);
-> 'ratically'
mysql> select SUBSTRING('foobarbar' FROM 4);
-> 'barbar'
LTRIM(str)
Returns str ที่ไม่มีช่องว่างอยู่ด้านหน้า str
mysql> select LTRIM(' barbar');
-> 'barbar'
RTRIM(str)
Returns str ที่ไม่มีช่องว่างอยู่ด้านหลัง str
mysql> select RTRIM('barbar ');
-> 'barbar'
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
Return str ที่ถูกตัดตัวอักษร remstr ที่อยู่ด้านหน้า(LEADIN) หรือ ด้านหลัง (TRAILING) หรือทั้ง 2
ด้านของ str ออกไปแล้ว
mysql> select TRIM(' bar ');
-> 'bar'
mysql> select TRIM(LEADING 'x' FROM 'xxxbarxxx');
-> 'barxxx'
mysql> select TRIM(BOTH 'x' FROM 'xxxbarxxx');
-> 'bar'
mysql> select TRIM(TRAILING 'xyz' FROM 'barxxyz');
-> 'barx'
LCASE(str)
LOWER(str)
Return str ทเี่ ปน็ ตัวอักษรพิมพ์เล็กทั้งหมด
mysql> select LCASE('QUADRATICALLY');
-> 'quadratically'
UCASE(str)
UPPER(str)
Return str ทเี่ ปน็ ตัวอักษรพิมพ์เล็กทั้งหมด
mysql> select UCASE('Hej');
-> 'HEJ'
5.3.2.! ฟงั กช์ นั่ เกยี่ วกบั วนั ที่ และ เวลา
DAYOFMONTH(date)
Return วันที่ใน 1 เดือน (1 ถึง 31)
mysql> select DAYOFMONTH('1998-02-03');
-> 3
DAYOFYEAR(date)
Return วันที่ ใน 1 ปี (1 ถึง 366)
mysql> select DAYOFYEAR('1998-02-03');
-> 34
MONTH(date)
Return เดือนที่ใน 1 ปี (1 ถึง 12)
mysql> select MONTH('1998-02-03');
-> 2
DAYNAME(date)
Return ชื่อวัน ใน 1 อาทิตย์
mysql> select DAYNAME("1998-02-05");
-> 'Thursday'
MONTHNAME(date)
Return ชื่อเดือน
mysql> select MONTHNAME("1998-02-05");
-> 'February'
YEAR(date)
Return ปีสํ าหรับวันที่ ซึ่งอยู่ในช่วง 1000-9999
mysql> select YEAR('98-02-03');
-> 1998
HOUR(time)
Return ชั่วโมง จาก 0 ถึง 23
mysql> select HOUR('10:05:03');
-> 10
MINUTE(time)
Return นาที จาก 0 ถึง 59
mysql> select MINUTE('98-02-03 10:05:03');
-> 5
SECOND(time)
Return วินาที จาก 0 ถึง 59
mysql> select SECOND('10:05:03');
-> 3
DATE_FORMAT(date,format)
รูปแบบของวันที่ที่ MySQL สามารถแสดงได้ ซึ่งใช้ string ในตารางข้างล่างเป็นตัวกํ าหนดรูปแบบ
%M Month name (January..December)
%W Weekday name (Sunday..Saturday)
%D Day of the month with english suffix (1st, 2nd, 3rd, etc.)
%Y Year, numeric, 4 digits
%y Year, numeric, 2 digits
%X Year for the week where Sunday is the first day of the week, numeric, 4 digits, used with '%V'
%x Year for the week, where Monday is the first day of the week, numeric, 4 digits, used with '%v'
%a Abbreviated weekday name (Sun..Sat)
%d Day of the month, numeric (00..31)
%e Day of the month, numeric (0..31)
%m Month, numeric (01..12)
%c Month, numeric (1..12)
%b Abbreviated month name (Jan..Dec)
%j Day of year (001..366)
%H Hour (00..23)
%k Hour (0..23)
%h Hour (01..12)
%I Hour (01..12)
%l Hour (1..12)
%i Minutes, numeric (00..59)
%r Time, 12-hour (hh:mm:ss [AP]M)
%T Time, 24-hour (hh:mm:ss)
%S Seconds (00..59)
%s Seconds (00..59)
%p AM or PM
%w Day of the week (0=Sunday..6=Saturday)
%U Week (0..53), where Sunday is the first day of the week
%u Week (0..53), where Monday is the first day of the week
%V Week (1..53), where Sunday is the first day of the week. Used with '%X'
%v Week (1..53), where Monday is the first day of the week. Used with '%x'
%% A literal `%'.
ตัวอย่าง
mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
-> 'Saturday October 1997'
mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
-> '22:23:00'
mysql> select DATE_FORMAT('1997-10-04 22:23:00',
'%D %y %a %d %m %b %j');
-> '4th 97 Sat 04 10 Oct 277'
mysql> select DATE_FORMAT('1997-10-04 22:23:00',
'%H %k %I %r %T %S %w');
-> '22 22 10 10:23:00 PM 22:23:00 00 6'
mysql> select DATE_FORMAT('1999-01-01', '%X %V');
-> '1998 52'
TIME_FORMAT(time,format)
ใช้เหมือนกับ DATE_FORMAT แต่ใช้บอกเวลา
CURDATE()
CURRENT_DATE
Return วันที่ปัจจุบัน
mysql> select CURDATE();
-> '2000-02-05'
CURTIME()
CURRENT_TIME
Return เวลาปัจจุบัน
mysql> select CURTIME();
-> '23:50:26'
mysql> select CURTIME() + 0;
-> 235026
NOW()
SYSDATE()
CURRENT_TIMESTAMP
Return ทั้งวันที่ และ เวลา ในรูปแบบ 'YYYY-MM-DD HH:MM:SS' หรือ YYYYMMDDHHMMSS
mysql> select NOW();
-> '2000-02-05 23:50:26'
mysql> select NOW() + 0;
-> 20000205235026
5.4.! CREATE DATABASE syntax
รูปแบบของคํ าสั่ง CREATE DATABASE มีดังนี้
CREATE DATABASE db_name
สํ าหรับ MySQL , database จะถูกสร้างเป็น directory อยู่ภายใต้ data directory ของ MySQL ซึ่ง file ใน
directory ก็คือ table ใน database นั่นเอง.
5.5.! DROP DATABASE syntax
รูปแบบคํ าสั่ง DROP DATABASE มีดังนี้
DROP DATABASE [IF EXISTS] db_name
Drop database เป็นการลบทุกๆ ตารางใน database และ ลบ database ด้วย ค่าที่ส่งกลับมาจากคํ าสั่ง drop
database คือ จํ านวน file ที่ถูกลบจาก database directory ซึ่งโดยปกติแล้ว จํ านวน file ที่ถูกลบจะเท่ากับ 3
เท่าของจํ านวนตาราง นั่นคือ 1 ตาราง จะประกอบด้วย file นามสกุล .MYD , .MYI และ .frm
5.6.! CREATE TABLE syntax
รูปแบบคํ าสั่งของการสร้างตารางด้วยคํ าสั่ง CREATE TABLE มีดังนี้
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)]
[table_options] [select_statement]
รูปแบบของ create_definition ได้แก่
col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
[PRIMARY KEY] [reference_definition]
หรือ PRIMARY KEY (index_col_name,...)
หรือ KEY [index_name] (index_col_name,...)
หรือ INDEX [index_name] (index_col_name,...)
หรือ UNIQUE [INDEX] [index_name] (index_col_name,...)
หรือ [CONSTRAINT symbol] FOREIGN KEY index_name (index_col_name,...)
[reference_definition]
หรือ CHECK (expr)
รูปแบบของ type ได้แก่
TINYINT[(length)] [UNSIGNED] [ZEROFILL]
หรือ SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
หรือ MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
หรือ INT[(length)] [UNSIGNED] [ZEROFILL]
หรือ INTEGER[(length)] [UNSIGNED] [ZEROFILL]
หรือ BIGINT[(length)] [UNSIGNED] [ZEROFILL]
หรือ REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
หรือ DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
หรือ FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
หรือ DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL]
หรือ NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL]
หรือ CHAR(length) [BINARY]
หรือ VARCHAR(length) [BINARY]
หรือ DATE
หรือ TIME
หรือ TIMESTAMP
หรือ DATETIME
หรือ TINYBLOB
หรือ BLOB
หรือ MEDIUMBLOB
หรือ LONGBLOB
หรือ TINYTEXT
หรือ TEXT
หรือ MEDIUMTEXT
หรือ LONGTEXT
หรือ ENUM(value1,value2,value3,...)
หรือ SET(value1,value2,value3,...)
รูปแบบของ index_col_name:
col_name [(length)]
รูปแบบของ reference_definition:
REFERENCES tbl_name [(index_col_name,...)]
[MATCH FULL | MATCH PARTIAL]
[ON DELETE reference_option]
[ON UPDATE reference_option]
รูปแบบ reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
รูปแบบของ table_options:
TYPE = {ISAM | MYISAM | HEAP}
หรือ AUTO_INCREMENT = #
หรือ AVG_ROW_LENGTH = #
หรือ CHECKSUM = {0 | 1}
หรือ COMMENT = "string"
หรือ MAX_ROWS = #
หรือ MIN_ROWS = #
หรือ PACK_KEYS = {0 | 1}
หรือ PASSWORD = "string"
หรือ DELAY_KEY_WRITE = {0 | 1}
หรือ ROW_FORMAT= { default | dynamic | static | compressed }
รูปแบบของ select_statement:
[IGNORE | REPLACE] SELECT ... (Some legal select statement)
CREATE TABLE ใช้ในการสร้างตารางตามชื่อที่กํ าหนดไว้ในฐานข้อมูลที่กํ าลังเปิดอยู่ กฏการตั้งชื่อตาราง
อนญุ าตใิ หต้ งั้ ชอื่ ที่มีความยาวได้ไม่เกิน 64 ตัวอักษร และห้ามใช้อักขระ “/” หรือ “.” ในชื่อตาราง อาจเกดิ ขอ้
ความแสดงข้อผิดพลาดได้ถ้าตารางอ้างถึงไม่ได้อยู่ในฐานข้อมูลปัจจุบัน
ใน MySQL 3.22 หรือหลังจากนั้น ชื่อตารางสามารถถูกกํ าหนดเป็น db_name.tbl.name วิธีนี้ใช้ได้ทั้งฐาน
ข้อมูลที่เปิดอยู่และที่ยังไม่ได้เปิด ใน MySQL 3.23 คุณสามารถใช้ Keyword ชั่วคราวตอนสร้างตารางได้
ตารางชั่วครางจะถูกลบโดยอัตโนมัติถ้าการเชื่อมต่อมีปัญหาและในการเชื่อมต่อแต่ละครั้งชื่อถูกใช้เฉพาะใน
การเชอื่ มตอ่ ครงั้ นนั้ ๆ หมายความว่าการเชื่อมต่อสองครั้งที่ต่างกันจะสามารถใช้ชื่อตารางชั่วคราวที่เหมือน
กนั ไดโ้ ดยไมเ่ กดิ การซ้ํ าซอ้ น คือตารางที่มีอยู่จะถูกซ่อนไว้จนกว่าตารางชั่วคราวจะถูกลบ ดังนั้นตารางชั่ว
คราวจึงสามารถมีชื่อซํ้ ากับตารางที่มีอยู่แล้วได้
ใน MySQL 3.23 หรอื หลงั จากนนั้ คุณสามารถใช  keyword IF NOT EXISTS ในการก าํ จดั ขอ้ ผดิ พลาดถา้
หากวา่ มตี ารางนนั้ อย ู่ สงั เกตวา่ ไม่มีการตรวจสอบวา่ โครงสรา้ งตารางเหมอื นกนั หรอื ไม่ แต่ละตาราง
tbl_name ถูกแทนด้วยบางไฟล์ในไดเรกทอรีฐานข้อมูล ตัวอย่าง ตารางชนิด MyISAM จะมี
ไฟล์ จุดมุ่งหมาย
tbl_name.frm Table definition (form) file
tbl_name.MYD Data file
tbl_name.MYI Index file
สํ าหรับข้อมูลเพิ่มเติมในเรื่องคุณสมบัติของคอลัมน์ชนิดต่างๆ กัน อ่านได้ในหัวข้อ Column types
5.7.! ALTER TABLE syntax
รูปแบบคํ าสั่งของ ALTER TABLE เป็นดังนี้
ALTER [IGNORE] TABLE tbl_name alter_spec [, alter_spec ...]
รูปแบบของ alter_specification:
ADD [COLUMN] create_definition [FIRST | AFTER column_name ]
หรือ ADD INDEX [index_name] (index_col_name,...)
หรือ ADD PRIMARY KEY (index_col_name,...)
หรือ ADD UNIQUE [index_name] (index_col_name,...)
หรือ ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
หรือ CHANGE [COLUMN] old_col_name create_definition
หรือ MODIFY [COLUMN] create_definition
หรือ DROP [COLUMN] col_name
หรือ DROP PRIMARY KEY
หรือ DROP INDEX index_name
หรือ RENAME [AS] new_tbl_name
หรือ table_options
ALTER TABLE ใช้ในการเปลี่ยนแปลงโครงสร้างของตารางที่มีอยู่ ตัวอย่างเช่น คุณสามารถจะเพิ่มหรือลบ
คอลัมน์ สร้างหรือทํ าลายดรรชนี เปลี่ยนชนิดของคอลัมน์ที่มีอยู่แล้ว หรือเปลี่ยนชื่อคอลัมน์หรือแม้แต่ชื่อ
ตารางเอง คณุ สามารถเปลยี่ นคอมเมนตข์ องตารางและชนดิ ของตารางไดด้ ว้ ย
ถ้าคุณใช้ ALTER TABLE ในการเปลี่ยนข้อกํ าหนดของคอลัมน์แต่ DESCRIBE tbl_name กํ าหนดไว้ว่า
คอลัมน์ของคุณต้องไม่ถูกเปลี่ยนแปลงใดๆ ก็เป็นไปได้ที่ MySQL จะไม่เปลี่ยนแปลงคอลัมน์ให้ตามคํ าสั่ง
ของคุณ ยกตัวอย่าง ถ้าคุณพยายามจะเปลี่ยนตัวแปรแบบ VARCHAR ไปเป็น CHAR MySQL จะยังคง
ใช้ VARCHAR ถา้ ตารางมีคอลัมน์ที่ความยาวสามารถแปรผันได้
ALTER TABLE ทํ างานโดยการสร้างชุดจํ าลองชั่วคราวของตารางต้นแบบ การเปลี่ยนแปลงจะถูกทํ าบนชุด
จํ าลองนี้ จากนั้นตารางต้นแบบจะถูกลยและเปลี่ยนชื่อตารางใหม่ให้เหมือนอันเด่า ดังนั้นการปรับปรุงใดๆ
จะถูกประยุกต์โดยตรงกับตารางใหม่นี้โดยไร้ข้อผิดพลาดใดๆ ทั้งสิ้น ขณะที่ ALTER TABLE กํ าลังทํ างาน
ตารางตน้ แบบจะถกู อา่ นโดยไคลเอนทอ์ นื่ ๆ การปรบั ปรงุ และการเขยี นลงตารางจะถกู หยดุ ไวจ้ นกวา่ ตาราง
ใหม่จะพร้อมใช้
•! ในการใช้ ALTER TABLE คุณจํ าเป็นใช้ select, insert, delete, update, create และ drop กับตาราง
•! IGNORE เป็นส่วนขยายของ MySQL บน ANSI SQL92 ถกู ใชใ้ นการควบคมุ วา่ ALTER TABLE จะ
ทํ างานได้อย่างไร ถ้ามีการซํ้ าซ้อนของคีย์หลักในตารางใหม่ ถ้าไม่มีการระบุ IGNORE ตารางจํ าลอง
จะถูกยกเลิกและการเปลี่ยนแปลงใดก็จะสูญหาย แต่ถ้ามีการระบุ IGNORE แถวที่มีการซํ้ าซ้อนบนคีย์
หลักจะถูกเลือกเฉพาะแถวแรก ส่วนแถวอื่นถูกลบ
•! คณุ สามารถใช้ประโยค ADD, ALTER, DROP และ CHANGE ไดห้ ลายประโยคในประโยค ALTER
TABLE ประโยคเดียว
•! MODIFY เป็นส่วนขยายของ ORACKE ที่ใช้กับ ALTER TABLE
•! คณุ สามารถเปลี่ยนชื่อคอลัมน์โดยใช้ประโยค CHANGE old_col_name create_definition ในการท าํ
เช่นนี้ต้องกํ าหนดชื่อคอลัมน์เก่าและใหม่และชนิดของคอลัมน์ปัจจุบันไว้ด้วย ดัวอย่าง
เมื่อต้องการเปลี่ยนชื่อคอลัมน์จาก a เป็น b
mysql> ALTER TABLE t1 CHANGE a b INTEGER;
เมอื่ ตอ้ งการเปลยี่ นชนดิ คอลมั นแ์ ตค่ งชอื่ เดมิ
mysql> ALTER TABLE t1 CHANGE a b INTEGER;
ใน MySQL 3.22.16a คุณสามรถใช้ MODIFY ในการเปลี่ยนชนิดคอลัมน์โดยไม่ต้องเปลี่ยนชื่อ
mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
•! ใน MySQL 3.22 หรือหลังจากนั้น คุณสามารถใช้ FIRST หรือ ADD … AFTER col_name ในการเพิ่ม
คอลัมน์ ณ ตํ าแหน่งที่ต้องการภายในตาราง
5.8.! DROP TABLE syntax
รูปแบบของคํ าสั่ง DROP TABLE เป็นดังนี้
DROP TABLE [IF EXISTS] tbl_name [, tbl_name,...]
DROP TABLE ใช้ในการลบตารางได้มากกว่าหนึ่ง ข้อมูลทั้งหมดในตารางและข้อกํ าหนดต่างๆในตารางจะ
ถูกลบ ดังนั้นจึงควรระวังเมื่อใช้คํ าสั่งนี้
ใน MySQL 3.22 หรือหลังจากนั้น คุณสามารถใช้ keyword IF EXISTS เพื่อเป็นการป้องกันข้อผิดพลาด
อันจะเกิดจากกรณีที่ไม่มีตารางนั้นอยู่จริง
5.9.! DELETE syntax
รูปแบบคํ าสั่ง DELETE มีดังนี้
DELETE [LOW_PRIORITY] FROM tbl_name [WHERE where_definition] [LIMIT rows]
DELETE จะทํ าการลบแถวจาก tbl_name ทกี่ าํ หนดไวใ้ นเงอื่ นไขใน where_condition และส่งกลับจ าํ นวน
เรคคอรด์ ทถี่ กู ลบ ถ้าคุณใช้คํ าสงั่ DELETE โดยไม่มีประโยค WHERE แถวทงั้ หมดจะถูกลบ
DELETE deletes rows from tbl_name that satisfy the condition given by where_definition, and
returns the number of records deleted.
5.10.! SELECT syntax
รูปแบบของคํ าสั่ง SELECT มีดังนี้
SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY]
[DISTINCT | DISTINCTROW | ALL]
select_expression,...
[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
[FROM table_references
[WHERE where_definition]
[GROUP BY col_name,...]
[HAVING where_definition]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...]
[LIMIT [offset,] rows]
[PROCEDURE procedure_name] ]
SELECT ใช้ในการค้นหาแถวข้อมูลจากตารางที่ต้องการ select_expression ใช้ในการกํ าหนดคอลัมน์ที่
ต้องการจะค้นหา SELECT อาจจะใช้ในการค้นหาแถวโดยไม่ต้องอ้างถึงตารางใดเลยก็ได้ ต้วอ
หัวข้อ: Re: Mysql
เริ่มหัวข้อโดย: doramon ที่ ตุลาคม 15, 2007, 20:38:04 PM
ASCII()    Return numeric value of left-most character
BIN()    Return a string representation of the argument
BIT_LENGTH()    Return length of argument in bits
CHAR_LENGTH()    Return number of characters in argument
CHAR()    Return the character for each integer passed
CHARACTER_LENGTH()    A synonym for CHAR_LENGTH()
CONCAT_WS()    Return concatenate with separator
CONCAT()    Return concatenated string
CONV()    Convert numbers between different number bases
ELT()    Return string at index number
<=>    NULL-safe equal to operator
=    Equal operator
EXPORT_SET()    Return a string such that for every bit set in the value bits, you get an on string and for every unset bit, you get an off string
FIELD()    Return the index (position) of the first argument in the subsequent arguments
FIND_IN_SET()    Return the index position of the first argument within the second argument
FORMAT()    Return a number formatted to specified number of decimal places
>=    Greater than or equal operator
>    Greater than operator
HEX()    Return a string representation of a hex value
INSERT()    Insert a substring at the specified position up to the specified number of characters
INSTR()    Return the index of the first occurrence of substring
IS NULL    NULL value test
IS    Test a value against a boolean
LCASE()    Synonym for LOWER()
LEFT()    Return the leftmost number of characters as specified
LENGTH()    Return the length of a string in bytes
<=    Less than or equal operator
<    Less than operator
LIKE    Simple pattern matching
LOAD_FILE()    Load the named file
LOCATE()    Return the position of the first occurrence of substring
LOWER()    Return the argument in lowercase
LPAD()    Return the string argument, left-padded with the specified string
LTRIM()    Remove leading spaces
MAKE_SET()    Return a set of comma-separated strings that have the corresponding bit in bits set
MID()    Return a substring starting from the specified position
!=, <>    Not equal operator
NOT LIKE    Negation of simple pattern matching
NOT REGEXP    Negation of REGEXP
OCT()    Return a string representation of the octal argument
OCTET_LENGTH()    A synonym for LENGTH()
ORD()    If the leftmost character of the argument is a multi-byte character, returns the code for that character
POSITION()    A synonym for LOCATE()
QUOTE()    Escape the argument for use in an SQL statement
REGEXP    Pattern matching using regular expressions
REPEAT()    Repeat a string the specified number of times
REPLACE()    Replace occurrences of a specified string
REVERSE()    Reverse the characters in a string
RIGHT()    Return the specified rightmost number of characters
RLIKE    Synonym for REGEXP
RPAD()    Append string the specified number of times
RTRIM()    Remove trailing spaces
SOUNDEX()    Return a soundex string
SOUNDS LIKE(v4.1.0)    Compare sounds
SPACE()    Return a string of the specified number of spaces
STRCMP()    Compare two strings
SUBSTRING_INDEX()    Return a substring from a string before the specified number of occurrences of the delimiter
SUBSTRING(), SUBSTR()    Return the substring as specified
TRIM()    Remove leading and trailing spaces
UCASE()    Synonym for UPPER()
UNHEX()(v4.1.2)    Convert each pair of hexadecimal digits to a character
UPPER()    Convert to uppercase