Saturday, 7 November 2015

mysql



ความหมาย
การใช้ MySQL ให้สำเร็จ ควรเรียนวิชาด้านฐานข้อมูล(Database) มาให้เข้าใจก่อนครับ
SQL (Structured Query Language)
เอสคิวแอล (SQL) คือ ภาษาสอบถามข้อมูล หรือภาษาจัดการข้อมูลอย่างมีโครงสร้าง มีการพัฒนาภาษาคอมพิวเตอร์ และโปรแกรมฐานข้อมูลที่รองรับมากมาย เพราะจัดการข้อมูลได้ง่าย เช่น MySQL, MsSQL, PostgreSQLหรือ MS Access เป็นต้น สำหรับโปรแกรมฐานข้อมูลที่ได้รับความนิยมคือ MySQL เป็น Open Source ที่ใช้งานได้ทั้งใน Linux และ Windows
การเปลี่ยนผ่านของ MySQL
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 อย่างต่อเนื่อง

- มายเอสคิวแอล (MySQL) คือ โปรแกรมระบบจัดการฐานข้อมูล มีหน้าที่เก็บข้อมูลอย่างเป็นระบบ รองรับคำสั่งเอสคิวแอล (SQL = Structured Query Language) เป็นเครื่องมือสำหรับเก็บข้อมูล ที่ต้องใช้ร่วมกับเครื่องมือหรือโปรแกรมอื่นอย่างบูรณาการ เพื่อให้ได้ระบบงานที่รองรับความต้องการของผู้ใช้ เช่นทำงานร่วมกับเครื่องบริการเว็บ (Web Server) เพื่อให้บริการแก่ภาษาสคริปต์ที่ทำงานฝั่งเครื่องบริการ (Server-Side Script) เช่น ภาษาพีเอชพี ภาษาเอเอสพี หรือภาษาเจเอสพี เป็นต้น หรือทำงานร่วมกับโปรแกรมประยุกต์ (Application Program) เช่น ภาษาวิชวลเบสิก ภาษาจาวา หรือภาษาซี เป็นต้น
- มายเอสคิวแอล (MySQL) เป็นระบบฐานข้อมูลแบบโอเพนซอร์ท (Open Source Database) สำหรับจัดการระบบดาต้าเบส (Database System) ผ่านเอสคิวแอล (SQL) โปรแกรมนี้ถูกพัฒนาโดย บริษัท MySQL AB ในประเทศสวีเดน มีทั้งแบบใช้ฟรี และเชิงธุรกิจ

สิ่งที่ควรเข้าใจก่อนใช้ MySQL
- เครื่องบริการเว็บ (Web Server) เช่น Apache, IIS หรือ PWS
- โปรแกรมประมวลผลฝั่งเครื่องบริการ (Server-Side Script)
เช่น Perl, PHP, ASP, VB และ JSP เป็นต้น
- ระบบปฏิบัติการ เช่น Windows หรือ Linux เป็นต้น

แหล่ง 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);
ผู้สนับสนุนยินดีรับ ผู้สนับสนุน เว็บไซต์ด้านการศึกษา
กลุ่มเว็บไซต์นี้ เริ่มพัฒนา พ.ศ.2542
โดยบุคลากรทางการศึกษาด้านคอมพิวเตอร์
โทร. 081-9927223 (ผมเป็นคนลำปางหนา)
ปล. ขอไม่รับ work at home / อาหารเสริม

สารบัญ (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 อย่างง่าย
- สอนอย่างง่ายใน แบบสอบถาม(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
แนะนำเว็บ (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 ( [..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 ( [..n]) | view_name | rowset_function_limited }
[ FROM {  } [,..n]]
[ where  ]

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

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
ข้อมูลโครงสร้างการดูแลระบบ
SELECTCREATEGRANT
INSERTALTERPROCESS
UPDATEINDEXRELOAD
DELETEDROPSHUTDOWN
FILEREFERENCES
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

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 . "
";
}
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

สามารถใช้คำสั่ง  เพื่อตรวจดูว่า php ในเครื่องสามารถติดต่อกับ MySQL ได้หรือไม่

6.2 โปรแกรมภาษา php สำหรับอ่านข้อมูลจาก MySQL
หาข้อมูลเรื่อง php เพิ่มเติมได้จาก http://www.thaiall.com/php
"; else exit;
while ($object = mysql_fetch_object($result)) {
  foreach ($object as $o) echo $o;
  # echo $object->cust . "  " . $object->custname;
  echo "
";
}
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 ครั้งต่อไปจะผิดพลาด เนื่องจากจำนวนข้อมูลที่เพิ่มขึ้น ผิดจากที่ต้องการ

Start of testmysql.php
"; } else { exit; } while ($object = mysql_fetch_object($result)) { echo $object->eid . " " . $object->ename . " "; } echo "Total records : ".mysql_num_rows($result); ?>
End of testmysql.php
ตัวอย่างผลลัพธ์ 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 count : ".mysql_num_rows($result) . " "; 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") & " ") 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") & " ") 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

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 จัดการข้อมูลเป็น 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 แรก
ขอบซ้ายขอบบน
แบบของข้อมูล (Data Type)
ข้อมูลที่เป็นตัวเลข
ประเภทขนาดที่จัดเก็บค่าที่จัดเก็บ
TINYINIT1 ไบต์เป็นค่าจำนวนเต็มขนาดเล็กมาก ถ้าเป็นค่าบวกอย่างเดียว (unsigned) จะมีค่าตั้งแต่ 0 ถึง 255 แต่ถ้าเป็นค่าบวกและลบ ( signed ) จะมีค่าตั้งแต่ –128 ถึง 127
SMALLINT2 ไบต์เป็นค่าจำนวนเต็มขนาดเล็ก ถ้าเป็นค่าบวกอย่างเดียว (unsigned) จะมีค่าตั้งแต่ 0 ถึง 65535 แต่ถ้าเป็นค่าบวกและลบ ( signed ) จะมีค่าตั้งแต่ –32768 ถึง 32767
MEDIUMINT3 ไบต์เป็นค่าจำนวนเต็มขนาดกลาง ถ้าเป็นค่าบวกอย่างเดียว (unsigned) จะมีค่าตั้งแต่ 0 ถึง 16777215 แต่ถ้าเป็นค่าบวกและลบ ( signed ) จะมีค่าตั้งแต่ –8388608 ถึง 8388607
INT หรือ INTEGER4 ไบต์เป็นค่าจำนวนเต็มขนาดปกติ ถ้าเป็นค่าบวกอย่างเดียว (unsigned) จะมีค่าตั้งแต่ 0 ถึง 4294967295 แต่ถ้าเป็นค่าบวกและลบ ( signed ) จะมีค่าตั้งแต่ –2147483648 ถึง 2147483647
BIGINT หรือ INTEGER8 ไบต์เป็นค่าจำนวนเต็มขนาดใหญ่ ถ้าเป็นค่าบวกอย่างเดียว (unsigned) จะมีค่าตั้งแต่ 0 ถึง 18446744073709551615 แต่ถ้าเป็นค่าบวกและลบ ( signed ) จะมีค่าตั้งแต่ –9223372036854775808 ถึง 9223372036854775807
FLOAT(X)4 ไบต์ (ถ้า x มีค่าไม่เกิน 24) หรือ 8 ไบต์ ( ถ้า x มีค่าตั้งแต่ 25-53 ) ปกติแล้วจะมีค่า x เป็น 2เป็นค่าจำนวนจริง
FLOAT4 ไบต์เก็บค่าจำนวนจริงขนาดเล็ก ตั้งแต่ –3.402823466E+38 ถึง –1.175494351E-38,0 และ 1.175494351E-38 ถึง 3.402823466E+38
DOUBLE หรือ REAL8 ไบต์เก็บค่าจำนวนจริงขนาดปกติ ตั้งแต่ –1.7976931348623157E+308 ถึง –2.2250738585072014E-308,0 และ 2.2250738585072014E-308 ถึง 1.7976931348623157E+308
DECIMAL(M,D) หรือ NUMBERIC(M,D)M+2 ไบต์ ถ้า D มากกว่า 0 หรือ M+1 ไบต์ ถ้า D = 0เก็บเลขทศนิยม เช่น 12345.67
ข้อมูลที่เป็นวันที่
ประเภทขนาดที่จัดเก็บค่าที่จัดเก็บ
DATE3 ไบต์เก็บวันที่และเวลาในรูปแบบ ค.ศ.-เดือน-วัน (YYYY-MM-DD) โดยมีค่าตั้งแต่ 1000-01-01 ถึง 9999-12-31
DATETIME8 ไบต์เก็บวันที่และเวลาในรูปแบบ ค.ศ.-เดือน-วัน ชั่วโมง-นาที-วินาที (YYYY-MM-DD HH:MM:SS) โดยมีค่าตั้งแต่ 1000-01-01 00:00:00 ถึง 9999-12-31 23:59:59
TIMESTAMP [(M)]4 ไบต์เก็บวันที่และเวลาโดยมีค่าตั้งแต่ 1970-01-01 00:00:00 ถึงปี ค.ศ 2037 ส่วนรูปแบบที่เก็บจะขึ้นอยู่กับค่า M ดังนี้ ถ้าไม่กำหนดค่า M หรือ M = 14 -> YYYY-MM-DD HH:MM:SS ถ้า M = 12 -> YY-MM-DD HH:MM:SS ถ้า M = 10 ->YY-MM-DD HH:MM ถ้า M = 8 ->YY-MM-DD ถ้า M = 6 ->YY-MM ถ้า M = 4 ->YY-MM ถ้า M = 2 ->YY
TIME3 ไบต์เก็บวันที่และเวลาในรูปแบบ ค.ศ.-เดือน-วัน ชั่วโมง-นาที-วินาที (YYYY-MM-DD HH:MM:SS) โดยมีค่าตั้งแต่ 1000-01-01 00:00:00 ถึง 999-12-31 23:59:59
YEAR [(2 หรือ 4)]1 ไบต์ถ้าระบุค่าเป็น 2 จะเก็บค่า 70-69 หมายถึงปี ค.ศ. 1970-2069 ถ้าระบุค่าเป็น 4 จะเก็บค่าปี ค.ศ.1901-2155
ข้อมูลที่เป็นตัวอักษร
ประเภทขนาดที่จัดเก็บ
CHAR(M)ขนาดตามค่า M แต่ไม่เกิน 255 ไบต์
VARCHAR(M)ขนาดตามข้อมูลจริง แต่ไม่เกิน 255 ไบต์
TINYBLOB หรือ TINYTEXTเก็บตามขนาดจริง +1 ไบต์ แต่ไม่เกิน 255 ไบต์
BLOB หรือ TEXTเก็บตามขนาดจริง +2 ไบต์ แต่ไม่เกิน 65,535 ไบต์
MEDIUMBLOB หรือ MEDIUMTEXTเก็บตามขนาดจริง +3 ไบต์ แต่ไม่เกิน 16,777,215 ไบต์
LONGBLOB หรือ LONGTEXTเก็บตามขนาดจริง +4 ไบต์ แต่ไม่เกิน 4,294,967,295 ไบต์
ENUM(‘value1’,’value2’,…)1 ไบต์ หรือ 2 ไบต์ แล้วแต่จำนวนค่า value ที่กำหนดซึ่งกำหนดได้ถึง 65,535 ค่า
SET(‘value1’,’value2’,…)1,2,3,4 หรือ 8 ไบต์ แล้วแต่จำนวนสมาชิกในเซ็ตของ SET (สูงสุดไม่เกิน 64)
ขอบซ้ายขอบบน
xampp + mysqlfront
ผลการทดสอบ .. หลังติดตั้ง 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 ขึ้นมา
Post a Comment

Analytics and Statistic

Blog Archive