既然你知道怎樣輸入命令,現在是存取一個數據庫的時候了。
假定在你的家(你的“動物園”)中有很多寵物,並且你想追蹤關於他們各種各樣類型的信息。你可以通過創建表來保存你的數據並根據所需要的信息裝載他們做到,然後你可以通過從表中檢索數據來回答關於你的動物不同種類的問題。本節顯示如何做到所有這些事情:
怎樣創建一個數據庫
怎樣創建一個數據庫表
怎樣裝載數據到數據庫表
怎樣以各種方法從表中檢索數據
怎樣使用多個表
動物園數據庫將會是簡單的(故意的),但是不難把它想象成可能用到相似類型數據庫的真實世界情況。例如,這樣的一個數據庫能被一個農夫用來追蹤家畜,或由一個獸醫追蹤病畜記錄。
使用SHOW語句找出在服務器上當前存在什麼數據庫:
MySQL> SHOW DATABASES;
+----------+
| Database |
+----------+
| MySQL |
| test |
| tmp |
+----------+
數據庫列表可能在你的機器上是不同的,但是mysql和test數據庫很可能的在其間。MySQL是必需的,因為它描述用戶存取權限,test數據庫經常作為一個工作區提供給用戶試試身手。
如果test數據庫存在,嘗試存取它:
MySQL> USE test
Database changed
注意,USE,類似QUIT,不需要一個分號。(如果你喜歡,你可以用一個分號終止這樣的語句;這無礙)USE語句在使用上也有另外一個特殊的地方:它必須在一個單行上給出。
你可列在後面的例子中使用test數據庫(如果你能訪問它),但是你在該數據庫創建的任何東西可以被與訪問它的其他人刪除,為了這個原因,你可能應該詢問你的MySQL管理員許可你自己使用的一個數據庫。假定你想要調用你的menagerIE,管理員需要執行一個這樣的命令:
mysql> GRANT ALL ON menagerIE.* TO your_MySQL_name;
這裡your_mysql_name是分配給你的MySQL用戶名。
8.4.1 創建並選用一個數據庫
如果在設置你的權限時,管理員為你創建了數據庫,你可以開始使用它。否則,你需要自己創建它:
MySQL> CREATE DATABASE menagerIE;
在Unix下,數據庫名字是區分大小寫的(不像SQL關鍵詞),因此你必須總是以menagerie引用你的數據庫,不是Menagerie、MENAGERIE或一些其他變種。對表名也是這樣的。(在Windows下,該限制不適用,盡管你必須在一個給定的查詢中使用同樣的大小寫來引用數據庫和表。)
創建了一個數據庫並不選定以使用它,你必須明確地做這件事。為了使menagerIE稱為當前的數據庫,使用這個命令:
MySQL> USE menagerIE
Database changed
你的數據庫只需要創建一次,但是你必須在每次啟動一個mysql會話時為使用而選擇它。你可以由發出上面一個USE語句做到。另外,當你調用時MySQL,你可在命令行上選擇數據庫,就在你可能需要提供的任何連接參數之後指定其名字。例如:
shell> MySQL -h host -u user -p menagerIE
Enter passWord: ********
注意,menagerIE不是你在剛才所示命令的口令。如果你想要在命令行上在-p選項後提供你的口令,你必須做到沒有多余的空格(例如,如-pmypassword,不是-p mypassWord)。然而,不建議把你的口令放在命令行上,因為這樣做把它暴露出來,能被在你的機器上登錄的其他用戶窺探到。
8.4.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、owner和specIEs列是個好的選擇,因為列值將會是變長的。這些列的長度都不必是相同的,而且不必是20。你可以挑選從1到255的任何長度,無論哪個對你來說好象最合理。(如果你做了較差的選擇,以後會變得你需要一個更長的字段,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,例如,如果你忘記在你表中的列的名字或他們是什麼類型。
8.4.3 將數據裝入一個數據庫表
在你創建表後,你需要充實它。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 1998-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”,每行包含一個記錄,用定位符(tab)把值分開,並且以在CREATE TABLE語句中列出的列次序給出。對於丟失的值(例如未知的性別,或仍然活著的動物的死亡日期),你可以使用NULL值。為了在你的文本文件表示這些,使用N。例如,對Whistler鳥的記錄看起來像這樣的(這裡在值之間的空白是一個單個的定位字符):
Whistler Gwen bird N 1997-12-09 N
為了裝載文本文件“pet.txt”到pet表中,使用這個命令:
MySQL> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;
如果你願意,你能明確地在LOAD DATA語句中指出列值的分隔符和行尾標記,但是缺省是定位符和換行符。這些對爭取讀入文件“pet.txt”的語句是足夠的。
當你想要一次增加一個新記錄時,INSERT語句是有用的。在它最簡單的形式,你為每一列提供值,以列在CREATE TABLE語句被列出的順序。假定Diane把一只新倉鼠命名為Puffball,你可以使用一個這樣INSERT語句增加一條新記錄:
MySQL> INSERT INTO pet
-> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
注意,這裡字符串和日期值被指定為引號擴起來的字符串。另外,用INSERT,你能直接插入NULL代表不存在的值。你不能使用N,就像你用LOAD DATA做