MySQL - 第三章 | 使用MySQL
開始之前建議大家觀看Docker - 第四章 | 安裝MySQL這篇文章,進行環境的建置。
連接
MySQL與所有客戶端—伺服器DBMS一樣,要求在能執行命令之前登錄到DBMS。登錄名可以與網路登錄名不相同(假定你使用網路)。 MySQL 在內部保存自己的用戶列表,並且把每個用戶與各種權限關聯起來。
在最初安裝MySQL時,很可能會要求你輸入一個管理登錄(通常為root)和一個密碼。如果你使用的是自己的本地伺服器,並且是簡單地試驗一下MySQL,使用上述登錄就可以了。但現實中,管理登錄受到密切保護(因為對它的訪問授予了創建表、刪除整個資料庫、更改登錄和密碼等完全的權限)。
提示:使用MySQL Administrator Users視圖提供了一個簡單的界面,可用來定義新用戶,包括賦予密碼和訪問權限。
為了連接到MySQL,需要以下訊息:
- 主機名(計算機名)——如果連接到本地MySQL伺服器,為localhost;
- 端口(如果使用默認端口3306之外的端口);
- 一個合法的用戶名;
- 用戶密碼(如果需要)。
這些訊息都可以傳遞給mysql命令行實用程序,或輸入到MySQL Administrator和MySQL Query Browser的伺服器連接屏幕。
在連接之後,你就可以訪問你的登錄名能夠訪問的任意資料庫和表了。
建立資料庫
你最初連接到MySQL時,沒有任何資料庫打開供你使用。這時候可以使用CREATE DATABASE關鍵字來建立資料庫。
在建立之前先使用SHOW DATABASE關鍵字來確認當前存在的資料庫。
1 2 3 4 5 6 7 8 9 10
| mysql> show databases; + | Database | + | information_schema | | mysql | | performance_schema | | sys | + 7 rows in set (0.04 sec)
|
建立資料庫testdb
1 2
| mysql> create database testdb; Query OK, 1 row affected (0.01 sec)
|
建立表
SQL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| CREATE TABLE `users` ( `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '后台用戶', `relation_id` int(11) NOT NULL DEFAULT '0' COMMENT '上層用戶', `vendor_id` int(11) NOT NULL DEFAULT '0' COMMENT '所屬廠商', `role_id` int(11) DEFAULT '0' COMMENT '角色編號', `domain_id` int(11) DEFAULT '0' COMMENT '域名編號', `level` tinyint(4) DEFAULT '99' COMMENT '層級', `admins` tinyint(4) DEFAULT '0' COMMENT '是否為管理者', `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '狀態 -1: 已停權 0:已申請 1:使用中', `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間', `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間', `user_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用戶名稱', `pwd` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '密碼', `token` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'OTP', `real_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '名稱', `tel` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '電話', `mobile` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '手機', `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '信箱', `creator` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '建立者', `operator` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '操作者', PRIMARY KEY (`user_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
執行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| mysql> CREATE TABLE `users` ( -> `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '', -> `relation_id` int(11) NOT NULL DEFAULT '0' COMMENT '', -> `vendor_id` int(11) NOT NULL DEFAULT '0' COMMENT '', -> `role_id` int(11) DEFAULT '0' COMMENT '', -> `domain_id` int(11) DEFAULT '0' COMMENT '', -> `level` tinyint(4) DEFAULT '99' COMMENT '', -> `admins` tinyint(4) DEFAULT '0' COMMENT '', -> `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT ' -1: 0: 1:', -> `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '', -> `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '', -> `user_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '', -> `pwd` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '', -> `token` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'OTP', -> `real_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '', -> `tel` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '', -> `mobile` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '', -> `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '', -> `creator` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '', -> `operator` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '', -> PRIMARY KEY (`user_id`) -> ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; Query OK, 0 rows affected (0.06 sec)
|
選擇資料庫
在你能執行任意資料庫操作前,需要選擇一個資料庫。為此,可使用USE關鍵字。
術語:關鍵字(key word)作為MySQL語言組成部分的一個保留字。決不要用關鍵字命名一個表或列。
使用testdb資料庫:
1 2
| mysql> use testdb; Database changed
|
USE語句並不返回任何結果。依賴於使用的客戶端,顯示某種形式的通知。例如,這裡顯示出的Database changed消息是mysql命令行實用程序在資料庫選擇成功後顯示的。
提示:使用MySQLQueryBrowser 在MySQLQueryBrowser中,雙擊Schemata列表中列出的任一資料庫以使用它。你看不到USE命令的實際執行,但會看到被選擇的資料庫(黑體加亮),而且應用標題欄將顯示所選擇的資料庫名。
記住,必須先使用USE打開資料庫,才能讀取其中的資料。
了解資料庫和表
資料庫、表、列、用戶、權限等的訊息被存儲在資料庫和表中(MySQL 使用MySQL來存儲這些訊息)。不過,內部的表一般不直接訪問。可用 MySQL的SHOW命令來顯示這些訊息(MySQL從內部表中提取這些訊息)。請看下面的例子:
1 2 3 4 5 6 7 8 9 10 11
| mysql> show databases; + | Database | + | information_schema | | mysql | | performance_schema | | sys | | testdb | + 8 rows in set (0.05 sec)
|
分析:SHOW DATABASES;返回可用資料庫的一個列表。包含在這個列表中的可能是MySQL內部使用的資料庫(如例子中的mysql和 information_schema)。當然,你自己的資料庫列表可能看上去與這裡的不一樣。
為了獲得一個資料庫內的表的列表,使用SHOW TABLES;,如下所示:
1 2 3 4 5 6 7
| mysql> show tables; + | Tables_in_testdb | + | users | + 1 row in set (0.00 sec)
|
分析:SHOW TABLES;返回當前選擇的資料庫內可用表的列表。
SHOW也可以用來顯示表列:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| mysql> show columns from users; + | Field | Type | Null | Key | Default | Extra | + | user_id | int(11) | NO | PRI | NULL | auto_increment | | relation_id | int(11) | NO | | 0 | | | vendor_id | int(11) | NO | | 0 | | | role_id | int(11) | YES | | 0 | | | domain_id | int(11) | YES | | 0 | | | level | tinyint(4) | YES | | 99 | | | admins | tinyint(4) | YES | | 0 | | | status | tinyint(4) | NO | | 0 | | | create_time | timestamp | YES | | CURRENT_TIMESTAMP | | | update_time | timestamp | YES | | CURRENT_TIMESTAMP | | | user_name | varchar(32) | NO | | | | | pwd | varchar(64) | NO | | | | | token | varchar(16) | NO | | | | | real_name | varchar(32) | YES | | | | | tel | varchar(20) | NO | | | | | mobile | varchar(50) | NO | | | | | email | varchar(50) | NO | | | | | creator | varchar(32) | YES | | | | | operator | varchar(32) | YES | | | | + 19 rows in set (0.01 sec)
|
分析:SHOW COLUMNS要求給出一個表名(這個例子中的FROM users),它對每個欄位返回一行,行中包含欄位名、資料類型、是否允許NULL、鍵訊息、默認值以及其他訊息(如欄位user_id的auto_increment)。
說明:什麼是自動增量? 某些表列需要唯一值。例如,訂單編號、僱員ID或(如上面例子中所示的)顧客ID。在每個行添加到表中時,MySQL可以自動地為每個行分配下一個可用編號,不用在添加一行時手動分配唯一值(這樣做必須記住最後一次使用的值)。這個功能就是所謂的自動增量。如果需要它,則必須在用CREATE語句創建表時把它作為表定義的組成部分。
提示:DESCRIBE語句MySQL支持用DESCRIBE作為SHOW COLUMNS FROM的一種快捷方式。換句話說,DESCRIBE users;是 SHOW COLUMNS FROM users;的一種快捷方式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| mysql> DESCRIBE users; + | Field | Type | Null | Key | Default | Extra | + | user_id | int(11) | NO | PRI | NULL | auto_increment | | relation_id | int(11) | NO | | 0 | | | vendor_id | int(11) | NO | | 0 | | | role_id | int(11) | YES | | 0 | | | domain_id | int(11) | YES | | 0 | | | level | tinyint(4) | YES | | 99 | | | admins | tinyint(4) | YES | | 0 | | | status | tinyint(4) | NO | | 0 | | | create_time | timestamp | YES | | CURRENT_TIMESTAMP | | | update_time | timestamp | YES | | CURRENT_TIMESTAMP | | | user_name | varchar(32) | NO | | | | | pwd | varchar(64) | NO | | | | | token | varchar(16) | NO | | | | | real_name | varchar(32) | YES | | | | | tel | varchar(20) | NO | | | | | mobile | varchar(50) | NO | | | | | email | varchar(50) | NO | | | | | creator | varchar(32) | YES | | | | | operator | varchar(32) | YES | | | | + 19 rows in set (0.00 sec)
|
所支持的其他SHOW語句還有:
- SHOW STATUS,用於顯示廣泛的伺服器狀態訊息;
- SHOW CREATE DATABASE和SHOW CREATE TABLE,分別用來顯示創建特定資料庫或表的MySQL語句;
- SHOW GRANTS,用來顯示授予用戶(所有用戶或特定用戶)的安全權限;
- SHOW ERRORS和SHOW WARNINGS,用來顯示伺服器錯誤或警告消息。
提示:進一步了解SHOW 請在mysql命令行實用程序中,執行命令HELP SHOW;顯示允許的SHOW語句。
結語
這邊主要介紹了SHOW和USE的使用,這些在有工具的使用時,其實是很少使用到,因為都是有GUI介面可以去做點擊,直接使用,透過工具幫下好指令,但是當沒有工具的環境下,還是需要稍微了解如何使用的。
註:以上參考了
MySQL必知必会 MySQL Crash Course