與Mysql服務器結合在一起進行開發或與Mysql數據庫協同工作的方法有許多種。你可以使用的最基本的界面程序就是mysql客戶機。使用改程序,你可以從命令行界面環境下與服務器進行交互操作。
一、登錄
從shell提示符,按照下述方法登錄到Mysql:
mysql -h host -u user -p
如果你是從本地登錄值Mysql(也就是說,從服務器本身登錄),或者使用安全的網絡連接工具(SSH, Secure Shell)遠程登錄值MySQL,則可以省略主機參數-h。因爲默認主機就是localhost,localhost引用你目前所在的系統。在其他環境下,你輸入的命令必須經過網絡才能到達服務器,此時需將host參數替換成主機名,此名稱可以解析稱IP地址,或者將host替換成MySQL服務器的實際IP地址。另外,還要用MySQL用戶名替換user參數。在這裏,並不要求MySQL用戶名和文件系統的用戶名保持一致。
-p選項令mysql提示你輸入密碼。你也可以在-p選項後直接添加密碼(例如:輸入-prover,rover就是密碼);如果使用這種方式,則-p與密碼名之間不要留有空格。然而在命令行輸入密碼並不是一個安全的做法,因爲這樣密碼會現實在屏幕上,而且密碼是以明文方式在網絡上傳輸的,另外,無論什麼時候其他用戶獲取服務器上正在運行的進程列表時都可以看到該密碼。
二、顯示數據庫用戶並設置用戶密碼
如果你已經正確地安裝了MySQL並且已經成功登錄,則mysql後臺程序就已經運行了,這時你將看到下面的提示:
mysql>
這是mysql客戶機的界面提示符。你應該爲所有root用戶設置密碼。從mysql客戶機執行下述命令可得到用戶及其數據庫服務器的地址列表:
SELECT User, Host FROM mysql.user;
+------+-----------+
| User | Host |
+------+-----------+
| root | localhost |
+------+-----------+
上面列車的是從服務器返回的接回。MySQL5.5安裝完畢後,將有一個用戶和主機的組合。可以在提示符中輸入以下內容來修改root用戶的密碼:
SET PASSWORD FOR 'root'@'localhost'=PASSWORD('password');
用即將爲root用戶設置的新密碼替換引號中的password。修改完root用戶的密碼後,輸入quit或exit並單擊回車鍵,退出mysql客戶機並用新密碼重新登錄。
可以在mysql客戶機中輸入下列內容刪除指定用戶:
DELETE FROM mysql.user WHERE User='username';
DELETE FROM mysql.db WHERE User='username';
FLUSH PRIVILEGES;
前兩條語句從mysql數據庫的user表以及db表中刪除了用戶名爲username的用戶(初始權限表存放在mysql數據庫中)。如果username爲空,則刪除的是匿名用戶(如果有的話)。最後一行語句令服務器根據前面的修改重新讀取授權表。
三、創建數據庫用戶
爲了不使用root用戶來作爲數據庫管理員,我們還需要創建一個擁有普通權限的用戶。創建完新用戶後,需要爲其設置權限。如果你想要創建一個只擁有查看數據權限的用戶,可從mysql客戶機輸入如下內容:
GRANT SELECT ON *.* TO 'kerry'@'localhost' IDENTIFIED BY 'beck123';
在該行中,用戶是來自本地機器的用戶kerry,其密碼爲beck123.如果想授權用戶瀏覽之外的權限,可以在SELECT後添加其他權限,並用逗號隔開。如果想授權用戶所有的權限,可用ALL替換SELECT。下面是ALL標記的另一個使用示例:
GRANT ALL ON db1.* TO 'kerry'@'localhost' IDENTIFIED BY 'beck123';
在此示例中,用戶kerry擁有所有基本的權限,但它僅僅對db1數據庫起作用,且必須從localhost登錄MySQL,如果遠程登錄則不會擁有所有的權限。
四、創建數據庫
假設你已經擁有創建和修改服務器上數據庫所必須的權限,那麼我們來看一下如何創建數據庫以及數據庫中的表。例如:
CREATE DATABASE bookstore;
通過這條簡單的SQL語句,這裏已創建了名爲bookstore的數據庫。創建好數據庫後,雖然只是個空數據庫,但是我們可通過下面的語句從默認數據庫切換到新數據庫:
USE bookstore
使用上述語句,就不必在每個SQL語句中都指定所用到的數據庫名了。默認情況下,MySQL會把最後一個指定的數據庫作爲當前使用的數據庫。該語句是基於客戶機程序的SQL語句,所以在句尾不必添加分號。
五、創建表與編輯表
下面我們將創建這個數據庫中的第一個表,這裏創建一個存放圖書基本信息的數據表,這將是一個書店業務的核心信息:
CREATE TABLE books(
book_id INT,
title VARCHAR(50),
author VARCHAR(50));
上面的SQL語句創建了帶有三個列的圖書信息表。圓括號內是列的全部列表。第一列是每條記錄的標識碼,代表一本書。第二列和第三列是可變長的字符類型,每列值的長度不能超過50。
輸入DESCRIBE語句可查看剛剛創建的表的結果,該結果以表格形式輸出:
DESCRIBE books;
+---------+-------------+------+-----+---------+-------+
| Fileld | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| book_id | int(11) | YES | | NULL | |
| title | varchar(50) | YES | | NULL | |
| author | varchar(50) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
如果想爲數據元素多添加幾個列:出版商、出版年份、ISBN碼、圖書類型(例如:小說、詩歌、戲劇)、圖書描述,等等。我們還想讓MySQL自動爲book_id列分配一個數字編號,這樣在添加一行新紀錄時就不必擔心有重複問題發生。另外,我們決定將作者字段的真實作者名改成標識碼,通過標識碼可將本表與包含作者名字段的其他表關聯起來。這種方式將數據統一起來,可以簡化數據的輸入,也使排列查找操作更容易實現。輸入下列SQL語句可在已創建好的數據表中完成修改操作:
ALTER TABLE books
CHANGE COLUMN book_id book_id INT AUTO_INCERMENT PRIMARY KEY,
CHANGE COLUMN author author_id INT,
ADD COLUMN description TEXT,
ADD COLUMN genre ENUM('novel', 'poetry', 'drama'),
ADD COLUMN publisher_id INT,
ADD COLUMN pub_year VARCHAR(4),
ADD COLUMN isbn VARCHAR(20);
在這個SQL語句的起始行後,可以看到每個修改或添加字段的子句都是由一個逗號分開的。第二行子句修改book_id列。即便是使用原來的列明和數據類型,我們也要將其重寫一遍。我們還要爲其添加AUTO_INCREMENT標記,它負責執行前一段提到的任務,就是將任意一個唯一的值分配給表中的每條記錄。另外,我們還要將該字段設爲主鍵,以提高數據檢索的速度。
第一個CHANGE子句可能會讓人感到迷惑,因爲其中列名(book_id)出現了兩次。當了解CHANGE子句的語法時,你就會明白其中的意義了:第一個book_id表示將要修改的現有列,該子句餘下的部分用於指定一個新列。要想更好地理解這個子句的意思,可查看第二條CHANGE子句:該子句用新列author_id替代了現有列author。數據表中不再有名爲author的列。
在第三行子句中,我們修改了author列,令其名稱及數據類型與將要創建的authors表中的名稱與類型一致。如同books表中的索引列代表圖書一樣,authors表中也有一個代表每個作者的索引列。我們把books表和authors表關聯起來做查詢操作,這樣就可通過books表的author_id列找到authors表中相應的記錄。由於authors表中相應列的數據類型是INT,所以該子句中author_id列的數據類型也一定是INT。
第四行子句爲每本書添加了一個描述列。該列的數據類型是文本型,文本類型是可變長數據類型,可支持長度小於64千字節的數據。
再genre列中,爲了確保統一性,實現已列舉了幾個可用的值。該字段允許爲空值或NULL,空值或NULL並不需要指定。
向books表輸入數據之前,我們先快速建立一個authors表。該表作爲備查表。首先要向authors表中添加數據,因爲當我們向books表中添加數據時,需要知道books表中author列的標識號:
CREATE TABLE authors
(author_id INT AUTO_INCREMENT PRIMARY KEY),
author_last VARCHAR(50),
author_first VARCHAR(50),
country VARCHAR(50);
如前所述,根據需要,我們還要吧books表與authors表通過author_id字段關聯在一起。
在authors表中,將作者的名和姓分別放在兩個不同的字段中,這樣可以很容易通過姓對數據進行分類查找。另外還要添加一個作者的國籍列,這樣就可以根據顧客的要求查找特定國家作者的相關作品。爲了方便起見,最好使用國家代碼,然後在其他備查表中列出國家的全稱。
六、顯示數據庫
使用SHOW DATABASES語句,可獲得數據庫列表:
SHOW DATABASES;
+-----------+
| Database |
+-----------+
| bookstore |
| mysql |
| test |
+-----------+
使用前面提到的USE語句選擇bookstore數據庫,然後輸入下面的內容,就可以看到bookstore數據庫中的數據表列表;
SHOW TABLES;
+---------------------+
| Tables_in_bookstore |
+---------------------+
| authors |
| books |
+---------------------+
在使用bookstore數據庫時,如果想查看其他數據庫中的表,可在上述語句中添加FROM子句:
SHOW TABLES FROM mysql;
這樣即使目前正在進行會話的默認數據庫是bookstore,也能夠得到mysql數據庫中的數據表。
七、追加數據
接下來,使用INSERT語句爲表添加一條或多條記錄。向books表中添加圖書信息時,由於books表引用了authors表中的字段,所以我們把作者信息放在最後添加。我們可以在mysql客戶機輸入如下內容完成上述工作:
INSERT INTO authors
(author_last, author_first, country)
VALUES ('Greene', 'Graham', 'United Kingdom');
SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 1 |
+------------------+
INSERT INTO books
(title, author_id, isbn, genre, pub_year)
VALUES('The End of the Affair', 1, '0099478447', 'novel', '1951');
INSERT INTO books
(title, author_id, isbn, genre, pub_year)
VALUES('Brighton Rock', 2, '0099541572', 'novel', '1937');
第一個SQL語句爲Graham Greene添加了一條記錄,Graham Greene是The End of the Affai的作者。如同上面列出的那樣,標準的INSERT語法要爲每個插入值制定相應的列。如果想爲所有的列添加值,則不需指定列名,但被添加的數據一定要按表中列的順序排列。
第二個SQL語句中,通過LAST_INSERT_ID函數可以從author表中取出我們剛剛輸入的記錄的標識碼。我們也可以簡單輸入SELECT author_id FROM authors;語句,可以得到同樣的結果。
第三個SQL語句,添加了Graham Greene作品的數據信息。在這個語句中,列的排列順序與數據表中的順序不同。MySQL允許這樣的操作,只要保證值和列的順序相對應就可以了。
八、顯示數據
現在已經爲每個表添加了一行數據,下面我們來做一些查詢操作。使用SELECT語句查詢所需的數據。輸入如下內容,可以得到books表中所有行列的數據:
SELECT * FROM books;
星號作爲通配符,表示選擇了所有列。如果想查找特定的列,則需要列出所需的列名。在SELECT語句的結尾處添加一個WHERE子句,可以選擇指定的行:
SELECT book_id, title, description
FROM books
WHERE genre='novel';
改語句列出了books表中genre列的值爲nove的所有圖書的標識號、標題、描述信息。當然,當數據庫中有更多的圖書數據時,結果將會更加有意義。
如果我們想從數據庫中得到小說及其作者的全名的列表,我們需要將books表和authors表關聯起來。這可以通過JOIN子句按如下所示將兩個表關聯起來:
SELECT book_id, title, pub_year,
CONCAT (author_first, '', author_last) AS author
FROM books
JOIN authors USING (author_id)
WHERE author_last='Greene';
在FROM子句中,我們通過author_id列將books表和authors表關聯起來。如果兩個表中的列名不同,我們還需要在JOIN子句中使用其他的子句或方法來連接這兩個表(例如:ON(author_id=writer_id))。需要注意SQL語句中的第二行,這裏使用了一個字符串函數CONCAT()。使用此函數,可以將取出的數據連接起來形成更有意義的輸出內容。既然如此,我們取出作者的名字,並在其後添加一個帶引號的空格,緊接着是作者的姓,將它們連接起來,形成格式更好的一個完整的作者姓名。結果將顯示在列標題爲author的列中。關鍵字AS根據我們指定的名稱創建了列標題,我們稱這個列標題爲別名。
在WHERE子句中,這裏使用性Greene指定了我們所需的Greene的作品信息。如果books表中沒有Greene的作品信息,則將不會有任何結果顯示。下面顯示了前面的查詢結果:
+---------+-----------------------+----------+---------------+
| book_id | title | pub_year | author |
+---------+-----------------------+----------+---------------+
| 1 | The End of the Affair | 1951 | Graham Greene |
| 2 | Brighton Rock | 1937 | Graham Greene |
+---------+-----------------------+----------+---------------+
正如你多看到的,Graham Greene的兩本作品都列舉出來了。列標題也已經變成了AS子句後面指定的名稱。我們也可以使用關鍵字AS將顯示的列標題改成其他名稱。在SELECT語句中可以使用別名author,遺憾的是,在WHERE子句中不能使用這個別名。
九、刪除數據庫
使用下面的語句刪除一個已經存在的數據庫:
DROP DATABASE databasename;