假设你已拥有创建和修改服务器上数据库所必需的权限,那么我们来看一下如何创建数据库以及数据库中的表。在本章的示例中,我们将为一个虚拟的书店建立一个数据库:

CREATE DATABASE bookstore
CREATE DATABASE bookstore

通过这条简单的SQL语句,我们已经创建了名为bookstore的数据库。另外,MySQL语句以及子句中的保留字对大小写不敏感。数据库与表名对大小写是否敏感取决于你所用的操作系统,比如在Linux系统上对大小写是敏感的,而Window系统对大小写不敏感。按照通常的习惯,在SQL说明文档中保留字均使用大写字母,而数据库名,表名以及字段名都使用小写字母。你可能也注意到了SQL语句结尾处的分号。一条完整的SQL语句可能不止一行,直到输入分号以后,客户机程序才会将SQL语句发送到服务器解析执行。

创建好数据库后,这虽然只是空库,但是我们可通过下面的语句从默认数据库切换到新数据库:

USE bookstore
USE bookstore

使用上述语句,就不必在每个SQL语句中都指定所用到的数据库名了。默认情况下,MySQL会把最后一个指定的数据库作为当前使用的数据库。该语句是基于客户机程序的SQL语句,所以在句尾不必添加分号。

下面,我们将创建第一个表,以后blog将把数据添加到此表中。首先创建一个存放图书基本信息的数据库,因为这是书店业务的核心信息:

CREATE TABLE books (
    book_id INT,
    title VARCHAR(50),
    author VARCHAR(50)
);
CREATE TABLE books (
    book_id INT,
    title VARCHAR(50),
    author VARCHAR(50)
);

上面的SQL语句创建了带有三个列的图书信息表。圆括号内是列的全部列表。接下来输入DESCRIBE语句可查看刚刚创建的表的结果,该结果以表格形式输出:

DESCRIBE books;
DESCRIBE books;

考虑到书店规模有点大,我们认为还需要为数据元素多添加几个列:出版商,出版年份,ISBN码,图书类型,图书描述等等。我们还想让MySQL自动为book_id列分配一个数字编号,这样在添加一行新记录时就不必担心有重复问题发生。另外,我们决定将作者字段的真实作者名改为标识码,通过标识码可将本表与包含作者名字段的其他表关联起来。这种方式将数据统一起来,可以简化数据的输入,也使排列查找操作更容易实现。输入下列SQL语句可在已创建好的数据表中完成修改操作:

ALTER TABLE books
CHANGE COLUMN book_id book_id INT AUTO_INCREMENT PRIMARY KEY,
CHANGE COLUMN author author_id INT,
ADD COLUMN description TEXT,
ADD COLUMN genre ENUM ('novel','poetry','drama'),
ADD COLUMN publisher_id INT,
ADD COLUMN pub_year VARCHAR(4),
ADD COLUMN isbn VARCHAR(20);
ALTER TABLE books
CHANGE COLUMN book_id book_id INT AUTO_INCREMENT PRIMARY KEY,
CHANGE COLUMN author author_id INT,
ADD COLUMN description TEXT,
ADD COLUMN genre ENUM ('novel','poetry','drama'),
ADD COLUMN publisher_id INT,
ADD COLUMN pub_year VARCHAR(4),
ADD COLUMN isbn VARCHAR(20);

在这个SQL语句的起始行后,可以看到每个修改或添加字段的子句都是由一个逗号分开的。第二行子句修改book_id列,即便是使用原来的列名和数据类型,我们也要将其重写一遍。我们还要为其添加AUTO_INCREMENT标记,它负责执行前一段提到的任务,就是将任意一个唯一的值分配给表中的每条记录。另外,我们还要将该字段设为主键,以提高数据检索的速度。

第一个CHANGE子句可能会让人感到迷惑,因为其中列名(book_id)出现了二次。当了解CHANGE子句的语法时,你就会明白其中的意义了,第一个book_id表示将要修改的现在列,该子句余下的部分用于指定一个新列。要想更好地理解这个子句的意思,可查看第二条CHANGE子句:该子句用新列author_id替代了现有列author。数据表中不再有名为author的列。

在第三行子句中,我们修改了author列,令其名称及数据类型与将要创建的authors表中的名称与类型一致。如同books表中的索引列代表图书一样,authors表中也有一个代表每个作者的索引列。我们把books表和authors表关联起来做查询操作,这样就可通过books表的author_id列找到author表中相应的记录。由于authors表中相应列的数据类型是INT,所以该子句中author_id列的数据类型也一定是INT。

第四行子句为每本书添加了一个描述列。该列的数据类型是文本类型,文本类型是可变长数据类型,可支持长度小于64千字节的数据。

在genre列中,为了确保统一性,事先已列举了几个可用的值。该字段允许为空值或NULL,空值或NULL并不需要指定。

向books表输入数据之前,我们先快速建立一个authors表。该表做为备查表。首先要向authors表中添加数据,因为我们向books表中添加数据时,需要知道books表中authors列的标识号:

CREATE TABLE authors(
    author_id INT AUTO_INCREMENT PRIMARY KEY,
    author_last VARCHAR(50),
    author_first VARCHAR(50),
    country VARCHAR(50)
);
CREATE TABLE authors(
    author_id INT AUTO_INCREMENT PRIMARY KEY,
    author_last VARCHAR(50),
    author_first VARCHAR(50),
    country VARCHAR(50)
);

根据需要,我们还要把books表与authors表通过author_id字段关联起来。这个例子先保存起来后面blog再用。