一、MySQL安装
1. MYSQL命令规则介绍
MySQL的命名机制使用由3个数字和一个后缀组成的版本号。例如,像mysql-5.0.27-beta的版本号这样解释:
第1个数字(5)是主版本号,描述了文件格式。所有版本5的发行都有相同的文
件格式。
第2个数字(0)是发行级别。主版本号和发行级别组合便构成了发行序列号。
第3个数字(9)是在此发行系列的版本号,随每个新分发版递增。通常你需要已
经选择的发行(release)的最新版本(版本)。
2. MYSQL安装
先下载安装包(MySQL AB编译的MySQL二进制版本):
mysql-5.0.27-win32.zip
mysql-noinstall-6.0.0-alpha-win32.zip
下载了2个版本:一个5.0.27安装版;一个6.0.0非安装版。本人测试用的为5.0.27安装版,安装过程不再赘述。各个操作系统平台的安装可以看MYSQL联机文档。
3. 安装后文件布局
在Windows中,MySQL 5.1的默认安装目录是C:\Program Files\MySQL\MySQL Server 5.1。(一些Windows用户宁愿安装到原来的默认安装目录 C:\mysql。然而,子目录布局仍然相同)。安装目录包括以下子目录:

二、登录及一些基本操作
本章的主要目的是让我们对MYSQL的基础框架有个大概的了解。
1 连接与断开MYSQL服务器
安装完毕登陆MYSQL(有过一些其他数据库基础的人都应该很容易使用这几步):
我们可以利用如下参数查看MYSQL命令的帮助:
C:\Program Files\MySQL\MySQL Server 5.0\bin>mysql –help
联接MYSQL服务器:
C:\Program Files\MySQL\MySQL Server 5.0\bin>mysql -h localhost -uroot -p888888
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 22 to server version: 5.0.27-community-nt
![]()
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
![]()
mysql> SHOW DATABASES;
![]()
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| root |
+--------------------+
3 rows in set (0.08 sec)
注意到目前没有连接到任何数据库。
我们也可以在连接MYSQL服务器的时候指定想要连接的数据库,如下:mysql> SELECT DATABASE();
+------------+
| database() |
+------------+
| NULL |
+------------+
1 row in set (0.78 sec)
![]()
mysql> QUIT
Bye
INFORMATION_SCHEMA数据库C:\Program Files\MySQL\MySQL Server 5.0\bin>mysql --user=root -p mysql
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7 to server version: 5.0.27-community-nt
![]()
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
![]()
mysql> select database();
+------------+
| database() |
+------------+
| mysql |
+------------+
1 row in set (0.00 sec)
![]()
我们在介绍MYSQL基本操作的同时顺便把INFORMATION_SCHEM数据库做个简单介绍:
类似其他数据库的数据字典,各个字典含义不做详述,以下摘自MYSQL联机文档:
INFORMATION_SCHEMA提供了访问数据库元数据的方式。
元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和
“系统目录”。INFORMATION_SCHEMA是信息数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息。在INFORMATION_SCHEMA
中,有数个只读表。它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件。
2 使用数据库
3 MYSQL的SHOW命令mysql> USE INFORMATION_SCHEMA;
Database changed
![]()
mysql> SELECT DATABASE();
+--------------------+
| database() |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)
![]()
mysql> SELECT VERSION(), CURRENT_DATE, CURDATE(), NOW(), USER();
+---------------------+--------------+------------+---------------------+-------
---------+
| VERSION() | CURRENT_DATE | CURDATE() | NOW() | USER()
|
+---------------------+--------------+------------+---------------------+-------
---------+
| 5.0.27-community-nt | 2007-05-24 | 2007-05-24 | 2007-05-24 17:01:16 | root@l
ocalhost |
+---------------------+--------------+------------+---------------------+-------
---------+
1 row in set (0.01 sec)
![]()
mysql> SHOW VARIABLES LIKE 'version';
+---------------+---------------------+
| Variable_name | Value |
+---------------+---------------------+
| version | 5.0.27-community-nt |
+---------------+---------------------+
1 row in set (0.13 sec)
前边的例子中我们已经用过了MYSQL的SHOW命令:
SHOW命令可用于获取关于INFORMATION_SCHEMA本身结构的信息。mysql> SHOW DATABASES;
一些SHOW语句允许使用FROM、WHERE子句,这样,在指定需要显示的行时,可更为灵活。下边给出部分例子:
SHOW TABLES命令显示了当前用数据库中的数据库对象列表,而从TABLES视图的查询我们将得到所有数据库下的对象列表。这个例子就是给出了一个查询MYSQL的表相关的系统视图,类似ORACLE中的(DBA_TABLES、USER_TABLES)和SYBASE中的SYSOBJECTS。mysql> SHOW TABLES FROM MYSQL;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| func |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| host |
| proc |
| procs_priv |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
17 rows in set (0.00 sec)
![]()
mysql> SHOW TABLES;
+---------------------------------------+
| Tables_in_information_schema |
+---------------------------------------+
| CHARACTER_SETS |
| COLLATIONS |
| COLLATION_CHARACTER_SET_APPLICABILITY |
| COLUMNS |
| COLUMN_PRIVILEGES |
| KEY_COLUMN_USAGE |
| ROUTINES |
| SCHEMATA |
| SCHEMA_PRIVILEGES |
| STATISTICS |
| TABLES |
| TABLE_CONSTRAINTS |
| TABLE_PRIVILEGES |
| TRIGGERS |
| USER_PRIVILEGES |
| VIEWS |
+---------------------------------------+
16 rows in set (0.00 sec)
mysql> SELECT TABLE_NAME, TABLE_TYPE, ENGINE FROM TABLES;
+---------------------------------------+-------------+--------+
| table_name | table_type | engine |
+---------------------------------------+-------------+--------+
| CHARACTER_SETS | SYSTEM VIEW | MEMORY |
| COLLATIONS | SYSTEM VIEW | MEMORY |
| COLLATION_CHARACTER_SET_APPLICABILITY | SYSTEM VIEW | MEMORY |
| COLUMNS | SYSTEM VIEW | MyISAM |
| COLUMN_PRIVILEGES | SYSTEM VIEW | MEMORY |
| KEY_COLUMN_USAGE | SYSTEM VIEW | MEMORY |
| ROUTINES | SYSTEM VIEW | MyISAM |
| SCHEMATA | SYSTEM VIEW | MEMORY |
| SCHEMA_PRIVILEGES | SYSTEM VIEW | MEMORY |
| STATISTICS | SYSTEM VIEW | MEMORY |
| TABLES | SYSTEM VIEW | MEMORY |
| TABLE_CONSTRAINTS | SYSTEM VIEW | MEMORY |
| TABLE_PRIVILEGES | SYSTEM VIEW | MEMORY |
| TRIGGERS | SYSTEM VIEW | MyISAM |
| USER_PRIVILEGES | SYSTEM VIEW | MEMORY |
| VIEWS | SYSTEM VIEW | MyISAM |
| columns_priv | BASE TABLE | MyISAM |
| db | BASE TABLE | MyISAM |
| func | BASE TABLE | MyISAM |
| help_category | BASE TABLE | MyISAM |
| help_keyword | BASE TABLE | MyISAM |
| help_relation | BASE TABLE | MyISAM |
| help_topic | BASE TABLE | MyISAM |
| host | BASE TABLE | MyISAM |
| proc | BASE TABLE | MyISAM |
| procs_priv | BASE TABLE | MyISAM |
| tables_priv | BASE TABLE | MyISAM |
| time_zone | BASE TABLE | MyISAM |
| time_zone_leap_second | BASE TABLE | MyISAM |
| time_zone_name | BASE TABLE | MyISAM |
| time_zone_transition | BASE TABLE | MyISAM |
| time_zone_transition_type | BASE TABLE | MyISAM |
| user | BASE TABLE | MyISAM |
+---------------------------------------+-------------+--------+
33 rows in set (0.03 sec)
mysql> SHOW COLUMNS FROM TABLES;
+-----------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+-------+
| TABLE_CATALOG | varchar(512) | YES | | NULL | |
| TABLE_SCHEMA | varchar(64) | NO | | | |
| TABLE_NAME | varchar(64) | NO | | | |
| TABLE_TYPE | varchar(64) | NO | | | |
| ENGINE | varchar(64) | YES | | NULL | |
| VERSION | bigint(21) | YES | | NULL | |
| ROW_FORMAT | varchar(10) | YES | | NULL | |
| TABLE_ROWS | bigint(21) | YES | | NULL | |
| AVG_ROW_LENGTH | bigint(21) | YES | | NULL | |
| DATA_LENGTH | bigint(21) | YES | | NULL | |
| MAX_DATA_LENGTH | bigint(21) | YES | | NULL | |
| INDEX_LENGTH | bigint(21) | YES | | NULL | |
| DATA_FREE | bigint(21) | YES | | NULL | |
| AUTO_INCREMENT | bigint(21) | YES | | NULL | |
| CREATE_TIME | datetime | YES | | NULL | |
| UPDATE_TIME | datetime | YES | | NULL | |
| CHECK_TIME | datetime | YES | | NULL | |
| TABLE_COLLATION | varchar(64) | YES | | NULL | |
| CHECKSUM | bigint(21) | YES | | NULL | |
| CREATE_OPTIONS | varchar(255) | YES | | NULL | |
| TABLE_COMMENT | varchar(80) | NO | | | |
+-----------------+--------------+------+-----+---------+-------+
21 rows in set (0.06 sec)
mysql> SHOW CHARACTER SET;
+----------+-----------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
| dec8 | DEC West European | dec8_swedish_ci | 1 |
| cp850 | DOS West European | cp850_general_ci | 1 |
| hp8 | HP West European | hp8_english_ci | 1 |
| koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 |
| latin1 | cp1252 West European | latin1_swedish_ci | 1 |
| latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 |
| swe7 | 7bit Swedish | swe7_swedish_ci | 1 |
| ascii | US ASCII | ascii_general_ci | 1 |
| ujis | EUC-JP Japanese | ujis_japanese_ci | 3 |
| sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 |
| hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | 1 |
| tis620 | TIS620 Thai | tis620_thai_ci | 1 |
| euckr | EUC-KR Korean | euckr_korean_ci | 2 |
| koi8u | KOI8-U Ukrainian | koi8u_general_ci | 1 |
| gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 |
| greek | ISO 8859-7 Greek | greek_general_ci | 1 |
| cp1250 | Windows Central European | cp1250_general_ci | 1 |
| gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |
| latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 |
| armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 |
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
| ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 |
| cp866 | DOS Russian | cp866_general_ci | 1 |
| keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 |
| macce | Mac Central European | macce_general_ci | 1 |
| macroman | Mac West European | macroman_general_ci | 1 |
| cp852 | DOS Central European | cp852_general_ci | 1 |
| latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 |
| cp1251 | Windows Cyrillic | cp1251_general_ci | 1 |
| cp1256 | Windows Arabic | cp1256_general_ci | 1 |
| cp1257 | Windows Baltic | cp1257_general_ci | 1 |
| binary | Binary pseudo charset | binary | 1 |
| geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 |
| cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 |
| eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 |
+----------+-----------------------------+---------------------+--------+
36 rows in set (0.00 sec)
mysql> SHOW CHARACTER SET like 'big5';
+---------+--------------------------+-------------------+--------+
| Charset | Description | Default collation | Maxlen |
+---------+--------------------------+-------------------+--------+
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
+---------+--------------------------+-------------------+--------+
1 row in set (0.00 sec)
mysql> SELECT * FROM COLLATIONS WHERE COLLATION_NAME LIKE '%big5%';
+-----------------+--------------------+----+------------+-------------+--------
-+
| COLLATION_NAME | CHARACTER_SET_NAME | ID | IS_DEFAULT | IS_COMPILED | SORTLEN
|
+-----------------+--------------------+----+------------+-------------+--------
-+
| big5_chinese_ci | big5 | 1 | Yes | Yes | 1
|
| big5_bin | big5 | 84 | | Yes | 1
|
+-----------------+--------------------+----+------------+-------------+--------
-+
2 rows in set (0.00 sec)
mysql> SHOW GRANTS;
+-------------------------------------------------------------------------------
---------------------------------------------------------+
| Grants for root@localhost
|
+-------------------------------------------------------------------------------
---------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*DA2
8842831B3C40F4BC1D3C76CF9AD8CBFDAE1CB' WITH GRANT OPTION |
+-------------------------------------------------------------------------------
---------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SHOW GRANTS FOR ROOT;
+-------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-------+
| Grants for root@%
![]()
|
+-------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS,
FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES,
LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'root'@'%
' IDENTIFIED BY PASSWORD '*DA28842831B3C40F4BC1D3C76CF9AD8CBFDAE1CB' WITH GRANT
OPTION |
+-------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-------+
1 row in set (0.00 sec)
我们也可以通过查询系统表来获得用户的权限:
mysql> SELECT * FROM USER_PRIVILEGES;
下边给出了MYSQL的权限列表功参考:

关于SHOW命令我们就简单介绍这么几个,如果想知道更多的SHOW命令可以得到的信息内容可以执行如下命令来获取帮助或者参看MYSQL的联机文档第23章:INFORMATION_SCHEMA信息数据库。
mysql> HELP SHOW
Name: 'SHOW'
Description:
SHOW has many forms that provide information about databases, tables,
columns, or status information about the server. This section describes
those following:
![]()
SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE 'pattern']
SHOW CREATE DATABASE db_name
SHOW CREATE FUNCTION funcname
SHOW CREATE PROCEDURE procname
SHOW CREATE TABLE tbl_name
SHOW DATABASES [LIKE 'pattern']
SHOW ENGINE engine_name {LOGS | STATUS }
SHOW [STORAGE] ENGINES
SHOW ERRORS [LIMIT [offset,] row_count]
SHOW FUNCTION STATUS [LIKE 'pattern']
SHOW GRANTS FOR user
SHOW INDEX FROM tbl_name [FROM db_name]
SHOW INNODB STATUS
SHOW PROCEDURE STATUS [LIKE 'pattern']
SHOW [BDB] LOGS
SHOW MUTEX STATUS
SHOW PRIVILEGES
SHOW [FULL] PROCESSLIST
SHOW [GLOBAL | SESSION] STATUS [LIKE 'pattern']
SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern']
SHOW [OPEN] TABLES [FROM db_name] [LIKE 'pattern']
SHOW TRIGGERS
SHOW [GLOBAL | SESSION] VARIABLES [LIKE 'pattern']
SHOW WARNINGS [LIMIT [offset,] row_count]
![]()
The SHOW statement also has forms that provide information about
replication master and slave servers and are described in [HELP PURGE
MASTER LOGS]:
![]()
SHOW BINARY LOGS
SHOW BINLOG EVENTS
SHOW MASTER STATUS
SHOW SLAVE HOSTS
SHOW SLAVE STATUS
![]()
If the syntax for a given SHOW statement includes a LIKE 'pattern'
part, 'pattern' is a string that can contain the SQL `%' and `_'
wildcard characters. The pattern is useful for restricting statement
output to matching values.
![]()
Several SHOW statements also accept a WHERE clause that provides more
flexibility in specifying which rows to display. See
http://dev.mysql.com/doc/refman/5.0/en/extended-show.html.
4 创建用户数据库
如果想改变MYSQL数据文件的默认路径,我们可以关闭MYSQL实例,修改配置文件”my.cnf”或”my.ini”(WINDOWS系统)中的datadir对应的参数值,然后把MYSQL默认安装的datadir下的内容拷贝到新的数据文件路径下,启动MYSQL实例这样我们再次创建数据库的时候数据文件就放在新的路径下了。mysql> CREATE DATABASE MYTEST;
Query OK, 1 row affected (0.00 sec)
5 创建数据库用户mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| mytest |
| root |
+--------------------+
4 rows in set (0.01 sec)
![]()
mysql> USE MYTEST;
Database changed
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| mytest |
+------------+
1 row in set (0.00 sec)
![]()
mysql> SHOW TABLES;
Empty set (0.01 sec)
![]()
可以用两种方式创建MySQL账户:
(1)直接操作MySQL授权表user(不推荐)
(2)CREATE USERmysql>INSERT INTO mysql.user VALUES('localhost','zhouwf', PASSWORD ('zho uwf'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
(3)直接使用GRANT语句mysql> create user test_cr identified by 'test_cr';
Query OK, 0 rows affected (0.23 sec)
我们可以不用第二步的CREATE语法来执行,而直接GRANT就可以创建用户。
注意:其中两个账户有相同的用户名TEST和密码TEST。两个账户均为超级用户账户,具有完全的权限可以做任何事情。一个账户('TEST'@'localhost')只用于从本机连接时。另一个账户('TEST'@'%')可用于从其它主机连接。请注意TEST的两个账户必须能mysql> GRANT ALL PRIVILEGES ON *.* TO 'TEST'@'LOCALHOST' IDENTIFIED BY 'TEST' WITH GRANT OPTION;
Query OK, 0 rows affected (0.06 sec)
![]()
mysql> GRANT ALL PRIVILEGES ON *.* TO 'TEST'@'%' IDENTIFIED BY 'TEST' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
![]()
mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON MYSQL.* TO TEST_NORMAL@'LOCALHOST' IDENTIFIED BY 'TEST_NORMAL';
Query OK, 0 rows affected (0.00 sec)
![]()
mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON MYSQL.* TO TEST_NORMAL@'%' IDENTIFIED BY 'TEST_NORMAL';
Query OK, 0 rows affected (0.02 sec)
![]()
mysql> SELECT USER FROM MYSQL.USER;
+-------------+
| USER |
+-------------+
| TEST |
| TEST_NORMAL |
| root |
| TEST |
| TEST_NORMAL |
| root |
+-------------+
6 rows in set (0.00 sec)
从任何主机以TEST连接。没有localhost账户,当TEST从本机连接时,mysql_install_db创建的localhost的匿名用户账户将占先。
结果是,TEST将被视为匿名用户。原因是匿名用户账户的Host列值比'TEST'@'%'账户更具体,这样在user表排序顺序中排在前面。
注意:用户名和密码区分大小写。
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| mytest |
+------------+
1 row in set (0.00 sec)
![]()
mysql> SELECT USER();
+----------------+
| USER() |
+----------------+
| TEST@localhost |
+----------------+
1 row in set (0.00 sec)
![]()
6 创建数据库对象
(1)创建表
在测试MYSQL创建的时候还遇到了一些小问题,这里整理出来供大家参考:
mysql> CREATE TABLE TEST(ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
-> MC VARCHAR(60),DT DATE DEFAULT NOW());
ERROR 1067 (42000): Invalid default value for 'DT'
注意: AUTO_INCREMENT为MYSQL的自增类型。我们可以利用如下函数查询最后一个序列号的值:
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 3 |
+------------------+
1 row in set (0.06 sec)
MYSQL的DEFAULT值只能是常量,如果想实现上述功能只有表中第一个TIMESTAMP类型字段可以做到。可以使用它自动地用当前的日期和时间标记INSERT或UPDATE的操作。如果你有多个TIMESTAMP列,只有第一个自动更新。自动更新第一个TIMESTAMP列在下列任何条件下发生:
A、列没有明确地在一个INSERT或LOAD DATA INFILE语句中指定。
B、列没有明确地在一个UPDATE语句中指定且一些另外的列改变值。(注意一个UPDATE设置一个列为它已经有的值,这将不引起TIMESTAMP列被更新,因为如果你设置一个列为它当前的值,MySQL为了效率而忽略更改。)
C、明确地设定TIMESTAMP列为NULL或NOW()。
格式:TIMESTAMP[(M)]
MySQL可以以YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD、YYMMDD格式来显示TIMESTAMP值,这主要取决于M值,它们分别为14(缺省值)\12\8\6。
注意:为表TEST新增加TIMESTAMP类型字段,我们发现不是表的第一个TIMESTAMP类型的字段的DEFAULT值不是系统时间。mysql> CREATE TABLE TEST(ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
-> MC VARCHAR(60),DT TIMESTAMP);
Query OK, 0 rows affected (1.08 sec)
![]()
mysql> SHOW COLUMNS FROM TEST;
+-------+-------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+-------------------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| MC | varchar(60) | YES | | NULL | |
| DT | timestamp | NO | | CURRENT_TIMESTAMP | |
+-------+-------------+------+-----+-------------------+----------------+
3 rows in set (0.17 sec)
![]()
mysql> insert into test(mc) values('ZhangSan');
Query OK, 1 row affected (0.13 sec)
![]()
mysql> select * from test;
+----+----------+---------------------+
| ID | MC | DT |
+----+----------+---------------------+
| 1 | ZhangSan | 2007-05-25 09:54:59 |
+----+----------+---------------------+
1 row in set (0.06 sec)
注意:执行UPDATE操作,表中第一个TIMESTAMP字段自动修改为系统时间。mysql> ALTER TABLE TEST ADD RQ TIMESTAMP;
Query OK, 1 row affected (0.70 sec)
Records: 1 Duplicates: 0 Warnings: 0
![]()
mysql> SHOW COLUMNS FROM TEST;
+-------+-------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------------------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| MC | varchar(60) | YES | | NULL | |
| DT | timestamp | NO | | CURRENT_TIMESTAMP | |
| RQ | timestamp | NO | | 0000-00-00 00:00:00 | |
+-------+-------------+------+-----+---------------------+----------------+
4 rows in set (0.19 sec)
![]()
mysql> INSERT INTO TEST(MC) VALUES('LiSi');
Query OK, 1 row affected (0.05 sec)
![]()
mysql> SELECT * FROM TEST;
+----+----------+---------------------+---------------------+
| ID | MC | DT | RQ |
+----+----------+---------------------+---------------------+
| 1 | ZhangSan | 2007-05-25 09:54:59 | 0000-00-00 00:00:00 |
| 2 | LiSi | 2007-05-25 10:02:47 | 0000-00-00 00:00:00 |
+----+----------+---------------------+---------------------+
2 rows in set (0.01 sec)
![]()
mysql> INSERT INTO TEST(MC,RQ) VALUES('LiSi',NOW());
Query OK, 1 row affected (0.11 sec)
![]()
mysql> SELECT * FROM TEST;
+----+----------+---------------------+---------------------+
| ID | MC | DT | RQ |
+----+----------+---------------------+---------------------+
| 1 | ZhangSan | 2007-05-25 09:54:59 | 0000-00-00 00:00:00 |
| 2 | LiSi | 2007-05-25 10:02:47 | 0000-00-00 00:00:00 |
| 3 | LiSi | 2007-05-25 10:03:29 | 2007-05-25 10:03:29 |
+----+----------+---------------------+---------------------+
3 rows in set (0.00 sec)
mysql> UPDATE TEST SET MC='WangWu' WHERE ID=3;
Query OK, 1 row affected (0.13 sec)
Rows matched: 1 Changed: 1 Warnings: 0
![]()
mysql> SELECT * FROM TEST;
+----+----------+---------------------+---------------------+
| ID | MC | DT | RQ |
+----+----------+---------------------+---------------------+
| 1 | ZhangSan | 2007-05-25 09:54:59 | 0000-00-00 00:00:00 |
| 2 | LiSi | 2007-05-25 10:02:47 | 0000-00-00 00:00:00 |
| 3 | WangWu | 2007-05-25 10:04:01 | 2007-05-25 10:03:29 |
+----+----------+---------------------+---------------------+
1 rows in set (0.00 sec)
创建临时表
MYSQL临时表是SESSION级别的,并且程序退出临表自动删除。
mysql> CREATE TEMPORARY TABLE TEMP(ID VARCHAR(20),MC VARCHAR(60));
Query OK, 0 rows affected (0.08 sec)
![]()
mysql> insert into temp values('111','111111');
Query OK, 1 row affected (0.08 sec)
![]()
mysql> select * from temp;
+------+--------+
| ID | MC |
+------+--------+
| 111 | 111111 |
+------+--------+
1 row in set (0.00 sec)
(2)创建索引
MYSQL索引类型:
普通索引
这是最基本的索引类型,而且它没有唯一性之类的限制。普通索引可以通过以下几种方式创建:
创建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);
创建表的时候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );
唯一性索引
这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一。唯一性索引可以用以下几种
方式创建:
创建索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);
创建表的时候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) );
主键
主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”。如果你曾经用过AUTO_INCREMENT类型的列,你可能已经熟悉主键之类的概念了。
主键一般在创建表的时候指定,例如“CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); ”。但是,我们也可以通过修改表
的方式加入主键,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每个表只能有一个主键。
全文索引
MySQL从3.23.23版开始支持全文索引和全文检索。在MySQL中,全文索引的索引类型为FULLTEXT。全文索引可以在VARCHAR或者TEXT类型
的列上创建。它可以通过CREATE TABLE命令创建,也可以通过ALTER TABLE或CREATE INDEX命令创建。对于大规模的数据集,通过ALTER
TABLE(或者CREATE INDEX)命令创建全文索引要比把记录插入带有全文索引的空表更快。本文下面的讨论不再涉及全文索引,如要了解
更多信息,请参见MySQL documentation。
创建MYSQL索引
mysql> create procedure p_test()
-> begin
-> declare counter int;
-> set counter = 1000;
-> while counter >= 1 do
-> insert into test(id,mc) values(counter,'test');
-> set counter = counter - 1;
-> end while;
-> end;//
Query OK, 0 rows affected (0.98 sec)
![]()
mysql> call p_test();
-> //
Query OK, 1 row affected (34.48 sec)
![]()
mysql> show columns from test;
+-------+-------------+------+-----+---------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------------------+-------+
| ID | int(11) | NO | | 0 | |
| MC | varchar(60) | YES | | NULL | |
| DT | timestamp | NO | | 0000-00-00 00:00:00 | |
| RQ | timestamp | NO | | 0000-00-00 00:00:00 | |
+-------+-------------+------+-----+---------------------+-------+
4 rows in set (0.08 sec)
![]()
mysql> select * from test where id=500;
+-----+------+---------------------+---------------------+
| ID | MC | DT | RQ |
+-----+------+---------------------+---------------------+
| 500 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
+-----+------+---------------------+---------------------+
1 row in set (0.01 sec)
![]()
mysql> create index idx_test on test(id);
Query OK, 1000 rows affected (0.81 sec)
Records: 1000 Duplicates: 0 Warnings: 0
![]()
mysql> show columns from test;
+-------+-------------+------+-----+---------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------------------+-------+
| ID | int(11) | NO | MUL | 0 | |
| MC | varchar(60) | YES | | NULL | |
| DT | timestamp | NO | | 0000-00-00 00:00:00 | |
| RQ | timestamp | NO | | 0000-00-00 00:00:00 | |
+-------+-------------+------+-----+---------------------+-------+
1 rows in set (0.00 sec)
![]()
mysql> select * from test where id=800;
+-----+------+---------------------+---------------------+
| ID | MC | DT | RQ |
+-----+------+---------------------+---------------------+
| 800 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
+-----+------+---------------------+---------------------+
1 row in set (0.00 sec)
我们可以看出上边的例子创建索引前后SQL执行时间的变化(红色字体部分)。
删除索引
mysql> drop index idx_test on test;
Query OK, 3 rows affected (1.20 sec)
Records: 3 Duplicates: 0 Warnings: 0
(3) 创建存储过程
MYSQL存储过程大致格式如下:
首先说明一点,在MYSQL的控制台执行创建过程的脚本时,要选择一个分隔符 DELIMITER。CREATE PROCEDURE procedure1 /**//* name存储过程名*/
(IN parameter1 INTEGER) /**//* parameters参数*/
BEGIN /**//* start of block语句块头*/
DECLARE variable1 CHAR(10); /**//* variables变量声明*/
IF parameter1 = 17 THEN /**//* start of IF IF条件开始*/
SET variable1 = 'birds'; /**//* assignment赋值*/
ELSE
SET variable1 = 'beasts'; /**//* assignment赋值*/
END IF; /**//* end of IF IF结束*/
INSERT INTO table1 VALUES (variable1); /**//* statement SQL语句*/
END /**//* end of block语句块结束*/
给出一个最简单的MYSQL存储过程示例:
给出一个带有输入输出参数的存储过程示例:mysql> DELIMITER //
mysql> CREATE PROCEDURE P()SELECT * FROM TEST; //
Query OK, 0 rows affected (0.31 sec)
![]()
mysql> DELIMITER ;
mysql> CALL P();
+----+----------+---------------------+---------------------+
| ID | MC | DT | RQ |
+----+----------+---------------------+---------------------+
| 1 | ZhangSan | 2007-05-25 09:54:59 | 0000-00-00 00:00:00 |
| 2 | LiSi | 2007-05-25 10:02:47 | 0000-00-00 00:00:00 |
| 3 | WangWu | 2007-05-25 10:04:01 | 2007-05-25 10:03:29 |
+----+----------+---------------------+---------------------+
3 rows in set (0.00 sec)
![]()
Query OK, 0 rows affected (0.02 sec)
存储过程内容的查看:mysql> DELIMITER //
mysql> CREATE PROCEDURE P_WITH_PARA(IN PARA_IN INT,OUT PARA_OUT INT)
-> BEGIN
-> DECLARE PARA INT;
-> SET PARA = 20;
-> SET PARA_OUT = PARA_IN + PARA;
-> END
-> //
Query OK, 0 rows affected (0.00 sec)
![]()
mysql> CALL P_WITH_PARA(10,@SUM);//
Query OK, 0 rows affected (0.01 sec)
![]()
mysql> SELECT @SUM//
+------+
| @SUM |
+------+
| 30 |
+------+
1 row in set (0.00 sec)
mysql> select body from proc where name='P_WITH_PARA';
+---------------------------------------------------------------------------+
| body |
+---------------------------------------------------------------------------+
| BEGIN
DECLARE PARA INT;
SET PARA = 20;
SET PARA_OUT = PARA_IN + PARA;
END |
+---------------------------------------------------------------------------+
1 row in set (0.01 sec)
MYSQL存储过程中的一些常用控制结构:选择结构:
IF ... THEN
...
ELSE
...
END IF;
![]()
CASE ...
WHEN ... THEN
WHEN ... THEN
END CASE;
WHILE ...
...
END WHILE;
![]()
LOOP_LABEL:LOOP
...
ITERATE LOOP_LABEL;
...
LEAVE LOOP_LABEL;
END LOOP;
![]()
REPEAT
...
UNTIL ...
END REPEAT;
![]()
LABEL LABEL_NAME;
...
GOTO LABEL_NAME;
(4) 创建函数
各个数据库包括各种开发工具都为用户提供了创建函数的功能,这里关于函数的语法我们不再做更多解释了,给出一个例子:
mysql> delimiter //
mysql> CREATE FUNCTION fn_test (n DECIMAL(3,0))
-> RETURNS DECIMAL(20,0)
-> DETERMINISTIC
-> BEGIN
-> DECLARE v_tmp DECIMAL(20,0) DEFAULT 1;
-> DECLARE counter DECIMAL(3,0);
-> SET counter = n;
-> factorial_loop: REPEAT
-> SET v_tmp = v_tmp * counter;
-> SET counter = counter - 1;
-> UNTIL counter = 1
-> END REPEAT;
-> RETURN v_tmp;
-> END
-> //
Query OK, 0 rows affected (0.23 sec)
![]()
mysql> delimiter ;
mysql> select fn_test(10);
+-------------+
| fn_test(10) |
+-------------+
| 3628800 |
+-------------+
1 row in set (0.20 sec)
![]()
mysql> select fn_test(3);
+------------+
| fn_test(3) |
+------------+
| 6 |
+------------+
1 row in set (0.00 sec)
显示一个定义好的函数的内容:
mysql> show create function fn_test;
(5) 创建视图
给出一个创建视图的例子:
注意:下边例子红色字体部分为MYSQL数据库取前n条记录的方法,不同于其他数据库。
mysql> select count(*) from test;
+----------+
| count(*) |
+----------+
| 2001 |
+----------+
1 row in set (0.01 sec)
![]()
mysql> create view v_test as select * from test limit 20;
Query OK, 0 rows affected (0.06 sec)
![]()
mysql> select * from v_test;
+------+------+---------------------+---------------------+
| ID | MC | DT | RQ |
+------+------+---------------------+---------------------+
| 1000 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 999 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 998 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 997 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 996 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 995 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 994 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 993 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 992 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 991 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 990 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 989 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 988 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 987 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 986 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 985 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 984 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 983 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 982 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 981 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
+------+------+---------------------+---------------------+
20 rows in set (0.06 sec)
和显示函数内容类似,我们也可以按照如下方法获得创建视图的语法内容:
mysql> show create view v_test;
删除视图
mysql> drop view v_test;
Query OK, 0 rows affected (0.02 sec)
(6) 创建触发器
给出一个简单的创建触发器的例子:
mysql> delimiter //
mysql> create trigger tr_test before insert on test for each row
-> begin
-> insert into test1(id,mc) values(new.id,new.mc);
-> end
-> //
Query OK, 0 rows affected (0.17 sec)
mysql> delimiter ;
![]()
mysql> select count(*) from test1;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)
![]()
mysql> insert into test (id,mc) values(50000,'trigger_to_test1');
Query OK, 1 row affected (0.19 sec)
![]()
mysql> select id,mc from test1;
+-------+------------------+
| id | mc |
+-------+------------------+
| 50000 | trigger_to_test1 |
+-------+------------------+
1 row in set (0.00 sec)