📄 manual_tutorial.html
字号:
<li>你可以相对于日期而不止是当前日期来计算年龄。例如,如果你在数据库存储死亡日期,你能容易计算一只宠物是何时多大死的。
</li>
</ul>
<p>你可能想到<code>pet</code>表中其他有用的其他类型信息,但是到目前为止这些现在是足够了:名字、主人、种类,性别、出生和死亡日期。
</p>
<p>使用一个<code>CREATE TABLE</code>语句指定你的数据库表的布局: </p>
<pre>mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
-> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
</pre>
<p><code>VARCHAR</code>对<code>name</code>、<code>owner</code>和<code>species</code>列是个好的选择,因为列值将会是变长的。这些列的长度都不必是相同的,而且不必是<code>20</code>。你可以挑选从<code>1</code>到<code>255</code>的任何长度,无论哪个对你来说好象最合理。(如果你做了较差的选择,以后会变得你需要一个更长的字段,<strong>MySQL</strong>提供一个<code>ALTER
TABLE</code>语句。)</p>
<p>动物性表可以用许多方法表示,例如,<code>"m"</code>和<code>"f"</code>,或也许<code>"male"</code>和<code>"female"</code>。使用单个字符<code>"m"</code>和<code>"f"</code>是最简单的。
</p>
<p>为<code>birth</code>和<code>death</code>列使用<code>DATE</code>数据类型是相当明显的选择。
</p>
<p>既然你创建了一个表,<code>SHOW TABLES</code>应该产生一些输出: </p>
<pre>mysql> SHOW TABLES;
+---------------------+
| Tables in menagerie |
+---------------------+
| pet |
+---------------------+
</pre>
<p>为了验证你的表是按你期望的方式被创建,使用一个<code>DESCRIBE</code>语句:
</p>
<pre>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 | |
+---------+-------------+------+-----+---------+-------+
</pre>
<p>你能随时<code>DESCRIBE</code>,例如,如果你忘记在你表中的列的名字或他们是什么类型。
</p>
<h3><a NAME="Loading_tables" HREF="manual_toc.html#Loading_tables">8.4.3
将数据装入一个数据库表</a></h3>
<p>在你创建表后,你需要充实它。<code>LOAD DATA</code>和<code>INSERT</code>语句用于此。
</p>
<p>假定你的宠物纪录描述如下。(观察到<strong>MySQL</strong>期望日期时以<code>YYYY-MM-DD</code>格式;这可能与你习惯的不同。)</p>
<table border="1" width="100%" NOSAVE class="p4">
<tbody>
<tr>
<td><strong>name</strong> </td>
<td><strong>owner</strong> </td>
<td><strong>species</strong> </td>
<td><strong>sex</strong> </td>
<td><strong>birth</strong> </td>
<td><strong>death</strong> </td>
</tr>
<tr>
<td>Fluffy </td>
<td>Harold </td>
<td>cat </td>
<td>f </td>
<td>1993-02-04 </td>
<td> </td>
</tr>
<tr>
<td>Claws </td>
<td>Gwen </td>
<td>cat </td>
<td>m </td>
<td>1994-03-17 </td>
<td> </td>
</tr>
<tr>
<td>Buffy </td>
<td>Harold </td>
<td>dog </td>
<td>f </td>
<td>1989-05-13 </td>
<td> </td>
</tr>
<tr>
<td>Fang </td>
<td>Benny </td>
<td>dog </td>
<td>m </td>
<td>1990-08-27 </td>
<td> </td>
</tr>
<tr>
<td>Bowser </td>
<td>Diane </td>
<td>dog </td>
<td>m </td>
<td>1998-08-31 </td>
<td>1995-07-29 </td>
</tr>
<tr>
<td>Chirpy </td>
<td>Gwen </td>
<td>bird </td>
<td>f </td>
<td>1998-09-11 </td>
<td> </td>
</tr>
<tr>
<td>Whistler </td>
<td>Gwen </td>
<td>bird </td>
<td> </td>
<td>1997-12-09 </td>
<td> </td>
</tr>
<tr>
<td>Slim </td>
<td>Benny </td>
<td>snake </td>
<td>m </td>
<td>1996-04-29 </td>
<td> </td>
</tr>
</tbody>
</table>
<p>因为你是从一张空表开始的,充实它的一个容易方法是创建包含为你的动物各一行一个文本文件,然后用一个单个语句装载文件的内容到表中。
</p>
<p>你可以创建一个文本文件<tt>“pet.txt”</tt>,每行包含一个记录,用定位符(tab)把值分开,并且以在<code>CREATE
TABLE</code>语句中列出的列次序给出。对于丢失的值(例如未知的性别,或仍然活着的动物的死亡日期),你可以使用<code>NULL</code>值。为了在你的文本文件表示这些,使用<code>\N</code>。例如,对Whistler鸟的记录看起来像这样的(这里在值之间的空白是一个单个的定位字符):</p>
<table border="1" width="100%" NOSAVE class="p4">
<tbody>
<tr>
<td><code>Whistler</code> </td>
<td><code>Gwen</code> </td>
<td><code>bird</code> </td>
<td><code>\N</code> </td>
<td><code>1997-12-09</code> </td>
<td><code>\N</code> </td>
</tr>
</tbody>
</table>
<p>为了装载文本文件<tt>“pet.txt”</tt>到<code>pet</code>表中,使用这个命令:
</p>
<pre>mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;
</pre>
<p>如果你愿意,你能明确地在<code>LOAD DATA</code>语句中指出列值的分隔符和行尾标记,但是缺省是定位符和换行符。这些对争取读入文件<tt>“pet.txt”</tt>的语句是足够的。
</p>
<p>当你想要一次增加一个新记录时,<code>INSERT</code>语句是有用的。在它最简单的形式,你为每一列提供值,以列在<code>CREATE
TABLE</code>语句被列出的顺序。假定Diane把一只新仓鼠命名为Puffball,你可以使用一个这样<code>INSERT</code>语句增加一条新记录:
</p>
<pre>mysql> INSERT INTO pet
-> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
</pre>
<p>注意,这里字符串和日期值被指定为引号扩起来的字符串。另外,用<code>INSERT</code>,你能直接插入<code>NULL</code>代表不存在的值。你不能使用<code>\N</code>,就像你用<code>LOAD
DATA</code>做的那样。 </p>
<p>从这个例子,你应该能看到涉及很多的键入用多个<code>INSERT</code>语句而非单个<code>LOAD
DATA</code>语句装载你的初始记录。 </p>
<h3><a NAME="Retrieving_data" HREF="manual_toc.html#Retrieving_data">8.4.4
从一个数据库表检索信息</a></h3>
<p><code>SELECT</code>语句被用来从一张桌子拉出信息。语句的一般格式是:
</p>
<pre>SELECT what_to_select
FROM which_table
WHERE conditions_to_satisfy
</pre>
<code>
<p>what_to_select</code>指出你想要看到的,这可以是列的一张表,或<code>*</code>表明“所有的列”。<code>which_table</code>指出你想要从其检索数据的表。<code>WHERE</code>子句是可选的,如果它在,<code>conditions_to_satisfy</code>指定行必须满足的检索条件。
</p>
<h4><a NAME="Selecting_all" HREF="manual_toc.html#Selecting_all">8.4.4.1
选择所有数据</a></h4>
<p><code>SELECT</code>最简单的形式是从一张表中检索每样东西: </p>
<pre>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 | 1998-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 |
+----------+--------+---------+------+------------+------------+
</pre>
<p>如果你想要考察整个表,这种形式的<code>SELECT</code>是很有用的。例如,在你刚刚给它装载了你的初始数据集装以后。当它发生时,刚才显示的输出揭示了在你的数据文件的一个错误:在Bowser死了以后,它好象要出生了!请教你原来的家谱,你发现正确的出生年是1989,而不是1998。
</p>
<p>至少有一些修正它的方法:
<ul>
<li>编辑文件<tt>“pet.txt”</tt>改正错误,然后使用<code>DELETE</code>和<code>LOAD
DATA</code>弄空表并且再次装载它: <pre>mysql> DELETE FROM pet;
mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;
</pre>
<p>然而, 如果你这样做,你必须重新输入Puffball记录。 </p>
</li>
<li>用一个<code>UPDATE</code>语句仅修正错误记录: <pre>mysql> UPDATE pet SET birth = "1989-08-31" WHERE name = "Bowser";
</pre>
</li>
</ul>
<p>如上所示,检索整个表是容易的,但是一般你不想那样做,特别地当表变得很大时。相反,你通常对回答一个特别的问题更感兴趣,在这种情况下你在你想要的信息上指定一些限制。让我们看一些他们回答有关你宠物的问题的选择查询。
</p>
<h4><a NAME="Selecting_rows" HREF="manual_toc.html#Selecting_rows">8.4.4.2 选择特定行</a></h4>
<p>你能从你的表中只选择特定的行。例如,如果你想要验证你对Bowser的出生日期所做的改变,像这样精选Bowser的记录:
</p>
<pre>mysql> SELECT * FROM pet WHERE name = "Bowser";
+--------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+
</pre>
<p>输出证实年份现在正确记录为1989,而不是1998。 </p>
<p>字符串比较通常是大小些无关的,因此你可以指定名字为<code>"bowser"</code>、"BOWSER"等等,查询结果将是相同的。
</p>
<p>你能在任何列上指定条件,不只是<code>name</code>。例如,如果你想要知道哪个动物在1998以后出生的,测试<code>birth</code>列:
</p>
<pre>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 |
+----------+-------+---------+------+------------+-------+
</pre>
<p>你能组合条件,例如,找出雌性的狗: </p>
<pre>mysql> SELECT * FROM pet WHERE species = "dog" AND sex = "f";
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
</pre>
<p>上面的查询使用<code>AND</code>逻辑操作符,也有一个<code>OR</code>操作符:
</p>
<pre>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 |
+----------+-------+---------+------+------------+-------+
</pre>
<p><code>AND</code>和<code>OR</code>可以混用。如果你这样做,使用括号指明条件应该如何被分组是一个好主意:
</p>
<pre>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 |
+-------+--------+---------+------+------------+-------+
</pre>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -