มายเอสคิวแอล (mysql, mariadb)
Northwind | HTML | JavaScript | Function | Datatype
ความหมาย
เอสคิวแอล (SQL = Structured Query Language) คือ ภาษาสอบถามข้อมูล หรือภาษาจัดการข้อมูลอย่างมีโครงสร้าง มีการพัฒนาภาษาคอมพิวเตอร์ และโปรแกรมฐานข้อมูลที่รองรับมากมาย เพราะจัดการข้อมูลได้ง่าย เช่น MySQL, MariaDB, MsSQL, PostgreSQL หรือ MS Access เป็นต้น สำหรับโปรแกรมฐานข้อมูลที่ได้รับความนิยมคือ MySQL หรือ MariaDB เป็น Open Source ที่ใช้งานได้ทั้งใน Linux และ Windows
การแยกทางของ MySQL สู่ MariaDB
26 ก.พ.2008 Sun Microsystems ซื้อ MySQL AB $1 Billion ต่อมาได้มีการทำข้อตกลงเมื่อ 20 เม.ย.2009 แล้วดำเนินการต่อเนื่องจนเสร็จสมบูรณ์เมื่อ 27 ม.ค.2010 เป็นผลให้Oracle เป็นเจ้าของ Sun Microsystems ด้วยวงเงิน $5.6 Billion แล้วนักพัฒนาก็เริ่มเห็นว่า MySQL เริ่มถอยห่างจากการเป็น Open Source มากขึ้น จึงหันไปหา Maria DB ด้วยหลายเหตุผล และเหตุผลหนึ่งคือผลการพัฒนาทำให้ MariaDB มีสถิติแซง MySQL AB อย่างต่อเนื่อง
ระบบฐานข้อมูล (Database System) คือ ระบบที่รวบรวมข้อมูลที่เกี่ยวข้องกันเข้าไว้ด้วยกันอย่างเป็นระบบ มีความสัมพันธ์ระหว่างข้อมูลที่ชัดเจน มองเห็นเป็นตาราง เป็นระเบียน เป็นเขตข้อมูลที่มีความสัมพันธ์ระหว่างกัน เปิดให้สามารถใช้งานดูแลจัดการข้อมูลได้อย่างมีประสิทธิภาพ ซึ่งมีซอฟต์แวร์เป็นสื่อกลางระหว่างผู้ใช้และโปรแกรมเพื่อจัดการและใช้งานระบบฐานข้อมูล
ระบบจัดการฐานข้อมูล (DBMS = DataBase Management System) คือ ระบบที่ช่วยให้ผู้ใช้เข้าบริหารจัดการข้อมูลได้ง่าย และมีประสิทธิภาพ มีบริการสร้างฐานข้อมูล สร้างตาราง เพิ่มลบแก้ไขข้อมูลในตาราง และตั้งคำถามเรียกข้อมูลมาใช้ โดยไม่จำเป็นต้องเขียนโปรแกรมจัดการโครงสร้างของข้อมูลด้วยตนเอง

สิ่งที่ควรเข้าใจก่อนใช้ MySQL
- เครื่องบริการเว็บ (Web Server) เช่น Apache, IIS หรือ PWS
- โปรแกรมประมวลผลฝั่งเครื่องบริการ (Server-Side Script)
เช่น Perl, PHP, ASP, VB และ JSP เป็นต้น
- ระบบปฏิบัติการ เช่น Windows หรือ Linux เป็นต้น
- จะช่วยให้เข้าใจ MySQL ก็ควรศึกษาด้านฐานข้อมูลก่อน
แหล่ง Download MySQL
http://www.mysql.com/downloads/ ซึ่งมีให้เลือกหลายรุ่น แต่ถ้าใช้ Redhat หรือ Fedora หรือ Linux SIS ขอแนะนำว่าไม่ต้องไปหาที่อื่น เพราะ pre-install มาแล้ว แต่ถ้าใช้ Windows ต้อง download MySQL ในรุ่นที่เหมาะสมกับการนำไปใช้


utf8 และ unicode กรณี 1. ถ้า export ข้อมูลจาก mysql ด้วย phpmyadmin หากเปิดด้วย wordpad หรือ editplus จะอ่านไม่ออกดังภาพด้านล่าง แต่ถ้าเปิดด้วย notepad หรือ microsoft word จะไม่พบปัญหา หากต้องการเปิดด้วย editplus อาจใช้วิธี save as จาก notepad แล้วเลือก encoding เป็น unicode แฟ้มที่ได้มา ก็จะเปิดด้วย wordpad หรือ editplus ได้ มีตัวอย่างแฟ้ม testtb_utf8.sql (มีปัญหา) และ testtb_unicode.sql (แก้ไขแล้ว)
กรณี 2. ผม export ตารางทั้งหมดจาก wordpress มาเป็นแฟ้ม .sql แต่ import เข้าไปใน wordpress อีกครั้งก็จะพบ ??? แทนภาษาไทยที่ควรเป็น จึงแก้ไขด้วยการ 1) เปิดแฟ้ม .sql ด้วย MS Word 2003 เมื่อถาม Conversion ก็ให้แปลงเป็น Unicode(UTF8) 2) ตรวจว่า create table มีคำว่า DEFAULT CHARSET=utf8 อยู่หลัง ENGINE=MyISAM หรือไม่ ถ้าไม่มีก็ต้องเพิ่มเข้าไป 3) แล้ว Save As เป็นแฟ้มใหม่ เปลี่ยนเป็น text encoding=windows ก่อนจัดเก็บ 4) เปิดแฟ้มใหม่ด้วย editplus หรือ wordpad ก็จะอ่านภาษาไทยได้ และแฟ้มที่ได้น่าจะมีขนาดเล็กกว่าเดิม 5) เมื่อ import ผ่าน phpmyadmin ให้ใช้ Character set of the file = tis620 เมื่อเลือก เปิด(browser) ก็จะอ่านภาษาไทยได้ 6) จากนั้นไปแก้แฟ้ม wp-config.php โดยเพิ่ม define('DB_CHARSET', 'utf8'); มีผลให้อ่านภาษาไทยที่ restore DB จากระบบอื่นเข้าไปได้ 7) เปิดหน้าแรกของ blog ก็จะพบ category หรือบันทึกทางขาวเป็นภาษาไทยตามปกติ (wordpress)
กรณี 3. เพื่อนต้องการส่งอีเมล โดยใช้ข้อมูลจาก server ของเขา ซึ่งเก็บใน mysql และส่งมายัง stmp server ของผม แต่ server ของเขาเก็บข้อมูลเป็น UTF-8 จึงต้องแปลงเป็น TIS-620 ก่อนส่งออกไป ก็ใช้ฟังก์ชัน iconv ตามนี้ echo iconv("UTF-8", "TIS-620", $msg);
สารบัญ (Contents)
1. เข้าไปใน MySQL ผ่าน command prompt เบื้องต้น
2. เข้าไปใน MySQL ผ่าน command prompt ปรับปรุงข้อมูล
3. select แบบต่าง ๆ
4. โปรแกรม phpMyAdmin สำหรับจัดการ MySQL (phpMyAdmin.net)
    4.1 ตัวอย่างการ config ให้ใช้งาน phpMyAdmin
    4.2 ตัวอย่างการ config เมื่อมีรหัสผู้ใช้สำหรับเข้าใช้ MySQL
    4.3 php4 กับ mysql4 อาจมีปัญหา
    4.4 แสดงรายชื่อตารางในฐานข้อมูลชื่อ b
    4.5 แสดงรายชื่อ field ในตาราง orderd ของฐานข้อมูลชื่อ b
    4.6 รับคำแนะนำจาก kemmmx@hotmail.com, khem@wassana.com (รหัสผ่าน และ remote access)
    4.7 ปัญหาที่ผมไม่พยายามแก้ต่อไป คือ การใช้ phpMyAdmin แบบ http
    4.8 แก้ปัญหาภาษาไทยเป็น ??? เมื่ออ่านข้อมูลจาก MySQL
5. โปรแกรม MySQL-Front สำหรับจัดการ MySQL จาก http://www.MySQLFront.de
6. ภาษาสำหรับจัดการ MySQL เช่น php, asp, perl หรือ jsp เป็นต้น
7. ทริกเกอร์ (Triggers) ตั้งเงื่อนไขจัดการข้อมูล
Source Script : memmysql.php คือ ระบบรับสมาชิกอย่างง่าย
โปรแกรมที่สั่งเปิดบริการ MySQL ก่อนที่จะใช้ phpmyadmin หรือ php script เข้าไปจัดการข้อมูล
mysqld : Compiled with full debugging and automatic memory allocation checking, and InnoDB and BDB tables.
mysqld-opt : Optimized binary. From version 4.0 on, InnoDB is enabled.
mysqld-nt : Optimized binary for Windows NT, 2000, and XP with support for named pipes.
mysqld-max : Optimized binary with InnoDB and BDB support.
mysqld-max-nt : Like mysqld-max, but compiled with support for named pipes.

Download โปรแกรมสนับสนุนการเชื่อมต่อเข้ามาใน MySQL
MySQL Connector/Net -- for connecting to MySQL from .NET
+ MySQL Connector/Net 5.1 -- Release Candidate
+ MySQL Connector/Net 5.0 -- Generally Available (GA) release
Connector/ODBC - MySQL ODBC driver
+ Connector/ODBC 5.1 -- Alpha release
+ Connector/ODBC 3.51 -- Generally Available (GA) release
รูปแบบการเลือก ย่อมต่างกันไป ตามเป้าหมาย คำสั่ง SQL - MySQL JOIN Types ของ Steve Stedman
สามารถชวนให้ อุปมา ว่า 13 select ก็เหมือน 13 เรื่องราว
ที่ย่อมแตกต่างกันไป ตามเป้าหมาย วัตถุประสงค์ และผลลัพธ์
อุปไมย ว่า ในสังคมอาจมีคน 13 รูปแบบ
แต่ละรูปแบบมีที่มา ที่ไป เหตุผล และประสบการณ์แตกต่างกัน
ดังนั้น รูปแบบคำสั่ง หรือค่าตัวแปรต่างกัน
ย่อมให้ผลลัพธ์ที่ผิดหรือถูก ตามวัตถุประสงค์ที่ต่างกัน
หรือตามความรู้สึก ความเชื่อ เหตุผล จริยธรรรม สังคม และเป้าประสงค์
facebook.com/mltutblogs/posts/432782475106215
stevestedman.com/2015/03/mysql-join-types-poster/
ต.ย.คำสั่ง SQL อย่างง่าย
- สอนอย่างง่ายใน แบบสอบถาม(Query) แล้วให้ประมวลผล เห็นผลทันที
create table a (a1 int, a2 char(20));
insert into a values (1, "abc");
insert into a (a2, a1) values ("abc",1);
select * from a;
delete from a where a1=1;
update a set a2="a",a3=123 where a1=1and a4=2;
select * from a order by a2;

ต.ย.คำสั่ง SQL สร้างตารางแบบค่าก่อน
create table b (b1 int primary key auto_increment);
alter table a auto_increment=101
insert into a (b) values (123);
insert into a (b) values (456);
select * from a; ผลคือ 101,123 และ 102,456

ต.ย.คำสั่ง SQL ตรวจตารางข้อมูลที่มีปัญหา
use test; show tables;
check table empl, salary;
repair table salary;

แก้ไข variables ใน my.ini
set-variable=key_buffer=64M
set-variable=sort_buffer=4M
ตัวอย่าง Command Line
c:\mysql\bin>mysql
c:\mysql\bin>mysql -u root -pxxx
c:\mysql\bin>mysql -?
c:\mysql\bin>mysqld-nt
c:\mysql\bin>mysqld-nt --console
c:\mysql\bin>mysqladmin -u root shutdown
c:\mysql\bin>mysqladmin status
c:\mysql\bin>mysqladmin ping
c:\mysql\bin>mysqladmin variables
c:\mysql\bin>mysqld-nt -install
c:\mysql\bin>mysqld-nt -remove
c:\mysql\bin>mysqlcheck -V
c:\mysql\bin>net start
c:\mysql\bin>net start mysql
c:\mysql\bin>net stop mysql

ตัวอย่าง subquery ใน SQL
เตรียมความพร้อม
1. จงนำเข้าตารางทั้ง 8 เข้าฐานข้อมูล northwind ผ่านโปรแกรม phpmyadmin
sql : northwindwithsqlfile.zip
2. เลือกใช้แฟ้ม northwindfromphpmyadmin.sql
3. ศึกษาคำสั่ง SQL เพื่อเลือกข้อมูลมาแสดง ตามโปรแกรมต่อไปนี้
php script : northwind.php
ตัวอย่างที่ 1 - in subquery
1. จงแสดงรายการสั่งซื้อละเอียด ที่จำนวนสินค้าในสต๊อก = 0 เรียงตามรหัสสินค้า ตัวอย่างผลลัพธ์จะแสดง 160 รายการ (case 16)
SELECT * FROM `order details` WHERE productid in
(SELECT productid FROM products WHERE unitsinstock = 0) ORDER BY productid

ตัวอย่างที่ 2 - from subquery
2.1 จงแสดงจำนวนรายการสินค้าตามข้อมูลในรายการสั่งซื้อละเอียด ที่ราคาต่อหน่วย มากกว่า 50 ตัวอย่างผลลัพธ์จะแสดงรายการเดียว คือ 7
SELECT COUNT(proid) FROM
(SELECT DISTINCT productid AS proid FROM `order details` WHERE Unitprice > 50) AS listorder

2.2 จงแสดงรหัสสินค้า ราคา ปริมาณสั่งซื้อ และส่วนลด ตามข้อมูลในรายการสั่งซื้อละเอียด ที่ราคาต่อหน่วย มากกว่า 50 เรียงตาม Unitprice จากมากไปน้อย ตัวอย่างผลลัพธ์จะแสดง 163 รายการ พบว่า unitprice เป็นราคาก่อนลด แต่ unitprice แตกต่างกันได้ตามช่วงเวลาที่สั่งซื้อ
SELECT productid as proid , Unitprice, Quantity, Discount FROM `order details` WHERE unitprice > 50 ORDER BY unitprice DESC
แนะนำเว็บ (Web Guides) - http://dev.mysql.com/doc/refman/5.0/en/string-functions.html ตัวอย่างฟังก์ชัน เช่น left, ucase
- http://www.mysql.org :: Official of MySQL in OSDN group
- http://www.phpmyadmin.net :: เป็นโปรแกรมที่ใช้จัดการกับฐานข้อมูล MySQL
- http://www.thaiall.com/webserver :: เนื้อหาเน้นด้านการติดตั้ง Server แบบต่าง ๆ
- http://www.isinthai.com :: เนื้อหาเน้นด้าน Redhat Linux server
- http://th.php.net/mysql
+ Download : ems_mysql2005.rar สำหรับจัดการระบบฐานข้อมูล MySQL
- คิดอะไร หรือนึกอะไรไม่ออกเกี่ยวกับ MySQL เปิด c:\mysql\Docs\manual.html อาจช่วยได้ เพราะละเอียดสุดสุด
    เทคนิคต่าง ๆ
  1. สั่ง start mysql รุ่น 4.1 สามารถกำหนดตำแหน่ง my.ini ขณะ เปิด service
    โดยเติม --defaults-file="C:\Program Files\MySQL\MySQL Server 4.1\my.ini"
    แก้ไขการสั่ง start ดูได้ใน Settings, Control Panel, Administrative Tools, Services
  2. Data Type ของ mysql มี 27 แบบ ดูตัวอย่างการสร้างจาก หัวข้อ 2.5 ได้แก่
    VARCHAR TINYINT TEXT DATE SMALLINT MEDIUMINT INT BIGINT FLOAT DOUBLE DECIMAL DATETIME TIMESTAMP TIME YEAR CHAR TINYBLOB TINYTEXT BLOB MEDIUMBLOB MEDIUMTEXT LONGBLOB LONGTEXT ENUM SET BINARY VARBINARY
    mysqldatabase.gif

ตัวอย่างกรณีเชื่อมต่อ MySQL server ไม่ได้
Warning: mysql_connect(): Can't connect to MySQL server on '203.185.132.247' (113)
in /var/www/html/lex_v1/connect.php on line 11 ไม่สามารถติดต่อกับ mysql ได้
1. เข้าไปใน MySQL ผ่าน command prompt เบื้องต้น
หลังติดตั้ง MySQL ครั้งแรก จะไม่มี user อื่นนอกจาก root และไม่มีรหัสผ่านของ root ท่านจึงเข้าไปได้สบาย ก่อนเข้าไปต้องสั่ง run MySQL เพื่อเปิดบริการด้วย c:\mysql\bin\mysqladmin.exe จะพบ icon รูปสัญญาณไฟเขียวไฟแดงมุมล่างขวาของจอภาพ แต่ถ้าเรียก c:\mysql\bin\mysqld.exe จะเป็นการเรียก MySQL server ให้ทำงานใน DOS mode และไม่แสดง icon ที่มุมล่างขวาด้วย
ถ้าเป็น Linux ที่ลง MySQL แล้ว สามารถเปิดบริการด้วยการเลือก #setup และstart sql ด้วย #/etc/init.d/mysqld start จากนั้นพิมพ์ว่า MySQL หลังเครื่องหมาย # เพื่อเข้าไปจัดการใน MySQL ถ้าเป็น windows ก็พิมพ์คำว่า c:\mysql\bin\mysql ใน start, run หรือภายใน command หรือ cmd ขั้นตอนนี้เป็นการเข้าไปเฉย ๆ ยังไม่ทำอะไร แค่ให้รู้ว่าเข้าไปได้เท่านั้น
1.1 หัดเข้า และหัดออกจาก MySQL
1.2 แสดงรายชื่อ database ในโปรแกรม MySQL
1.3 เรียกใช้ หรือเข้าไปในฐานข้อมูลชื่อ MySQL
1.4 แสดงรายชื่อ table ในระบบฐานข้อมูล MySQL
1.5 ลบผู้ใช้ที่ไม่ระบุตัวตน
1.6 สร้างฐานข้อมูลใหม่ชื่อ oho
1.7 เรียกใช้ฐานข้อมูล oho และสร้างตารางชื่อ wow
1.8 เพิ่มระเบียนใหม่ 3 ระเบียนเข้าไปใน wow
1.9 เรียกข้อมูลบาง field มาแสดง
1.10 แสดง field ในตาราง wow
1.11 หาผลรวมของบาง field
1.12 ลบระเบียนที่ 2
1.13 เปลี่ยนชื่อระเบียนที่ 1 เป็น thaiall thailand
ตัวอย่างคำสั่ง DOS>mysql -u root -p
mysql> show databases;
mysql> use mysql;
mysql> show tables;
mysql> delete from user where user='';
mysql> update user set password = password('upass') where user='root';
mysql> set password for 'root'@'localhost' = old_password('p');
mysql> flush privileges;
mysql> create database oho;
mysql> use oho;
mysql> create table wow1(
->id int primary key not null auto_increment ,
->ename varchar(50),
->salary double);
mysql> drop table wow1;
mysql> create table xx(x1 time,x2 date);
mysql> insert into xx values('09:56:51','2007-12-30');
mysql> insert into xx (x2)values('2007-12-30');
mysql> select * from xx where x2='2007-12-30';
mysql> repair table mdl_user;
เป็นการซ่อมตาราง กรณีเข้าระบบไม่ได้ใน moodle

1.1 หัดเข้า และหัดออกจาก MySQL
เขาว่า การเริ่มต้นที่ดี สำเร็จไปแล้วครึ่งหนึ่ง จึงให้ท่านเข้าไป แล้วออกมาเลย ไม่ต้องทำอะไร เพื่อดูว่าเข้าเป็น และออกเป็น เท่านั้น
Click Start, Run and type COMMand
c:\windows>cd\mysql\bin
c:\mysql\bin>mysql
หรือกำหนด user ตามบรรทัดข้างล่างนี้
c:\mysql\bin>mysql -u root

บรรทัดข้างบนนี้ใช้ได้ในการเข้า MySQL ครั้งแรก เพราะยังไม่มี password สำหรับ root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 3.23.54
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
mysql>
mysql> exit
หรือใช้ quit ก็ได้
พิมพ์ exit เพื่อออกจาก MySQL
เพราะ MySQL ยังไม่มีรหัสผ่านของ root ท่านจึงเข้า MySQL ได้ ถ้ามีการตั้งรหัสผ่านของ root ท่านจะต้องมีรหัส จึงจะ MySQL ได้
ถ้าท่าน หรือใคร แอบกำหนดรหัสผ่านให้ root โดยท่านไม่รู้ ก็ไปหาแฟ้มจาก c:\mysql\data\mysql\*.* ในเครื่องอื่น มาทับซะก็เรียบร้อย

1.2 แสดงรายชื่อ database ในโปรแกรม MySQL
mysql> show databases; คำสั่งนี้ ทำในขั้น 1.1 ได้ ถ้าไม่ exit ไปซะก่อน
| Database |
| mysql |
| test |
2 rows in set (0.00 sec)
mysql>


1.3 เรียกใช้ หรือเข้าไปในฐานข้อมูลชื่อ MySQL
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql>


1.4 แสดงรายชื่อ table ในระบบฐานข้อมูล MySQL
mysql> show tables;
| Tables_in_mysql |
| columns_priv |
| db |
| func |
| host |
| tables_priv |
| user |
6 rows in set (0.00 sec)
mysql>


1.5 ลบผู้ใช้ที่ไม่ระบุตัวตน และคนเข้า MySQL ต้องมี user และ password พร้อมกำหนดรหัสให้ root
mysql> delete from user where user='';
Query OK, 2 rows affected (0.00 sec)
mysql> update user set password = password('yourpassword') where user='root';
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 changed: 2 warnings: 0
mysql> flush privileges-
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> exit

เมื่อเข้า MySQL อีกครั้งต้องพิมพ์ mysql -u root -p แล้วพิมพ์รหัสผ่านให้ถูกอีกครั้ง
ตัวอย่างนี้ ผมกำหนดรหัสผ่านให้ root เป็น yourpassword นะครับ
บ่อยครั้งที่แนะนำว่าสร้าง user ใหม่ให้มี username เป็น u และ password เป็น p จะได้จำได้ง่าย ๆ ไม่ลืม

1.6 สร้างฐานข้อมูลใหม่ชื่อ oho
mysql> create database oho;
mysql> show databases;
| Database |
| mysql |
| oho |
| test |
2 rows in set (0.00 sec)
mysql>

ครั้งแรก MySQL สร้างฐานข้อมูลชื่อ MySQL และ test มาให้
ถ้าอยากมีฐานข้อมูลเป็นสัดส่วนไว้เก็บตารางต่าง ๆ ก็ควรสร้างไว้ใช้เอง ตัวอย่างนี้สร้างขึ้นใหม่ 1 database ชื่อ oho

1.7 เรียกใช้ฐานข้อมูล oho และสร้างตารางชื่อ wow
mysql> use oho;
mysql> create table wow(
->id int primary key not null auto_increment ,
->ename varchar(50),
->salary double
->);
mysql>

ระวังเรื่อง , และเครื่องหมาย ; นะครับ เพราะ sql ปิดคำสั่งด้วย ; เสมอ

1.8 เพิ่มระเบียนใหม่ 3 ระเบียนเข้าไปใน wow
mysql> insert into wow values('','yonok lampang',80.25);
mysql> insert into wow values('','atichart hancharnchai',0.75);
mysql> insert into wow values('','yaowalak ketsarin',19);
mysql>
รูปแบบคำสั่ง insert
INSERT [INTO]
{ table_name WITH (<table_hint_limited> [..n]) | view_name | rowset_function_limited }
{ [(column_list)] { VALUES ( { DEFAULT | NULL | expression } [,..n] )
| derived_table | execute_statement } }


1.9 เรียกข้อมูลบาง field มาแสดง
mysql> select salary from wow; (ถ้าต้องการทุก field ก็ใช้ select * from wow;)
| salary |
| 80.25 |
| 0.75 |
| 19 |
mysql>

รูปแบบคำสั่ง select
SELECT [ALL | DISTINCT] select_list
[INTO new_table]
FROM table_source
[where search_condition]
[GROUP BY group_by_expression]
[HAVING search_condition]
[ORDER BY order_expression [ASC | DESC]]


1.10 แสดง field ในตาราง wow
หลังใช้คำสั่งสร้างตาราง หากดูผลการสร้างก็ใช้คำสั่ง show columns นี่หละครับ
mysql> show columns from wow;
| Field | Type | Null | Key | Default | Extra |
| id | int(11) | | PRI | NULL | auto_increment |
| ename | varchar(50) | YES | | NULL | |
| salary | double | YES | | NULL | |
3 rows in set (0.05 sec)
mysql>

ถ้าคำสั่ง show columns ยาวไป จะใช้คำสั่ง mysql> desc wow; แทนก็ได้นะครับ ให้ผลเหมือนกัน

1.11 หาผลรวมของบาง field
mysql> select sum(salary) from wow;
|sum(salary)|
| 100 |
mysql>


1.12 ลบระเบียนที่ 2
mysql> delete from wow where id = 2;
mysql>
รูปแบบคำสั่ง delete
DELETE
{ table_name WITH (<table_hint_limited> [..n]) | view_name | rowset_function_limited }
[ FROM { <table_source> } [,..n]]
[ where <search_condition> ]


1.13 เปลี่ยนชื่อระเบียนที่ 1 เป็น thaiall thailand
mysql> update wow set ename='thaiall thailand' where id = 1;
mysql>
รูปแบบคำสั่ง update
UPDATE
{ table_name WITH (<table_hint_limited> [..n]) | view_name | rowset_function_limited }
SET
column_name = { expression | default | null }
{ [ FROM { <table_source> } [,..n]]
[ where <search_condition> ] }

2. เข้าไปใน MySQL ผ่าน command prompt ปรับปรุงข้อมูล
2.1 เข้า MySQL โดยพิมพ์ password ผ่าน command prompt
2.2 ดูสถานะของ MySQL
2.3 สร้างผู้ใช้อื่นนอกจาก root อีก 3 users
2.4 แสดงรายชื่อผู้ใช้ที่สามารถเข้า MySQL
2.5 สร้างตาราง และลบตาราง
2.6 เรียกใช้ฐานข้อมูล test และสร้างตารางชื่อ orderm, orderd, pro, cust
2.7 เพิ่มระเบียนใหม่ใน 4 ตาราง
2.8 สร้างฐานข้อมูลใหม่ชื่อ a และ b พร้อม user ใหม่ชื่อ a และ b
2.9 คัดลอกทุกตารางจากฐานข้อมูล test ใส่ในฐานข้อมูล b
2.10 สร้าง user และ ฐานข้อมูลใหม่ ให้นักเรียนแต่ละคน
2.11 ลบสมาชิกออกจากระบบ 1 คน
2.1 เข้า MySQL โดยพิมพ์ password ผ่าน command prompt
C:\mysql\bin>mysql -u root -p
Enter password: ************
Welcome to the MySQL monitor.
Your MySQL connection id is 6
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> exit
C:\mysql\bin>mysql -u root -pyourpassword
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7 to server version: 3.23.57
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>


2.2 ดูสถานะของ MySQL
mysql> status
--------------
C:\mysql\bin\mysql.EXE Ver 11.15 Distrib 3.23.44, for Win95/Win98 (i32)
Connection id: 2
Current database: test
Current user: root@localhost
Server version: 3.23.44
Protocol version: 10
Connection: localhost via TCP/IP
Client characterset: latin1
Server characterset: latin1
TCP port: 3306
Uptime: 20 min 18 sec
Threads: 2 Questions: 145 Slow queries: 0 Opens: 9 Flush tables: 1
Open tales: 3 Queries per second avg: 0.119
--------------
mysql>


2.3 สร้างผู้ใช้อื่นนอกจาก root อีก 3 users
burin เป็น full superuser เข้า server จากที่ไหนก็ได้ และกำหนดรหัสผ่านเป็น some_pass
admin เข้าจัดการกับฐานข้อมูล จาก localhost ไม่ต้องใช้รหัสผ่าน สามารถ reload หรือ process งานเกี่ยวกับ admin ได้
tom เข้าจัดการกับฐานข้อมูล จาก localhost ไม่ต้องใช้รหัสผ่าน สามารถจัดการกับฐานข้อมูล dtom ได้เต็มที่
dummy เข้าไม่ต้องใช้รหัสผ่าน จาก localhost แต่ไม่มีสิทธิใด ๆ เพราะมีแผนจะกำหนดสิทธิให้กับ database ที่เหมาะสมภายหลัง
mysql> grant all privileges on *.* TO burin@localhost
IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> grant all privileges on *.* TO burin@"%"
IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> grant all privileges on dtom.* TO dtom@localhost;
mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;
mysql> GRANT USAGE ON *.* TO dummy@localhost;
mysql> FLUSH PRIVILEGES;

อ.อิทธิพล แซ่จิว ใช้เว็บเพจนี้ เสริมการสอนเรื่องฐานข้อมูล .. ผมจึงต้องปรับปรุงให้เหมาะสม
สิทธิของผู้ใช้ แบบโกลบอล (Mouse over จะแสดงคำอธิบาย)
ตารางนี้ copy มาจาก phpMyAdmin ซึ่ง download ได้จาก http://www.phpmyadmin.net
ข้อมูลโครงสร้างการดูแลระบบ
+ SELECT + CREATE + GRANT
+ INSERT + ALTER + PROCESS
+ UPDATE + INDEX + RELOAD
+ DELETE + DROP + SHUTDOWN
+ FILE + REFERENCES
2.4 แสดงรายชื่อผู้ใช้ที่สามารถเข้า MySQL
mysql> use MySQL;
Database changed
mysql> select user,password from user;
| user | password |
| root | 606718756665bfe6 |
| u | 606718756665bfe6 |
2 rows in set (0.00 sec)
mysql>


2.5 สร้างตาราง และลบตาราง
mysql> use test;
mysql> create table x(x int primary key);
mysql> drop table x;
mysql> drop table if exists x;

แสดง Data type ของการใช้ phpmyadmin 25 แบบ ส่งเข้า SQL แล้วใช้ได้ทันที

mysql> create table `samtable` (
`f01` varchar(5) not null default '',
`f02` tinyint(5) not null default '0',
`f03` text not null,
`f04` date not null default '0000-00-00',
`f05` smallint(5) not null default '0',
`f06` mediumint(5) not null default '0',
`f07` int(5) not null default '0',
`f08` bigint(5) not null default '0',
`f09` float(5,2) not null default '0.00',
`f10` double(5,2) not null default '0.00',
`f11` decimal(5,0) not null default '0',
`f12` datetime not null default '0000-00-00 00:00:00',
`f13` timestamp(14) not null,
`f14` time not null default '00:00:00',
`f15` year(4) not null default '0000',
`f16` varchar(5) not null default '',
`f17` tinyblob not null,
`f18` tinytext not null,
`f19` blob not null,
`f20` mediumblob not null,
`f21` mediumtext not null,
`f22` longblob not null,
`f23` longtext not null,
`f24` enum('0','1','2') not null default '0',
`f25` set('M','F') not null default ''
) TYPE=MyISAM;


2.6 เรียกใช้ฐานข้อมูล test และสร้างตารางชื่อ orderm, orderd, pro, cust
mysql> use test;
mysql> create table orderm(orderid int primary key,cust int,orderdate date,ordertime time);
mysql> create table orderd(orderid int not null,pro int not null,primary key(orderid,pro));
mysql> create table pro(pro int primary key,proname varchar(50),price double,prorest int);
mysql> create table cust(cust int primary key,custname varchar(50));

ฐานข้อมูลนี้ print screen มาจาก http://www.thaiall.com/teachaccess/db4order.mdb
orderm : คำว่า m ย่อมาจาก main หมายถึง ข้อมูลการสั่งซื้อของแต่ละใบ ถ้ามี 3 ใบ ก็จะมี 3 ระเบียนในตารางนี้
orderd : คำว่า d ย่อมาจาก detail หมายถึง ข้อมูลรายละเอียดการสั่งซื้อ เช่นใบสั่ง 3 ใบ อาจสั่งสินค้า 6 รายการ แฟ้มนี้อาจมี 6 ระเบียน
pro : คำว่า pro ย่อมาจาก product หมายถึง ข้อมูลจำนวนสินค้า อาจมีสินค้าเป็น 1000 รายการ แฟ้มนี้ก็จะเก็บ 1000 ระเบียน
cust : คำว่า cust ย่อมาจาก customer หมายถึง ข้อมูลจำนวนลูกค้า อาจมีลูกค้าเป็น 1000 รายการ แฟ้มนี้ก็จะเก็บ 1000 ระเบียน

2.7 เพิ่มระเบียนใหม่ใน 4 ตาราง
mysql> use test;
mysql> insert into `orderm` (`orderid`,`cust`,`orderdate`,`ordertime`)values(
'1001','101','1/7/2004','13:35');
mysql> insert into orderm values('1002','101','1/7/2004','13:35');
mysql> insert into orderm values(1003,103,'15/7/2004','10:12');

mysql> insert into orderd values(1001,201,5,10);
mysql> insert into orderd values(1001,202,6,100);
mysql> insert into orderd values(1001,203,1,30);
mysql> insert into orderd values(1002,204,3,50);
mysql> insert into orderd values(1003,202,4,50);
mysql> insert into orderd values(1003,204,1,50);

mysql> insert into pro values(201,'pen',10,200);
mysql> insert into pro values(202,'book',100,10);
mysql> insert into pro values(203,'ink',30,5);
mysql> insert into pro values(204,'knight',50,20)
mysql> insert into cust values(101,'Mr.Boy');
mysql> insert into cust values(102,'Ms.Girl');
mysql> insert into cust values(103,'Mr.Man');


2.8 สร้างฐานข้อมูลใหม่ชื่อ a และ b พร้อม user ใหม่ชื่อ a และ b
mysql> show databases;
mysql> create database a;
mysql> create database b;
mysql> GRANT USAGE ON *.* TO a@localhost;
mysql> grant all privileges on b.* TO 'b'@'localhost' identified by 'bpassword';
mysql> exit

user ชื่อ a และ b เข้าฐานข้อมูลใด ๆ ไม่ได้เลย ถ้าไม่กำหนดฐานข้อมูลให้กับ user นั้นโดยเฉพาะ
ตัวอย่างนี้ user a เข้า MySQL โดยไม่มีรหัสผ่านก็ได้ แต่ไม่สามารถจัดการข้อมูลในฐานข้อมูลใด ๆ ได้
สำหรับ user b เป็นเจ้าของฐานข้อมูล b โดยสมบูรณ์ และมีรหัสผ่านเข้า MySQL คือ bpassword
ถ้าไม่มีสิทธิ แต่พยายามใช้ฐานข้อมูลนั้น ก็จะถูกปฏิเสธ ดังตัวอย่างด้านล่าง
mysql> use a;
ERROR 1044: Access denied for user: 'a@localhost' to database 'a'


2.9 คัดลอกทุกตารางจากฐานข้อมูล test ใส่ในฐานข้อมูล b
1. ใช้ explorer copy แฟ้มทุกแฟ้มในห้อง c:\mysql\data\test\*.* ไปไว้ในห้อง c:\mysql\data\b\*.*
2. เท่านี้ก็เรียบร้อย ข้อมูลทั้งหมดในฐานข้อมูล test เป็นของ b แล้วครับ
ผม zip แฟ้มทั้ง 15 แฟ้ม ของ 5 ตาราง
ไว้ในแฟ้ม 5table.zip [4 KB]
ตาราง : cust
ตาราง : pro
ตาราง : orderm
ตาราง : orderd
ตาราง : wow
ถ้าท่านมีฐานข้อมูลชื่อ xxx และอยากมีตาราง 5 ตารางนี้
ท่านก็คลาย zip ลงไปในห้อง c:\mysql\data\xxx ก็เรียบร้อย
ประหยัดเวลาสร้างตารางอีก 5 ตาราง ตามที่ผมทำให้ดูนี้
2.10 สร้าง user และ ฐานข้อมูลใหม่ ให้นักเรียนแต่ละคน
mysql> show databases;
mysql> grant all privileges on s01.* TO 's01'@'%' identified by 's01';
mysql> grant all privileges on s02.* TO 's02'@'%' identified by 's02';
::
::
mysql> grant all privileges on s30.* TO 's30'@'%' identified by 's30';
mysql> exit

สร้างสมาชิกใหม่ 30 สมาชิก แต่ตอนสร้าง database ชื่อ s01 ถึง s30
ให้ใช้ explorer copy ห้องต้นแบบ เป็นห้องต่าง ๆ ไว้ใน c:\mysql\data\s01 ถึง c:\mysql\data\s30
ผลการสร้างสมาชิก s01 จะเพิ่มระเบียนในแฟ้ม user และ db ของ ฐานข้อมูลชื่อ MySQL
ส่วนรหัสผ่าน จะเหมือนกับชื่อ user เช่นสมาชิกชื่อ s01 ก็จะมีรหัสผ่านคือ s01
สมาชิกใหม่สามารถเขียนโปรแกรมไว้ใน server ใดก็ได้ เพราะอนุญาตไว้ว่าเข้ามาจากที่ใดก็ได้ ไม่จำกัดเฉพาะ localhost

2.11 ลบสมาชิกออกจากระบบ 1 คน
mysql> delete from `user` where `User` = "s01" and `Host` = "%";
mysql> delete from `db` where `User` = "s01" and `Host` = "%";
mysql> delete from `tables_priv` where `User` = "s01" and `Host` = "%";
mysql> delete from `columns_priv` where `User` = "s01" and `Host` = "%";
# ปรับปรุงสิทธิเข้าถึงใหม่อีกรอบ ...
mysql> flush privileges ;
mysql>

คำสั่งเหล่านี้ copy มาจาก phpMyAdmin ในส่วนของการลบสมาชิก ถ้าสมาชิกคนนี้ถูกสร้างขึ้นมาด้วยคำสั่งข้างล่างนี้
grant all privileges on s01.* TO 's01'@'%' identified by 's01';
3. Select แบบต่าง ๆ
3.1 แสดงข้อมูลทั้งหมดจากใบสั่งซื้อละเอียด(orderd) ในฐานข้อมูล s01
3.2 นับจำนวนระเบียนในแฟ้มสั่งซื้อละเอียด
3.3 แสดงข้อมูล โดยเปลี่ยนชื่อ field เพื่อแสดงผล หรือใช้อ้างอิง
3.4 แสดงข้อมูล โดยเปลี่ยนชื่อ field และใช้ function length
3.5 แสดงข้อมูล โดยตัดตัวอักษรมาแสดงผล
3.6 แสดงข้อมูลเลขที่ใบสั่งซื้อ เฉพาะที่ไม่ซ้ำ
3.7 เลือกแสดงรายการสั่งซื้อละเอียด เฉพาะสินค้ารหัส 204
3.8 แสดงรายชื่อลูกค้า และจัดเรียงตามชื่อ
3.9 แสดงข้อมูลสินค้า เรียงตามราคาจากมากไปน้อย
3.10 แสดงข้อมูลสินค้า ทั้งการจัดเรียง และเลือกข้อมูลพร้อมกัน
3.11 แสดงข้อมูลสินค้า ยกเว้นรายการที่มีชื่อว่า ink
3.12 แสดงข้อมูลสินค้า ยกเว้น(ที่ชื่อว่า pen หรือ ราคามากกว่า 90)
3.13 แสดงข้อมูล เฉพาะเขตข้อมูลที่ต้องการ
3.14 แสดงข้อมูล เลือกเฉพาะวันที่น้อยกว่า ปี 2010 เดือนธันวาคม วันที่ 13
3.15 แสดงข้อมูล เลือกเฉพาะปี และเดือนที่ต้องการ
3.16 เลือกข้อมูลด้วยคำสั่ง in เลือกเฉพาะ pen และ book
3.17 เลือกข้อมูลด้วยคำสั่ง like เลือกเฉพาะขึ้นต้นด้วย Mr
3.18 แสดงข้อมูลตั้งแต่ระเบียนแรกไป 3 ระเบียน
3.19 นับแยกกลุ่มในแฟ้มใบสั่งละเอียด
3.20 คำนวณค่าใช้จ่ายของแต่ละรายการ
3.21 คำนวณยอดรวมในแฟ้มใบสั่งละเอียดแต่ละใบ
3.22 คำนวณยอดรวม เลือกด้วยคำสั่ง having ภายหลัง group แล้ว
3.23 แสดงข้อมูลใบสั่ง และชื่อผู้ซื้อแต่ละใบ
3.24 แสดงข้อมูลใบสั่งละเอียด และชื่อสินค้าแต่ละรายการ
3.25 การเชื่อม orderm, orderd, cust และ pro
3.26 เลือกข้อมูลด้วย between
ถ้าไม่มี MySQL จะใช้ access เพื่อศึกษา sql ก็ได้นะครับ มีตัวอย่างข้อมูล และตารางใน access ให้ศึกษา

สามารถ download แฟ้มนี้ได้จาก http://www.thaiall.com/teachaccess/db4order.mdb


3.1 แสดงข้อมูลทั้งหมดจากใบสั่งซื้อละเอียด(orderd) ในฐานข้อมูล s01
mysql> use s01;
Database changed
mysql> select * from orderd;
| 1001 | 201 | 5 | 10 |
| 1001 | 202 | 6 | 100 |
| 1001 | 203 | 1 | 30 |
| 1002 | 204 | 3 | 50 |
| 1003 | 202 | 4 | 50 |
| 1003 | 204 | 1 | 50 |


3.2 นับจำนวนระเบียนในแฟ้มสั่งซื้อละเอียด
mysql> select count(*) from orderd;
| count(*) |
| 6 |

มีอีกหลายคำสั่ง เช่น sum avg max min length mid left right instr replace เป็นต้น

3.3 แสดงข้อมูล โดยเปลี่ยนชื่อ field เพื่อแสดงผล หรือใช้อ้างอิง
mysql> select cust as f1, custname as f2 from cust;
| f1 | f2 |
| 101 | Mr.Boy |
| 102 | Ms.Girl |
| 103 | Mr.Man |


3.4 แสดงข้อมูล โดยเปลี่ยนชื่อ field และใช้ function length
mysql> select cust as f1, length(custname) as f2 from cust;
| f1 | f2 |
| 101 | 6 |
| 102 | 7 |
| 103 | 6 |

3.5 แสดงข้อมูล โดยตัดตัวอักษรมาแสดงผล
mysql> select cust, mid(custname,1,2) from cust;
| cust | mid(custname,1,2) |
| 101 | Mr |
| 102 | Ms |
| 103 | Mr |
mysql>select mid(dt,1,10) as x, count(dt) as y from ynlog
->group by mid(dt,1,10) order by mid(dt,1,10) desc;
| x | y |
| 2007/01/03 | 19 |
| 2007/01/02 | 2 |


3.6 แสดงข้อมูลเลขที่ใบสั่งซื้อ เฉพาะที่ไม่ซ้ำ
mysql> select distinct orderid from orderd;
| orderid |
| 1001 |
| 1002 |
| 1003 |


3.7 เลือกแสดงรายการสั่งซื้อละเอียด เฉพาะสินค้ารหัส 204
mysql> select * from orderd where pro =204;
| orderid | pro | price | quan |
| 1002 | 204 | 3 | 50 |
| 1003 | 204 | 1 | 50 |


3.8 แสดงรายชื่อลูกค้า และจัดเรียงตามชื่อ
mysql> select * from cust order by custname;
| cust | custname |
| 101 | Mr.Boy |
| 103 | Mr.Man |
| 102 | Ms.Girl |


3.9 แสดงข้อมูลสินค้า เรียงตามราคาจากมากไปน้อย
mysql> select * from pro order by price desc;
| pro | proname | price | prorest |
| 202 | book | 100 | 10 |
| 204 | knight | 50 | 20 |
| 203 | ink | 30 | 5 |
| 201 | pen | 10 | 200 |


3.10 แสดงข้อมูลสินค้า ทั้งการจัดเรียง และเลือกข้อมูลพร้อมกัน
mysql> select * from pro where price<100 and price>20 order by price desc;
| pro | proname | price | prorest |
| 204 | knight | 50 | 20 |
| 203 | ink | 30 | 5 |


3.11 แสดงข้อมูลสินค้า ยกเว้นรายการที่มีชื่อว่า ink
mysql> select * from pro where not(proname = 'ink');
| pro | proname | price | prorest |
| 201 | pen | 10 | 200 |
| 202 | book | 100 | 10 |
| 204 | knight | 50 | 20 |


3.12 แสดงข้อมูลสินค้า ยกเว้น(ที่ชื่อว่า pen หรือ ราคามากกว่า 90)
mysql> select * from pro where not(proname='pen' or price >90);
| pro | proname | price | prorest |
| 203 | ink | 30 | 5 |
| 204 | knight | 50 | 20 |


3.13 แสดงข้อมูล เฉพาะเขตข้อมูลที่ต้องการ
mysql> select orderid,cust,orderdate from orderm;
| orderid | cust | orderdate |
| 1002 | 101 | 2001-07-20 |
| 1003 | 103 | 2015-07-20 |
| 1001 | 101 | 2001-07-20 |


3.14 แสดงข้อมูล เลือกเฉพาะวันที่น้อยกว่า ปี 2010 เดือนธันวาคม วันที่ 13
mysql> select * from orderm where orderdate < '2010-12-13';
| orderid | cust | orderdate | ordertime |
| 1002 | 101 | 2001-07-20 | 13:35:00 |
| 1001 | 101 | 2001-07-20 | 13:35:00 |

3.15 แสดงข้อมูล เลือกเฉพาะปี และเดือนที่ต้องการ
mysql> select * from orderm where year(orderdate)='2001' and month(orderdate)='07';
| orderid | cust | orderdate | ordertime |
| 1002 | 101 | 2001-07-20 | 13:35:00 |
| 1001 | 101 | 2001-07-20 | 13:35:00 |


3.16 เลือกข้อมูลด้วยคำสั่ง in เลือกเฉพาะ pen และ book
mysql> select * from pro where proname in ('pen','book');
| pro | proname | price | prorest |
| 201 | pen | 10 | 200 |
| 202 | book | 100 | 10 |


3.17 เลือกข้อมูลด้วยคำสั่ง like เลือกเฉพาะขึ้นต้นด้วย Mr
mysql> select * from cust where custname like 'Mr%';
| cust | custname |
| 101 | Mr.Boy |
| 103 | Mr.Man |


3.18 แสดงข้อมูลตั้งแต่ระเบียนแรกไป 3 ระเบียน
mysql> select * from orderd limit 0,3;
| orderid | pro | price | quan |
| 1001 | 201 | 5 | 10 |
| 1001 | 202 | 6 | 100 |
| 1001 | 203 | 1 | 30 |


3.19 นับแยกกลุ่มในแฟ้มใบสั่งละเอียด
mysql> select orderid, count(pro) from orderd group by orderid;
| orderid | count(pro) |
| 1001 | 3 |
| 1002 | 1 |
| 1003 | 2 |


3.20 คำนวณค่าใช้จ่ายของแต่ละรายการ
mysql> select orderid, pro, price * quan from orderd;
| orderid | pro | price * quan |
| 1001 | 201 | 50 |
| 1001 | 202 | 600 |
| 1001 | 203 | 30 |
| 1002 | 204 | 150 |
| 1003 | 202 | 200 |
| 1003 | 204 | 50 |


3.21 คำนวณยอดรวมในแฟ้มใบสั่งละเอียดแต่ละใบ
mysql> select orderid, sum(price * quan) from orderd group by orderid;
| orderid | sum(price * quan) |
| 1001 | 680 |
| 1002 | 150 |
| 1003 | 250 |


3.22 คำนวณยอดรวม เลือกด้วยคำสั่ง having ภายหลัง group แล้ว

เพราะไม่สามารถใช้ where ได้ เนื่องจากค่าที่ต้องการ เป็นค่าหลังการ group ถ้าท่านใช้ having price > 100 ก็จะผิด
mysql> select orderid, sum(price * quan) from orderd group by orderid having
-> sum(price * quan) > 200;
| orderid | sum(price * quan) |
| 1001 | 680 |
| 1003 | 250 |


3.23 แสดงข้อมูลใบสั่ง และชื่อผู้ซื้อแต่ละใบ
mysql> select orderm.orderid, cust.custname from orderm,cust where orderm.cust=cust.cust;
| orderid | custname |
| 1002 | Mr.Boy |
| 1001 | Mr.Boy |
| 1003 | Mr.Man |


3.24 แสดงข้อมูลใบสั่งละเอียด และชื่อสินค้าแต่ละรายการ

ตัวอย่างนี้ใช้คำสั่ง inner join ตามตัวอย่างใน MS Access
mysql> select orderd.*, pro.*
-> from (orderd inner join pro on orderd.pro = pro.pro) order by orderd.orderid;
| orderid | pro | price | quan | pro | proname | price | prorest |
| 1001 | 201 | 5 | 10 | 201 | pen | 10 | 200 |
| 1001 | 203 | 1 | 30 | 203 | ink | 30 | 5 |
| 1001 | 202 | 6 | 100 | 202 | book | 100 | 10 |
| 1002 | 204 | 3 | 50 | 204 | knight | 50 | 20 |
| 1003 | 202 | 4 | 50 | 202 | book | 100 | 10 |
| 1003 | 204 | 1 | 50 | 204 | knight | 50 | 20 |


3.25 การเชื่อม orderm, orderd, cust และ pro

- ตัวอย่างนี้ copy sql มาจาก MS Access ครับ แต่ใช้ใน MySQL ไม่ได้ เพราะบรรทัดคำสั่งรับ 255 ตัวอักษร แม้ลดแล้วก็ยังไม่ได้ครับ

- ตัวอย่างที่ 3 ใช้ได้ เพราะผมเขียนตาม concept ของ MySQL ไม่ได้ใช้หลักการของ MS Access

- แต่ผมยังก็ไม่ได้ทดสอบว่าทำไมใช้แบบ MS Access ไม่ได้ .. ลองทดสอบดูนะครับ
Type 1 : MS Access but error on MySQL
SELECT orderm.orderid, orderm.orderdate, orderm.ordertime, cust.cust, cust.custname,
orderd.pro, pro.proname, orderd.price, orderd.quan, pro.price, pro.prorest
FROM (orderd INNER JOIN pro ON orderd.pro = pro.pro)
INNER JOIN (cust INNER JOIN orderm ON cust.cust = orderm.cust)
ON orderd.orderid = orderm.orderid;
Type 2 : change from type 1 but error on MySQL
mysql> SELECT orderm.orderid,orderdate,custname,proname,orderd.price,quan,prorest
-> FROM(orderd INNER JOIN pro ON orderd.pro=pro.pro)INNER JOIN(cust INNER JOIN orderm
-> ON cust.cust = orderm.cust) ON orderd.orderid = orderm.orderid;
Type 3 : ok on MySQL
mysql> select orderm.orderid, orderm.orderdate, orderm.ordertime, cust.cust, cust.custname,
-> orderd.pro, pro.proname, orderd.price, orderd.quan, pro.price
-> from orderm,orderd,cust,pro
-> where orderm.cust=cust.cust
-> and orderm.orderid=orderd.orderid
-> and orderd.pro=pro.pro order by orderm.orderid;
orderid | orderdate | ordertime |cust | custname | pro | proname |price |quan |price
1001 | 2001-07-20 | 13:35:00 | 101 | Mr.Boy | 202 | book | 6 | 100 | 100
1001 | 2001-07-20 | 13:35:00 | 101 | Mr.Boy | 201 | pen | 5 | 10 | 10
1001 | 2001-07-20 | 13:35:00 | 101 | Mr.Boy | 203 | ink | 1 | 30 | 30
1002 | 2001-07-20 | 13:35:00 | 101 | Mr.Boy | 204 | knight | 3 | 50 | 50
1003 | 2015-07-20 | 10:12:00 | 103 | Mr.Man | 202 | book | 4 | 50 | 100
1003 | 2015-07-20 | 10:12:00 | 103 | Mr.Man | 204 | knight | 1 | 50 | 50
Type 4 : อีกตัวอย่างของ sql ใน MS Access
select distinct sindexs.*,scomponents.* from
(users inner join scomponents on users.sarindex = scomponents.sarindex)
inner join sindexs on sindexs.sarindex = scomponents.sarindex and sindexs.cseq = scomponents.cseq
where scomponents.sarindex = 1
order by sindexs.cseq, sindexs.iseq
ตัวอย่างการสร้างตารางใน Microsoft Access
create table tbnamehere (
field1 text(20) not null, field2 single,
constraint pkfield1 primary key (field1));


3.26 เลือกข้อมูลด้วย between

เพราะคุณพงศ์เดช ศิริพันธุ์ กลุ่มงานรังสี โรงพยาบาลลำปาง ถามมา ผมจึงทดสอบคำสั่งนี้

ตัวอย่างนี้ใช้คำสั่ง เลือกข้อมูลที่อยู่ในช่วงที่ต้องการ และผมก็ทดสอบกับตัวเลขได้ผล

ทดสอบใน MS Access โดยใช้ query สร้าง แล้วดู code ของ SQL และเชื่อแน่ว่าใช้ได้กับ MySQL

SELECT empl.salary
FROM empl
where (((empl.salary) Between 5000 and 10000));
4. โปรแกรม phpMyAdmin สำหรับจัดการ MySQL
phpMyAdmin (phpMyAdmin is intended to handle the adminstration of MySQL over the WWW.) คือ php script ที่ run อยู่บน Web Server ใช้สำหรับบริหารข้อมูลใน MySQL บน host ใด ๆ ถ้า MySQL จากเครื่องเป้าหมายยอมให้เข้าไปจัดการข้อมูลจากเครื่อง Remote เช่น
- create and drop databases
- create, copy, drop and alter tables
- delete, edit and add fields
- execute any SQL-statement
- export and import CSV data
แนะนำเว็บ (Web Guides)
+ http://www.phpmyadmin.net
+ http://dev.mysql.com/doc/mysql/en/old-client.html
4.1 ตัวอย่างการ config ให้ใช้งาน phpMyAdmin
ในกรณีที่ท่านยังไม่กำหนดรหัสผ่านให้กับ root ใน mysql .. (เป็นการเริ่มต้นใช้งานที่ง่าย)
เปิดแฟ้ม config.inc.php ด้วย notepad แล้วหา 3 บรรทัดด้านล่างนี้
$cfg['PmaAbsoluteUri'] = '';
$cfg['Servers'][$i]['user'] = 'root'; // MySQL user
$cfg['Servers'][$i]['password'] = ''; // MySQL password

4.2 ตัวอย่างการ config เมื่อมีรหัสผู้ใช้สำหรับเข้าใช้ MySQL
ถ้าใน MySQL มี user ชื่อ burin และ password คือ saveworld ให้แก้ไข 3 บรรทัด ดังนี้
$cfg['PmaAbsoluteUri'] = 'http://localhost/phpMyAdmin/';
$cfg['Servers'][$i]['user'] = 'burin'; // MySQL user
$cfg['Servers'][$i]['password'] = 'saveworld'; // MySQL password

4.3 php4 กับ mysql4 อาจมีปัญหา
ถ้าพบปัญหา #1251 - Client does not support authentication protocol requested by server; ..
วิธีแก้ไขคือเปลี่ยนรุ่นของ php4 แต่ถ้าไม่ต้องการเปลี่ยนเป็น php5 ก็ให้เปลี่ยนการเข้ารหัสของ password เป็นแบบเก่า
การใช้ mysql ใน Text mode ถ้าพบปัญหาเรื่อง not support authentication ใน phpMyAdmin ก็ต้องเปลี่ยนวิธีเข้ารหัส
- ถ้าใช้ php4 กับ mysql4 จะมีปัญหาเรื่อง mysql_connect( ... ) ถ้าต้องการใช้ให้ได้ ต้องใช้ฟังก์ชัน old_password
- ถ้ากำหนด $cfg['Servers'][$i]['auth_type'] = 'config'; ก็ยังใช้งานได้ ถ้าใช้ old_password
- ถ้ากำหนด $cfg['Servers'][$i]['auth_type'] = 'http'; จะพิมพ์รหัสผ่านไม่ผ่าน แม้จะใช้ old_password แล้วก็ตาม
mysql> set password for 'burin'@'localhost' = old_password('saveworld');

วิธีแก้ปัญหามีอีก 2 ทาง (http://th.php.net/manual/en/function.mysql-connect.php)
1. Start mysql server ด้วย --old-passwords option เช่น mysql --old-passwords
2. ใส่ old_passwords ใน my.ini หรือ my.cnf (ref)
4.4 แสดงรายชื่อตารางในฐานข้อมูลชื่อ b

4.5 แสดงรายชื่อ field ในตาราง orderd ของฐานข้อมูลชื่อ b

4.6 รับคำแนะนำจาก kemmmx@hotmail.com, khem@wassana.com (รหัสผ่าน และ remote access)
1. ประสบการณ์การใช้ MySQL ในหลายสถานการณ์ผมมีน้อย ส่วนใหญ่ผมจะใช้ MySQL ของ root ที่ไม่มีรหัสผ่าน คือติดตั้งเสร็จก็ใช้เลย ถ้าสร้างผู้ใช้ก็ใช้ MySQL 3.23 ซึ่งไม่มีปัญหา แต่ปัญหาเกิดเมื่อใช้กับ MySQL 4.1 ขึ้นไป เพราะรหัสผ่านไม่สามารถ Verify ได้ เพราะการเข้ารหัสใน MySQL 4.1 แตกต่างไปจากเดิม จึงต้องใช้ฟังก์ชัน old_password เปลี่ยนรหัสใฟ้ผู้ใช้ทีละคน
2. ถ้าต้องการใช้ phpMyAdmin จากหลายเครื่องต้องกำหนด ip ถ้าเครื่องของท่านมี ip เป็น 202.203.204.205
แนะนำว่าครั้งแรกไม่กำหนด ให้ลองใช้ก่อน ถ้าพอใจเรื่อง security ก็ไม่ต้องกำหนด .. อาจมีบางเหตุผลที่ต้องการกำหนด
old $cfg['PmaAbsoluteUri'] = '';
new $cfg['PmaAbsoluteUri'] = 'http://202.203.204.205/phpmyadmin/';

3. การสร้าง user ก็ต้องกำหนดเป็น % ถ้ายอมให้เข้ามาจาก Host ใด ๆ ก็ได้ แต่ปกติใช้ localhost จะยอมให้ใช้ในเครื่องเท่านั้น
mysql> grant all privileges on *.* to boy@"%" identified by 'girl' with grant option;
mysql> set password for 'boy'@'%' = old_password('girl');
mysql> flush privileges;

4.7 ปัญหาที่ผมไม่พยายามแก้ต่อไป คือ การใช้ phpMyAdmin แบบ http
ถ้าต้องการให้ phpMyAdmin ถ้ารหัสผ่าน auth_type แบบ http จะไม่พบปัญหากับ MySQL 3.23 แต่พอใช้กับ MySQL 4.1 ขึ้นไป พบว่าการ Verify รหัสไม่ผ่าน .. ถ้าไม่เปลี่ยน version ของ php เป็น php5 ผมยังหาวิธีแก้ไขไม่ได้
มีอีกวิธีที่ช่วยให้การเรียน phpMyAdmin ถามรหัสผ่านได้ คือการใช้ .htaccess ของ apache ตรวจสอบรหัสผ่านแทนได้ (http://www.thaiall.com/cgi/htpasswd.pl)
4.8 แก้ปัญหาภาษาไทยเป็น ??? เมื่ออ่านข้อมูลจาก MySQL
มีวิธีแก้ไข 2 วิธีแบบเลือกด้าน ว่าจะแก้ด้าน php sourcecode หรือ คุณสมบัติของ MySQL เกี่ยวกับ Collation
1. วิธีแก้ในรหัสต้นฉบับ (php sourcecode)
- หลังใช้ mysql_connection(..) ให้ใช้ mysql_query("set names tis620") ก่อนใช้ mysql_db_query(..)
- ถ้าเลือกวิธี set names จะต้องใช้ทุกครั้งที่ประมวลผล query ไม่ว่าจะ insert หรือ select มิเช่นนั้นจะพบ ???
- ถ้าใช้เฉพาะ insert จะนำข้อมูลเข้า แต่ตอน select ไม่ได้แปลงภาษา ก็จะเป็น ?? เช่นเดิม
2. วิธีแก้คุณสมบัติของ MySQL เกี่ยวกับ Collation (ลูกศิษย์ผมชื่อวศิลป์ แนะนำมาครับ)
- เปลี่ยนภาษาไทย หรือที่เรียกว่า Character Set : Collations(การตรวจเทียบ)
- เปลี่ยนตั้งแต่ Connection, Database, Table, Field เป็น utf8_general_ci หรือ utf8_unicode_ci หรือ utf8-bin
- ผลคือไม่ต้อง set names ใน Source code ก็ใช้ข้อมูลเป็นภาษาไทยกับ MySQL ในโปรแกรมที่เราเขียนได้ตามปกติ
+ แหล่งอ้างอิง : http://www.thaiadmin.org/board/index.php?topic=59724
<?
/* http://www.phpconcept.com/content/view/21/28/ */
$host     = "localhost";
$db       = "db";
$tb       = "phpbb_users";
$user     = "admin";
$password = "p";
$query    = "select * from $tb";
$connect = mysql_connect("$host","$user","$password") or die ("connect error");
mysql_query("set names tis620") or die('Invalid query: ' . mysql_error());
$result = mysql_db_query($db,$query);
while ($object = mysql_fetch_object($result)) {
   echo $object->username . "<br>";
}
mysql_close($connect);
?>
4.9 แก้ปัญหาภาษาไทย เมื่อพิมพ์ภาษาไทยใน phpmyadmin แล้วออกเป็น ???
- ให้ทำตอนเริ่มต้นสร้างตาราง หรือ backup ข้อมูลไว้ก่อน เพราะถ้ามีข้อมูลมาก ๆ อาจมีปัญหา
- เปลี่ยน การเรียงลำดับในแต่ละ field จาก latin1_swedish_ci เป็น tis620_thai_ci
- ใน php script ต้องเพิ่ม คำสั่งข้างล่างนี้ ต่อจาก mysql_connect( .. ); และต้องใช้ก่อน mysql_db_query(..)
mysql_query("set names tis620");
- ต้องใช้เมื่อ insert และ select จะใช้เฉพาะอันใดอันหนึ่งไม่ได้
- วิธีนี้ไม่สามารถ แก้ปัญหาภาษาไทยในข้อมูลเดิม
5. โปรแกรม MySQL-Front สำหรับจัดการ MySQL
จาก http://www.MySQLFront.de/download.htm
รุ่นล่าสุด Release Version 3.1, Build: 7.11 (1,394 KB, 01 Aug 2004):
ถ้าต้องการใช้หลังหมดอายุ สามารถเลือก help, info, license, Testing until ดูวันที่หมดอายุ แล้วไปเปลี่ยนวันที่กลับไปก่อนวันหมดอายุ สัก 7 วัน ภาพแสดงหน้าตาของโปรแกรม MySQL-Front ::
โปรแกรม MySQL-Front for windows ใช้เชื่อมต่อเข้า MySQL เพื่อจักการข้อมูลได้โดยง่าย สามารถ download โปรแกรมจาก http://www.MySQLFront.de version ที่ได้มาเป็น shareware กำหนดเวลาการใช้ เมื่อหมดอายุ จะใช้ความสามารถหลายอย่างไม่ได้ เช่น import export แต่ถ้าใช้วิธีย้อนวันที่ก็ยังใช้งาน option เหล่านั้นได้
5.1 แสดงเมื่อเริ่มต้น connect (MySQLFront1.gif)
5.2 แสดงตารางในฐานข้อมูล moodle (MySQLFront2.gif)
5.3 แสดงการเปิด table จาก database ที่กำหนด (version 3.0) (MySQLFront3.gif)
6. ภาษาสำหรับจัดการ MySQL เช่น php, asp, perl หรือ jsp
6.1 ถ้าไม่เปิดบริการ MySQL แต่ขอเชื่อมต่อจากภาษา php
ถ้าไม่ได้ install หรือ install แล้วไม่เปิดบริการ MySQL ท่านอาจพบข้อความข้างล่างนี้
Warning: mysql_connect(): Can't connect to mysql server on 'localhost' (10061) in c:\httpd\htdocs\test.php on line 2
สามารถใช้คำสั่ง <? phpinfo(); ?> เพื่อตรวจดูว่า php ในเครื่องสามารถติดต่อกับ MySQL ได้หรือไม่ 6.2 โปรแกรมภาษา php สำหรับอ่านข้อมูลจาก MySQL หาข้อมูลเรื่อง php เพิ่มเติมได้จาก http://www.thaiall.com/php
<?
$host     = "localhost";
$db       = "test";
$tb       = "cust";
$user     = "root";
$password = "yourpassword";
$query    = "select * from $tb";
###########################
$connect = mysql_connect("$host","$user","$password");
$result = mysql_db_query($db,$query);
if ($result) echo "OK<br>"; else exit;
while ($object = mysql_fetch_object($result)) {
  foreach ($object as $o) echo $o;
  # echo $object->cust . "  " . $object->custname;
  echo "<br>";
}
echo "Total records : ".mysql_num_rows($result);
mysql_close($connect);
?>
ตัวอย่างผลลัพธ์
OK
101Mr.Boy
102Ms.Girl
103Mr.Man
Total records : 3
6.3 โปรแกรมภาษา php สำหรับสร้างฐาน สร้างตาราง ส่งข้อมูล และอ่านออกมา

โปรแกรมนี้ชื่อ c:\httpd\htdocs\testmysql.php จะนำไปใช้ทันทีไม่ได้ จะต้องนำเครื่องหมาย ## ออก ส่วน # ไม่ต้องเอาออก
เมื่อนำ ## ออกแล้ว ให้เปิดเว็บชื่อ http://localhost/testmysql.php ผลที่ได้ จะเป็นดังข้างล่าง เมื่อเห็นผลแล้วจะต้องใส่
เครื่องหมาย ## ลงไปตามตัวอย่างข้างล่าง มิเช่นนั้นการ run ครั้งต่อไปจะผิดพลาด เนื่องจากจำนวนข้อมูลที่เพิ่มขึ้น ผิดจากที่ต้องการ
<body>Start of testmysql.php<hr>
<?
$db = "thaiall_db";
$host = "localhost";
$uname = "u";
$passwd = "p";
$connect=mysql_connect($host,$uname,$passwd);
$tb="worker";
# ===
# This area for create database in first time.
## $result=mysql_create_db($db,$connect);
## echo "Create database perlphpasp (table $tb)";
## $query="create table $tb (eid char(4),ename char(40))";
## $result=mysql_db_query($db,$query);
## $sql="insert into $tb values('1001','Tom')";
## $result=mysql_db_query($db,$sql);
## $sql="insert into $tb values('1002','Dang')";
## $result=mysql_db_query($db,$sql);
## $sql="insert into $tb values('1003','Pom')";
## $result=mysql_db_query($db,$sql);
## mysql_close($connect);
# ===
echo "Display records : ";
$query="select * from $tb";
$result = mysql_db_query($db,$query);
if ($result) { echo "OK<br>"; } else { exit; }
while ($object = mysql_fetch_object($result)) {
  echo $object->eid . "  " . $object->ename . "<br>";
}
echo "Total records : ".mysql_num_rows($result);
?>
<hr>End of testmysql.php</body>
ตัวอย่างผลลัพธ์
Start of testmysql.php
----------------------
Display records : OK
1001 Tom
1002 Dang
1003 Pom
Total records : 3
----------------------
End of testmysql.php
6.4 โปรแกรมภาษา php ทดสอบการ insert ข้อมูล 1000 ระเบียน
ทดสอบในโปรแกรม XAMPP 3.0.12 ที่ใช้ Apache 2.4, PHP 5.4.4, MySql 5.0.10
<?php
// Start : Keep time
list($u,$s) = preg_split('/ /',microtime());
$gap = $s + $u;
// Initial Value
$host = "localhost";
$user = "root";
$password = "";
$db = "mytest";
$tb="test";
$tot = 1000;
$link=mysql_connect($host,$user,$password);
// Create Database
$sql="create database $db";
$db_selected = mysql_select_db($db, $link);
if (!$db_selected) {
  $result=mysql_query($sql,$link);
  header("Location: " . $_SERVER["SCRIPT_NAME"]);
}
// Create Table
$sql="select * from $tb";
if(!$result=mysql_query($sql,$link)){
  $sql="create table $tb (id int primary key not null auto_increment,mytime datetime)";
  $result=mysql_query($sql,$link);
}
// Insert Record
for ($i=1;$i<=$tot;$i++) {
  $sql="insert into $tb values('','". date('Y-m-d H:i:s') . "')";
  $result=mysql_query($sql,$link);
}
// Show all Record
echo "<br/><textarea rows=10 cols=60>";
$sql="select * from $tb";
$result = mysql_query($sql,$link);
while ($object = mysql_fetch_object($result)) {
  echo $object->id . "  " . $object->mytime . "\n";
}
echo "</textarea><br/>count : ".mysql_num_rows($result) . "<br/>";
mysql_close($link);
// Stop : Calculate time gap
list($u_stop,$s_stop) = preg_split('/ /',microtime()); 
$gap = $s_stop + $u_stop - $gap;
echo number_format($gap,9) . " second";
?>
6.5 โปรแกรมภาษา asp สำหรับอ่านข้อมูลจาก MySQL
ถ้าจะใช้ MySQL ด้วย asp ใน windows98 ต้องติดตั้ง Connector/ODBC 3.51 -- production release
Download Driver : MyODBC-3.51.02.exe 420 KB จาก http://pubnet.moph.go.th/download.html ในประเทศไทย
Download Driver : http://dev.mysql.com/get/Downloads/MyODBC3/MyODBC-standard-3.51.9-win.exe/from/pick
Information : http://dev.mysql.com/downloads/connector/odbc/3.51.html
แสดงการกำหนด DSN name และเชื่อมต่อด้วย ASP
<%
set conn = server.createobject("adodb.connection")
' conn.open "burincust", "changetousername", "changetopassword"
conn.open "burincust", "", ""
sql = "select * from cust"
set rs = conn.execute(sql)
do while not rs.eof
  response.write(rs("cust") & " " & rs("custname") & "<br>")
  rs.MoveNext
loop
conn.close
set rs = nothing
set conn = nothing
%>
<%
ConnString = "Driver={MySQL ODBC 3.51 Driver};Server=localhost;Database=test;uid=u;password=p;"
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open ConnString
Set rs = conn.Execute("SELECT * FROM cust")
do while not rs.eof
  response.write(rs("cust") & " " & rs("custname") & "<br>")
  rs.MoveNext
loop
conn.close
set rs = nothing
set conn = nothing
%>
6.6 นับระเบียนด้วย mysql_num_rows หรือ mysql_num_fields
อาจารย์ที่อุบล ถามผมใช้ว่า mysql_num_rows แล้วมีปัญหาใน RH9 .. ก่อนท่านส่ง code หาตัวอย่างมาดูก่อน

ตัวอย่างนี้จาก http://th.php.net/manual/en/function.mysql-num-rows.php
<?
$link = mysql_connect("localhost", "mysql_user", "mysql_password");
mysql_select_db("database", $link);
$result = mysql_query("SELECT * FROM table1", $link);
$num_rows = mysql_num_rows($result);
echo "$num_rows Rows\n";
?>
7. ทริกเกอร์ (Triggers) Triggers = ตั้งเงื่อนไขจัดการข้อมูล ถูกเพิ่มใน MySQL 5.0.2
Triggers are a special PL/SQL construct similar to procedures. However, a procedure is executed explicitly from another block via a procedure call, while a trigger is executed implicitly whenever the triggering event happens. The triggering event is either a INSERT, DELETE, or UPDATE command. The timing can be either BEFORE or AFTER. The trigger can be either row-level or statement-level, where the former fires once for each row affected by the triggering statement and the latter fires once for the whole statement. WHAT ARE TRIGGERS?
Triggers are programmable events that react to queries and reside directly on the database server. Triggers can be executed before or after INSERT, UPDATE or DELETE statements.? 7.1 แนะนำเว็บ (Web Guides)
+ mysql.com : 19.1. CREATE TRIGGER Syntax ***
+ microsoft.com : CREATE TRIGGER (Transact-SQL)
+ digitalpropulsion.org : MySQL Triggers Tryout
+ onlamp.com : MySQL Triggers Tryout
+ browardphp.com : MySQL Reference Manual for version 5.0.3-alpha
7.2 ตัวอย่าง code ของ triggers
CREATE
    [DEFINER = { user | CURRENT_USER }]
    TRIGGER trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW trigger_stmt

create table test1(a1 INT);
create table test2(a2 INT);
create table test3(a3 INT not null AUTO_INCREMENT PRIMARY KEY);
create table test4(
  a4 INT not null AUTO_INCREMENT PRIMARY KEY, 
  b4 INT DEFAULT 0
);

DELIMITER |

CREATE TRIGGER testref BEFORE INSERT ON test1
  FOR EACH ROW BEGIN
    INSERT INTO test2 SET a2 = NEW.a1;
    delete from test3 where a3 = NEW.a1;  
    UPDATE test4 SET b4 = b4 + 1 where a4 = NEW.a1;
  END;
|

DELIMITER ;

INSERT INTO test3 (a3) VALUES 
  (NULL), (NULL), (NULL), (NULL), (NULL), 
  (NULL), (NULL), (NULL), (NULL), (NULL);

INSERT INTO test4 (a4) VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0), (0);

INSERT INTO test1 VALUES (1), (3), (1), (7), (1), (8), (4), (4);

SHOW TRIGGERS;

DROP TRIGGER testref;

SELECT * FROM test1;
| a1   | 8 rows
+------+
|    1 |
|    3 |
|    1 |
|    7 |
|    1 |
|    8 |
|    4 |
|    4 |

SELECT * FROM test2;
| a2   | 8 rows
+------+
|    1 |
|    3 |
|    1 |
|    7 |
|    1 |
|    8 |
|    4 |
|    4 |

SELECT * FROM test3; ถ้ามีใน test2 จะถูกลบจาก test3
| a3 | 5 rows
+----+
|  2 |
|  5 |
|  6 |
|  9 |
| 10 |

SELECT * FROM test4; นับว่าแต่ละค่าเพิ่มกี่ครั้ง
| a4 | b4   | 10 rows
+----+------+
|  1 |    3 |
|  2 |    0 |
|  3 |    1 |
|  4 |    2 |
|  5 |    0 |
|  6 |    0 |
|  7 |    1 |
|  8 |    1 |
|  9 |    0 |
| 10 |    0 |
การใช้ excel การใช้ excel จัดการข้อมูลเป็น SQL Command ก่อนส่งไปประมวลผลในเครื่องบริการ
- เมื่อกรอกข้อมูลใน excel แล้ว เขียนสูตรสร้าง SQL Command แล้วคัดลอก SQL Command ไปประมวลผล
- ตัวอย่างนี้มีตารางชื่อ friends และในตารางมีเขตข้อมูล 3 ระเบียน

ปัญหาที่เกิดจากการไม่ควบคุมข้อมูลก่อนการ Insert

เห็นภาพนี้แล้วผมว่าปัญหาเกิดจาก doubleclick ซึ่งมีวิธีป้องกันอยู่หลายวิธี เช่น เช็คค่าว่าง หรือเซสชัน
แต่ก็สงสัยว่า doubleclick แล้วทำไมฟอร์ม post ข้อมูลรอบเดียว .. อะไรเป็นปัจจัยเสริม
บทเรียนกับ stored procedure บน mysql
1. ทดสอบกับ MySQL server version 5.5.16 ใน thaiabc.com 8.0
2. เดิม start mysql ด้วย DOS>mysqld.exe --console
แต่พบปัญหาขณะ call procedure ว่า
ERROR 1436 (HY000): Thread stack overrun:  6892 bytes used of a 131072 byte stack, 
and 128000 bytes needed.  Use 'mysqld --thread_stack=#' to specify a bigger stack.
3. จึง start mysql ด้วย DOS>mysqld.exe --console --thread_stack=999999
---
4. สร้าง procedure
use test;
delimiter //
create procedure x01()
begin
select * from student;
end//
delimiter ;
grant execute on procedure test.x01 to ''@'localhost';
call x01();
---
5. สร้าง function
create function addhead(s char(20))
returns char(50) deterministic
return concat('- ',s,'!');
select addhead(sname) from student;
---
6. คำสั่งที่น่าสนใจ
show create procedure xxx;
drop procedure xxx;
show procedure status;
show function status;
help show;
show procedure status where Db = DATABASE() and type = 'PROCEDURE';
select * from mysql.proc;
select * from information_schema.routines;
กรณีตัวอย่าง : เลือกข้อมูลหลัง merge key field
มีความต้องการว่า ตารางแรกมีเขตข้อมูล ปีกับภาคแยกกัน แต่ตารางที่สองเก็บ ปีกับภาคในเขตข้อมูลเดียวกัน หากต้องการ select ข้อมูลและเลือกด้วย where ก็ต้องรวมปีกับภาคก่อน จึงจะเชื่อม 2 แฟ้มนี้ได้ โดยใช้ concat ช่วยในการต่อเขตข้อมูลแบบ string เพราะถ้าใช้ + จะกลายเป็นการหาผลรวม ซึ่งตัวอย่างนี้ทดสอบใน XAMPP แบบ command line ได้ผลตามตารางข้างล่างนี้
+------+------+
| b12  | a3   |
+------+------+
|   12 | toy  |
|   21 | jam  |
+------+------+
use test;
create table a(a1 int, a2 int,a3 char(10));
create table b(b int primary key auto_increment,b12 int);
insert into a values(1,1,"tom");
insert into a values(1,2,"toy");
insert into a values(2,1,"jam");
insert into a values(2,2,"dig");
insert into b (b12) values(12);
insert into b (b12) values(21);
select concat(a1,a2) from a;
select b.b12,a.a3 from (a inner join b on concat(a.a1,a.a2) = b.b12) ;
select b.b12,a.a3 from a,b where concat(a.a1,a.a2) = b.b12;
กรณีตัวอย่าง : การนำ 2 ตารางมารวมกันด้วย union
ถ้ามีข้อมูล 2 ตาราง และมีจำนวนเขตข้อมูลเท่ากัน แล้วต้องการนำมาต่อกัน เช่นมีตารางละ 10 ระเบียน ต้องการต่อกันเป็น 20 ระเบียนก็ใช้คำสั่ง union all ได้ดังตัวอย่าง แต่ถ้าใช้ union ก็จะเลือกที่ไม่ซ้ำกันตามกฎ distinct คือเลือกเฉพาะที่แตกต่าง
+------+------+------+
| d1   | d2   | d3   |
+------+------+------+
|    1 |    1 | tom  |
|    1 |    2 | toy  |
|    2 |    1 | jam  |
|    2 |    2 | dig  |
|    1 |    1 | tom  |
|    1 |    2 | toy  |
|    2 |    1 | jam  |
|    2 |    2 | dig  |
+------+------+------+
create table c(a1 int, a2 int,a3 char(10));
insert into c values(1,1,"tom");
insert into c values(1,2,"toy");
insert into c values(2,1,"jam");
insert into c values(2,2,"dig");
create table d(d1 int, d2 int,d3 char(10));
insert into d values(1,1,"tom");
insert into d values(1,2,"toy");
insert into d values(2,1,"jam");
insert into d values(2,2,"dig");
select * from d union all select * from a;
select * from a union select * from b;
หมายเหตุ
ตัวอย่างนี้ใช้ union all จะมา 8 ระเบียน
ถ้าใช้ union จะมา 4 ระเบียน
แม้เขตข้อมูลชื่อต่างกันก็ union กันได้
โดยชื่อเขตข้อมูลที่ปรากฎจะเป็นของ select แรก
ผลการทดสอบ ลังติดตั้ง xampp มี phpmyadmin มาให้ใช้แล้ว ทำให้เข้าจัดการฐานข้อมูลได้ทันที แต่ mysqlfront ที่ download มาใหม่ ผลการทดสอบพบว่าทำงานกับ MySQL 5.5.25a ได้ไม่ดีนัก โดยเฉพาะการจัดการ user ที่ทำให้ผลการแก้ไข user ผิดปกติไป ก็ต้องแนะนำว่าให้หา tool ที่ compatible กับรุ่นของ MySQL ที่ใช้อยู่ พบใน help ว่า mysqlfront เริ่มรองรับ MySQL ตั้งแต่รุ่น 3.23 แต่ไม่รู้ว่าสูงสุดถึงรุ่นใด แต่ถ้าสร้าง user ใน phpmyadmin แล้ว ก็จะใช้ user นั้นบน mysqlfront ได้ไม่มีปัญหา สามารถใช้ function พื้นฐาน เช่น สร้างฐานข้อมูล สร้างตาราง เพิ่ม ลบ แก้ไขข้อมูล สำหรับการสร้าง user ขึ้นมาใหม่ ถ้ากำหนดเป็น any host หรือ % ก็จะสามารถ signin จากเครื่องอื่นได้ แทนที่จะกำหนดเป็น localhost ที่ script ต้องอยู่ในเครื่องนั้น และติดต่อได้เฉพาะในเครื่องเท่านั้น แล้วอย่าลืม Grant all privileges ถ้าคิดจะสร้างผู้มีสิทธิ์เทียบ root ขึ้นมา
การนำเข้าฐานข้อมูล (import)
มีเพื่อนเล่าให้ฟังว่าไปพบแฟ้ม .gz ขนาดใหญ่ถึง 100 MiB 
แล้วบอกว่าถ้าแตกเป็น .sql จะใหญ่เกิด 1GiB ทำให้รู้ว่าบีบได้ถึง 10 เท่า
จึงหาแฟ้มใหญ่ที่อาจสร้างด้วย php[54] มาทดสอบ มีขั้นตอนดังนี้
วิธีที่ 1. ใช้ phpmyadmin
1. ลง xampp (ก่อนลงก็ใช้ netstat เช็คก่อนว่าเปิด 80 ทิ้งไว้รึเปล่า)
2. แก้ php.ini ซึ่งเป็น configuration file ของ script interpreter 

post_max_size=3000M ; Warning: POST Content-Length of xxx bytes exceeds the limit of 8388608 bytes
upload_max_filesize=3000M ; big dump file
memory_limit=128M  ; big dump file (128M is default value)
max_execution_time=30000 ; Fatal error: Maximum execution time of 300 seconds (30 is default)
max_input_time=-1 ; unlimited (60 is default value)
; in 300 seconds, in my test get 255000 records
3. แก้ไขแฟ้ม /xampp/phpmyadmin/config.inc.php
โดยเพิ่ม $cfg['ExecTimeLimit'] = 30000; เข้าไปอีก 1 บรรทัด
หากไม่แก้จะพบ Script timeout passed, if you want to finish import, please resubmit
และจะพบระเบียนเข้ามาเพียงประมาณ 255000 records
4. เรียก phpmyadmin เพื่อใช้สำหรับบริการจัดการ mysql ที่เปิดอยู่
5. สร้าง db ที่ชอบที่ชอบ เพื่อใช้เป็นแหล่งนำตารางเข้าเครื่อง
6. import แฟ้ม 1GiB mydata.gz หรือ mydata.sql (เครื่องผม 7:07:17 ถึง 8:26:20 ใน access.log)

วิธีที่ 2. การนำ .sql เข้า mysql ผ่าน command line
1. DOS> c:\xampp\mysql\bin\mysql -u root -p (เข้า mysql)
2. mysql> create database testj; (สร้างฐานข้อมูลสำหรับนำข้อมูลเข้า)
3. mysql> exit;
4. DOS> echo %TIME% (6:26:30) ดูเวลาเริ่มต้น
5. DOS> c:\xampp\mysql\bin\mysql -u root -p testj < mydata.sql
6. DOS> echo %TIME% (6:27:59) ดูเวลาสิ้นสุด
7. ใช้เวลาไม่ถึงนาทีครึ่ง และไม่ต้อง config ใด ๆ 
แนะนำเว็บ (Web Guides) Store Procedure
+ http://code.function.in.th/sqlserver/stored-procedure ***
+ http://www.mssqltips.com/sqlservertutorial/160/sql-server-stored-procedure/
+ http://www.mysqltutorial.org/getting-started-with-mysql-stored-procedures.aspx
+ https://dev.mysql.com/doc/refman/8.0/en/stored-routines.html
+ http://php.net/manual/en/mysqli.quickstart.stored-procedures.php
MS Access 2016
โปรแกรม Microsoft Access 2016 เปิดแฟ้ม .mdb ตรง ๆ ไม่ได้
วิธีที่เค้าแนะนำมา คือ เปิด .mdb ด้วย Microsoft Access รุ่นเดิมที่มีอยู่นั้น
แล้วแปลงเป็น .accdb ที่เป็นรูปแบบใหม่
อีกวิธีคือหาโปรแกรมภายนอกมาแปลง มาเปิดแฟ้ม .mdb แทน Microsoft Access 
แล้วแปลงเข้า Database ตัวอื่น อาทิ

MDB Viewer plus (Portable)
http://www.alexnolan.net/software/mdb_viewer_plus.htm

AxBase (คล้าย MDB Viewer plus)
https://sourceforge.net/projects/axbase/

MDB, ACCDE Viewer and Reader (Chrome extension)
https://chrome.google.com/webstore/detail/mdb-accdb-viewer-and-read/mcfgopgpdlpcphkcijidlencdankpgbc

Access To MySQL
http://www.bullzip.com/products/a2m/info.php

MDBopener แบบใช้ online
http://www.mdbopener.com/

ACCDB MDB Explorer for MAC
https://accdb-mdb-explorer.en.softonic.com/mac

MDB/ACCDE Viewer for MAC
https://eggerapps.at/mdbviewer/

บน Windows 10 มี Bash on ubuntu on windows [win10]
https://github.com/brianb/mdbtools (source)
https://gist.github.com/turicas/2592877 (script)
http://manpages.ubuntu.com/manpages/trusty/man1/mdb-export.1.html (manual)
sudo apt-get install mdbtools
mdb-tables /mnt/d/Northwind.mdb
cd /mnt/d
[Order Details, Orders, Products, Shippers, Categories, Customers, Employees, Suppliers]
mdb-schema -T 'Order Details' Northwind.mdb mysql > orderdetails.sql
mdb-export -I 'mysql' -R '\n' Northwind.mdb 'Order Details' >> orderdetails.sql

mdb-schema -T Orders Northwind.mdb mysql > orders.sql
mdb-export -I 'mysql' -R '\n' Northwind.mdb Orders >> orders.sql

mdb-schema -T Products Northwind.mdb mysql > products.sql
mdb-export -I 'mysql' -R '\n' Northwind.mdb Products >> products.sql

mdb-schema -T Shippers Northwind.mdb mysql > shippers.sql
mdb-export -I 'mysql' -R '\n' Northwind.mdb Shippers >> shippers.sql

mdb-schema -T Categories Northwind.mdb mysql > categories.sql
mdb-export -I 'mysql' -R '\n' Northwind.mdb Categories >> categories.sql

mdb-schema -T Customers Northwind.mdb mysql > customers.sql
mdb-export -I 'mysql' -R '\n' Northwind.mdb Customers >> customers.sql

mdb-schema -T Employees Northwind.mdb mysql > employees.sql
mdb-export -I 'mysql' -R '\n' Northwind.mdb Employees >> employees.sql

mdb-schema -T Suppliers Northwind.mdb mysql > suppliers.sql
mdb-export -I 'mysql' -R '\n' Northwind.mdb Suppliers >> suppliers.sql
---
เข้า DOS ผ่าน cmd
cd /xampp/mysql/bin
mysql -u root -p
MariaDB [(none)]> show databases;
MariaDB [(none)]> create database northwind;
MariaDB [(none)]> use northwind;
MariaDB [(none)]> source c:\orders.sql
MariaDB [(none)]> exit
DOS> mysql -u root -p northwind < d:\orderdetails.sql
DOS> mysql -u root -p northwind < d:\products.sql
DOS> mysql -u root -p northwind < d:\shippers.sql
DOS> mysql -u root -p northwind < d:\customers.sql
DOS> mysql -u root -p northwind < d:\shippers.sql
DOS> mysql -u root -p northwind < d:\suppliers.sql
DOS> mysql -u root -p northwind --binary-mode < d:\categories.sql
DOS> mysql -u root -p northwind --binary-mode < d:\employees.sql

หากพบ error ก็เพิ่ม --binary-mode เพราะข้อมูลมีภาพ
ERROR at line 19: ASCII '\0' appeared in the statement, 
but this is not allowed unless option --binary-mode is enabled and mysql is run in non-interactive mode. 
Set --binary-mode to 1 if ASCII '\0' is expected. 

หลังนำเข้าหมดแล้ว
ก็เปิด phpmyadmin
คลิ๊กเข้า Database : northwind
คลิ๊ก Export จาก Tab menu และ format=sql
ได้แฟ้ม northwindfromphpmyadmin.sql ไว้ใช้กับ mysql เครื่องอื่นต่อไป

ถ้าไม่ใช้ phpmyadmin ก็ใช้คำสั่งผ่าน Command line หรือ DOS Prompt
ก็ใช้คำสั่ง mysqldump ด้วย
mysqldump -u root -p northwind > d:\northwindfrommysqldump.sql
Download : northwindwithsqlfile.zip
Download : northwind_csvxml_by_mdbviewerplus.zip รวมแฟ้ม csv และ xml จาก mdbviewplus

Source_code : http://www.thaiall.com/perlphpasp/source.pl?9141
การทำเหมืองข้อมูล เล่ม 1 การค้นหาความรู้จากข้อมูล
ผู้แต่ง : รศ.สายชล สินสมบูรณ์ทอง ISBN : 9786164408760
ปีพิมพ์ : 2 / 2560 ขนาด (w x h) : 185 x 260 mm.
ปก / จำนวนหน้า : ปกอ่อน / 550 หน้า ราคาปก : 290.00 บาท

หนังสือการทำเหมืองข้อมูลเล่ม 1 : การค้นหาความรู้จากข้อมูล พิมพ์ครั้งที่ 2 ฉบับปรับปรุง เหมาะสำหรับนิสิตและนักศึกษาในระดับปริญญาตรีและปริญญาโท ในคณะวิทยาศาสตร์ สารสนเทศ พาณิชยศาสตร์และการบัญชี และวิศวกรรมศาสตร์ ทั้งในระดับปริญญาตรีและปริญญาโท ในหลายสาขาวิชา เช่น สถิติ สถิติประยุกต์ การวิจัยการดำเนินงาน คณิตศาสตร์ คณิตศาสตร์ประยุกต์ วิทยาการคอมพิวเตอร์สารสนเทศ วิศวกรรมคอมพิวเตอร์ วิศวกรรมสารสนเทศ นอกจากนี้ยังเหมาะสมสำหรับคณะครุศาสตร์อุตสาหกรรม บริหารธุรกิจ เศรษฐศาสตร์ สังคมศาสตร์ มนุษยศาสตร์ ศึกษาศาสตร์ วิจัยการศึกษา แพทยศาสตร์ เภสัชศาสตร์ และเกษตรศาสตร์ ที่ต้องการศึกษาและนำหลักการในการทำเหมืองข้อมูลไปใช้ในการทำปัญหาพิเศษ การทำวิทยานิพนธ์ การทำวิจัย หรือเป็นเครื่องมือทางการตลาด เพื่อเอาชนะคู่แข่งทางธุรกิจ หนังสือเล่มนี้ประกอบด้วย 13 บท คือ บทนำเกี่ยวกับการทำเหมืองข้อมูล การจัดเตรียมข้อมูลก่อนประมวลผลข้อมูล การวิเคราะห์ข้อมูลโดยการสำรวจ วิธีการเชิงสถิติในการประมาณค่าและการทำนาย ความใกล้เคียงกันมากที่สุด ต้นไม้ตัดสินใจโครงการประสาทเทียม โครงจ่ายโคโฮเนน กฎความสัมพันธ์ วิธีการประเมินตัวแบบ การทำเหมืองข้อมูลบนเวป และโปรแกรมในการทำเหมืองข้อมูล
p.20
SELECT P.custid, P.item, sum(P.qty)
FROM Purchases P
GROUP BY P.custid , P.item
HAVING SUM(P.qty) > 5
ทดสอบคำสั่ง SQL บน w3schools.com

ทดสอบ SQL Function บน Northwind
ถ้ายังไม่ได้ติดตั้ง MySQL แต่ต้องการทดสอบคำสั่ง SQL สามารถทดสอบคำสั่งได้ที่ w3schools.com เมื่อเข้าไปจะพบตัวอย่างคำสั่ง ที่มี table และ field ให้ทดสอบเรียบร้อยแล้ว
SELECT * FROM Customers WHERE City IN ('Paris','London');
SELECT * FROM Categories Where CategoryID < 4;
SELECT *, substr(BirthDate,0,5) as b FROM Employees ORDER BY b;
SELECT OrderID, count(OrderID) as c FROM OrderDetails GROUP BY OrderID;
SELECT * FROM Orders;
SELECT * FROM Products;
SELECT * FROM Shippers;
SELECT * FROM Suppliers;
SQL Function #
MySQL String Functions
No.FunctionDescription
ASCII Returns the number code that represents the specific character
CHAR_LENGTH Returns the length of the specified string (in characters)
CHARACTER_LENGTH Returns the length of the specified string (in characters)
CONCAT Concatenates two or more expressions together
CONCAT_WS Concatenates two or more expressions together and adds a separator between them
FIELD Returns the position of a value in a list of values
FIND_IN_SET Returns the position of a string in a string list
FORMAT Formats a number as a format of "#,###.##", rounding it to a certain number of decimal places
INSERT Inserts a substring into a string at a specified position for a certain number of characters
INSTR Returns the position of the first occurrence of a string in another string
LCASE Converts a string to lower-case
LEFT Extracts a substring from a string (starting from left)
LENGTH Returns the length of the specified string (in bytes)
LOCATE Returns the position of the first occurrence of a substring in a string
LOWER Converts a string to lower-case
LPAD Returns a string that is left-padded with a specified string to a certain length
LTRIM Removes leading spaces from a string
MID Extracts a substring from a string (starting at any position)
POSITION Returns the position of the first occurrence of a substring in a string
REPEAT Repeats a string a specified number of times
REPLACE Replaces all occurrences of a specified string
REVERSE Reverses a string and returns the result
RIGHT Extracts a substring from a string (starting from right)
RPAD Returns a string that is right-padded with a specified string to a certain length
RTRIM Removes trailing spaces from a string
SPACE Returns a string with a specified number of spaces
STRCMP Tests whether two strings are the same
SUBSTR Extracts a substring from a string (starting at any position)
SUBSTRING Extracts a substring from a string (starting at any position)
SUBSTRING_INDEX Returns the substring of string before number of occurrences of delimiter
TRIM Removes leading and trailing spaces from a string
UCASE Converts a string to upper-case
UPPER Converts a string to upper-case

MySQL Numeric Functions
No.FunctionDescription
ABS Returns the absolute value of a number
ACOS Returns the arc cosine of a number
ASIN Returns the arc sine of a number
ATAN Returns the arc tangent of a number or the arc tangent of n and m
ATAN2 Returns the arc tangent of n and m
AVG Returns the average value of an expression
CEIL Returns the smallest integer value that is greater than or equal to a number
CEILING Returns the smallest integer value that is greater than or equal to a number
COS Returns the cosine of a number
COT Returns the cotangent of a number
COUNT Returns the number of records in a select query
DEGREES Converts a radian value into degrees
DIV Used for integer division
EXP Returns e raised to the power of number
FLOOR Returns the largest integer value that is less than or equal to a number
GREATEST Returns the greatest value in a list of expressions
LEAST Returns the smallest value in a list of expressions
LN Returns the natural logarithm of a number
LOG Returns the natural logarithm of a number or the logarithm of a number to a specified base
LOG10 Returns the base-10 logarithm of a number
LOG2 Returns the base-2 logarithm of a number
MAX Returns the maximum value of an expression
MIN Returns the minimum value of an expression
MOD Returns the remainder of n divided by m
PI Returns the value of PI displayed with 6 decimal places
POW Returns m raised to the nth power
POWER Returns m raised to the nth power
RADIANS Converts a value in degrees to radians
RAND Returns a random number or a random number within a range
ROUND Returns a number rounded to a certain number of decimal places
SIGN Returns a value indicating the sign of a number
SIN Returns the sine of a number
SQRT Returns the square root of a number
SUM Returns the summed value of an expression
TAN Returns the tangent of a number
TRUNCATE Returns a number truncated to a certain number of decimal places

MySQL Date Functions
No.FunctionDescription
ADDDATE Returns a date after a certain time/date interval has been added
ADDTIME Returns a time/datetime after a certain time interval has been added
CURDATE Returns the current date
CURRENT_DATE Returns the current date
CURRENT_TIME Returns the current time
CURRENT_TIMESTAMP Returns the current date and time
CURTIME Returns the current time
DATE Extracts the date value from a date or datetime expression
DATEDIFF Returns the difference in days between two date values
DATE_ADD Returns a date after a certain time/date interval has been added
DATE_FORMAT Formats a date as specified by a format mask
DATE_SUB Returns a date after a certain time/date interval has been subtracted
DAY Returns the day portion of a date value
DAYNAME Returns the weekday name for a date
DAYOFMONTH Returns the day portion of a date value
DAYOFWEEK Returns the weekday index for a date value
DAYOFYEAR Returns the day of the year for a date value
EXTRACT Extracts parts from a date
FROM_DAYS Returns a date value from a numeric representation of the day
HOUR Returns the hour portion of a date value
LAST_DAY Returns the last day of the month for a given date
LOCALTIME Returns the current date and time
LOCALTIMESTAMP Returns the current date and time
MAKEDATE Returns the date for a certain year and day-of-year value
MAKETIME Returns the time for a certain hour, minute, second combination
MICROSECOND Returns the microsecond portion of a date value
MINUTE Returns the minute portion of a date value
MONTH Returns the month portion of a date value
MONTHNAME Returns the full month name for a date
NOW Returns the current date and time
PERIOD_ADD Takes a period and adds a specified number of months to it
PERIOD_DIFF Returns the difference in months between two periods
QUARTER Returns the quarter portion of a date value
SECOND Returns the second portion of a date value
SEC_TO_TIME Converts numeric seconds into a time value
STR_TO_DATE Takes a string and returns a date specified by a format mask
SUBDATE Returns a date after which a certain time/date interval has been subtracted
SUBTIME Returns a time/datetime value after a certain time interval has been subtracted
SYSDATE Returns the current date and time
TIME Extracts the time value from a time/datetime expression
TIME_FORMAT Formats a time as specified by a format mask
TIME_TO_SEC Converts a time value into numeric seconds
TIMEDIFF Returns the difference between two time/datetime values
TIMESTAMP Converts an expression to a datetime value and if specified adds an optional time interval to the value
TO_DAYS Converts a date into numeric days
WEEK Returns the week portion of a date value
WEEKDAY Returns the weekday index for a date value
WEEKOFYEAR Returns the week of the year for a date value
YEAR Returns the year portion of a date value
YEARWEEK Returns the year and week for a date value

MySQL Advanced Functions
No.FunctionDescription
BIN Converts a decimal number to a binary number
BINARY Converts a value to a binary string
CASE Lets you evaluate conditions and return a value when the first condition is met
CAST Converts a value from one datatype to another datatype
COALESCE Returns the first non-null expression in a list
CONNECTION_ID Returns the unique connection ID for the current connection
CONV Converts a number from one number base to another
CONVERT Converts a value from one datatype to another, or one character set to another
CURRENT_USER Returns the user name and host name for the MySQL account used by the server to authenticate the current client
DATABASE Returns the name of the default database
IF Returns one value if a condition is TRUE, or another value if a condition is FALSE
IFNULL Lets you to return an alternate value if an expression is NULL
ISNULL Tests whether an expression is NULL
LAST_INSERT_ID Returns the first AUTO_INCREMENT value that was set by the most recent INSERT or UPDATE statement
NULLIF Compares two expressions
SESSION_USER Returns the user name and host name for the current MySQL user
SYSTEM_USER Returns the user name and host name for the current MySQL user
USER Returns the user name and host name for the current MySQL user
VERSION Returns the version of the MySQL database
ระบบสั่งซื้อที่ใช้ ajax และ temporary table

621025 : ปรับให้โปรแกรมทำงานได้ทั้ง php5 และ php7 และไม่ต้องใช้ phpmyadmin และแสดงการใช้ fetch_object กับ fetch_assoc แล้วใช้ ajax
+ myorderform.docx
+ training492.htm
ตัวอย่าง order in temporary table and reduce quantity
วัตถุประสงค์หลักของโปรแกรม เพื่อแสดงแนวทางการเขียนโปรแกรมในระบบสั่งซื้อ (Orders) และสั่งซื้อละเอียด (Order Details) ที่ทำงานร่วมกับ temporary table เมื่อเปิดใบสั่งซื้อใหม่ และเพิ่มรายการสินค้า (Product) จะส่งเข้า temporary เมื่อต้องปิดการขายได้แล้ว ให้กดปุ่ม confirm จึงจะย้ายข้อมูลจาก temporary table ไปยัง main table และแสดงการตัด stock กับ field quantity เมื่อมีการเลือกสินค้า โดยมีโปรแกรมทำงาน 6 โปรแกรม คือ 1) create5tb.php คือ โปรแกรมสร้างตารางและข้อมูลเพื่อเตรียมถูกเรียกใช้ 2) myorderform.php คือ ฟอร์มหลักรอรับข้อมูลใบสั่งซื้อ 3) insertorderform.php คือ ฟอร์มที่รอรับข้อมูลสินค้าและจำนวน 4) insertorderprocess.php คือ ปุ่มบันทึกสินค้าเข้าตารางชั่วคราว แล้วรอรับสินค้าใหม่) 5) insertorderconfirm.php คือ ลิงค์ยืนยัน บันทึกจากชั่วคราวไปหลัก และล้างตารางชั่วคราวทั้งหมด 6) mygetprice.php คือ โปรแกรมส่งราคาสินค้ากลับ ผ่าน ajax เรียกข้อมูลตามรหัสสินค้า
mysqldump : import and export
C:\xampp> apache_start.bat
C:\xampp> apache_stop.bat
C:\xampp> mysql_start.bat
C:\xampp> mysql_stop.bat
C:\xampp\mysql\bin\> mysql -u root -p testdb < mydata1.sql
C:\xampp\mysql\bin\> mysqldump --version
C:\xampp\mysql\bin\> mysqldump -u root -p testdb > mydata2.sql
Enter password:
C:\xampp\mysql\bin> dir test.sql
09/05/2021  09:14 AM             1,927 mydata2.sql
Foreign key in PHPMyadmin
ศัพท์เทคนิคที่น่าสนใจ (Interested Terms)
MySQL
มายเอสคิวแอล (MySQL) คือ โปรแกรมระบบจัดการฐานข้อมูล มีหน้าที่เก็บข้อมูลอย่างเป็นระบบ รองรับคำสั่งเอสคิวแอล (SQL = Structured Query Language) เป็นเครื่องมือสำหรับเก็บข้อมูล ที่ต้องใช้ร่วมกับเครื่องมือหรือโปรแกรมอื่นอย่างบูรณาการ เพื่อให้ได้ระบบงานที่รองรับความต้องการของผู้ใช้ เช่นทำงานร่วมกับเครื่องบริการเว็บ (Web Server) เพื่อให้บริการแก่ภาษาสคริปต์ที่ทำงานฝั่งเครื่องบริการ (Server-Side Script) เช่น ภาษาพีเอชพี ภาษาเอเอสพี หรือภาษาเจเอสพี เป็นต้น หรือทำงานร่วมกับโปรแกรมประยุกต์ (Application Program) เช่น ภาษาวิชวลเบสิก ภาษาจาวา หรือภาษาซี เป็นต้น
มายเอสคิวแอล (MySQL) เป็นระบบฐานข้อมูลแบบโอเพนซอร์ท (Open Source Database) สำหรับจัดการระบบดาต้าเบส (Database System) ผ่านเอสคิวแอล (SQL) โปรแกรมนี้ถูกพัฒนาโดย บริษัท MySQL AB ในประเทศสวีเดน มีทั้งแบบใช้ฟรี และเชิงธุรกิจ
rspsocial
Thaiall.com