用PHP和MySQL構建一個資料庫驅動的網站(三)

來源:互聯網
上載者:User
mysql|資料|資料庫 摘要

  在這一章,我們將集中學習如何使用結構化查詢語言 (SQL)(SQL)在MySQL資料庫中工作。

(2002-08-29 14:11:10)

--------------------------------------------------------------------------------
By Wing, 出處:Linuxaid


第二章: MySQL入門

  歡迎回到這個教程!在上一章,我們學習了安裝和配置PHP和MySQL這兩個軟體。在這一章,我們將集中學習如果使用結構化查詢語言 (SQL)(SQL)在MySQL資料庫中工作。


資料庫入門

  上一章簡要說明的那樣,PHP是一個伺服器端的指令碼語言,通過這個語言你可以在你的Web頁面中添加指令,這樣你的Web服務軟體(可能是Apache,Personal Web Server或其他任何軟體)會在向發出請求的瀏覽器發送這些頁面前首先執行它。在那個簡單的例子中,我展示了如何每次在接受請求的Web頁面中插入當前的日期。


  都很清楚了,但是如果在其中添加一個資料庫會真正引起我們的興趣。一個資料庫伺服器(我們這裡是MySQL)是一個使用一定格式儲存大量資訊的程式,通過這個程式你可以很簡單地使用象PHP這樣的指令碼語言來訪問資料。例如,你可以使用PHP在資料庫中獲得一個笑話的列表並將其顯示到你的Web網站。


  子中,笑話被完全儲存在資料庫中。這樣做有兩個好處。首先,你不再需要為你的每個笑話寫一個HTML檔案,你只需要寫一個PHP檔案來從資料庫中引出任何的笑話並顯示它;其次,要添加笑話到你的Web網站中,也僅僅是添加笑話到資料庫中。PHP代碼在新笑話包含在列表中時可以自動顯示新的笑話。


  們通過這個例子來看看資料是如何在資料庫中儲存的。一個資料庫包含一個或幾個資料表(table),每一個資料表包含了一個事物的列表。對於我們的笑話資料庫來說,我們一開始可能需要一個名為“jokes”的資料表,這個資料表包含了一個笑話列表。資料庫中每個資料表包含一個或幾個資料列(column)或資料域(field)。回到我們的例子中來,我們的“jokes”資料表可能有這樣的兩列:笑話的本文以及笑話添加到資料庫中的日期。每個儲存在資料表中的笑話我們稱之為一行。要瞭解這兒提到的所有術語,你可以看下面這張圖:


  在笑話本文(“JokeText”)和添加日期(“JokeDate”)這兩個資料列之外,我還增加了一個叫做“ID”的資料列。這個資料列的作用是給每個笑話分配一個唯一的號碼,這樣我們可以很容易地查閱並區分這些笑話。


  習一下,上面的資料表中有三個資料列、兩行。每一行包含了一個笑話的ID、它的本文以及它的添加日期。掌握了這些基本術語後,我們將開始使用MySQL。


登入MySQL

  SQL資料庫的標準介面是串連到MySQL服務軟體(在第一章內安裝)並同時輸入命令。要串連上伺服器,我們需要使用MySQL用戶端程式。如果你自己安裝了MySQL服務軟體,不管你是在Windows下安裝的,還是在一些Unix的版本下安裝的,你應該已經在安裝服務程式的同一地點安裝了這個用戶端程式。在Linux,這個程式被稱之為mysql,其位置預設是/usr/local/mysql/bin 目錄。在Windows下,這個程式被稱之為mysql.exe,其位置預設是C:mysqlin目錄。


  是自己安裝的MySQL伺服器(例如,你是在你的Web主機供應商的MySQL伺服器上工作),那麼有兩個方法串連到MySQL伺服器,第一個方法是使用telnet登入到你的Web主機的伺服器上,然後在那兒運行mysql。第二種方法是從http://www.mysql.com/(for Windows和for Linux的都可以免費獲得) 下載並安裝MySQL用戶端程式。這兩種方法都可以很好地工作,你的Web主機可能支援其中的一種,或者兩種都支援(你需要去問清楚)。


  擇了哪種方法,不管你使用的是哪種系統,你最終都應該在一個命令列執行MySQL用戶端程式去串連你的MySQL伺服器,你需要輸入下面的命令:

mysql -h  -u  -p



  換成你的MySQL伺服器正在其上啟動並執行電腦的主機名稱或IP地址。如果你在運行服務的同一台電腦上運行用戶端程式,你可以不使用-h 而且直接使用-h localhost。應該是你的MySQL使用者名稱。如果你是自己安裝的MySQL伺服器,這應該就是root。如果你是使用的你的Web主機供應商的MySQL服務,這應該是他們為你指定的MySQL使用者。


  參數告訴程式提示你輸入你的口令,這將在你輸入上面的命令後立即顯示。如果你是自己安裝的MySQL,你的口令就是你在第一章內選擇的root的口令。如果你是使用的你的Web主機供應商的MySQL服務,這應該是他們給你的MySQL口令。


  切都輸入好了,MySQL用戶端程式會串連上MySQL伺服器並返回給你一個MySQL的命令列:

mysql>



  ySQL伺服器實際上是串連了好幾個資料庫(這使得一個Web主機可以為幾個使用者佈建同一個MySQL伺服器)。所以你的下一步應該是選擇一個工作的資料庫。首先,獲得當前伺服器上的資料庫列表。輸入下面的命令(不要忘了分號!),然後打斷行符號。

mysql> SHOW DATABASES;



  L會顯示給你伺服器上的資料庫列表。如果這是一個新安裝的伺服器(也就是說,這是你在第一章裡自己安裝的)。這個列表將會是這樣:


+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
2 rows in set (0.11 sec)




  L伺服器使用第一個被稱之為mysql的資料庫來系統管理使用者及其口令和許可權。現在我們暫時不會關心這個資料庫,在以後的章節中,我們會討論它。第二個叫test是一個資料模組。你可以刪除這個資料庫,在我們的教程中不會使用到它(我們會自己建立一些資料庫)。刪除什麼東西在MySQL中被稱之為“dropping”,要刪除test資料庫,其正確的命令應該是:

mysql> DROP DATABASE test;



  入了這個命令,並打了斷行符號,MySQL會刪除這個資料庫,並返回Query OK。注意,並不會提示你諸如“這是否確定”這樣的資訊。所以你在MySQL輸入命令必須十分小心。就象我們在這兒看到的,你可以完全刪除資料庫--包含它其中的所有資訊--僅僅只用一個命令!


  入下一步之前,讓我們先來看看MySQL命令列的串連。正如我們已經注意到的,在MySQL中的所有命令都必須以分號(;)結束。如果你忘記了這個分號,MySQL會認為你還沒有結束輸入你的命令,並會讓你這下一行中繼續錄入:


mysql> SHOW
    -> DATABASES;




  L在等待你輸入命令中的剩餘部分時,提示符會從mysql>改變為->。對於一個長命令,這是很有用的,你可以將你的命令分幾行輸入。


  途發現你的命令出錯了,你可以完全取消當前的命令(譯者註:是指尚未執行的命令)並從頭來過。要完成這個工作,你只需要輸入c並按斷行符號:

mysql> DROP DATABASEcmysql>



  L會完全忽略你剛才輸入的命令,並返回到提示符等待你的下一個命令。


  你要退出MySQL用戶端程式時,你只需要輸入quit或者exit (這兩個命令是完全一樣的)。這是唯一不用以分號結尾就可以執行的命令。

mysql> quitBye



什麼是SQL?

  程中我們用來告訴MySQL去做什麼的命令其實是一個叫結構化查詢語言 (SQL)(SQL)的規範的一部分。SQL中的命令也被稱之為查詢(在這篇教程中,我們會交替地採用這兩種稱呼)。


  實現與絕大多數的資料庫的互動的標準語言,所以即使你將來不再使用MySQL,轉而使用Microsoft SQL Server,你會發現絕大多數命令是相同的。你必須理解SQL和MySQL的區別。MySQL是你正在使用的資料庫服務軟體。SQL是你用來實現和資料庫的互動的語言。


建立一個資料庫

  Web主機供應商已經為你分配了一個用來工作的資料庫。你先耐心地等待一下,等一下我們會和你繼續討論下面的問題。如果你是在自己安裝的MySQL伺服器上工作。執行下面的命令,很容易地你就可以建立一個資料庫了:

mysql> CREATE DATABASE jokes;



  庫的名字是jokes,這是為了與我們工作的例子一致。其實你可以給你的資料庫起任何你自己喜歡的名字。不過,如果你是在Web主機供應商的MySQL伺服器上工作,它們可能已經為你建立了一個資料庫,你就沒法選擇資料庫的名字了。


  已經有了一個資料庫,我們需要告訴MySQL我們想要使用這個資料庫。下面這個命令應該也不太難記:

mysql> USE jokes;



  以開始使用你的資料庫了。在你在其中添加資料表之前,這個資料庫將是空的,我們的第一步工作應該是建立一個資料表來儲存我們的笑話。


建立一個資料表

  遇到的SQL命令都是非常簡單的,但是因為資料表是比較靈活的,相應地建立它們的命令就要複雜得多了。建立資料表的基本格式是這樣的:


mysql> CREATE TABLE <table name;> (
    -> <column 1 name;> <col. 1 type;> <col. 1 details;> ,
    -> <column 2 name;> <col. 2 type> <col. 2 details;> ,
    -> ...
    -> );




  現在回到我們的例子“Jokes”表。這個表有三個資料列:ID(一個數字)、JokeText(笑話的本文)和JokeDate(加入的日期)。建立這個表的命令應該是這樣的:


mysql> CREATE TABLE Jokes (
    -> ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> JokeText TEXT,
    -> JokeDate DATE NOT NULL
    -> );



  看上去很複雜,是吧?讓我們將它分解一下:

  第一行是比較簡單的;它說明我們想要建立一個新的名為Jokes的資料表。

  第二行說明我們需要一個資料列叫ID,這個列的類型應該是一個整數(INT)。這一行還定義了這個資料列的其他一些資訊。首先,這一行不允許為空白(NOT NULL)。第二,如果你沒有為一列指定一個值,MySQL會選擇使用一個比當前最大值大的值(AUTO_INCREMENT)。最後,這個資料列還是這資料表的唯一的標識符,所以這個資料列中的所有值都應該是不重複的(PRIMARY KEY)。

  第三行是非常簡單的;這說明我們需要一個資料列叫JokeText,這個列的類型應該是一個文本(TEXT)。

  第四行定義了我們的最後一列,列名是JokeDate,這個列的類型是日期型(DATE)這個列也不可為空(NOT NULL)。

  請注意,我們在輸入SQL命令時,大小寫是完全自由的,但是在一個Unix-based系統下啟動並執行MySQL服務,因為我們必須與MySQL資料目錄下的目錄和檔案一致,當遇到資料庫名和表名時,我們必須區分大小寫。否則,MySQL是完全對大小寫不敏感的,只有一種情況例外,在同一命令中多次出現的表名、列名以及其他名字必須在拼字上完全一致。

  我們還應該注意到,我們為我們建立的每一列指定了一個指定的類型。 ID是一個整型,JokeText是一個文本型,JokeDate是一個日期型。MySQL允許我們為每一個列定義一個類型。 這不僅僅可以協助你組織資料,而且你可以利用它對資料進行比較(我們在下面會看到)。要想得到一個關於MySQL支援的資料類型的完整的列表,你可以參看MySQL使用者手冊。

  總之,如果你正確輸入了上面的命令,MySQL會返回 Query OK並會為你建立你的第一個資料表。如果你在輸入中出了什麼錯誤,MySQL會告訴你輸入的語名有問題,而且會給你一些提示,說明什麼地方它不能理解。

  對於這樣一個複雜的命令,最終只出現Query OK是相當單調的。讓我們看看你的新資料表是不是正常地建立了。輸入下面的命令:

mysql> SHOW TABLES;


  響應應該是這樣的:


+-----------------+
| Tables in jokes |
+-----------------+
| Jokes |
+-----------------+
1 row in set



  這是一個關於我們的資料庫(我們在前面將其命名為jokes)中的所有表的列表。這個列表僅僅包含了一個資料表:Jokes,這個表是我們剛剛建立的。看來一切都好了,讓我們再來近看一下這個Jokes表:


mysql> DESCRIBE Jokes;
+----------+---------+------+-----+------------+- -
| Field | Type | Null | Key | Default | ...
+----------+---------+------+-----+------------+- -
| ID | int(11) | | PRI | 0 | ...
| JokeText | text | YES | | NULL |
| JokeDate | date | | | 0000-00-00 |
+----------+---------+------+-----+------------+- -
3 rows in set



  這兒提供了一個資料列的列表。正如我們看到的,這個表中有三個列,在返回的結果表中這被表示為三行。詳細資料比較難以看懂,但是你認真看一下,應該還是能瞭解其大致的含義的。不要為這件事過於擔心。我們還會繼續學習,我們還會在這個表中添加一些笑話。

  我們還需要知道一些其他的事,例如刪除一個表。這和刪除一個資料庫一樣的簡單,簡單得令人恐怖。命令也幾乎一樣:

mysql> DROP TABLE ;


向資料庫中添加資料

  我們的資料庫和資料表都已經建立好了,現在我們該向我們的資料庫中添加笑話了。向資料庫中添加資料的命令被稱之為INSERT。這個命令有兩種基本格式:


mysql> INSERT INTO <table name;> SET
    -> columnName1 = value1,
    -> columnName2 = value2,
    -> ...
    -> ;
mysql> INSERT INTO <table name;>
    -> (columnName1, columnName2, ...)
    -> VALUES (value1, value2, ...);
    所以要向我們的資料表中添加笑話,我們可以在下面的兩個命令中選擇一個:
mysql> INSERT INTO Jokes SET
    -> JokeText = "Why did the chicken cross theroad? To get to the other side!",
    -> JokeDate = "2000-04-01";
mysql> INSERT INTO Jokes
    -> (JokeText, JokeDate) VALUES (
    -> "Why did the chicken cross the road? Toget to the other side!",
    -> "2000-04-01"
    -> );



  請注意在INSERT命令的第二種格式中,你給出的列的順序必須與你給出的資料的順序一致。

  現在你知道如何向表中添加了,下面讓我們來看看如何顯示表的內容。

顯示儲存的資料

  顯示你的資料庫中表的儲存資料的命令,被稱之為SELECT,這個命令無疑是SQL語言中最複雜的命令。說它複雜,是因為資料庫的最主要的優點就是可以機動地給出資料。而機動性就是通過這個命令實現的。

  下面的命令會列出儲存在表Jokes中的所有資料:

mysql> SELECT * FROM Jokes;


  這個命令意味著“從Jokes中挑選所有的東西”。如果你試著輸入這個命令,你會看到這樣的顯示:


+----+---------------------------------------
------------------------+------------+
| ID | JokeText
                        | JokeDate |
+----+---------------------------------------
------------------------+------------+
| 1 | Why did the chicken cross the road? To
get to the other side! | 2000-04-01 |
+----+---------------------------------------
------------------------+------------+
1 row in set (0.05 sec)



  這看上去有點混亂,這是因為JokeText列實在是太長了。因為這個原因,我們可能想要告訴MySQL省去JokeText列,這個命令會實現這個功能:

mysql> SELECT ID, JokeDate FROM Jokes;


  這一次我們不再告訴它“挑選所有的東西”了,我們告訴它我們對顯示哪些列感興趣。結果應該是這樣的:


+----+------------+
| ID | JokeDate |
+----+------------+
| 1 | 2000-04-01 |
+----+------------+
1 row in set (0.00 sec)



  但是我們是不是可以多少顯示一點笑話本文的內容呢?作為對我們所想顯示的列的補充,我們可用“函數”來更改我們所要顯示的列。有一個叫做LEFT的函數,可以讓我們告訴MySQL當我們顯示一個資料列時最多顯示幾個字元。例如,如果我們只想顯示JokeText列的前20個字元:


mysql> SELECT ID, LEFT(JokeText,20), JokeDate FROM Jokes;
+----+----------------------+------------+
| ID | LEFT(JokeText,20) | JokeDate |
+----+----------------------+------------+
| 1 | Why did the chicken | 2000-04-01 |
+----+----------------------+------------+
1 row in set (0.05 sec)



  明白它是如果工作的了嗎?另一個有用的函數是COUNT,通過這個函數,我們可以很簡單地得到返回結果的個數。例如,如果我們想要找出在我們的表中我們儲存了多少笑話,我們可以用下面這個命令:


mysql> SELECT COUNT(*) FROM Jokes;
+----------+
| COUNT(*) |
+----------+
| 1 |
+----------+
1 row in set (0.06 sec)



  正如我們看到的,在我們的表中只有一個笑話。

  到目前為止,我們的所有的例子都是針對錶中的所有記錄的。作為對SELECT命令的補充,我們可以使用“WHERE子句”,這樣我們可以對返回的結果進行限制。看看下面這個例子:


mysql> SELECT COUNT(*) FROM Jokes
    -> WHERE JokeDate >= "2000-01-01";



  這個查詢語句會數出所有日期“大於或等於”2000年1月1日的記錄,對於一個日期來說“大於或等於”意味著“在當天或在此之後”。

  有一種比較特殊的用法可以找出包含某一段文字的記錄。你可以看看這個查詢語句:

mysql> SELECT JokeText FROM Jokes
    -> WHERE JokeText LIKE "%chicken%";



  這個查詢語句顯示了所有JokeText列包含單詞chicken的笑話的本文。LIKE關鍵字告訴MySQL指定的列必須匹配給定的運算式。在這裡,我們使用的運算式是"%chicken%"。這兒的%說明單詞chicken可以出現在任何字串的前面或後面。

  條件也可以在WHERE子句中組合使用,這樣可以做更複雜的查詢。例如我們要顯示2000年4月份的knock-knock笑話,我們可以使用下面的查詢語句:


mysql> SELECT JokeText FROM Jokes WHERE
    -> JokeText LIKE "%knock knock%" AND
    -> JokeDate >= "2000-04-01" AND
    -> JokeDate < "2000-05-01";



  在表中添加再一些笑話,再實驗實驗SELECT語句。熟悉SELECT語句會有助於學習這個教程。

  我們還可以用SELECT語句做很多事,但是我們在這裡將不再詳細討論它,我們在需要的時候才會再講到其他一些進階的功能。如果你太好奇,沒法再等下去的話,你可以去看MySQL使用者手冊。

修改儲存的資料

  一旦你已經向資料庫的表中輸入了一些資料,你可能想要進行一些修改。例如改正拼字錯誤,以及其他有關笑話的資料,所有的這些改變都可以用UPDATE命令來完成。這個命令包含了一些INSERT命令(在設定列的數值方面)和 SELECT命令(在選取改變對象方面)的基本原理。UPDATE命令的基本格式是這樣的:


mysql> UPDATE  SET
    -> =, ...
    -> WHERE ;



  例如,如果你想要改變上面輸入的笑話的日期,你需要輸入下面的命令:

mysql> UPDATE Jokes SET JokeDate="1990-04-01" WHERE ID=1;


  這兒我們用到了ID列。通過它你可以很方便地指定你要改變的笑話。WHERE子句也可以用在這裡,就象在SELECT命令中那樣。下面的命令是改變所有本文中包含單詞chicken的笑話的日期:


mysql> UPDATE Jokes SET JokeDate="1990-04-01"
    -> WHERE JokeText LIKE "%chicken%";



刪除儲存資料

  在SQL中刪除一個內容是令人恐怖的簡單,下面是這個命令的格式:

mysql> DELETE FROM  WHERE ;


  要刪除所有包含chicken的笑話,你只需要輸入下面的命令:

mysql> DELETE FROM Jokes WHERE JokeText LIKE "%chicken%";


  這裡的WHERE子句是可選的,但是如果你不用它,你應該清楚你在幹什麼,因為這時其實你是在清空這個資料表。下面這個命令將清空Jokes資料表:

mysql> DELETE FROM Jokes;


結語

  事實上除了我們在這裡已經看到的這些基本的命令,MySQL資料庫系統和SQL語句還有許多其它值得學的東西,但是我們提到的這些命令是一些最常用的命令。到目前為止,我們只是在一個資料表中工作。要理解關係型資料庫引擎的真正的強大功能,你還需要學會如果同時使用幾個表以描述表之間可能存在的複雜的關係。

  所有的這些內容以及一些其他的內容,我們都會在我們的這個教程的第四章內講到,在第四章中,我們會討論資料庫的設計原理並參考一些複雜一點的例子。現在,我們需要能夠熟練地使用命令列介面來操作MySQL。

  在第三章內,我們將深入研究PHP這個伺服器端的指令碼語言,並且學習使用它來建立一個動態Web頁面。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.