MySQL 8.0 安裝
-
推薦離線安裝,在線安裝會默認安裝MySQL5.0。
到MySQL官網下載對應安裝包。
在安裝包所在的文件夾執行以下指令:sudo dpkg -i mysql-apt-config_*.deb sudo apt update sudo apt install mysql-server sudo apt install libmysqlclient-dev
-
驗證是否成功:
mysql -u root -p
輸入密碼,如果出現以下提示證明沒有問題
mysql>
-
數據庫備份: cmd命令下
mysqldump -u root -p test>test.sql
-
數據庫恢復:
創建數據庫並選擇該數據庫
在cmd命令下:mysql -u root -p test<test.sql
或者:
在mysql >命令行下 執行 SOURCE 數據庫文件
MySQL語言簡介
MySQL是關係數據庫語言,用來創建編輯維護關係數據庫。
關係數據庫,顧名思義,把事物之間的聯繫抽象出來,用數據項表示,稱爲關係。
關係數據庫的的存儲單元是表,每個表中存儲若干數據稱爲元組。
元組就是最基本的數據記錄。
基礎的數據庫語言包括
- DQL:數據查詢語言
- DML:數據操作語言
- DDL:數據定義語言
- DCL:數據控制語言
MySQL數據類型
MySQL基礎語句
注意:
- MySQL命令不區分大小寫,可以隨意換行,分號作爲結束符號。爲了便於區分,以下MySQL中的語言關鍵字均採用大寫。
- 三種註釋方式:
#註釋
/*註釋*/
-- 註釋(前有空格)
數據庫操作
DATABASES關鍵字可以用SCHEMA關鍵字替代
創建數據庫
CREATE DATABASE IF NOT EXISTS db_name --IF NOT EXISTS可以省略
DEFAULT CHARACTER SET = charset_name --指定數據庫字符集,可以省略
DEFAULT COLLATEN = collation_name; --指定字符集的校對規則
選擇數據庫
USE db_name; --選擇數據庫之後可以進行後續對數據庫的操作
修改數據庫
ALTER DATABASE db_name --選擇數據庫
alter-specification; --修改語句
刪除數據庫
DROP DATABASE IF_EXISTS db_name; -- IF EXISTS 可以省略
查看數據庫
SHOW DATABASES LIKE ‘pattern’ WHERE expr;
-- LIKE 用於指定數據庫名稱 WHERE限定數據庫查詢範圍
查看指定數據庫的創建信息
SHOW CREATE DATABASE ‘數據庫名稱’
表操作
創建表
簡單創建
完整創建
CREATE TEMPORARY TABLE tb_name -- TEMPORARY關鍵字表明是臨時表,可以省略,表示爲持久表
(
col1_name 數據類型 [列級完整性約束] [DEFAULT 默認值],
col2_name 數據類型 [列級完整性約束] [DEFAULT 默認值],
...
[表級完整性約束]
)ENGINE = 引擎類型;
-- 引擎類型可以省略,默認值也可以省略
常用完整性約束:
主碼約束:PRIMARY KEY
唯一性約束:UNIQUE
非空值約束:NOT NULL
更新表
在表中添加新列
ALTER TABLE tb_name
ADD COLUMN col_name 數據類型 [列級完整性約束] [DEFAULT 默認值];
修改表中列的屬性
- 整體重定義
ALTER TABLE tb_name
CHANGE COLUMN col_name new_name 數據類型 [列級完整性約束] [DEFAULT 默認值];
- 修改表中列的默認值(操作速度快)
ALTER TABLE tb_name
ALTER COLUMN col_name SET DEFAULT 新默認值; --修改默認值
ALTER COLUMN col_name DROP DEFAULT; --刪除默認值
- 修改表中列的屬性和位置
ALTER TABLE tb_name
MODIFY COLUMN col_name new_name 數據類型 [列級完整性約束] [DEFAULT 默認值];
刪除表中的列
ALTER TABLE tb_name
DROP COLUMN col_name;
重命名錶
- RENAME TO子句
ALTER TABLE tb_name
RENAME TO new_name;
- RENAME TABLE 語句
RENAME TABLE tb_name TO new_name
刪除表
DROP [TEMPORARY] TABLE [IF EXISTS] tb_name;
查看錶
查看錶的名稱
SHOW [FULL(顯示錶的類型)] TABLES IN db_name;
查看錶的結構
SHOW [FULL(顯示全部信息)] COLUMNS IN/FROM tb_name IN/FROM db_name;
或者
DESC tb_name;
索引操作
創建索引
- CREATE INDEX語句
CREATE [UNIQUE] INDEX index_name
ON tb_name (col_name1 [(length)] [ASC/DESC],col_name2 [(length)] [ASC/DESC]...);
- CREATE TABLE語句
在使用CREATE TABLE語句創建表時直接加入語句創建索引- PRIMARY KEY(col_name1,col_name2…);-- 創建主鍵
- INDEX/KEY [index_name] (col_name1,col_name2…);–創建普通索引
- FOREIGN KEY [index_name] (col_name1,col_name2…); --創建外鍵
- ALTER TABLE語句
查看索引
SHOW INDEX/KEYS FROM tb_name FROM db_name WHERE expr;
刪除索引
- DROP INDEX 語句
DROP INDEX index_name ON tb_name;
- ALTER TABLE語句
ALTER TABLE tb_name
DROP PRIMARY KEY/KEY/INDEX/FOREIGN KEY;
數據操作
插入數據
INSERT INTO tb_name [(col_name1,col_name2...)] --括號內爲要賦值的列名,如果省略則按照表中列的默認順序依次賦值
VALUE/VALUES(expr/default,expr/default...),(expr/default,expr/default...)
-- 括號內爲賦給的值,可以是表達式或者是default 默認值,可以一次插入多行
指定部分列插入,未指定爲默認值
INSERT INTO tb_name SET col_name1=expr1,col_name2=expr2...;
刪除數據
DELETE FROM tb_name WHERE expr;
修改數據
UPDATE tb_name
SET col_name1=expr,col_name2=expr...
WHERE where_condition;
查詢數據
SELECT [DISTINCT] select_expr1,select_expr2 AS new_name,```
FROM tb_name WHERE where_condition ORDER BY colonm_exper ASC|DESC;
Select
指定查詢哪些列的數據,可以跟表達式,*表示所有列。AS new_name
指定列名。FROM
指定查詢哪張表,可以是連接語句構造的新表。DISTINCT
可選,指顯示結果時,是否剔除重複數據WHERE
後跟表達式限制查詢條件ORDER BY
指定排序的列,排序的列即可是表中的列名,也可以是select 語句後指定的列名。Asc 升序、Desc 降序where子句
中經常使用的運算符
數據查詢進階操作
表的連接
可以通過不同表之間進行連接然後查詢得到新的數據關係結果,語言形式如下:
Select *
from TABLE1 join_type TABLE2 [on (join_condition)]
[where (query_condition)]
- TABLE1和TABLE2表示參與連接操作的表,TABLE1爲左表,TABLE2爲右表
- on子句設定連接條件
- where子句設定查詢條件
- join_type表示連接類型
交叉連接
默認連接模式,用兩個表的表項的笛卡爾積構成新的表查詢,直接用,或者CROSS JOIN
表示。笛卡爾積即表1中的每一行都與表2中的每一行進行組合作爲新表的一行。
內連接
內連接其實就是在交叉連接的基礎上進行條件限制,即限定表1中的某一表項與表2中的表項相等。然後在交叉連接的表中篩選出滿足條件的元組記錄。
-
顯式內連接:使用inner join關鍵字,在on子句中設定連接條件
SELECT * FROM customer c INNER JOIN orders o ON c.id=o.customer_id; SELECT * FROM customer as c INNER JOIN orders as o ON c.id=o.customer_id;
-
隱式內連接:不包含inner join關鍵字和on關鍵字,在where子句中設定連接條件
SELECT * FROM customer c,orders o WHERE c.id=o.customer_id;
外連接
- 外連接在內連接的基礎上多出來一些數據,即內連接中只會顯示滿足條件的兩個表的元組組合。而外連接可以指定一個表的記錄全部顯示。
- 如果顯示左表 全部行,就是左外連接,否則就是右外連接,都顯示則是全連接。另一個表中沒有匹配項的顯示空值。
子查詢
相當於複合查詢,即在查詢語句的wher語句中嵌套一個select子句。
聯合查詢
相當於兩個select取並集,去掉重複行。
用UNION連接兩個不同的select語句即可。
報表查詢
group by語法可以根據給定數據列的每個成員對查詢結果進行分組統計,最終得到一個分組彙總表。
格式:select … from … [where…] [ group by … [having… ]] [ order by … ]
SELECT子句中的列名必須爲分組列或列函數。
列函數對於GROUP BY子句定義的每個組各返回一個結果,然後按照分組列統計列函數的結果。
可以追加having語句進行二次篩選。
常用統計函數
函數 | 功能 |
---|---|
count(列名) | 返回某一列滿足條件的記錄有多少行,即有多少條數據記錄,配合group by可以進行分類計數統計 |
sum(列名) | 返回某一列滿足條件的記錄的總和,這一列必須是數值,可以進行加法操作 |
avg(列名) | 返回某一列中滿足條件的記錄的平均值 |
max(列名) | 返回某一列中滿足條件的最大值,該列需要可以比較大小 |
min(列名) | 返回某一列中滿足條件的最大值,該列需要可以比較大小 |
C語言連接MySQL
MySQL提供了一系列接口供其他語言調用
下面的命令用來安裝C語言的依賴庫。
sudo apt install libmysqlclient-dev
記得在源碼文件中包含頭文件
#include <mysql/mysql.h>
與MySQL交互步驟:
-
通過調用mysql_init()初始化數據庫句柄MSQL指針
-
通過調用mysql_real_connect()連接到服務器。
-
發出SQL語句並處理其結果。
-
通過調用mysql_close(),關閉與MySQL服務器的連接。
函數介紹如下:
mysql_init函數
- 原型:
MYSQL *mysql_init(MYSQL *mysql)
, - 作用:分配或初始化與mysql_real_connect()相適應的MYSQL對象。
- 返回值:如果mysql是NULL指針,該函數將分配、初始化、並返回新對象。否則,將初始化對象,並返回對象的地址。如果mysql_init()分配了新的對象,當調用mysql_close()來關閉連接時。將釋放該對象。函數返回初始化的MYSQL*句柄。如果無足夠內存以分配新的對象,返回NULL。
mysql_real_connect函數
- 原型:
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag)
- 作用:連接指定數據庫
- 參數:
-
第一個參數mysql應是已有MYSQL結構的地址。
-
第二個參數host的值必須是主機名或IP地址。如果是NULL或字符串"localhost",連接將被視爲與本地主機的連接。
-
第三個參數是登錄MySQL的用戶名
-
第四個參數包含用戶的密碼。如果是NULL,僅會對該用戶的(擁有1個空密碼字段的)用戶表中的條目進行匹配檢查。這樣,數據庫管理員就能按特定的方式設置MySQL權限系統,根據用戶是否擁有指定的密碼,用戶將獲得不同的權限。
-
第五個參數是數據庫名稱。如果爲NULL,連接會將默認的數據庫設爲該值
-
第六個參數如果不是0,其值將用作TCP/IP連接的端口號。注意,“host”參數決定了連接的類型。
-
第七個參數unix_socket不如果是NULL,則描述了進行TCP/IP連接應使用的套接字或命名管道。注意,“host”參數決定了連接的類型。
-
第八個參數client_flag的值通常爲0
-
- 返回值:如果連接成功,函數返回MYSQL*連接句柄。如果連接失敗,返回NULL。對於成功的連接,返回值與第1個參數的值相同
mysql_query/mysql_real_query函數
- 原型:
int mysql_real_query(MYSQL *mysql, const char *query, unsigned int length)
int mysql_query(MYSQL *mysql, const char *query)
- 作用:向MySQL發送命令
- 返回值:命令執行成功返回0,失敗返回非零值,不同返回值對應不同的錯誤
- 參數:
- mysql是一個已經建立連接的MYSQL句柄
- query是一條MySQL命令
- length是命令的長度,mysql_query函數沒有該參數,而是會自動執行strlen求長度,因此不能用於包含二進制數據的查詢,因爲會把
\0
對應的二進制數據當作結束符。
mysql_use_result函數
- 原型:
MYSQL_RES *mysql_use_result(MYSQL *mysql)
- 作用:對於成功檢索了數據的每個查詢(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),需要調用mysql_use_result()來獲取命令執行的結果
- 返回值:執行成功返回指向結果集結構體的指針,失敗返回NULL
mysql_fetch_row函數
- 原型:
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
- 作用:接收mysql_use_result返回的結構體指針,可以返回下一行的查詢結果
- 返回值:沒有後續行或者出錯返回NULL,否則返回保存行結果的指針。
mysql_num_fields函數
- 原型:
int mysql_num_fields(MYSQL_RES *result)
- 作用:接收一個結果集結構體指針,返回結果集中的字段數,包含空字段,如果用row保存了該行結果的指針,則按照row[0]到row[mysql_num_fields(result)-1],可以訪問這些字段字符串對應的指針,空字段的指針爲NULL。
mysql_free_result函數
- 原型:
void mysql_free_result(MYSQL_RES *result)
- 作用:釋放結果集佔用的內存,在執行完所有對結果集的操作後調用