归档 write 编程 财务软件 会计 数据库 网络工程 运维 自考 doc文档系统 管理
 

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,而不是 MenagerieMENAGERIE或一些其他变种。表名也是如此。(在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 )。但是,不建议将密码放在命令行上,因为这样做会使密码容易被登录到您计算机上的其他用户监听。 -ppassword-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会提供一条语句。 ownerspecies20165535ALTER TABLE

可以选择几种类型的值来表示动物记录中的性别,例如'm'和 'f',或者也许'male'和 'female'使用单个字符'm'最简单'f'

DATE对于birthdeath 列 使用数据类型是一个显而易见的选择。

创建表后,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 | +----------+--------+---------+------+------------+------------+

SELECT如果您想查看整个表(例如,在将初始数据集加载到表中之后),则 这种形式非常有用。例如,您可能碰巧认为Bowser的出生日期似乎不太正确。查阅原始的血统书,您会发现正确的出生年份应该是1989,而不是1979。

至少有两种方法可以解决此问题:

  • 编辑文件pet.txt以更正错误,然后清空表并使用DELETE和 重新加载它 LOAD DATA

    mysql> DELETE FROM pet;
    mysql> LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet;
    

      

    但是,如果执行此操作,则还必须重新输入Puffball的记录。

  • 使用以下UPDATE语句仅修复错误的记录 

    mysql> UPDATE pet SET birth = '1989-08-31' WHERE name = 'Bowser';
    

      

    UPDATE所做 的更改仅是有关记录更改,不需要您重新加载表。

 

 

 

 

3.3.4.2选择特定行

如上一节所示,很容易检索整个表。只需WHERESELECT语句中省略该子句即可但通常您不希望看到整个表格,尤其是当表格变大时。相反,您通常对回答特定问题更感兴趣,在这种情况下,您可以对所需的信息指定一些限制。让我们从与宠物有关的问题来看一些选择查询。

您只能从表中选择特定的行。例如,如果要验证对Bowser的生日所做的更改,请选择Bowser的记录,如下所示:

mysql> SELECT * FROM pet WHERE name = 'Bowser';
+--------+-------+---------+------+------------+------------+
| name   | owner | species | sex  | birth      | death      |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+

输出确认该年正确记录为1989,而不是1979。

字符串比较通常不区分大小写,因此您可以将名称指定为'bowser', 'BOWSER'等等。查询结果相同。

您可以在任何列上指定条件,而不仅仅是 name例如,如果您想知道在1998年或之后出生的动物,请测试以下列 birth

mysql> SELECT * FROM pet WHERE birth >= '1998-1-1';
+----------+-------+---------+------+------------+-------+
| name     | owner | species | sex  | birth      | death |
+----------+-------+---------+------+------------+-------+
| Chirpy   | Gwen  | bird    | f    | 1998-09-11 | NULL  |
| Puffball | Diane | hamster | f    | 1999-03-30 | NULL  |
+----------+-------+---------+------+------------+-------+

您可以组合条件,例如查找雌狗:

mysql> SELECT * FROM pet WHERE species = 'dog' AND sex = 'f';
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

前面的查询使用AND 逻辑运算符。还有一个 OR运算符:

mysql> SELECT * FROM pet WHERE species = 'snake' OR species = 'bird';
+----------+-------+---------+------+------------+-------+
| name     | owner | species | sex  | birth      | death |
+----------+-------+---------+------+------------+-------+
| Chirpy   | Gwen  | bird    | f    | 1998-09-11 | NULL  |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL  |
| Slim     | Benny | snake   | m    | 1996-04-29 | NULL  |
+----------+-------+---------+------+------------+-------+

AND并且 OR可以混合使用,尽管 AND优先级高于 OR如果同时使用这两个运算符,则最好使用括号来明确指示应如何对条件进行分组:

 
mysql> SELECT * FROM pet WHERE (species = 'cat' AND sex = 'm')
       OR (species = 'dog' AND sex = 'f');
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+
mysql> SELECT * FROM pet;
posted @ 2020-10-27 11:13  少时的路  阅读(151)  评论(0编辑  收藏  举报