一旦知道如何输入SQL语句,就能够访问数据库了。mysql
假设你家中有几只宠物(你的动物园),而且你但愿跟踪有关它们的各类类型的信息。你能够经过建立表来保存数据并使用所需信息加载数据,而后,你能够经过从表中检索数据来回答有关你的动物的各类问题,本节介绍如何执行如下操做:sql
动物园数据库很简单(故意),但要想到可能使用相似数据库的真实状况并不困难。例如,农民可使用这样的数据库跟踪牲畜,或由兽医跟踪患者记录,能够从MySQL网站得到包含如下部分中使用的一些查询和样本数据的menagerie发行版,它经过https://dev.mysql.com/doc/以压缩tar文件和Zip格式提供。shell
使用SHOW
语句查找服务器上当前存在的数据库:数据库
mysql> SHOW DATABASES; +----------+ | Database | +----------+ | mysql | | test | | tmp | +----------+
mysql数据库描述了用户访问权限,test
数据库一般可用做工做空间供用户试用。segmentfault
语句显示的数据库列表可能在你的计算机上有所不一样,若是你没有SHOW DATABASES
权限,SHOW DATABASES
不会显示你没有权限的数据库。服务器
若是test
数据库存在,请尝试访问它:编辑器
mysql> USE test Database changed
与QUIT
同样,USE
不须要分号(若是你愿意,你能够用分号终止这样的语句,它没有坏处)。USE
语句在另外一方面也是特殊的:它必须在一行上给出。测试
对于后面的示例,你可使用测试数据库(若是你有权访问它),可是你在该数据库中建立的任何内容均可以被其余任何有权访问它的人删除。所以,你可能应该要求MySQL管理员容许使用你本身的数据库,假设你想调用你的menagerie
,管理员须要执行以下语句:网站
mysql> GRANT ALL ON menagerie.* TO 'your_mysql_name'@'your_client_host';
其中your_mysql_name
是分配给你的MySQL用户名,your_client_host
是链接到服务器的主机。命令行
若是管理员在设置权限时为你建立数据库,则能够开始使用它,不然,你须要本身建立它:
mysql> CREATE DATABASE menagerie;
在Unix下,数据库名称区分大小写(与SQL关键字不一样),所以你必须始终将数据库做为menagerie
引用,而不是Menagerie
、MENAGERIE
或其余一些变体,表名也是如此。在Windows下,此限制不适用,但你必须在给定查询中使用相同的大小写引用数据库和表,可是,因为各类缘由,建议的最佳作法始终是使用建立数据库时使用的相同字母。
若是你尝试建立数据库时收到错误,例如
ERROR 1044 (42000): Access denied for user 'micah'@'localhost' to database 'menagerie'
,这意味着你的用户账户没有必要的权限。
建立数据库不会选择它来使用,你必须明确地这样作,要使menagerie
成为当前数据库,请使用如下语句:
mysql> USE menagerie Database changed
你的数据库只需建立一次,但每次开始mysql
会话时都必须选择它才能使用,你能够经过发出USE
语句来执行此操做,如示例中所示。或者,你能够在调用mysql
时在命令行上选择数据库,只需在你可能须要提供的任何链接参数以后指定其名称,例如:
shell> mysql -h host -u user -p menagerie Enter password: ********
刚刚显示的命令中的menagerie
不是你的密码,若是要在-p
选项后的命令行上提供密码,则必须在没有中间空间的状况下执行此操做(例如,-p
password,而不是-p
password)。可是,建议不要在命令行中输入密码,由于这样作会让登陆到你机器上的其余用户窥探密码。
你能够随时使用
SELECT DATABASE()
查看当前选择的数据库。
建立数据库很容易,但此时它是空的,正如SHOW TABLES
告诉你的那样:
mysql> SHOW TABLES; Empty set (0.00 sec)
更难的部分是决定数据库的结构应该是什么:你须要哪些表以及每一个表中应该包含哪些列。
你想要一张包含每只宠物记录的表,这能够称为pet
表,它至少应该包含每种动物的名字,由于名称自己不是颇有趣,因此该表应包含其余信息。例如,若是你家中有多我的饲养宠物,你可能但愿列出每只动物的主人,你可能还想记录一些基本的描述性信息,如物种和性别。
年龄怎么样?这多是有意义的,但存储在数据库中并非一件好事,随着时间的推移,年龄会发生变化,这意味着你必须常常更新你的记录。相反,最好存储固定值,如出生日期,而后,只要你须要年龄,你就能够将其计算为当前日期和出生日期之间的差值。MySQL提供了进行日期算术的功能,所以这并不困难,存储出生日期而不是年龄也有其余优势:
你可能会想到在pet
表中有用的其余类型的信息,可是到目前为止所识别的信息已经足够了:name
、owner
、species
、sex
、birth
和death
。
使用CREATE TABLE
语句指定表的结构:
mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20), species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
VARCHAR
是name
、owner
和species
列的不错选择,由于列值的长度不一样,这些列定义中的长度没必要所有相同,也没必要为20
。你一般能够选择1
到65535
之间的任何长度,不管你认为哪一个最合理。若是你作了一个糟糕的选择,后来发现你须要一个更长的字段,MySQL提供了一个ALTER TABLE
语句。
能够选择几种类型的值来表示动物记录中的性别,例如'm'
和'f'
,或者多是'male'
和'female'
,最简单的是使用单个字符'm'
和'f'
。
对于birth
和death
列使用DATE
数据类型是一个至关明显的选择。
一旦你建立了一个表,SHOW TABLES
应该产生一些输出:
mysql> SHOW TABLES; +---------------------+ | Tables in menagerie | +---------------------+ | pet | +---------------------+
要验证你的表是否按预期方式建立,请使用DESCRIBE
语句:
mysql> DESCRIBE pet; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | name | varchar(20) | YES | | NULL | | | owner | varchar(20) | YES | | NULL | | | species | varchar(20) | YES | | NULL | | | sex | char(1) | YES | | NULL | | | birth | date | YES | | NULL | | | death | date | YES | | NULL | | +---------+-------------+------+-----+---------+-------+
你能够随时使用DESCRIBE
,例如,若是你忘记了表中列的名称或它们具备的类型。
建立表后,你须要填充它,LOAD DATA
和INSERT
语句对此颇有用。
假设你的宠物记录能够如此处所示(注意MySQL指望以'YYYY-MM-DD'
格式的日期,这可能与你习惯的不一样)。
name | owner | species | sex | birth | death |
---|---|---|---|---|---|
Fluffy | Harold | cat | f | 1993-02-04 | |
Claws | Gwen | cat | m | 1994-03-17 | |
Buffy | Harold | dog | f | 1989-05-13 | |
Fang | Benny | dog | m | 1990-08-27 | |
Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |
Chirpy | Gwen | bird | f | 1998-09-11 | |
Whistler | Gwen | bird | 1997-12-09 | ||
Slim | Benny | snake | m | 1996-04-29 |
由于你从空表开始,因此填充它的一种简单方法是为每一个动物建立一个包含行的文本文件,而后使用单个语句将文件内容加载到表中。
你能够建立一个文本文件pet.txt
,每行包含一条记录,其值由制表符分隔,并按照CREATE TABLE
语句中列出的顺序给出,对于缺失值(例如仍然活着的动物的未知性别或死亡日期),你可使用NULL
值。要在文本文件中表示这些,请使用\N
(反斜杠,大写N),例如,Whistler鸟的记录看起来像这样(值之间的空格是单个制表符):
Whistler Gwen bird \N 1997-12-09 \N
要将文本文件pet.txt
加载到pet
表中,请使用如下语句:
mysql> LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet;
若是你使用编辑器在Windows上建立文件,该编辑器使用\r\n
做为行终止符,则应使用此语句:
mysql> LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet LINES TERMINATED BY '\r\n';
(在运行OS X的Apple计算机上,你可能但愿使用LINES TERMINATED BY '\r'
)。
若是须要,能够在LOAD DATA
语句中显式指定列值分隔符和行结束标记,但默认值为制表符和换行符,这些语句足以使语句正确读取pet.txt
文件。
若是语句失败,则默认状况下你的MySQL安装可能没有启用本地文件功能。
若是要一次添加一条新记录,INSERT
语句颇有用,在最简单的形式中,你按照CREATE TABLE
语句中列出的列的顺序为每列提供值。假设Diane获得了一只名为“Puffball”的新hamster,你可使用INSERT
语句添加新记录,以下所示:
mysql> INSERT INTO pet VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
字符串和日期值在此处指定为带引号的字符串,此外,使用INSERT,你能够直接插入NULL
以表示缺乏的值,你不像使用LOAD DATA
那样使用\N
。
从这个示例中,你应该可以看到,最初使用多个INSERT
语句而不是单个LOAD DATA
语句来加载记录会涉及更多的输入。