[資料庫]MySQL基礎知識
[資料庫]MySQL基礎知識
目錄參考:
1. SQL語句
可以把 SQL 分成兩個部分:資料操作語言(DML)和資料定義語言(DDL)
SQL 適用於執行查詢的語法。但是 SQL 語言也包含用於增刪改查的語法。
增刪改查語句構成 SQL 的 DML 部分:
- **SELECT **- 查詢
- UPDATE - 更改
- DELETE - 刪除
- INSERT INTO - 增加
建立刪除表格,定義索引(鍵),規定表間連結和設定約束的 DDL 語句:
- CREATE DATABASE - 建立新資料庫
- ALTER DATABASE - 修改資料庫
- CREATE TABLE - 建立新表
- ALTER TABLE - 變更(改變)資料庫表
- DROP TABLE - 刪除表
- CREATE INDEX - 建立索引(搜尋鍵)
- DROP INDEX - 刪除索引
2. 資料庫簡介
-
資料庫(DataBase)是按照資料結構來組織、儲存和管理資料的倉庫。
-
每個資料庫都有一個或多個不同的API用於對資料的增刪改查。
3. 關係型資料庫
RDBMS(Relational DataBase Management System),關係型資料庫。
關係型資料庫的一些術語:
- 資料庫(DataBase):資料庫是表的集合,可以理解為用來存放資料表的倉庫。
- 資料表(Table):表是資料的矩陣,看起來就像一個簡單的Excel表格。
- 列(Column):一列相同型別的資料。
- 行(Row):一組相關的資料。
- 主鍵(Primary Key):主鍵是唯一的,一個數據表中只能包含一個主鍵,可以使用主鍵來查詢資料。
- 外來鍵(Foreign key):外來鍵用於關聯兩個表。
- 複合鍵(Composite key):複合鍵將多個列作為一個索引鍵,一般用於符合索引。
- 索引(Index):使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構。類似於書籍的目錄。
4. MySQL 安裝
在 CentOS 7 之後的MySQL被其分支MariaDB代替,在儲存引擎方面採用XtraDB來代替MySQL的InnoDB。
檢視系統中的是否自帶MariaDB:
[root@localhost ~]# rpm -qa | grep mariadb
mariadb-errmsg-10.3.28-1.module_el8.3.0+757+d382997d.x86_64
mariadb-10.3.28-1.module_el8.3.0+757+d382997d.x86_64
mariadb-gssapi-server-10.3.28-1.module_el8.3.0+757+d382997d.x86_64
mariadb-backup-10.3.28-1.module_el8.3.0+757+d382997d.x86_64
mariadb-connector-c-config-3.1.11-2.el8_3.noarch
mariadb-server-10.3.28-1.module_el8.3.0+757+d382997d.x86_64
mariadb-server-utils-10.3.28-1.module_el8.3.0+757+d382997d.x86_64
mariadb-common-10.3.28-1.module_el8.3.0+757+d382997d.x86_64
mariadb-connector-c-3.1.11-2.el8_3.x86_64
如果有,可以選擇解除安裝(因為系統自帶的版本可能會比較舊,存在相容性問題)
rpm -e mariadb // 普通刪除模式
rpm -e --nodeps mariadb // 強力刪除模式,會刪除依賴檔案
安裝 Mariadb:
yum install -y mariadb mariadb-server
初始化 Mariadb:
mysqld --initialize
設定開機啟動:
systemctl enable mariadb.service
systemctl start mariadb.service
驗證:
[root@localhost ~]# mysqladmin --version
mysqladmin Ver 9.1 Distrib 10.3.28-MariaDB, for Linux on x86_64
初始化root登入密碼:
mysqladmin -u root password "new_password"
登入資料庫:
mysql -u root -p
5. MySQL 管理
5.1 使用者設定
在MySQL(MariaDB)中,新增使用者有兩種方式:
5.1.1 建立使用者
切換到mysql庫:
MariaDB [(none)]> use mysql;
新增sky使用者,密碼為skybiubiu:
MariaDB [mysql]> create user sky identified by 'skybiubiu';
Query OK, 0 rows affected (0.000 sec)
5.1.2 使用者授權
以skydb庫為例子:
MariaDB [mysql]> CREATE DATABASE skydb;
Query OK, 1 row affected (0.000 sec)
通過GRANT命令進行授權,授予sky使用者SELECT,INSERT,UPDATE操作許可權:
MariaDB [skydb]> GRANT SELECT,INSERT,UPDATE ON skydb.*
-> TO 'sky'@'localhost'
-> IDENTIFIED BY 'skybiubiu';
Query OK, 0 rows affected (0.001 sec)
5.2 管理命令
- USE 資料庫名 - 選擇要操作的資料庫
- SHOW DATABASES - 檢視所有資料庫
- SHOW TABLES - 檢視指定庫的所有表
- SHOW COLUMNS FROM 資料表 - 顯示資料表的屬性,屬性型別,主鍵資訊,NULL,預設值等資訊
- SHOW INDEX FROM 資料表 - 顯示資料表的詳細索引資訊,包括主鍵。
- SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern'] - 查看錶狀態
6. MySQL 資料結構
有三種主要的型別:Text(文字)、Number(數字)和 Date/Time(日期/時間)型別。
6.1 Text 型別
資料型別 | 描述 |
---|---|
CHAR(size) | 儲存固定長度的字串(可包含字母、數字以及特殊字元)。在括號中指定字串的長度。最多 255 個字元。 |
VARCHAR(size) | 儲存可變長度的字串(可包含字母、數字以及特殊字元)。在括號中指定字串的最大長度。最多 255 個字元。註釋:如果值的長度大於 255,則被轉換為 TEXT 型別。 |
TINYTEXT | 存放最大長度為 255 個字元的字串。 |
TEXT | 存放最大長度為 65,535 個字元的字串。 |
BLOB | 用於 BLOBs(Binary Large OBjects)。存放最多 65,535 位元組的資料。 |
MEDIUMTEXT | 存放最大長度為 16,777,215 個字元的字串。 |
MEDIUMBLOB | 用於 BLOBs(Binary Large OBjects)。存放最多 16,777,215 位元組的資料。 |
LONGTEXT | 存放最大長度為 4,294,967,295 個字元的字串。 |
LONGBLOB | 用於 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 位元組的資料。 |
ENUM(x,y,z,etc.) | 允許您輸入可能值的列表。可以在 ENUM 列表中列出最大 65535 個值。如果列表中不存在插入的值,則插入空值。註釋:這些值是按照您輸入的順序排序的。可以按照此格式輸入可能的值: ENUM('X','Y','Z') |
SET | 與 ENUM 類似,不同的是,SET 最多隻能包含 64 個列表項且 SET 可儲存一個以上的選擇。 |
6.2 Number 型別
資料型別 | 描述 |
---|---|
TINYINT(size) | -128 到 127 常規。0 到 255 無符號*。在括號中規定最大位數。 |
SMALLINT(size) | -32768 到 32767 常規。0 到 65535 無符號*。在括號中規定最大位數。 |
MEDIUMINT(size) | -8388608 到 8388607 普通。0 to 16777215 無符號*。在括號中規定最大位數。 |
INT(size) | -2147483648 到 2147483647 常規。0 到 4294967295 無符號*。在括號中規定最大位數。 |
BIGINT(size) | -9223372036854775808 到 9223372036854775807 常規。0 到 18446744073709551615 無符號*。在括號中規定最大位數。 |
FLOAT(size,d) | 帶有浮動小數點的小數字。在 size 引數中規定最大位數。在 d 引數中規定小數點右側的最大位數。 |
DOUBLE(size,d) | 帶有浮動小數點的大數字。在 size 引數中規定最大位數。在 d 引數中規定小數點右側的最大位數。 |
DECIMAL(size,d) | 作為字串儲存的 DOUBLE 型別,允許固定的小數點。在 size 引數中規定最大位數。在 d 引數中規定小數點右側的最大位數。 |
這些整數型別擁有額外的選項 UNSIGNED。通常,整數可以是負數或正數。如果新增 UNSIGNED 屬性,那麼範圍將從 0 開始,而不是某個負數。
6.3 Date 型別
資料型別 | 描述 |
---|---|
DATE() | 日期。格式:YYYY-MM-DD註釋:支援的範圍是從 '1000-01-01' 到 '9999-12-31' |
DATETIME() | *日期和時間的組合。格式:YYYY-MM-DD HH:MM:SS註釋:支援的範圍是從 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59' |
TIMESTAMP() | *時間戳。TIMESTAMP 值使用 Unix 紀元('1970-01-01 00:00:00' UTC) 至今的秒數來儲存。格式:YYYY-MM-DD HH:MM:SS註釋:支援的範圍是從 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC |
TIME() | 時間。格式:HH:MM:SS註釋:支援的範圍是從 '-838:59:59' 到 '838:59:59' |
YEAR() | 2 位或 4 位格式的年。註釋:4 位格式所允許的值:1901 到 2155。2 位格式所允許的值:70 到 69,表示從 1970 到 2069。 |
7. MySQL 庫&表操作
7.1 庫操作
7.1.1 建立庫
方法一:登入MySQL中,通過SQL語句建立。
CREATE DATABASE IF NOT EXISTS <資料庫名>;
- IF NOT EXISTS - 如果不存在該資料庫則建立。
方法二:在bash中,利用mysqladmin命令建立。
mysqladmin -u root -p create <資料庫名>
7.1.2 刪除庫
同上兩種刪除庫的方法:
登入MySQL中,通過SQL語句刪除:
DROP DATABASE <資料庫名>;
在Bash,通過mysqladmin命令刪除:
mysqladmin -u root -p drop <資料庫名>
7.1.3 選擇庫
進入mysql,使用SQL語句選擇庫:
USE <資料庫名>;
7.2 表操作
7.2.1 建立表
登入MySQL中,通過SQL語句建立:
CREATE TABLE <表名> (column_name column_type);
示例:
CREATE TABLE IF NOT EXISTS books (
BookID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
Title VARCHAR(100) NOT NULL,
SeriesID INT, AuthorID INT)CHARSET UTF8;
注意:`
是反單引號,ESC下面那個,可加可不加。
- NOT NULL - 該欄位不能為空。
- AUTO_INCREMENT - 自增,常用於主鍵,數值會自動加1。
- PRIMARY KEY - 定義主鍵,可使用多列來定義主鍵,列間以逗號分隔。
- ENGINE - 設定儲存引擎。
- CHARSET - 設定編碼。
7.2.2 刪除表
登入MySQL中,通過SQL語句建立:
DROP TABLE <表名>;
示例:
MariaDB [skydb]> show tables;
+-----------------+
| Tables_in_skydb |
+-----------------+
| books |
| sky_table |
+-----------------+
2 rows in set (0.000 sec)
MariaDB [skydb]> DROP TABLE sky_table;
Query OK, 0 rows affected (0.002 sec)
MariaDB [skydb]> show tables;
+-----------------+
| Tables_in_skydb |
+-----------------+
| books |
+-----------------+
1 row in set (0.000 sec)
7.2.3 查詢表
檢視庫中所有表:
MariaDB [skydb]> SHOW TABLES;
+-----------------+
| Tables_in_skydb |
+-----------------+
| books |
+-----------------+
1 row in set (0.000 sec)
檢視一個某個表頭的詳情:
MariaDB [skydb]> DESCRIBE books;
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| BookID | int(11) | NO | PRI | NULL | auto_increment |
| Title | varchar(100) | NO | | NULL | |
| SeriesID | int(11) | YES | | NULL | |
| AuthorID | int(11) | YES | | NULL | |
+----------+--------------+------+-----+---------+----------------+
4 rows in set (0.001 sec)
DESCRIBE 可以簡寫為 DESC。
7.3 資料操作
7.3.1 插入資料
INSERT INTO books (Title, SeriesID, AuthorID)
VALUES ("Lair of Bones", 2, 2);
7.3.2 查詢資料
語法:
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
Clause - 從哪個表裡找。
LIMIT N - 設定返回的記錄數。
OFFSET M - 查詢資料的偏移量,預設為0。
效果:
MariaDB [skydb]> SELECT * FROM books;
+--------+---------------+----------+----------+
| BookID | Title | SeriesID | AuthorID |
+--------+---------------+----------+----------+
| 1 | Lair of Bones | 2 | 2 |
| 2 | Lair of Bones | 2 | 2 |
+--------+---------------+----------+----------+
2 rows in set (0.000 sec)
因為我插入了兩次資料,所以有兩條一樣的,留著下面更改的時候用。
7.3.3 更改資料
將7.3.2中BookID為2的Title改為 I'm SkyBiuBiu
SQL語法:
UPDATE books
SET Title = "I'm SkyBiuBiu"
WHERE BookID = 2;
效果:
MariaDB [skydb]> SELECT * FROM books;
+--------+---------------+----------+----------+
| BookID | Title | SeriesID | AuthorID |
+--------+---------------+----------+----------+
| 1 | Lair of Bones | 2 | 2 |
| 2 | I'm SkyBiuBiu | 2 | 2 |
+--------+---------------+----------+----------+
2 rows in set (0.000 sec)