前面我們已經講述了,登入時,我們使用mysql –u root –p命令進行,此時如果設定了密碼,則需要輸入密碼。
輸入密碼後即進入MySQL的操作介面,此時,命令列窗體左側顯示“mysql>”表示此時可接受mysql命令。
- (1)列出全部資料庫命令
我們使用“show databases;”命令列出當前MySQL管理的全部資料庫。(注意:mysql命令以英文;為結束符)。
這裡可以看到,目前mysql管理的資料庫共有4個。
- (2)切換資料庫
我們可以在上述顯示的4個資料庫中進行切換,表示當前所使用的是哪個資料庫。我們使用“use”+資料庫名進行資料庫切換。如
- (3)列出當前資料庫下全部表
我們使用“show tables;”命令,列出當前資料庫下全部表名稱,如
- (4)建立一個資料庫。
使用“create database”+資料庫名,來建立一個新的資料庫。如,按本節開始的例子,我們建立一個名為“db_edu_sys”的資料庫,並切換至該資料庫。
從提示資訊上我們看到,我們成功建立了名為“db_edu_sys”,並將當前資料庫切換至該資料庫。
- (5)向資料庫中新增表。
我們使用SQL語句“CREATE TABLE”命令進行新增表的操作。
例如,上述例子中,我們建立教師表(Teacher),可以寫成如下SQL語句
CREATE TABLE teacher(ID int auto_increment primary key,t_name varchar(30),t_title varchar(50));
這時,我們再檢視資料庫中的表,可以看到新建立的教師表(teacher)。
- (6)匯入sql文字
有時,對多條SQL語句進行操作時,我們一條一條的寫入不是很方便,尤其是在有事務操作和結構化語句時,就更加困難,因此,我們可以將SQL語句事先寫好,儲存在文字中,然後一次性匯入到資料庫中,我們使用如下命令對sql文字進行匯入。
“source ”+文字檔案
如source c:/createtable.sql
(如果不寫路徑名,則預設為當前路徑,即執行“mysql –u root –p”時前面顯示的路徑。)
我們將學生表、課程表、選課表、教學表寫到一個sql文字中,一次匯入。這個文字我們命名為createtable.sql,其內容如下:
CREATE TABLE student(ID int auto_increment primary key,s_name varchar(30),s_class varchar(50)); CREATE TABLE course(ID int auto_increment primary key,c_name varchar(30),c_credit varchar(50)); CREATE TABLE teaching(ID int auto_increment primary key,t_ID int,c_ID int); CREATE TABLE selection(ID int auto_increment primary key,s_ID int,c_ID int);
我們執行匯入,結果如下:
- (7)檢視錶結構
我們可以通過“DESCRIBE”+表名,來檢視某一張表的表結構,如執行“DESCRIBE teacher”結果如下
- (8)新增資料
向表內新增資料要使用SQL語句“INSERT INTO”,如,我們要向teacher表中新增一條教師的資訊,可以寫成如下形式:
INSERT INTO teacher(t_name,t_title) VALUES('張老師','副教授');
執行後,如下
- (9)查詢資料
我們通過SQL語句“SELECT … FROM … WHERE …”進行查詢,其中“SELECT”後面是要查詢的欄位名稱,可以多個,也可以用“*”,表示查詢全部欄位,“FROM”後面是要查詢的表名,“WHERE”後面是查詢條件,支援“AND”和“OR”的組合。
查詢條件中,運算子號可以為“=”(等於),“>”(大於),“<”(小於),“LIKE”(類似於),“<>”(不等於)等,請按照實際情況進行書寫。比如,我們要查詢出所有姓名不等於空的教師的資訊,可以使用如下SQL語句:
SELECT * FROM teacher WHERE t_name <> '';
- (10)刪除資料
我們使用SQL語句的“DELETE FROM…WHERE”進行資料刪除操作。例如,刪除ID為1且姓名為張的老師
DELETE FROM teacher WHERE t_name LIKE '張%' AND ID = 1;
- (11)修改資料
我們使用SQL語句“UPDATE [tablename] SET … WHERE …”來進行修改資料操作,例如,將ID為2的老師姓名改為“王志超”可以寫作
UPDATE teacher SET t_name='王志超' WHERE ID=2;
- (12)匯出資料
我們使用“SELECT … FROM [tablename] INTO OUTFILE …”進行資料匯出,例如,使用如下語句進行資料匯出操作:
SELECT * FROM teacher INTO OUTFILE "E:/mysql-8.0.23/teacher.txt";
執行結果如下
得到的檔案teacher.txt內容如下:
- (13)資料庫備份與恢復
使用mysqldump對MySQL進行備份。(注意:mysqldump是一個可執行程式,請直接在命令列下執行,不要進入mysql控制檯後再執行)
例如,使用下面的命令對指定的資料庫進行備份。
mysqldump -uroot -p123456 db_edu_sys > "E:/mysql-8.0.23/db_edu_sys.sql"
將“db_edu_sys”資料庫備份至“E:/mysql-8.0.23/db_edu_sys.sql”檔案中,執行後如下圖所示
這裡會出現一個警告:在命令列上使用密碼是不安全的。但是,命令已經執行完畢了,我們到對應的資料夾下可以看到備份出來的檔案。部分內容如下:
即表明已經備份成功。
恢復資料庫時,匯入備份檔案(參看本節第(6)點)即可,我們進入mysql命令列狀態,輸入下列語句即可恢復資料:
USE db_edu_sys SET SQL_LOG_BIN=0; source "E:/mysql-8.0.23/db_edu_sys.sql";
- (14)事務
我們來討論下資料庫中一個比較重要的概念——事務,這在資料操作時會經常遇到。
我們將上述5個資料表內容進行了填充,將教師表、學生表、課程表、教學表、選課表內容進一步充實,每個表中都存在了資料。
考慮這樣一種情況,有一門課程(例如:課程ID:1,課程名稱:高等數學),已被教師(教師ID:2,教師姓名:王志超)領取了教學任務,同時,該課程被學生(學生ID:1,學生姓名:李曉軍)選課。由於一些原因,我們準備刪除這門課程,那麼,我們怎麼刪除才能保證資料的一致性呢?
如果要刪除這門課程,我們首先要刪除教師教學任務,還要刪除學生的選課情況,最後才能刪除這門課程,同時,我們還要保證上述過程必須同時完成,不能只刪除了課程,而教學任務和選課情況沒有刪除,這樣就會在教學表和選課表中留下不一致的資料(無法與課程表關聯)。
我們將必須一起完成的操作成為一個原子操作,我們使用事務來完成這個操作。即,當整個過程均無誤的完成時,我們對事務過程整體進行提交,確保事務操作全部完成;而當事務操作中部分操作出現錯誤時,我們可以通過“回滾”確保事務全部都沒有提交,返回沒有執行該事務時的狀態,從而確保資料的一致性。
例如,上述操作我們可以通過以下事務程式碼進行
delimiter $ CREATE PROCEDURE deleteCourse(IN cid int) -- 宣告刪除課程的儲存過程(函式)引數為課程ID BEGIN DECLARE i_error integer; -- 定義一個變數,用於接收出錯資訊 DECLARE CONTINUE handler FOR SQLEXCEPTION SET i_error = 1; -- 一旦出錯則將變數設定為1 START TRANSACTION ; -- 發起事務 DELETE FROM teaching WHERE c_ID=cid; -- 刪除教學表中有關該課程資料 DELETE FROM selection WHERE c_ID=cid; -- 刪除選課表中有關該課程資料 DELETE FROM course WHERE id=cid; -- 刪除課程表中的該課程 IF i_error = 1 THEN -- 判斷是否出錯 ROLLBACK; -- 回滾事務 ELSE COMMIT; -- 提交事務 END IF; END $
定義了上述儲存過程後,在命令列下呼叫
Call deleteCourse(1);
即可執行對應的事務,按照上述分析結論,同時刪除3個表對應的課程表編號為1的全部資料。
- (15)複雜SQL查詢
本節的最後,我們介紹複雜一些的SQL查詢——多表聯合查詢。
在實際運用查詢時,單獨對一個表的查詢往往不能滿足查詢的需求,這時就需要對多表進行聯合查詢。例如,我們想查詢“數值分析”這門課的教師姓名是什麼,這就涉及到從“課程表”、“教學表”和“教師表”3個表中聯合查詢出結果,我們使用“AND”關鍵字進行查詢。
SELECT a.t_name,c.c_name FROM teacher a,teaching b,course c WHERE a.ID = b.t_ID AND b.c_ID = c.ID AND c.c_name='數值分析';
再比如,我們想要查詢哪些課程都由哪個教師教學,以便學生進行選課,我們可以使用左連線的方式進行查詢。
(“左連線”即表示,只有左側表中有資料,無論右側表中是否有資料,都可查詢出結果,右側無資料的表使用“NULL”表示。本例中,由於不是所有的課程都由老師領取了教學任務,因此,將“課程表”放在左側連線教學任務表,沒有教師領取任務的課程,教師姓名一欄為“NULL”),SQL查詢語句如下:
SELECT a.ID AS 課程編號,a.c_name AS 課程,b.t_name AS 教師 FROM course a LEFT JOIN (SELECT c.t_name,d.c_ID FROM teacher c,teaching d WHERE c.ID=d.t_ID) b ON a.ID = b.c_ID;
查詢結果為:
本節小結
這一節,我們簡單講述了MySQL資料庫的操作和一些基本的SQL語句,因為在後面的章節中,本節的內容會大量使用,請讀者熟練掌握。有關SQL語法和相關操作,尤其是多表聯合查詢、儲存過程和事務處理等,內容相對較難,有興趣的讀者可以參考有關資料庫的書籍,這裡僅為入門級的描述。本節中的資料庫和表的設計還很簡單,只為了說明問題並便於理解,由於本書後續環節還將使用這裡的資料庫和表,到時我們會對它們進行優化處理。有關本節所涉及的有關程式碼、表結構,成書過程中我們會逐漸整理並掛在書後附件對應的網站上,請讀者自行下載學習。