与Mysql服务器结合在一起进行开发或与Mysql数据库协同工作的方法有许多种。你可以使用的最基本的界面程序就是mysql客户机。使用改程序,你可以从命令行界面环境下与服务器进行交互操作。
一、登录
从shell提示符,按照下述方法登录到Mysql:
mysql -h host -u user -p
如果你是从本地登录值Mysql(也就是说,从服务器本身登录),或者使用安全的网络连接工具(SSH, Secure Shell)远程登录值MySQL,则可以省略主机参数-h。因为默认主机就是localhost,localhost引用你目前所在的系统。在其他环境下,你输入的命令必须经过网络才能到达服务器,此时需将host参数替换成主机名,此名称可以解析称IP地址,或者将host替换成MySQL服务器的实际IP地址。另外,还要用MySQL用户名替换user参数。在这里,并不要求MySQL用户名和文件系统的用户名保持一致。
-p选项令mysql提示你输入密码。你也可以在-p选项后直接添加密码(例如:输入-prover,rover就是密码);如果使用这种方式,则-p与密码名之间不要留有空格。然而在命令行输入密码并不是一个安全的做法,因为这样密码会现实在屏幕上,而且密码是以明文方式在网络上传输的,另外,无论什么时候其他用户获取服务器上正在运行的进程列表时都可以看到该密码。
二、显示数据库用户并设置用户密码
如果你已经正确地安装了MySQL并且已经成功登录,则mysql后台程序就已经运行了,这时你将看到下面的提示:
mysql>
这是mysql客户机的界面提示符。你应该为所有root用户设置密码。从mysql客户机执行下述命令可得到用户及其数据库服务器的地址列表:
SELECT User, Host FROM mysql.user;
+------+-----------+
| User | Host |
+------+-----------+
| root | localhost |
+------+-----------+
上面列车的是从服务器返回的接回。MySQL5.5安装完毕后,将有一个用户和主机的组合。可以在提示符中输入以下内容来修改root用户的密码:
SET PASSWORD FOR 'root'@'localhost'=PASSWORD('password');
用即将为root用户设置的新密码替换引号中的password。修改完root用户的密码后,输入quit或exit并单击回车键,退出mysql客户机并用新密码重新登录。
可以在mysql客户机中输入下列内容删除指定用户:
DELETE FROM mysql.user WHERE User='username';
DELETE FROM mysql.db WHERE User='username';
FLUSH PRIVILEGES;
前两条语句从mysql数据库的user表以及db表中删除了用户名为username的用户(初始权限表存放在mysql数据库中)。如果username为空,则删除的是匿名用户(如果有的话)。最后一行语句令服务器根据前面的修改重新读取授权表。
三、创建数据库用户
为了不使用root用户来作为数据库管理员,我们还需要创建一个拥有普通权限的用户。创建完新用户后,需要为其设置权限。如果你想要创建一个只拥有查看数据权限的用户,可从mysql客户机输入如下内容:
GRANT SELECT ON *.* TO 'kerry'@'localhost' IDENTIFIED BY 'beck123';
在该行中,用户是来自本地机器的用户kerry,其密码为beck123.如果想授权用户浏览之外的权限,可以在SELECT后添加其他权限,并用逗号隔开。如果想授权用户所有的权限,可用ALL替换SELECT。下面是ALL标记的另一个使用示例:
GRANT ALL ON db1.* TO 'kerry'@'localhost' IDENTIFIED BY 'beck123';
在此示例中,用户kerry拥有所有基本的权限,但它仅仅对db1数据库起作用,且必须从localhost登录MySQL,如果远程登录则不会拥有所有的权限。
四、创建数据库
假设你已经拥有创建和修改服务器上数据库所必须的权限,那么我们来看一下如何创建数据库以及数据库中的表。例如:
CREATE DATABASE bookstore;
通过这条简单的SQL语句,这里已创建了名为bookstore的数据库。创建好数据库后,虽然只是个空数据库,但是我们可通过下面的语句从默认数据库切换到新数据库:
USE bookstore
使用上述语句,就不必在每个SQL语句中都指定所用到的数据库名了。默认情况下,MySQL会把最后一个指定的数据库作为当前使用的数据库。该语句是基于客户机程序的SQL语句,所以在句尾不必添加分号。
五、创建表与编辑表
下面我们将创建这个数据库中的第一个表,这里创建一个存放图书基本信息的数据表,这将是一个书店业务的核心信息:
CREATE TABLE books(
book_id INT,
title VARCHAR(50),
author VARCHAR(50));
上面的SQL语句创建了带有三个列的图书信息表。圆括号内是列的全部列表。第一列是每条记录的标识码,代表一本书。第二列和第三列是可变长的字符类型,每列值的长度不能超过50。
输入DESCRIBE语句可查看刚刚创建的表的结果,该结果以表格形式输出:
DESCRIBE books;
+---------+-------------+------+-----+---------+-------+
| Fileld | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| book_id | int(11) | YES | | NULL | |
| title | varchar(50) | YES | | NULL | |
| author | varchar(50) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
如果想为数据元素多添加几个列:出版商、出版年份、ISBN码、图书类型(例如:小说、诗歌、戏剧)、图书描述,等等。我们还想让MySQL自动为book_id列分配一个数字编号,这样在添加一行新纪录时就不必担心有重复问题发生。另外,我们决定将作者字段的真实作者名改成标识码,通过标识码可将本表与包含作者名字段的其他表关联起来。这种方式将数据统一起来,可以简化数据的输入,也使排列查找操作更容易实现。输入下列SQL语句可在已创建好的数据表中完成修改操作:
ALTER TABLE books
CHANGE COLUMN book_id book_id INT AUTO_INCERMENT 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列找到authors表中相应的记录。由于authors表中相应列的数据类型是INT,所以该子句中author_id列的数据类型也一定是INT。
第四行子句为每本书添加了一个描述列。该列的数据类型是文本型,文本类型是可变长数据类型,可支持长度小于64千字节的数据。
再genre列中,为了确保统一性,实现已列举了几个可用的值。该字段允许为空值或NULL,空值或NULL并不需要指定。
向books表输入数据之前,我们先快速建立一个authors表。该表作为备查表。首先要向authors表中添加数据,因为当我们向books表中添加数据时,需要知道books表中author列的标识号:
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字段关联在一起。
在authors表中,将作者的名和姓分别放在两个不同的字段中,这样可以很容易通过姓对数据进行分类查找。另外还要添加一个作者的国籍列,这样就可以根据顾客的要求查找特定国家作者的相关作品。为了方便起见,最好使用国家代码,然后在其他备查表中列出国家的全称。
六、显示数据库
使用SHOW DATABASES语句,可获得数据库列表:
SHOW DATABASES;
+-----------+
| Database |
+-----------+
| bookstore |
| mysql |
| test |
+-----------+
使用前面提到的USE语句选择bookstore数据库,然后输入下面的内容,就可以看到bookstore数据库中的数据表列表;
SHOW TABLES;
+---------------------+
| Tables_in_bookstore |
+---------------------+
| authors |
| books |
+---------------------+
在使用bookstore数据库时,如果想查看其他数据库中的表,可在上述语句中添加FROM子句:
SHOW TABLES FROM mysql;
这样即使目前正在进行会话的默认数据库是bookstore,也能够得到mysql数据库中的数据表。
七、追加数据
接下来,使用INSERT语句为表添加一条或多条记录。向books表中添加图书信息时,由于books表引用了authors表中的字段,所以我们把作者信息放在最后添加。我们可以在mysql客户机输入如下内容完成上述工作:
INSERT INTO authors
(author_last, author_first, country)
VALUES ('Greene', 'Graham', 'United Kingdom');
SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 1 |
+------------------+
INSERT INTO books
(title, author_id, isbn, genre, pub_year)
VALUES('The End of the Affair', 1, '0099478447', 'novel', '1951');
INSERT INTO books
(title, author_id, isbn, genre, pub_year)
VALUES('Brighton Rock', 2, '0099541572', 'novel', '1937');
第一个SQL语句为Graham Greene添加了一条记录,Graham Greene是The End of the Affai的作者。如同上面列出的那样,标准的INSERT语法要为每个插入值制定相应的列。如果想为所有的列添加值,则不需指定列名,但被添加的数据一定要按表中列的顺序排列。
第二个SQL语句中,通过LAST_INSERT_ID函数可以从author表中取出我们刚刚输入的记录的标识码。我们也可以简单输入SELECT author_id FROM authors;语句,可以得到同样的结果。
第三个SQL语句,添加了Graham Greene作品的数据信息。在这个语句中,列的排列顺序与数据表中的顺序不同。MySQL允许这样的操作,只要保证值和列的顺序相对应就可以了。
八、显示数据
现在已经为每个表添加了一行数据,下面我们来做一些查询操作。使用SELECT语句查询所需的数据。输入如下内容,可以得到books表中所有行列的数据:
SELECT * FROM books;
星号作为通配符,表示选择了所有列。如果想查找特定的列,则需要列出所需的列名。在SELECT语句的结尾处添加一个WHERE子句,可以选择指定的行:
SELECT book_id, title, description
FROM books
WHERE genre='novel';
改语句列出了books表中genre列的值为nove的所有图书的标识号、标题、描述信息。当然,当数据库中有更多的图书数据时,结果将会更加有意义。
如果我们想从数据库中得到小说及其作者的全名的列表,我们需要将books表和authors表关联起来。这可以通过JOIN子句按如下所示将两个表关联起来:
SELECT book_id, title, pub_year,
CONCAT (author_first, '', author_last) AS author
FROM books
JOIN authors USING (author_id)
WHERE author_last='Greene';
在FROM子句中,我们通过author_id列将books表和authors表关联起来。如果两个表中的列名不同,我们还需要在JOIN子句中使用其他的子句或方法来连接这两个表(例如:ON(author_id=writer_id))。需要注意SQL语句中的第二行,这里使用了一个字符串函数CONCAT()。使用此函数,可以将取出的数据连接起来形成更有意义的输出内容。既然如此,我们取出作者的名字,并在其后添加一个带引号的空格,紧接着是作者的姓,将它们连接起来,形成格式更好的一个完整的作者姓名。结果将显示在列标题为author的列中。关键字AS根据我们指定的名称创建了列标题,我们称这个列标题为别名。
在WHERE子句中,这里使用性Greene指定了我们所需的Greene的作品信息。如果books表中没有Greene的作品信息,则将不会有任何结果显示。下面显示了前面的查询结果:
+---------+-----------------------+----------+---------------+
| book_id | title | pub_year | author |
+---------+-----------------------+----------+---------------+
| 1 | The End of the Affair | 1951 | Graham Greene |
| 2 | Brighton Rock | 1937 | Graham Greene |
+---------+-----------------------+----------+---------------+
正如你多看到的,Graham Greene的两本作品都列举出来了。列标题也已经变成了AS子句后面指定的名称。我们也可以使用关键字AS将显示的列标题改成其他名称。在SELECT语句中可以使用别名author,遗憾的是,在WHERE子句中不能使用这个别名。
九、删除数据库
使用下面的语句删除一个已经存在的数据库:
DROP DATABASE databasename;