Linux環境:MySQL安裝配置、基礎操作和C語言連接MySQL操作

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交互步驟:

  1. 通過調用mysql_init()初始化數據庫句柄MSQL指針

  2. 通過調用mysql_real_connect()連接到服務器。

  3. 發出SQL語句並處理其結果。

  4. 通過調用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)
  • 作用:釋放結果集佔用的內存,在執行完所有對結果集的操作後調用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章