一旦知道如何輸入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
語句來加載記錄會涉及更多的輸入。