數據庫的基本操作

我們都是小青蛙2018-05-15 14:39:30

點擊藍字,關注我們


關注


閲讀正文之前一定要仔細閲讀下邊這些建議:

1. 最好使用電腦觀看。

2. 如果你非要使用手機觀看,那請把字體調整到最小,這樣觀看效果會好一些。

3. 碎片化閲讀並不會得到真正的知識提升,要想有提升還得找張書桌認認真真看一會書,或者我們公眾號的文章

4. 如果覺得不錯,各位幫着轉發轉發,如果覺得有問題或者寫的哪不清晰,務必私聊我~

5. 本公眾號的文章都是需要被系統性學習的,在閲讀本篇文章前最好已經閲讀過下邊幾篇文章,要不然可能會有閲讀不暢的體驗:

  • MySQL概述

上集回顧

MySQL使用表來存放數據,表的每一列都需要存放特定格式的數據,所以MySQL為不同的格式的數據定義了不同的類型,我們介紹了各種數值、字符串、時間和二進制類型的含義以及要求的存儲空間。本集來看一下在MySQL中關於數據庫和表的各種操作。

命令使用注意事項

我們知道MySQL的基本運行過程就是:通過客户端程序發送命令給服務器程序,服務器程序按照接收的命令去操作實際的數據。在我們使用黑框框啟動了MySQL客户端程序之後,界面上會一直顯示一行mysql>的提示符,你可以在它後邊輸入我們的命令然後按一下回車鍵,在書寫命令的時候需要注意下邊這幾點:

1. 命令結束符號。

在書寫完一個命令之後需要以下邊這幾個符號之一結尾:

  • ;

  • \g

  • \G

比如説我們執行一個簡單的查詢當前時間的命令:

mysql> SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2018-02-06 17:50:55 |
+---------------------+
1 row in set (0.00 sec)
mysql>

其中的SELECT意味着這是一個查詢命令,NOW()MySQL內置的函數,用於返回當前時間。不過我們現在並不是深究具體的某個命令是什麼意思,只是想介紹一下書寫命令時需要注意的一些事情。結果中1 row in set (0.00 sec)的意思是結果只有1行數據,用時0.00秒。使用\g可以起到一樣的效果:

mysql> SELECT NOW()\g
+---------------------+
| NOW()               |
+---------------------+
| 2018-02-06 17:50:55 |
+---------------------+
1 row in set (0.00 sec)
mysql>

\G有一點特殊,它並不以表格的形式返回查詢數據,而是以垂直的形式展現查詢數據,這包含兩個方面的意思:

  1. 如果查詢結果中包含多個行的數據,各個行的數據之間會用一堆一星號*隔開。

  2. 每行中的每一個列的數據將按照列名: 列值的形式給出。

比如上邊的查詢用\G結尾的效果就是這樣:

mysql> SELECT NOW()\G
*************************** 1. row ***************************
NOW(): 2018-02-06 17:51:51
1 row in set (0.00 sec)
mysql>

如果查詢包含的列非常多的話,使用\G可以讓我們看清結果。其實用哪個符號作為結束符號都是無所謂的,只是在展示結果的時候的格式不一樣而已,所以一般我們平時都使用分號;作為命令結束符了~

2. 命令可以隨意換行。

並不是按了回車鍵就提交命令了,只要按回車鍵的時候輸入的語句裏沒有;\g或者\G就算是語句沒結束。比如上邊查詢當前時間的命令還可以這麼寫:

mysql> SELECT
   -> NOW()
   -> ;
+---------------------+
| NOW()               |
+---------------------+
| 2018-02-06 17:57:15 |
+---------------------+
1 row in set (0.00 sec)
mysql>

3. 可以一次提交多個命令

我們可以在一條語句裏寫多個命令(命令之間用上面説的結束符分隔),比如這樣:

mysql> SELECT NOW(); SELECT NOW(); SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2018-02-06 18:00:05 |
+---------------------+
1 row in set (0.00 sec)
+---------------------+
| NOW()               |
+---------------------+
| 2018-02-06 18:00:05 |
+---------------------+
1 row in set (0.00 sec)
+---------------------+
| NOW()               |
+---------------------+
| 2018-02-06 18:00:05 |
+---------------------+
1 row in set (0.00 sec)
mysql>

連着輸入了3個查詢當前時間的命令,只要沒按回車鍵,就不會提交命令。

小貼士:

後邊我們還會介紹把命令都寫在文件裏,然後再批量執行文件中的命令,那個感覺更爽!

4. 使用\c清除本次操作。

如果你想放棄本次編寫的命令,可以使用\c來清除,比如這樣:

mysql> SELECT NOW()\c
mysql>

如果不使用\c,那客户端會以為這是一個多行命令,還在一直傻傻的等你輸入命令~

5. 大小寫問題。

MySQL默認對命令的大小寫並沒有限制,也就是説我們這樣查詢當前時間也是可以的:

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2018-02-06 18:23:01 |
+---------------------+
1 row in set (0.00 sec)
mysql>

不過按照習俗,這些命令、函數什麼的都是要大寫的,而一些名稱類的東西,比如數據庫名,表名、列名啥的都是要小寫的,更多具體的書寫規範等我們遇着再詳細介紹。

6. 字符串的表示。

在命令裏有時會使用到字符串,我們可以使用單引號''或者雙引號""把字符串內容引起來,比如這樣:

mysql> SELECT 'aaa';
+-----+
| aaa |
+-----+
| aaa |
+-----+
1 row in set (0.00 sec)
mysql> SELECT "aaa";
+-----+
| aaa |
+-----+
| aaa |
+-----+
1 row in set (0.00 sec)
mysql>

這個語句只是簡單的把字符串'aaa'又輸出來了而已。但是一定要在字符串內容上加上引號,不然的話MySQL服務器會把它當作列名,比如這樣就會返回一個錯誤:

mysql> SELECT aaa;
ERROR 1054 (42S22): Unknown column 'aaa' in 'field list'
mysql>

但是MySQL中有一種叫ANSI_QUOTES的模式,如果開啟了這種模式,雙引號就有其他特殊的用途了,可能你並不能看懂我在説什麼,但是這都不重要,重要的是建議你最好使用單引號來表示字符串

當一條命令發送給了MySQL服務器之後,服務器處理完後就會給你發送回來響應的結果,然後顯示到界面上。然後你就可以接着輸入下一條命令了。

數據庫相關操作

MySQL中把某種類型的表的集合稱為一個數據庫MySQL服務器管理着若干個數據庫,每個數據庫下都可以有若干個表,畫個圖就是這樣:

展示數據庫

在我們剛剛安裝好MySQL的時候,它已經內建了許多數據庫和表了,我們可以使用下邊這個命令來看一下都有哪些數據庫:

SHOW DATABASES;

我自己的電腦上安裝的MySQL版本是5.7.21,看一下在這個版本里內建了哪些數據庫(啟動客户端軟件,用你的用户名和密碼登錄後輸入命令):

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)
mysql>

可以看到,這一版本的MySQL已經為我們內建了4個數據庫,這些數據庫都是給MySQL自己使用的,如果我們想使用MySQL存放自己的數據的話,首先需要創建一個屬於自己的數據庫。

創建數據庫

創建數據庫的語法賊簡單:

CREATE DATABASE 數據庫名;

來實際操作一下:

mysql> CREATE DATABASE xiaohaizi;
Query OK, 1 row affected (0.00 sec)

mysql>

我把我的名字xiaohaizi作為了數據庫名稱,敲完命令回車之後提示了一個Query OK, 1 row affected (0.00 sec)説明數據庫創建成功了。然後我們再用SHOW DATABASES的命令查看一下現在有哪些數據庫:

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| xiaohaizi          |
+--------------------+
5 rows in set (0.00 sec)
mysql>

看到我們自己創建的數據庫xiaohaizi就已經在列表裏了。

IF NOT EXISTS

我們在一個數據庫已經存在的情況下再使用CREATE DATABASE去創建這個數據庫會產生錯誤:

mysql> CREATE DATABASE xiaohaizi;
ERROR 1007 (HY000): Can't create database 'xiaohaizi'; database exists
mysql>

執行結果提示了一個ERROR,意思是數據庫xiaohaizi已經存在!所以如果我們並不清楚數據庫是否存在,可以使用下邊的語句來創建數據庫:

CREATE DATABASE IF NOT EXISTS 數據庫名;

這個命令的意思是如果指定的數據庫不存在的話就創建它,否則什麼都不做。我們試一試:

mysql> CREATE DATABASE IF NOT EXISTS xiaohaizi;
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql>

可以看到語句執行成功了,報的ERROR錯誤也沒有了,只是結果中有1個warning而已。這個warning只是MySQL善意的提醒我們數據庫xiaohaizi不存在而已,並不會影響語句的執行。

小貼士:

前邊説過MySQL的命令可以多條一起執行,可以在黑框框中一次輸入多個命令,也可以把好多命令放到一個文件中執行。如果某一條命令的執行結果是產生了一個`ERROR`,MySQL會停止執行該命令之後的命令,但是如果僅僅是在執行結果中有`warning`的話,是不會中斷執行的。

切換當前數據庫

對於每一個連接到MySQL服務器的客户端,都有一個當前數據庫的概念,我們創建的表默認都會被放到當前數據庫中,切換當前數據庫的命令也賊簡單:

USE 數據庫名稱;

所以在介紹創建表之前,我們應該把當前數據庫切換到剛剛創建的數據庫xiaohaizi上:

mysql> USE xiaohaizi;
Database changed
mysql>

看到顯示了Database changed説明當前數據庫已經切換成功了。需要注意的是,在退出當前客户端之後,也就是你輸入了exit或者quit命令之後或者直接把當前的黑框框頁面關掉,當你再次調用mysql -h 主機名 -u 用户名 -p 密碼的時候,相當於重新開啟了一個客户端,需要重新調用USE 數據庫名稱的命令來選擇一下當前數據庫。

刪除數據庫

如果你創建的數據庫沒用了,我們還可以把它刪掉,語法如下:

DROP DATABASE 數據庫名;

在真實的工作環境裏,在刪除數據庫之前你需要先拿體温計量量是不是發高燒了,然後再找至少兩個人核實一下自己是不是發燒了,然後你才敢執行刪除數據庫的命令。刪除數據庫意味着裏邊的表就都被刪除了,也就意味着你的數據都沒了,所以是個極其危險的操作,使用時需要極其謹慎。不過我們這是學習環境,而且剛剛創建了xiaohaizi數據庫,什麼表都沒往裏頭放,刪了就刪了吧:

mysql> DROP DATABASE xiaohaizi;
Query OK, 0 rows affected (0.01 sec)

mysql>

然後看一下現在還有哪些數據庫:

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)
mysql>

可以看到我們前邊創建的xiaohaizi數據庫就沒有啦。

IF EXISTS

如果某個數據庫並不存在,我們仍舊調用DROP TABLE語句去刪除它,會報錯的:

mysql> DROP DATABASE xiaohaizi;
ERROR 1008 (HY000): Can't drop database 'xiaohaizi'; database doesn't exist
mysql>

如果想避免這種報錯,可以使用這種形式的語句來刪除數據庫:

DROP DATABASE IF EXISTS 表名;

再次刪除一下xiaohaizi

mysql> DROP DATABASE IF EXISTS xiaohaizi;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql>

這回就不會報錯啦!演示完刪除數據庫的流程之後還是把xiaohaizi數據庫創建出來並且切換到當前數據庫吧,畢竟我們之後還要在這個數據庫裏創建各種表呢:

mysql> CREATE DATABASE xiaohaizi;
Query OK, 1 row affected (0.01 sec)

mysql>

總結

  1. MySQL的基本運行過程是:客户端程序發送命令給服務器程序,服務器程序按照接收的命令去操作實際的數據,然後把結果返回到客户端。

  2. 在MySQL客户端輸入命令時有一些注意事項:

    • ;\g\G都可以作為命令結束符號。

    • 只要按回車鍵的時候輸入的語句裏沒有;\g或者\G就算是語句沒結束,可以換行後繼續輸入命令。

    • 可以一次提交多個命令。

    • 使用\c清除本次操作。

    • MySQL默認對命令的大小寫並沒有限制。

    • 字符串可以被單引號'或者雙引號"引起來,但是我們推薦使用單引號'

  3. MySQL服務器可以包含若干數據庫,每個數據庫中可以包含若干個表。

  4. 數據庫相關操作如下:

    • 展示數據庫:SHOW DATABASES;

    • 創建數據庫:CREATE DATABASE 數據庫名;

    • 切換當前數據庫:USE 數據庫名

    • 刪除數據庫:DROP DATABASE 數據庫名

  5. IF EXISTS 和 IF NOT EXISTS在創建和刪除數據庫時使用可以避免ERROR產生。

題外話

寫文章挺累的,有時候你覺得閲讀挺流暢的,那其實是背後無數次修改的結果。如果你覺得不錯請幫忙轉發一下,萬分感謝~



閲讀原文

TAGS:數據庫命令客户端可以