MySQL 上手教程


安裝

通過官網選擇版本下載安裝。Mac 上可通過 Homebrew 方便地安裝:

$ brew install mysql

檢查安裝是否成功:

$ mysql --version
mysql  Ver 8.0.15 for osx10.14 on x86_64 (Homebrew)

注意到安裝成功后的提示里有一些有用的信息:

==> Caveats
We've installed your MySQL database without a root password. To secure it run:
    mysql_secure_installation

MySQL is configured to only allow connections from localhost by default

To connect run:
    mysql -uroot

To have launchd start mysql now and restart at login:
  brew services start mysql
Or, if you don't want/need a background service you can just run:
  mysql.server start
==> Analytics
install: 61,745 (30 days), 203,280 (90 days), 869,736 (365 days)
install_on_request: 58,156 (30 days), 187,881 (90 days), 795,173 (365 days)
build_error: 0 (30 days)
  • 默認的安裝沒有設置 root 密碼,可運行 mysql_secure_installation 來設置
  • 默認安裝下,只允許從本機連接 MySQL 服務,命令是 mysql -uroot
  • 啟動並使其開機時自啟動 brew services start mysql

第一件事我們需要啟動 MySQL 服務,

$ brew services start mysql

另外,停止及重啟的命令為:

  • brew services stop mysql
  • brew services restart mysql

卸載

$ brew uninstall mysql

該命令並沒有徹底卸載 MySQL,比如設置過的 root 密碼,MySQL 相關的配置都還保留。如需徹底卸載,可參考這里 以及這里

上手相關的資源

通過官方文檔可查閱教程及其他相關知識點,比如安全優化

初始可從這個上手教程開始。

數據庫的連接

默認安裝下,MySQL 提供了 root 賬戶且不需要密碼,所以可通過如下命令在本地快速連接,

$ mysql -uroot

不過還是讓我們先為其設置一個密碼,操作起來比較規范也更接近於真實生產環境。運行 mysql_secure_installation 后根據向導來為 root 設置密碼,同時跟着向導走還能完善一些安全相關的設置。

$ mysql_secure_installation

設置好之后來看如何連接到 MySQL 服務。連接 MySQL 的命令為:

$ mysql -h host -u user -p

其中,

  • -h 指定 host
  • -u 指定用戶名
  • -p 指定密碼

設置密碼后便不能再缺省密碼登錄了,

$ mysql -uroot
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

需要帶上 -u-p 指定用戶名及密碼。

$ mysql -h localhost -u root -p
Enter password:

本機的數據庫可省略掉 host 的指定,即 mysql -u root -p

成功登錄后可看到歡迎信息:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 25
Server version: 8.0.15 Homebrew

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

此時便進入了 MySQL 的命令行,可以和數據庫進行交互了,比如重置剛才設置的 root 密碼:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

輸入 help? 查看幫助。

mysql> help;

執行 exitquit 可退出登錄,即退出 MySQL 命令行。

MySQL 命令行及 SQL 語句

一些注意點:

  • 從上面歡迎信息可看到,SQL 語句以分號(;)或 \g\G 結束,如果沒有顯式輸入結束符,回車后會進入多行輸入的模式。而 MySQL 命令則不需要顯式地結束,比如 help
  • 命令(e.g. help, quit, 或 clear)及 SQL 語句(e.g. SELECT, CREATE TABLE, 或 INSERT)等是大小寫不敏感的,但一般我們都將 SQL 語句中關鍵字大寫。
  • 表中列名是大小寫敏感的,但表名因為本質是對應的是物理上的文件夾,其大小寫是否敏感跟系統有關,在 Windows 上大小寫不敏感,在類 Unix 系統比如 Linux,Mac OS 上則是大小寫敏感的。在進行字符串比較時,是否大小寫敏感與所使用的字符(character collation)集有關。推薦的做法是在代碼中始終保持大小寫敏感,不要混用,即雖然表名對大小寫不敏感就一會大寫一會小寫。

以下是通過 MySQL 命令行對數據庫的一些基本操作。

列出數據庫

通過 SHOW DATABASES 語句可查看當前存在的數據庫。

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

雖然 MySQL 文檔里有說其自帶了一個名為 test 的庫方便測試,但這里並沒發現,可能跟安裝的版本及來源有關

創建數據庫

通過 CREATE DATABASE 語句來創建數據庫。

CREATE DATABASE <database_name>

比如,創建名為 pets 的數據庫,

mysql> CREATE DATABASE pets;
Query OK, 1 row affected (0.09 sec)

然后通過 SHOW DATABASES查看檢查剛剛創建的 pets 數據庫是否生效。

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

刪除數據庫

相應地,刪除數據庫的命令為 DROP DATABASE <database_name>

重命名數據庫

MySQL 中沒有提供數據庫重命名的功能,但可以間接地實現。

先使用想要的名字創建一個新的數據庫,再將舊數據庫中的表重命名到新數據庫下。

mysql> CREATE database new_db_name;
mysql> RENAME TABLE old_db_name.table1 TO new_db_name.table1, old_db_name.table2 TO new_db_name.table2;
mysql> DROP database old_db_name;

關於表的重命名,參見下面表的部分。

數據庫間的切換

首先通過 USE 命令切到目標數據庫,該命令表示后續 SQL 語句都作用於所切換到的那個數據庫。

mysql> USE pets;

通過 SELECT DATABASE() 可查看當前使用的是哪個數據庫。

mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| pets       |
+------------+
1 row in set (0.00 sec)

創建表

通過 CREATE TABLE 語句在數據庫中創建表。

以下語句會在數據庫中創建一張名為 cats 表。

CREATE TABLE cats
(
  id              INT unsigned NOT NULL AUTO_INCREMENT, # Unique ID for the record
  name            VARCHAR(150) NOT NULL,                # Name of the cat
  owner           VARCHAR(150) NOT NULL,                # Owner of the cat
  birth           DATE NOT NULL,                        # Birthday of the cat
  PRIMARY KEY     (id)                                  # Make the id the primary key
);

其中第一列為列名,緊隨其后的是該列的數據類型,然后是指定其是否可空。id 列通過指定 AUTO_INCREMENT 使其在新增條目時自動增加。通過 PRIMARY KEY 設置 id 列作為表的主鍵。其中 # 號后面為注釋內容

上面代碼可直接粘貼執行。平時自己手動輸入的情況下,在進入多行模式行,如果發現前一行輸入有誤,那么很不幸,根據文檔的描述,沒有辦法回到上一行進行修正。只能鍵入 \c 結束掉當前的編輯重新編寫。

通過 SHOW TABLES 可查看到剛剛創建的 cats 表。

mysql> SHOW TABLES;
+----------------+
| Tables_in_pets |
+----------------+
| cats           |
+----------------+
1 row in set (0.01 sec)

通過 DESCRIBE 可查看各列的詳情。

mysql> DESCRIBE cats;
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name  | varchar(150)     | NO   |     | NULL    |                |
| owner | varchar(150)     | NO   |     | NULL    |                |
| birth | date             | NO   |     | NULL    |                |
+-------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

修改表名

如果想修改已經創建的表名,可通過 RENAME TABLE 語句來實現。

mysql> RENAME TABLE todo TO todos
Query OK, 0 rows affected (0.04 sec)

插入記錄

通過 INSERT...VALUES 可向表中插入記錄。

INSERT INTO cats ( name, owner, birth) VALUES
  ( 'Sandy', 'Lennon', '2015-01-03' ),
  ( 'Cookie', 'Casey', '2013-11-13' ),
  ( 'Charlie', 'River', '2016-05-21' );

關於各數據類型及相應值的設置可參見 Literal Values

查詢記錄

通過 SELECT 語句可查詢表中的記錄。這應該是使用最為頻繁的語句了。

簡單情況下的使用格式為 SELECT <column_name> from <table_name>,表示從 table_name 查詢 column_name 這一列的數據,可通過將列名指定為通配符 * 以表示查詢所有列。

mysql> SELECT * FROM cats;
+----+---------+--------+------------+
| id | name    | owner  | birth      |
+----+---------+--------+------------+
|  1 | Sandy   | Lennon | 2015-01-03 |
|  2 | Cookie  | Casey  | 2013-11-13 |
|  3 | Charlie | River  | 2016-05-21 |
+----+---------+--------+------------+
3 rows in set (0.01 sec)

前面提到過語句的結束除了通過分號,還有 \g,以及 \G。前面兩者等效,\G 會將結果豎向展示。

mysql> SELECT * FROM cats\G
*************************** 1. row ***************************
    id: 1
  name: Sandy
 owner: Lennon
 birth: 2015-01-03
*************************** 2. row ***************************
    id: 2
  name: Cookie
 owner: Casey
 birth: 2013-11-13
*************************** 3. row ***************************
    id: 3
  name: Charlie
 owner: River
 birth: 2016-05-21
3 rows in set (0.00 sec)

注意使用 \G 時語句后面無須再跟分號,否則會報錯。

mysql> SELECT * FROM cats\G;
...

ERROR:
No query specified

通過添加 WHERE 條件可對查詢進行更加精確的限制,比如只返回滿足某個條件下的記錄。

mysql> SELECT name FROM cats WHERE owner = 'Casey';
+--------+
| name   |
+--------+
| Cookie |
+--------+
1 row in set (0.00 sec)

更新記錄

通過 UPDATE 對已經插入的記錄進行更新。

mysql> SELECT * FROM cats;
+----+---------+--------+------------+
| id | name    | owner  | birth      |
+----+---------+--------+------------+
|  1 | Sandy   | Lennon | 2015-01-03 |
|  3 | Charlie | River  | 2016-05-21 |
+----+---------+--------+------------+
2 rows in set (0.01 sec)

mysql> UPDATE cats SET name='Tom',owner='Tom<span class="pl-pds">'s Daddy' WHERE cats.name='Charlie';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> SELECT * FROM cats;
+----+-------+-------------+------------+
| id | name | owner | birth |
+----+-------+-------------+------------+
| 1 | Sandy | Lennon | 2015-01-03 |
| 3 | Tom | Tom's Daddy | 2016-05-21 |
+----+-------+-------------+------------+
2 rows in set (0.00 sec)

上面更新時,新的 owner 將 ``` 進行轉義后插入,不然 SQL 語句在這里無法被正確解析。

刪除記錄

通過 DELETE 語句可刪除表中的記錄。

mysql> DELETE FROM cats WHERE name='Cookie';
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM cats;
+----+---------+--------+------------+
| id | name | owner | birth |
+----+---------+--------+------------+
| 1 | Sandy | Lennon | 2015-01-03 |
| 3 | Charlie | River | 2016-05-21 |
+----+---------+--------+------------+
2 rows in set (0.00 sec)

清空表

線下測試時,會造成大量測試數據。可通過 TRUNCATE 語句來清空指定的表。

TRUNCATE [TABLE] tbl_name

清空前需謹慎,你應該不會想要在生產環境隨便給到這個權限。

列的添加

通過 ALTER TABLE...ADD 語句可對表進行列的增加。

mysql> ALTER TABLE cats ADD gender CHAR(1) AFTER name;
Query OK, 0 rows affected (0.22 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> DESCRIBE cats;
+--------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(150) | NO | | NULL | |
| gender | char(1) | YES | | NULL | |
| owner | varchar(150) | NO | | NULL | |
| birth | date | NO | | NULL | |
+--------+------------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)

創建表時,除了通過設置 AUTO_INCREMENT 讓 id 列自增,還可通過 DEFAULT 指定列的默認值。所以這里如果想在數據插入時如果沒指定性別就默認為 M,可以這樣來寫,

mysql> ALTER TABLE cats ADD gender CHAR(1) DEFAULT 'M' AFTER name;

前面通過 DESCRIBE 語句檢查表的創建情況,還可通過 SHOW CREATE TABLE 以獲得關於表更加具體的信息,該語句打印用於創建該表時的 CREATE TABLE 語句,包含了我們在手寫時省略掉的一些默認設置。

mysql> SHOW CREATE TABLE cats\G
*************************** 1. row ***************************
       Table: cats
Create Table: CREATE TABLE `cats` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(150) COLLATE utf8mb4_general_ci NOT NULL,
  `gender` char(1) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `owner` varchar(150) COLLATE utf8mb4_general_ci NOT NULL,
  `birth` date NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
1 row in set (0.00 sec)

關鍵是該語句的輸出可直接用來在其他地方執行,然后創建出相同的表,比如上線的時候在線上環境執行。

列的刪除

通過 ALTER TABLE...DROP 語句可刪除表中指定的列。

mysql> DESCRIBE cats;
+--------+------------------+------+-----+---------+----------------+
| Field  | Type             | Null | Key | Default | Extra          |
+--------+------------------+------+-----+---------+----------------+
| id     | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name   | varchar(150)     | NO   |     | NULL    |                |
| gender | char(1)          | YES  |     | NULL    |                |
| owner  | varchar(150)     | NO   |     | NULL    |                |
| birth  | date             | NO   |     | NULL    |                |
+--------+------------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)

mysql> ALTER TABLE cats DROP gender;
Query OK, 0 rows affected (0.21 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> DESCRIBE cats;
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(150) | NO | | NULL | |
| owner | varchar(150) | NO | | NULL | |
| birth | date | NO | | NULL | |
+-------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

賬戶及權限

默認的 root 賬戶權限很高,一般不用於日常的作業。 可根據需要創建不同權限的賬戶來進行管理和作業。

賬戶創建與分配的權限

以下腳本展示了賬戶的創建並為其分配相應權限。

CREATE USER 'finley'@'localhost'
  IDENTIFIED BY 'password';

GRANT ALL
ON .
TO 'finley'@'localhost'
WITH GRANT OPTION;

CREATE USER 'finley'@'%.example.com'
IDENTIFIED BY 'password';

GRANT ALL
ON .
TO 'finley'@'%.example.com'
WITH GRANT OPTION;

該腳本分別為 finley 在本地 localhostexample.com 域上的數據庫創建了賬戶,並賦予了所有權限。其中 %.example.com 里面的 % 為通配符,表示該賬戶對 example.com 上的數據庫擁有權限。

其中 WITH GRANT OPTION 表示還給該賬戶賦予了能夠修改其他用戶權限的能力

CREATE USER 'admin'@'localhost'
  IDENTIFIED BY 'password';

GRANT RELOAD,PROCESS
ON .
TO 'admin'@'localhost';

上面的腳本創建了名為 'admin'@'localhost' 的賬戶並賦予了 RELOADPROCESS 權限。

CREATE USER 'dummy'@'localhost';

上面的腳本創建名為 'dummy'@'localhost' 的賬戶並且無須密碼登錄,但並沒有賦予任何權限。后續可通過 GRANT 來設置權限。

上面創建的賬戶都是全局作用域,即沒有限制數據庫。通過為賬戶指定相應的數據庫可限制賬戶只對某些庫有相應操作權限,達到更加精細的設置。

CREATE USER 'custom'@'localhost'
  IDENTIFIED BY 'password';
GRANT ALL
  ON bankaccount.*
  TO 'custom'@'localhost';

上面腳本創建的 'custom'@'localhost' 賬戶對 bankaccount 庫擁有全部權限,但僅限於從 localhost 進行連接。

CREATE USER 'custom'@'host47.example.com'
  IDENTIFIED BY 'password';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
  ON expenses.*
  TO 'custom'@'host47.example.com';

上面腳本對 'custom'@'host47.example.com' 開放 expenses 數據庫的部分權限,其中包括 SELECTINSERTUPDATEDELETECREATEDROP 且只能是操作 host47.example.com 上的數據庫。

CREATE USER 'custom'@'%.example.com'
  IDENTIFIED BY 'password';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
  ON customer.addresses
  TO 'custom'@'%.example.com';

上面腳本創建 'custom'@'%.example.com' 賬戶並只對其開通 customer 庫下面 addresses 的權限。

權限的查看

通過 SHOW GRANTS 來查看賬戶的權限。

mysql> SHOW GRANTS FOR 'wayou'@'localhost';
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for wayou@localhost                                                                                                                                                                                                                                                                                                                                                                                   |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `wayou`@`localhost` WITH GRANT OPTION    |
| GRANT APPLICATION_PASSWORD_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,GROUP_REPLICATION_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SYSTEM_VARIABLES_ADMIN,XA_RECOVER_ADMIN ON *.* TO `wayou`@`localhost` WITH GRANT OPTION |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

通過 SHOW CREATE USER 可查看創建該用戶的腳本。

mysql> SHOW CREATE USER 'wayou'@'localhost';
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| CREATE USER for wayou@localhost                                                                                                                                                                                                                                                                     |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| CREATE USER 'wayou'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS 'xxx' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

權限的回收與賬戶的刪除

通過 REVOKE 可對權限進行回收,即撤回。

回收所有全局權限的示例:

REVOKE ALL
  ON *.*
  FROM 'finley'@'%.example.com';

REVOKE RELOAD
ON .
FROM 'admin'@'localhost';

回收數據庫作用域權限的示例:

REVOKE CREATE,DROP
  ON expenses.*
  FROM 'custom'@'host47.example.com';

回收表作用域權限的示例:

REVOKE INSERT,UPDATE,DELETE
  ON customer.addresses
  FROM 'custom'@'%.example.com';

同樣,可通過 SHOW GRANTS 來檢查權限更新的情況。

最后是賬戶的刪除,通過 DROP USER 語句,以下是一個刪除的示例:

DROP USER 'finley'@'localhost';

查看用戶列表

通過查詢內置的 mysql 數據庫中 user 表,可看到添加后的所有用戶。

mysql> SELECT User FROM mysql.user;
+------------------+
| user             |
+------------------+
| mysql.infoschema |
| mysql.session    |
| mysql.sys        |
| root             |
| wayou            |
+------------------+
5 rows in set (0.00 sec)

相關資源


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM