MySQL 上手教程
安裝
通過官網選擇版本 下載安裝。Mac上可通過Homebrew 方便地安裝:
$ brew install mysql
檢查安裝是否成功:
$ mysql --version mysqlVer 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)
mysql_secure_installation 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 -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;
執行exit
或quit
可退出登入,即退出 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>
資料庫間的切換
首先通過
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 ( idINT unsigned NOT NULL AUTO_INCREMENT, # Unique ID for the record nameVARCHAR(150) NOT NULL,# Name of the cat ownerVARCHAR(150) NOT NULL,# Owner of the cat birthDATE NOT NULL,# Birthday of the cat PRIMARY KEY(id)# Make the id the primary key );
其中第一列為列名,緊隨其後的是該列的
資料型別
,然後是指定其是否可空。id
列通過指定AUTO_INCREMENT
使其在新增條目時自動增加。通過PRIMARY KEY
設定id
列作為表的
主鍵
。其中#
號後面為註釋內容
。
通過
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)
插入記錄
通過
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)
通過新增WHERE
條件可對查詢進行更加精確的限制,比如只返回滿足某個條件下的記錄。
mysql> SELECT name FROM cats WHERE owner = 'Casey'; +--------+ | name| +--------+ | Cookie | +--------+ 1 row in set (0.00 sec)
刪除記錄
通過
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)
列的新增
通過
ALTER TABLE...ADD
語句可對錶進行列的增加。
mysql> ALTER TABLE cats ADD gender CHAR(1) AFTER name; Query OK, 0 rows affected (0.22 sec) Records: 0Duplicates: 0Warnings: 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)
前面通過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: 0Duplicates: 0Warnings: 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 語句建立賬戶,DROP USER 刪除賬戶。
-
SHOW GRANTS 檢視許可權的分配情況。
賬戶建立與分配的許可權
以下指令碼展示了賬戶的建立併為其分配相應許可權。
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
在本地localhost
及example.com
域上的資料庫建立了賬戶,並賦予了所有許可權。其中%.example.com
裡面的%
為萬用字元,表示該賬戶對example.com
上的資料庫擁有許可權。
其中WITH GRANT OPTION
表示還給該賬戶賦予了能夠修改其他使用者許可權的能力
。
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'password'; GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';
上面的指令碼建立了名為'admin'@'localhost'
的賬戶並賦予了
RELOAD
,
PROCESS
許可權。
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
資料庫的部分許可權,其中包括SELECT
,INSERT
,UPDATE
,DELETE
,CREATE
,DROP
且只能是操作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)