Like Share Discussion Bookmark Smile

J.J. Huang   2020-06-10   MySQL   瀏覽次數:

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