3.3.1创建和选择数据库
3.3创建和使用数据库
一旦知道如何输入SQL语句,就可以访问数据库了。
假设您的家中有几只宠物(您的宠物),并且您想跟踪有关它们的各种信息。您可以通过创建表来保存数据并向其加载所需的信息来做到这一点。然后,您可以通过从表格中检索数据来回答有关您的动物的各种问题。本节说明如何执行以下操作:
-
建立资料库
-
建立表格
-
将数据加载到表中
-
以多种方式从表中检索数据
-
使用多个表格
Menagerie数据库很简单(故意),但不难想到现实世界中可能会使用类似类型的数据库。例如,农民可以使用这样的数据库来跟踪牲畜,或者兽医可以使用这种数据库来跟踪患者记录。可以从MySQL网站上获取包含一些查询和示例数据的示例分布。可从https://dev.mysql.com/doc/以压缩的tar文件和Zip格式获得。
使用该SHOW
语句找出服务器上当前存在哪些数据库:
mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql |
| test |
| tmp |
+----------+
该mysql
数据库描述了用户访问权限。该test
数据库通常可作为用户工作区尝试的事情了。
该语句显示的数据库列表在您的计算机上可能有所不同。SHOW DATABASES
如果您没有特权,则不会显示您没有特权的数据库SHOW DATABASES
。请参见第13.7.5.14节“ SHOW DATABASES语句”。
如果test
数据库存在,请尝试访问它:
mysql> USE test Database changed
USE
像一样QUIT
,不需要分号。(如果愿意,可以用分号来终止这样的语句;它没有害处。)该 USE
语句也有另一种特殊之处:必须在一行上给出。
您可以在下面test
的示例中使用数据库(如果有权访问),但是有权访问该数据库的任何人都可以删除在该数据库中创建的任何内容。由于这个原因,您可能应该向您的MySQL管理员寻求使用自己的数据库的权限。假设您想打电话给您menagerie
。管理员需要执行如下语句:
mysql> GRANT ALL ON menagerie.* TO 'your_mysql_name'@'your_client_host';
其中your_mysql_name
是分配给您的MySQL用户名,your_client_host
是连接服务器的主机。
3.3.1创建和选择数据库
如果管理员在设置权限时为您创建了数据库,则可以开始使用它。否则,您需要自己创建它:
mysql> CREATE DATABASE menagerie;
在Unix下,数据库名称是区分大小写的(不像SQL关键字),所以你必须总是指到你的数据库 menagerie
,而不是 Menagerie
,MENAGERIE
或一些其他变种。表名也是如此。(在Windows下,此限制不适用,尽管您必须在整个给定查询中使用相同的字母大写来引用数据库和表。但是,由于多种原因,建议的最佳实践始终是使用与以下情况相同的字母大写:数据库已创建。)
如果收到诸如ERROR 1044(42000)的错误:尝试创建数据库时,拒绝用户'micah'@'localhost'对数据库'menagerie'的访问,这意味着您的用户帐户没有执行此操作所需的特权所以。与管理员讨论此问题,或参阅第6.2节“访问控制和帐户管理”。
创建数据库不会选择使用它;您必须明确地做到这一点。要创建menagerie
当前数据库,请使用以下语句:
mysql> USE menagerie Database changed
您的数据库只需创建一次,但是每次开始mysql 会话时,都必须选择该数据库以供使用。您可以通过发出USE
示例中所示的语句来执行此操作 。或者,可以在调用mysql时在命令行上选择数据库。只需在您可能需要提供的任何连接参数之后指定其名称即可。例如:
shell> mysql -h host -u user -p menagerie Enter password: ********
menagerie
刚刚显示的命令中 的密码不是您的密码。如果要在-p
选项后在命令行上提供密码,则 必须在中间没有空格(例如,as ,而不是as )。但是,不建议将密码放在命令行上,因为这样做会使密码容易被登录到您计算机上的其他用户监听。 -p
password
-p
password
您可以随时使用查看当前选择的数据库。 SELECT
DATABASE()
3.3.2创建表
创建数据库很容易,但是此时它是空的,如SHOW TABLES
您所知:
mysql> SHOW TABLES; Empty set (0.00 sec)
较难的部分是确定数据库的结构应该是:每个表中需要什么表以及什么列。
您需要一个包含每个宠物记录的表格。这可以称为pet
表格,并且至少应包含每只动物的名字。由于名称本身不是很有趣,因此该表应包含其他信息。例如,如果您家中有不止一个人养宠物,您可能希望列出每只动物的所有者。您可能还想记录一些基本的描述性信息,例如物种和性别。
年龄呢?这可能很有趣,但是将它存储在数据库中并不是一件好事。年龄随着时间的流逝而变化,这意味着您必须经常更新记录。相反,最好存储一个固定值,例如出生日期。然后,无论何时需要年龄,都可以将其计算为当前日期与出生日期之间的差。MySQL提供了执行日期算术的功能,因此这并不困难。存储出生日期而不是年龄还有其他好处:
-
您可以使用该数据库执行诸如为即将到来的宠物生日生成提醒之类的任务。(如果您认为这种查询有点愚蠢,请注意,在业务数据库的上下文中,您可能会问同样的问题,以标识您需要在当前一周或当月向其发送生日祝福的客户,为此电脑辅助的个人风格。)
-
您可以相对于当前日期以外的日期计算年龄。例如,如果将死亡日期存储在数据库中,则可以轻松计算宠物死亡的年龄。
您可能会想到pet
表中可能有用的其他类型的信息,但到目前为止确定的信息已足够:姓名,所有者,物种,性别,出生和死亡。
使用一条CREATE TABLE
语句指定表的布局:
mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20), species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
VARCHAR
对于,和 列是一个不错的选择 name
,因为列值的长度不同。这些列定义中的长度不必全部相同,也不必相同。您通常可以选择从到的 任何长度,无论您觉得最合理的长度。如果您选择不当,后来又发现需要更长的字段,MySQL会提供一条语句。 owner
species
20
1
65535
ALTER TABLE
可以选择几种类型的值来表示动物记录中的性别,例如'm'
和 'f'
,或者也许'male'
和 'female'
。使用单个字符'm'
和最简单'f'
。
DATE
对于birth
和death
列 使用数据类型是一个显而易见的选择。
创建表后,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
例如,如果您忘记了表中列的名称或列的类型,则 可以使用任何时间。
有关MySQL数据类型的更多信息,请参见 第11章,数据类型。
3.3.3将数据加载到表中
创建表后,需要填充它。该 LOAD DATA
和 INSERT
语句是这个有用的。
假设您的宠物记录可以描述如下。(请注意,MySQL需要使用 格式的日期;这可能与您习惯的日期 有所不同。) '
YYYY-MM-DD
'
名称 | 所有者 | 种类 | 性别 | 出生 | 死亡 |
---|---|---|---|---|---|
蓬松 | 哈罗德 | 猫 | F | 1993-02-04 | |
爪子 | 格温 | 猫 | 米 | 1994-03-17 | |
巴菲 | 哈罗德 | 狗 | F | 1989-05-13 | |
ang | 本尼 | 狗 | 米 | 1990-08-27 | |
鲍泽 | 黛安 | 狗 | 米 | 1979-08-31 | 1995-07-29 |
扢 | 格温 | 鸟 | F | 1998-09-11 | |
惠斯勒 | 格温 | 鸟 | 1997-12-09 | ||
瘦 | 本尼 | 蛇 | 米 | 1996-04-29 |
因为您是从一个空表开始的,所以填充它的一种简单方法是为每个动物创建一个包含一行的文本文件,然后使用单个语句将文件的内容加载到表中。
您可以创建一个文本文件pet.txt
,每行包含一个记录,其值由制表符分隔,并按CREATE TABLE
语句中各列的列出顺序给出 。对于缺失值(例如,未知的性别或仍在生活中的动物的死亡日期),可以使用NULL
值。要在文本文件中表示这些字符,请使用 \N
(反斜杠,大写N)。例如,惠斯勒小鸟的记录应如下所示(其中值之间的空格是单个制表符):
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';
(在运行macOS的Apple机器上,您可能想使用 LINES TERMINATED BY '\r'
。)
您可以根据需要在LOAD DATA
语句中显式指定列值分隔符和行尾标记,但默认值为制表符和换行符。这些足以使语句pet.txt
正确读取文件。
如果该语句失败,则可能是默认情况下您的MySQL安装未启用本地文件功能。有关如何更改此设置的信息,请参见第6.1.6节“ LOAD DATA LOCAL的安全注意事项”。
当您想一次添加一个新记录时,该 INSERT
语句很有用。以最简单的形式,您可以按CREATE TABLE
语句中列出列的顺序为每一列提供值 。假设Diane有了一只名为“ Puffball ”的新仓鼠。”您可以使用如下INSERT
语句添加新记录 :
mysql> INSERT INTO pet VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
字符串和日期值在此处指定为带引号的字符串。另外,使用INSERT
,您可以NULL
直接插入 以表示缺失值。您不会\N
像使用那样使用 LOAD DATA
。
从该示例中,您应该能够看到,最初使用多个INSERT
语句而不是单个LOAD DATA
语句来加载记录时会涉及更多类型的输入
3.3.4从表中检索信息
该SELECT
语句用于从表中提取信息。该语句的一般形式为:
SELECT what_to_select
FROM which_table
WHERE conditions_to_satisfy;
what_to_select
指示您要查看的内容。这可以是列的列表,也 *
可以表示“所有列”。” which_table
表示要从中检索数据的表。该WHERE
子句是可选的。如果存在,则 conditions_to_satisfy
指定行必须满足的一个或多个条件才有资格进行检索。
3.3.4.1选择所有数据
最简单的形式SELECT
从表中检索所有内容:
mysql> SELECT * FROM pet;
+----------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+--------+---------+------+------------+------------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Fang | Benny | dog | m | 1990-08-27 | NULL |
| Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
+-----