MySQL入门教程

什么是数据库

数据库是按照数据结构来组织、存储和管理数据的仓库

关系型数据库:建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据

RDBMS即关系数据库管理系统的特点:

1.数据以表格的形式出现

2.每行为各种记录名称

3.每列为记录名称所对应的数据域

4.许多行和列组成一张表单

5.若干的表单组成数据库

RDBMS相关概念

·

MySQL创建数据表

语法

CREATE TABLE table_name (column_name column_type)

举例:在W3CSCHOOL数据库中创建数据表w3cschool_tbl:

1
2
3
4
5
6
7
CREATE TABLE IF NOT EXISTS tutorials_tbl(
tutorial_id INT NOT NULL AUTO_INCREMENT,
tutorial_title VARCHAR(100) NOT NULL,
tutorial_author VARCHAR(40) NOT NULL,
submission_date DATE,
PRIMARY KEY (tutorial_id)
);

注:

·如果你不想字段为NULL可以设置字段的属性为NOT NULL,在操作数据库如果输入该字段的数据为NULL,则会报错。

·AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。

·PRIMARY KEY关键字用于定义列为主键。你可以使用多列来定义主键,列间以逗号分隔。

MySQL删除数据表

语法

DROP TABLE table_name

MySQL插入数据

语法

1
2
3
INSERT INTO table_name(field1, field2, ...fieldN)
VALUES
(value1, value2, ...valueN);

举例:使用SQL INSERT INTO语句向MySQL数据表w3cschool_tbl插入数据:

1
2
3
4
INSERT INTO w3cschool_tbl
(w3cschool_title, w3cschool_author, submission_date)
VALUES
("Learn PHP", "John Poul", NOW());

MySQL查询数据

语法

1
2
3
4
SELECT column_name, column_name
FROM table_name
[WHERE Clause]
[OFFSET M][LIMIT N]

注:

·查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分隔,并使用WHERE语句来设定查询条件。

·SELECT命令可以读取一条或者多条记录。

·你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据。

·你可以使用WHERE语句来包含任何条件。

·你可以通过OFFSET指定SELECT语句开始查询的数据偏移量,默认偏移量为0。

·你可以使用LIMIT属性来设定返回的记录数。

举例:通过SQL SELECT命令来获取MySQL数据表w3cschool_tbl的数据:

SELECT * from w3cschool_tbl;

MySQL where子句

语法

1
2
3
SELECT field1, field2, ...fieldN
FROM table_name1, table_name2...
[WHERE condition1 [[AND][OR]] condition2...]

注:

·查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分隔,并使用WHERE语句来设定查询条件。

·你可以在WHERE子句中指定任何条件。

·你可以使用AND或者OR指定一个或多个条件。

·WHERE子句也可以运用于SQL的DELETE或UPDATE命令。

·WHERE子句类似于程序中的if条件,根据MySQL表中的字段值来读取指定的数据。

操作符列表,实例假定A=10,B=20:

操作符 描述 实例
= 等号,检测两个值是否相等,如果相等返回True (A=B)返回false
<>或!= 不等于,检测两个值是否相等,如果不相等返回True (A!=B)返归true
> 大于号,检测左边的值是否大于右边的值,如果左边的值大于右边的值返回True (A>B)返回false
< 小于号,检测左边的值是否小于右边的值,如果左边的值小于右边的值返回True (A<B)返回true
>= 大于等于号,检测左边的值是否大于等于右边的值,如果左边的值大于或等于右边的值返回True (A>=B)返回false
<= 小于等于号,检测左边的值是否小于或等于右边的值,如果左边的值小于或等于右边的值返回True (A<=B)返回true

举例:读取w3cschool_tbl表中w3cschool_author字段值为Sanjay的所有记录:

SELECT * from w3cschool_tbl WHERE w3cschool_author='Sanjay';

除非你使用LIKE来比较字符串,否则MySQL的WHERE子句的字符串比较是不区分大小写的。你可以使用BINARY关键字来设定WHERE子句的紫福春是区分大小写的。

SELECT * from w3cschool_tbl WHERE BINARY w3cschool_author='sanjay';

MySQL UPDATE查询

语法

1
2
3
UPDATE table_name SET field1=new-value1, field2=new-value2

[WHERE Clause]

注:

·你可以同时更新一个或多个字段

·你可以在WHERE字句中指定任何条件

·你可以在一个单独表中同时更新数据

当你需要更新表中指定行的数据时,WHERE子句是非常有用的。

举例:更新数据表中w3cschool_id为3的w3cschool_title字段值:

1
2
3
UPDATE w3cschool_tbl
SET w3cschool_title='Learning JAVA'
WHERE w3cschool_id=3;

MySQL DELETE语句

语法

DELETE FROM table_name [WHERE Clause]

注:

·如果没有指定WHERE子句,MySQL表中的所有记录将被删除

·你可以在WHERE字句中指定任何条件

·你可以在单个表中一次性删除记录

当你想删除数据表中的指定记录时,WHERE子句是非常有用的

举例:删除w3cschool_tbl表中w3cschool_id为3的记录:

1
DELETE FROM w3cschool_tbl WHERE w3cschool_id=3;

MySQL LIKE子句

SQL LIKE子句中使用百分号(%)字符来表示任意字符,类似于UNIX或者正则表达式中的星号(*)。

语法

1
2
3
SELECT field1, field2, ...fieldN
FROM table_name1, table_name2...
WHERE field1 LIKE condition [[AND][OR]] field2='somevalue'

注:

·你可以在WHERE子句中指定任何条件

·你可以在WHERE字句中使用LIKE子句

·你可以使用LIKE子句代替等号

·LIKE通常与%一同使用,类似于一个元字符的搜索

·你可以使用AND或OR指定一个或多个条件

·你可以在DELETE或UPDATE命令中使用WHERE…LIKE子句来指定条件

举例:查询w3cschool_tbl表中的w3cschool_author字段中以’jay’为结尾的所有记录:

1
2
SELECT * from w3cschool_tbl
WHERE w3cschool_author LIKE '%jay';

MySQL排序

语法

1
2
SELECT field1, field2,...fieldN FROM table_name1, table_name2...
ORDER BY field1, [field2...] [ASC[DESC]]

注:

·你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果

·你可以设定多个字段来排序

·你可以使用ASC或DESC关键字来设置查询结果是按升序或者降序排列。默认情况下,它是按升序排列

·你可以添加WHERE…LIKE子句来设置条件

举例:使用ORDER BY子句来读取MySQL数据表w3cschool_tbl中的数据:

SELECT * from w3cschool_tbl ORDER BY w3cschool_author ASC;

SELECT * from w3cschool_tbl ORDER BY w3cschool_author DESC;

MySQL 分组

GROUP BY语句根据一个或者多个列对结果集进行分组,在分组的列上我们可以使用COUNT,SUM,AVG等函数。

语法

1
2
3
4
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

employee_tbl表格信息如下:

id name date singin
1 小明 2016-04-22 15:25:33 1
2 小王 2016-04-20 15:25:47 3
3 小丽 2016-04-19 15:26:02 2
4 小王 2016-04-07 15:26:14 4
5 小明 2016-04-11 15:26:40 4
6 小明 2016-04-04 15:26:54 2

举例:将数据表按名字进行分组,并统计每个人有多少条记录:

SELECT name, COUNT(*) FROM employ_tbl GROUP BY name;

使用WITH ROLLUP

WITH ROLLUP可以实现在分组统计数据基础上再进行相同的统计(SUM.AVG,COUNT).

举例:将以上的数据表按名字进行分组,再统计每个人登录的次数:

1
2
3
SELECT name, SUM(singin) as singin_count
FROM employee_tbl
GROUP BY name WITH ROLLUP;

其中结果如下:

name singin_out
小丽 2
小明 7
小王 7
NULL 16

其中记录NULL表示所有人的登录次数,我们可以使用coalesce来设置一个可以取代NULL的名称。

语法

select coalesce(a, b, c);

参数说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果abc都为null,则返回null(没意义)。

举例:如果名字为空,使用总数代替:

1
2
3
SELECT coalesce(name, '总数'), SUM(singin) as singin_out
FROM employee_tbl
GROUP BY name WITH ROLLUP;

MySQL连接的使用

JOIN按照功能大致分为如下三类:

·INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录

·LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录

·RIGHT JOIN(右连接):用于获取右表所有记录,即使左表没有对应匹配的记录

SQL JOINS

假设W3CSCHOOL数据库中有两张表tcount_tbl和w3cschool_tbl,两张数据表数据如下:

1.tcount_tbl

w3cschool_author w3cschool_count
mahran 20
mahnaz NULL
Jen NULL
Gill 20
John Poul 1
Sanjay 1

2.w3cschool_tbl

w3cschool_id w3cschool_title w3cschool_author submission_date
1 Learn PHP John Poul 2007-05-24
2 Learn MyQL Abdul S 2007-05-24
3 JAVA Tutorial Sanjay 2007-05-06

举例:使用INNER JOIN来连接以上两张表来读取w3cschool_tbl表中所有w3cschool_author字段在tcount_tbl表中对应的w3cschool_count字段值。

1
2
3
SELECT a.w3cschool_id, a.w3cschool_author, b.w3cschool_count
FROM w3cschool_tbl a INNER JOIN tcount_tbl b
ON a.w3cschool_author = b.w3cschool_author

等价于:

1
2
3
SELECT a.w3cschool_id, a_w3cschool_author, b.w3cschool_count
FROM w3cschool_tbl a, tcount_tbl b
WHERE a.w3cschool_author = b.w3cschool_author;

举例:以w3cschool_tbl为左表, t_count_tbl为右表,理解MySQL LEFT JOIN的应用:

1
2
3
SELECT a.w3cschool_id, a.w3cschool_author, b.w3cschool_count
FROM w3cschool_tbl a LEFT JOIN tcount_tbl b
ON a.w3cschool_author = b.w3cschool_author;

举例:以tcount_tbl为左表, w3cschool_tbl为右表,理解MySQL RIGHT JOIN的应用:

1
2
3
SELECT b.w3cschool_id, b.w3cschool_author, a.w3cschool_count
FROM tcount_tbl a RIGHT JOIN w3cschool_tbl b
ON a.w3cschool_author = b.w3cschool_author;

MySQL NULL值处理

查询条件字段为NULL时,该命令可能无法正常工作,为了处理这种情况,MySQL提供了三大运算符:

·IS NULL:当列的值为NULL,此运算符返回True

·IS NOT NULL:当列的值不为NULL,运算符返回True

·<=>:比较运算符,当比较的两个值为NULL时返回True

关于NULL的条件比较运算是比较特殊的,你不能够使用=NULL或!=NULL在列中查找NULL值,在MySQL中,NULL值与任何其他值的比较永远返回false,即NULL=NULL返回false。

在命令提示符中使用NULL值

假设数据库W3CSCHOOL中的表tcount_tbl含有两列w3cschool_author和w3cschool_count, w3cschool_count中设置插入NULL值。

假设表如下所示:

w3cschool_author w3cschool_count
mahran 20
mahnaz NULL
Jen NULL
Gill 20

查询数据表中w3cschool_count列是否为NULL,必须使用IS NULL和IS NOT NULL,如下实例:

1
2
SELECT * FROM tcount_tbl
WHERE w3cschool_count IS NULL;
1
2
SELECT * FROM tcount_tbl
WHERE w3cschool_count IS NOT NULL;

MySQL正则表达式

下表中的正则模式可应用于REGEXP操作符中。

^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配’\n’或’\r’之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,^也匹配’\n’或’\r’之前的位置。
. 匹配除’\n’之外的任何单个字符。要匹配包括’\n’在内的任何字符,请使用’[.\n]’的模式。
[…] 字符集合。匹配所包含的任何一个字符。例如’[abc]’可以匹配’plain’中的’a’。
... 负值字符集合。匹配未包含的任意字符。例如,’abc‘可以匹配’plain’中的’p’。
p1\ p2\ p3 匹配p1或p2或p3.例如,’z\ food’能匹配’z’或’food’。,’(z\ f)food’能匹配’zood’或’food’
* 匹配前面的子表达式零次或多次。例如,zo能匹配’z’以及’zoo’.*等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,’zo+’能匹配’zo’以及’zoo’,但不能匹配’z’。+等价于{1,}
{n} n是一个非负整数。匹配确定的n次。例如,’o{2}’不能匹配’Bob’中的’o’,但是能匹配’food’中的两个o。
{n, m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。

举例:

1.查找name字段中以’st’为开头的所有数据:

1
SELECT name FROM person_tbl WHERE name REGEXP '^st';

2.查找name字段中以’ok’为结尾的所有数据:

1
SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

3.查找name字段中包含’mar’字符串的所有数据:

1
SELECT name FROM person_tbl WHERE name REGEXP 'mar'

4.查找name字段中以元音字符开头或以’ok’字符串结尾的所有数据:

1
SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$'

MySQL事务

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

  • 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
  • 事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行。
  • 事务用来管理 insert , update , delete 语句。

一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性或不可分割性)、Consistency(一致性)、Isolation(隔离性或独立性)、Durability(持久性)

  • 1、原子性:一组事务,要么成功;要么撤回,即事务在执行过程中出错会回滚到事务开始前的状态。
  • 2、一致性 : 一个事务不论是开始前还是结束后,数据库的完整性都没有被破坏。因此写入的数据必须完全符合所有预设规则(资料精确度、串联性以及后续数据库能够自发完成预定工作)。
  • 3、隔离性:数据库允许多个事务并发的同时对其数据进行读写修改等操作,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离可分为:Read uncommitted(读未提交)、Read committed(读提交)、Repeatable read(可重复读)、Serializable(串行化)。
  • 4、持久性:事务在处理结束后对数据做出的修改是永久的,无法丢失

事务控制语句

1.显式的开始一个事务:

start transaction或者begin

2.做保存点,一个事务中可以有多个保存点:

savepoint [savepoint_name]

3.提交事务,并使数据库中进行的修改成为永久性的:

commitcommit work

4.回滚结束用户的事务,并撤销正在进行的所有未提交的修改:

rollbackrollback work

5.删除一个事务的保存点,若没有指定保存点,执行该语句操作则会抛错:

release savepoint [savepoint_name]

6.将事务滚回标记点:

rollback to 标记点

7.设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。

1
set transaction

事务处理方法

1.用 begin , rollback , commit 来实现事务处理。

2.用 set 来改变 MySQL 的自动提交模式。

  • set autocommit = 0 (禁止自动提交)。
  • set autocommit = 1 (开启自动提交)。

MySQL ALTER命令

当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令。

开始本章教程前让我们先创建一张表,表名为:testalter_tbl。

1
2
3
4
5
create table testalter_tbl(
i INT,
c CHAR(1)
);

SHOW COLUMNS FROM testalter_tbl;

Field Type Null Key Default Extra
i int(11) YES NULL
c char(1) YES NULL

删除、添加或修改表字段

如下命令使用了 ALTER 命令及 DROP 子句来删除以上创建表的 i 字段:

mysql> ALTER TABLE testalter_tbl DROP i;

如果数据表中只剩余一个字段则无法使用DROP来删除字段。

MySQL 中使用 ADD 子句来想数据表中添加列,如下实例在表 testalter_tbl 中添加 i 字段,并定义数据类型:

mysql> ALTER TABLE testalter_tbl ADD i INT;

执行以上命令后,i 字段会自动添加到数据表字段的末尾。

`mysql> SHOW COLUMNS FROM testalter_tbl;

+-------+---------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+---------+------+-----+---------+-------+

| c | char(1) | YES | | NULL | |

| i | int(11) | YES | | NULL | |

+-------+---------+------+-----+---------+-------+

2 rows in set (0.00 sec)

如果你需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。

尝试以下 ALTER TABLE 语句, 在执行成功后,使用 SHOW COLUMNS 查看表结构的变化:

ALTER TABLE testalter_tbl DROP i;

ALTER TABLE testalter_tbl ADD i INT FIRST;

ALTER TABLE testalter_tbl DROP i;

ALTER TABLE testalter_tbl ADD i INT AFTER c;

FIRST 和 AFTER 关键字只占用于 ADD 子句,所以如果你想重置数据表字段的位置就需要先使用 DROP 删除字段然后使用 ADD 来添加字段并设置位置。

修改字段类型及名称

如果需要修改字段类型及名称, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。

例如,把字段 c 的类型从 CHAR(1) 改为 CHAR(10),可以执行以下命令:

mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10);

使用 CHANGE 子句, 语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段的类型及名称。尝试如下实例:

mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;

如果你现在想把字段 j 从 BIGINT 修改为 INT,SQL语句如下:

mysql> ALTER TABLE testalter_tbl CHANGE j j INT;

ALTER TABLE 对 Null 值和默认值的影响

当你修改字段时,你可以指定是否包含只或者是否设置默认值。以下实例,指定字段 j 为 NOT NULL 且默认值为100 。

mysql> ALTER TABLE testalter_tbl

-> MODIFY j BIGINT NOT NULL DEFAULT 100;

如果你不设置默认值,MySQL会自动设置该字段默认为 NULL。

修改字段默认值

你可以使用 ALTER 来修改字段的默认值,尝试以下实例:

mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;

mysql> SHOW COLUMNS FROM testalter_tbl;

+-------+---------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+---------+------+-----+---------+-------+

| c | char(1) | YES | | NULL | |

| i | int(11) | YES | | 1000 | |

+-------+---------+------+-----+---------+-------+

2 rows in set (0.00 sec)

你也可以使用 ALTER 命令及 DROP子句来删除字段的默认值,如下实例:

mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;

mysql> SHOW COLUMNS FROM testalter_tbl;

+-------+---------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+---------+------+-----+---------+-------+

| c | char(1) | YES | | NULL | |

| i | int(11) | YES | | NULL | |

+-------+---------+------+-----+---------+-------+

2 rows in set (0.00 sec) Changing a Table Type:

修改数据表类型,可以使用 ALTER 命令及 TYPE 子句来完成。尝试以下实例,我们将表 testalter_tbl 的类型修改为 MYISAM :注意:查看数据表类型可以使用 SHOW TABLE STATUS 语句。*

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> ALTER TABLE testalter_tbl TYPE = MYISAM;
mysql> SHOW TABLE STATUS LIKE 'testalter_tbl'\G
1. row **
Name: testalter_tbl
Type: MyISAM
Row_format: Fixed
Rows: 0
Avg_row_length: 0
Data_length: 0
Max_data_length: 25769803775
Index_length: 1024
Data_free: 0
Auto_increment: NULL
Create_time: 2007-06-03 08:04:36
Update_time: 2007-06-03 08:04:36
Check_time: NULL
Create_options:
Comment:
1 row in set (0.00 sec)

修改表名

如果需要修改数据表的名称,可以在 ALTER TABLE 语句中使用 RENAME 子句来实现。

尝试以下实例将数据表 testalter_tbl 重命名为 alter_tbl:

1
mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;

MySQL索引

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。

打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。

拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。

索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。

创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。

实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。

建立索引会占用磁盘空间的索引文件。

普通索引

创建索引

这是最基本的索引,它没有任何限制。它有以下几种创建方式:

1
CREATE INDEX indexName ON mytable(username(length)); 

如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。

修改表结构(添加索引)

1
ALTER table tableName ADD INDEX indexName(columnName)

创建表的时候直接指定

1
2
3
4
5
6
7
8
9
CREATE TABLE mytable(  

ID INT NOT NULL,

username VARCHAR(16) NOT NULL,

INDEX [indexName] (username(length))

);

删除索引的语法

1
DROP INDEX [indexName] ON mytable; 

唯一索引

它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

创建索引

1
CREATE UNIQUE INDEX indexName ON mytable(username(length)) 

修改表结构

1
ALTER table mytable ADD UNIQUE [indexName] (username(length))

创建表的时候直接指定

1
2
3
4
5
6
7
8
9
CREATE TABLE mytable(  

ID INT NOT NULL,

username VARCHAR(16) NOT NULL,

UNIQUE [indexName] (username(length))

);

使用ALTER 命令添加和删除索引

有四种方式来添加数据表的索引:

  • ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
  • ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
  • ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。
  • ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。

以下实例为在表中添加索引。

1
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);

你还可以在 ALTER 命令中使用 DROP 子句来删除索引。尝试以下实例删除索引:

1
mysql> ALTER TABLE testalter_tbl DROP INDEX c;

使用 ALTER 命令添加和删除主键

主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:

1
2
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);

你也可以使用 ALTER 命令删除主键:

1
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;

删除主键时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。

显示索引信息

你可以使用 SHOW INDEX 命令来列出表中的相关的索引信息。可以通过添加 \G 来格式化输出信息。

尝试以下实例:

1
2
mysql> SHOW INDEX FROM table_name; \G
........

MySQL临时表

MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,MySQL会自动删除表并释放所有空间。

临时表在MySQL 3.23版本中添加,如果你的MySQL版本低于 3.23版本就无法使用MySQL的临时表。不过现在一般很少有再使用这么低版本的MySQL数据库服务了。

MySQL临时表只在当前连接可见,如果你使用PHP脚本来创建MySQL临时表,那每当PHP脚本执行完成后,该临时表也会自动销毁。

如果你使用了其他MySQL客户端程序连接MySQL数据库服务器来创建临时表,那么只有在关闭客户端程序时才会销毁临时表,当然你也可以手动销毁。

实例

以下展示了使用MySQL 临时表的简单实例,以下的SQL代码可以适用于PHP脚本的mysql_query()函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> CREATE TEMPORARY TABLE SalesSummary (
-> product_name VARCHAR(50) NOT NULL
-> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
-> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
-> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO SalesSummary
-> (product_name, total_sales, avg_unit_price, total_units_sold)
-> VALUES
-> ('cucumber', 100.25, 90, 2);

mysql> SELECT * FROM SalesSummary;
+--------------+-------------+----------------+------------------+
| product_name | total_sales | avg_unit_price | total_units_sold |
+--------------+-------------+----------------+------------------+
| cucumber | 100.25 | 90.00 | 2 |
+--------------+-------------+----------------+------------------+
1 row in set (0.00 sec)

当你使用 SHOW TABLES命令显示数据表列表时,你将无法看到 SalesSummary表。

如果你退出当前MySQL会话,再使用 SELECT命令来读取原先创建的临时表数据,那你会发现数据库中没有该表的存在,因为在你退出时该临时表已经被销毁了。

删除MySQL 临时表

默认情况下,当你断开与数据库的连接后,临时表就会自动被销毁。当然你也可以在当前MySQL会话使用 DROP TABLE 命令来手动删除临时表。

以下是手动删除临时表的实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql> CREATE TEMPORARY TABLE SalesSummary (
-> product_name VARCHAR(50) NOT NULL
-> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
-> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
-> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO SalesSummary
-> (product_name, total_sales, avg_unit_price, total_units_sold)
-> VALUES
-> ('cucumber', 100.25, 90, 2);

mysql> SELECT * FROM SalesSummary;
+--------------+-------------+----------------+------------------+
| product_name | total_sales | avg_unit_price | total_units_sold |
+--------------+-------------+----------------+------------------+
| cucumber | 100.25 | 90.00 | 2 |
+--------------+-------------+----------------+------------------+
1 row in set (0.00 sec)
mysql> DROP TABLE SalesSummary;
mysql> SELECT * FROM SalesSummary;
ERROR 1146: Table 'W3CSCHOOL.SalesSummary' doesn't exist