主頁 >  其他 > MySQL見聞錄 - 入門之旅

MySQL見聞錄 - 入門之旅

2020-09-30 12:52:54 其他

在網上翻來覆去找不到一套適合新手自學的書,于是買了課,急急忙忙上完了課,又發現全還給老師了,
這一系列文放在這里,從下載軟體開始,記錄一條MySQL入門之旅, 新手也可以跟著這條路走,一條道走到黑, 粉絲可見,愿者上鉤,
有任何疑問,參考三篇上課筆記,或者私信我,

文章目錄

      • 1、我的上課筆記
      • 2、軟體下載選擇
      • 3、示例資料庫
      • 4、DOS界面用戶登錄方式
      • 5、取消陳述句
      • 6、資料庫操作
      • 7、資料表操作
      • 8、往資料表中插入資料
      • 9、從表中檢索資料
      • 10、sampdb資料庫資料
      • 11、當前服務器下存盤引擎
      • 12、各存盤引擎特性
      • 13、如何選擇合適的存盤引擎
      • 14、存盤引擎設定
        • warning查看方法
        • 只創建不存在的資料表
      • 15、創建臨時資料表
      • 16、從其他表中創建新表
      • 17、洗掉資料表
      • 18、為資料表編制索引
      • 19、洗掉索引
      • 20、Alter 改變資料表的結構
      • 21、獲取資料庫里的元資料
      • 22、使用視圖
      • 23、事務處理
      • 24、使用事務保存點
      • 25、外鍵使用
      • 26、數值型別
        • 數值類別
        • 特殊字串處理
      • 27、MySQL如何處理非法資料
      • 28、運算子
        • 算術運算子
        • 邏輯運算子
        • 比較運算子
      • 29、復合陳述句與陳述句分隔符
      • 30、觸發器
      • 31、索引的使用
      • 索引為什么能提高查詢效率?
      • 挑選索引
        • 盡量為用來搜索、分類或分組的資料列編制索引,不要為用來輸出的資料列編制索引,
        • 盡量為短小的值建立索引,或者說,建立索引的值,要盡量短小,
        • 為字串的前綴設定索引
        • 利用慢查詢日志找出拖慢進度的SQL陳述句
      • 32、MySQL的查詢優化程式
      • 33、使用explain 陳述句來驗證優化器操作
      • 34、其他話
      • 35、C++語言使用MySQL
        • 1、Linux下的MySQL環境搭建
        • 2、頭檔案
        • 3、初見廬山真面目
        • 4、撥開迷霧,看下一層迷霧
          • ①呼叫mysql_real_connect函式連接Mysql資料庫,
          • ②呼叫mysql_real_query函式進行資料庫查詢,
          • ③通過呼叫mysql_store_result或mysql_use_result函式回傳的MYSQL_RES變數獲取查詢結果資料,
          • ④呼叫mysql_fetch_row函式讀取結果集資料,
          • ⑤結果集用完后,呼叫mysql_free_result函式釋放結果集,以防記憶體泄露,
          • ⑥不再查詢Mysql資料庫時,呼叫mysql_close函式關閉資料庫連接,
        • 5、看個實體融會貫通一下

1、我的上課筆記

MySQL資料庫從入門到實戰應用(學習筆記一)

MySQL資料庫從入門到實戰應用(學習筆記二)

MySQL資料庫從入門到實戰應用(學習筆記三)

2、軟體下載選擇

MySQL8.0版本,下載411M的那個debug版本

相比于5代版本,這款跨越6、7代版本的8代版本有許多的好評,當然我也沒體驗過5代版本,反正要用就用最新的嘛,

3、示例資料庫

示例資料庫是人家書里面的,有書總比沒書好,

示例資料庫的鏈接會在后面給出,

打開MySQL客戶端(如果已經配置好了系統路徑也可以直接打開DOS界面),登錄之后配置一個新用戶:

create user 'sampadm'@'localhost' identified by 'secret';

grant all on sampdb.* to 'sampadm'@'localhost';

完成對新用戶 sampadm的配置,本用戶只能在localhost上登錄,

完成配置后,就可以用賬號:sampadm 密碼:secret登錄該賬戶了,

4、DOS界面用戶登錄方式

首先你要配置路徑,
然后,登錄指令:mysql -h hostname -p -u username;
或者:mysql -p -u username; //本機登錄當然可以這樣了

退出會話可以使用:quit;

5、取消陳述句

當你輸入了好幾條陳述句,但是又不想執行,你會發現刪不掉,這時候就需要使用 \c
意會一下:
在這里插入圖片描述

6、資料庫操作

創建資料庫,名字叫sampdb:create database sampdb;

查詢當前使用資料庫:select database();

查看當前服務器下所有資料庫:show database;

指定當前使用資料庫為sampdb:use sampdb;

一條龍服務:
在這里插入圖片描述

7、資料表操作

創建資料表:
方式1:代碼撰寫

create table president
(
	last_name varchar(15) not null,
	first_name varchar(15) not null,
	suffix varchar(5) null,
	city varchar(20) not null,
	state varchar(2) not null,
	birth date not null,
	death date null
);

方式2:.sql檔案匯入
先進入sampdb檔案夾下,然后:source create_president.sql;

查看當前資料庫下資料表:

查看某一張表的列:desc tablename;

查看某些列:desc president '%name';

查看當前資料庫下所有表:show tables;

查看指定資料庫下所有表:show tables from sampdb;

8、往資料表中插入資料

普通插入一條資料:insert into student values('Kyle','M',NULL);

一次插入多條資料:insert into grade_event values('2008-09-03','Q',NULL),('2008-09-04','Q',NULL),('2008-09-05','Q',NULL);

往指定列(不可為空的列必須插上資料)插入資料:insert into member(member_id,last_name,first_name) values(20,'linfeng','wu');

一條龍服務:
在這里插入圖片描述

檔案匯入法:
source insert_president.sql;

接下來來這么一波配置,先把資料庫搭建好開始干別的了:
在這里插入圖片描述

9、從表中檢索資料

一干查詢陳述句我就不再細敘,這篇寫好了基礎的查詢陳述句:SQL陳述句學習

需要實操的時候,可以先用select *查出表中所有資料,然后再進行實操設計,

刪和改的陳述句也在里面了,

還需多加練習熟練各項基本操作,本章的操作和資料庫在在后續章節將持續被使用,

10、sampdb資料庫資料

鏈接:sampdb
提取碼:4td8

11、當前服務器下存盤引擎

1.使用show engines;以查看當前系統下所有引擎,如圖:
在這里插入圖片描述

圈出來那一行,yes就是有,no就是沒有,default就是系統默認的,一般是開著的,disabled就是有,但是被關了,

你每創建一個資料表,MySQL就會創建一個硬碟檔案來保存該資料表的格式(也就是它的定義),這個格式檔案的基本名和資料表的名字一樣, 擴展名是. frm.

比如說,如果資料表的名字是t,其格式檔案的名字就將是t. frm,你創建的資料表屬于哪個資料庫,服務器就會在該資料庫的資料庫子目錄里創建這個檔案,

. frm檔案的內容是不變的,不管是哪一個存盤引擎在管理資料表,每個資料表也只有-一個相應的. frm檔案,如果資料表的名字字符在檔案名里會引起麻煩,SQL 陳述句里使用的資料表的名字有可能與相應的. frm檔案的基本名(表名)不致具體到某個特定的存盤引擎,它還會為資料表再創建幾個特定的檔案以存盤其內容,

對于給定的資料表,與之相關的所有檔案都集中存放在這個資料表所在的資料庫的資料庫子目錄里,

存盤引擎有什么重要作用呢?開頭那三篇里面有介紹啦,

12、各存盤引擎特性

在這里插入圖片描述

13、如何選擇合適的存盤引擎

選擇標準:根據應用特點選擇合適的存盤引擎,對于復雜的應用系統可以根據實際情況選擇多種存盤引擎進行組合,

下面是常用存盤引擎的適用環境:

MyISAM:默認的MySQL插件式存盤引擎,它是在Web、資料倉儲和其他應用環境下最常使用的存盤引擎之一
InnoDB:用于事務處理應用程式,具有眾多特性,包括ACID事務支持,
Memory:將所有資料保存在RAM中,在需要快速查找參考和其他類似資料的環境下,可提供極快的訪問,
Merge:允許MySQL DBA或開發人員將一系列等同的MyISAM表以邏輯方式組合在一起,并作為1個物件參考它們,對于諸如資料倉儲等VLDB環境十分適合,

14、存盤引擎設定

創建資料表時設定存盤引擎:create table temp(i int) engine = innoDB;

這里插幾條,

warning查看方法

有時候雖然執行陳述句沒報錯,不過會有警告,但是警告不主動顯示,
如果我們想看,就要主動讓它顯示:show warnings;

只創建不存在的資料表

create table if not exit tablename;

重復創建表是會報錯的,

15、創建臨時資料表

臨時資料表會在與服務器斷開連接時自動銷毀,
創建方式:create temporary table tablename;

臨時表的表名可以和已存在的表相同,不過在臨時表存在期間那個永久表會被隱藏,
不過無法創建兩個同名的臨時表,

什么時候使用臨時表:比如說要做實驗的時候,你匯入一個外部檔案,但是你又不知道里面資料安全不安全,是吧,

16、從其他表中創建新表

1、create table tablename like othertable; 將另一個表的資料復制到新表中,
2、create table tablename select ...以查詢結果建表,

17、洗掉資料表

1、洗掉一張表:drop table tablename;
2、洗掉多張表:自己想

18、為資料表編制索引

1.存盤引的索引特性

MySQL提供了多種靈活的索引創建辦法,如下所示,

你可以為單個資料列編制索引,也可以為多個資料列構造復合索引,

索引可以只包含獨-無二的值,也可以包含重復的值,

你可以為同一個資料表創建多個索引并分別利用它們來優化基于不同資料列的查詢,

對于ENUM和SET以外的字串資料型別,可以只為資料列的-一個前緞創建索引,也就是為對最左邊的n個字符(對二進制字串型別來說就是最左邊的n個位元組)創建索引,(對于BLOB和TEXT資料列,你只有在指定了前綴長度的情況下才能創建-一個索引,)如果資料列在前綴長度范圍內具有足夠的獨一無二性,查詢性能通常不會受到影響,而是會得到改善:為資料列前綴而不是整個資料列編索引可以讓索引本身更小并加快訪問速度,

2.創建索引

MySQL可以創建好幾種索引,如下所示,

唯一索引,這種索引不允許索引項本身出現重復的值,對只涉及-一個資料列的素引來說,這意味著該資料列不能包含重復的值,對涉及多個資料列的索引(復合索引)來說,這意味著那幾個資料列的值的組合在整個資料表的范圍內不能出現重復,

普通(非唯一)索引,這種索引的優點(從另一方面看是缺點) 是允許索引值出現重復,0 FULLTEXT索引,用來進行全文檢索,這種索引只適用于MyISAM資料表,如果你想了解更多資訊,請參閱2.15節,

SPATIAL索引,這種索引只適用于MyISAM資料表和空間(spatial) 資料型別,對這種資料型別的描述見第3章,(對于其他支持空間資料型別的存盤引擎,你可以創建非SPATTAL索引.)

HASH索引,這是MEMORY資料表的默認索引型別,但你可以改用BTREE索引來代替這個默認索引,

alter table tablename add index index_name(index_columns);

tablename:要加索引的資料表
index_name:索引名
index_columns:要加索引的單列或多列,如果是多列要用逗號隔開,

  • 如果是一個primary key索引或spatial索引,則帶索引的列必須為not null,
  • 每個資料表只能有一個primary key,

索引干嘛用?開頭那三篇里面講的詳細了,

19、洗掉索引

drop index index_name on tablename;

20、Alter 改變資料表的結構

alter語法:alter table tablename action ...;

示例:
改變數提列的資料型別,如果想改變某個資料列的資料型別,可以使用CHANGE或MODIFY子句,假設mytbl資料表里的某個資料列的資料型別是SMALLIT UNSIGNED,你想把它改成MEDIUMITUNSIGNEID,下面兩條命令都可以達到目的:

ALTER TABLE mytbl MODIFY i MEDIUMINT UNSIGNED;

ALTER TABLB mytbl CHANGB i i MEDIUMINT UNSIGNED;

為什么在使用CHANGE子句時需要寫兩遍資料列的名字呢?因為CHANGE子句能夠(而MODIFY子句不能)做到的事情是在改變其資料型別的同時重新命名一個資料列,如果想在改變其資料型別的同時把資料列i重新命名為k,你可以這樣做:

ALTER TABLE mytbl CHANGE i k MEDIUMINT UNSIGNED;

在CHANGE子句里,需要先給出想改動的資料列的名字,然后給出它的新名字和新定義,因此,即使不想重新命名那個資料列,也需要把它的名字寫兩遍,

如果只想改變資料列的名字,不改變它的資料型別,先寫出CHANGE o1d name new_ name、再寫出資料列的當前定義即可,


重新命名-個資料表,用RENAME子句給資料表起-個新名字:

ALTER TABLE tbl name RENAME TO new_ tbl_ name;

另一個辦法是使用RENAMB TABLE 陳述句來重新命名資料表,下面是它的語法:

RENAME TABLE old name TO new_ name;

ALTER TABLE陳述句每次只能重新命名一個資料表,而RENAME TABLE陳述句可以一次重新命名多個資料表,比如說,你可以像下面這樣交換兩個資料表的名字:

RENAME TABLE t1 TO tmp, t2 TO t1, tmp TO t2;

如果在重新命名個資料表時在它的名字前面加上了資料庫名前級,就可以把它從一個資料庫移動到另一個資料庫,下面兩條陳述句都可以把資料表t從sampdb資料庫移到test資料庫去:

ALTER TABLE sampdb.t RENAME TO test. t;

RENAME TABLE sampdb.t TO test.t:

不能把一個資料表重新命名為一個已有的名字,

如果重新命名的某個MyISAM資料表是某個MERGE資料表的成員,你必須重新定義那個MERGE資料表,讓它使用那個MyISAM資料表的新名字,

21、獲取資料庫里的元資料

前面講的雜亂無章,整理一下:

 show databases;
 show create database sampdb;	//建庫陳述句查詢
 show tables;
 show create table score;	//建表陳述句查詢
 show columns from student;
 show index from student;
 show table status;		//查看資料表的描述性資訊

22、使用視圖

視圖是一種虛表,它是從資料表或其他視圖中抽取出資料形成的臨時表,用來提供查看資料的另一種方式,可以簡化應用程式,

創建視圖:

create view view_name as
select column1,column2... from table_name;

查詢視圖的方法和效果與普通資料表一樣,使用視圖時,你只能參考當前視圖中存在的資料列,

視圖可以用來自動完成必要的數學運算,我們可以把視圖運算放在一個視圖定義里運行,

23、事務處理

事務是作為一個不可分割的邏輯單元而被執行的一組SQL陳述句,如有必要,它們的執行效果可以被撤銷,
并非所有的陳述句每次都能被執行成功,
事務的處理是通過提交和回滾功能實作的,如果某個事務里的陳述句都執行完成了,提交該事務將把那些執行效果永久的記錄到資料庫里,如果在事務程序中發生錯誤,回滾該事務將把發生錯誤之前已經執行的陳述句全部撤銷,

事務的另一個用途就是確保某個操作所設計的資料行在你正在使用它們的時候不會被其他客戶所修改,
MySQL在執行每一條SQL陳述句時都會自動的對該陳述句所設計的資源進行鎖定以避免個陳述句之間相互干擾,但這仍不足以保證每一個資料庫操作總是能得到預期的結果,要知道,有的資料庫操作需要多條陳述句才能完成,而在此期間,不同的客戶就有可能互相干擾,
通過把多條陳述句組合成一個執行單元,事務機制可以防止多客戶環境里可能發生的并發問題,

使用事務處理為資料庫提供了強有力的保證,但這需要增加CPU、記憶體和硬碟空間等方面的開銷作為代價,
想要使用事務,就必須選擇一個支持事務的存盤引擎,如innoDB,

在這里插入圖片描述在這里插入圖片描述

要注意,有些陳述句時不能成為事務的一部分的,所以在事務中出現了這些陳述句,系統會自動將事務提交,如:

ALTER TABLE

CREATEINDEX

DROP DATABASE

DROP INDEX

DROP TABLE

LOCK TABLES

RENAME TABLE

SET autocommit = 1 (if not already set to 1)

每個版本的情況略有偏差,具體還得看官方檔案,

24、使用事務保存點

MySQL使你能夠對一個事務進行部分回滾,這就需要你在事務程序中使用savepoint陳述句設定一些稱為”保存點“的標記,在后續的事務里,如果你想回滾到某個特定的保存點,在rollback陳述句里給出該保存點的位置即可,

有圖有真相:
在這里插入圖片描述

25、外鍵使用

利用外鍵(foreign key)關系可以在某個資料表里宣告與另一個資料表里的某個索引相關聯的索引,還可以把你想施加在資料表上的約束條件放到外鍵關系里,讓系統根據這個關系里的規則來維護資料的參考完整性,比如說,sampdb 資料庫里的score資料表包含-一個student_ id 資料列,我們要用它把score資料表里的考試成績與student資料表里的學生聯系在-起,當我們在第1章里創建這些資料表時,我們在它們之間建立了一些明確的關系,其中之一-是把score. student_ id資料列定義為student. student_ id資料列的-一個外鍵,這可以確保只有那些在studnt資料表里存在student_ id值的資料行才能被插人到score資料表里,換句話說,這個外鍵可以確保不會出現為一名并不存在的學生輸入了成績的錯誤,

外鍵不僅在資料行的插人操作中很有用,在洗掉和更新操作中也很有用,比如說,我們可以建立這樣-一個約束條件:在把某個學生從student資料表里洗掉時,score 資料表里與這個學生有關的所有資料行也將自動被洗掉,這被稱為級聯洗掉(cascaded delete), 因為洗掉操作的效果就像瀑布(cascade)那樣從一一個資料表“流淌”到另外-一個資料表,級聯更新也是可能的,比如說,如果利用瀑布式更新在student資料表里改變了某個學生的student_ id, score 資料表里與這個學生相對應的所有資料行的這個值也應該發生相應的改變,

外鍵可以幫我們維護資料的一致性,它們用起來也很方便,如果不使用外鍵,就必須由你來負責保證資料表之間的依賴關系和維護它們的致性,而這意味著你的應用程式必須增加一-些必要的代碼,在某些情況下,這只需要你額外發出幾條DELETE陳述句以確保當你洗掉某個資料表里的資料行時,其他資料表里與之相對應的資料行也將隨之一起被洗掉,但額外作業畢竟是額外作業,而且既然資料庫引擎能夠替你進行資料一致性檢查,為什么不讓它干呢?要是你的資料表有非常復雜的關系,由你在你的應用程式里通過代碼去檢查這些依賴關系就會變得很麻煩,而資料庫系統提供的自動檢查能力往往要比你本人考慮得更周全和更細致,也更簡明實用,

示例:
在這里插入圖片描述

26、數值型別

數值類別

MySQL能夠識別和使用的資料值包括數值、字串值、日期/時間值、坐標值和空值(NULL),

特殊字串處理

SQL標準對于字串的兩端規定為單引號,

MySQL可以識別出字串中的轉義序列,這就很尷尬:
在這里插入圖片描述
那怎么辦?
首先,這表里的轉義序列是區分大小寫的,

從上面這個表來看,可以使用\來轉義\,

也可以使用轉義字符來轉義字串中的單引號和雙引號,

當然,處理字串中引號還有別的辦法:
1、如果引號與字串兩端引號相同,雙寫該引號,如:
‘I can ’ ’ t.’
“He said,” “I can 't.” " "

2、用不同引號把該字串包起來,如:
’ “I can’t .” ’
" He said,'I can ‘t.’ "

27、MySQL如何處理非法資料

在默認的情況下,MySQL按照以下規則處理“資料越界”和其他非正常資料:

  • 對于數值資料列或TIME資料列,超出合法范圍的值將被截短到最近的取值范圍邊界,然后把結果值存人資料庫,

  • 對于字串資料列(不包括ENUM和SET),太長的字串將被截短到資料列的最大長度,

  • 對ENUM和SET資料列的賦值操作取決于在資料列定義里給出的合法取值串列,如果你賦值給某個ENUM資料列的值不是合法成員,MySQL 將把“出錯”成員(也就是與零值成員相對應的空字串)賦值給該資料列,如果你賦值給某個SET資料列的值包含非合法子字串,MySQL將洗掉那些子字串而只把剩下來的東西賦值給該資料列,

  • 對于日期和時間資料列,非法值將被轉換為該型別的“零值”,

  • 如果在執行INSERT、REPLACE、 UPDATE、 LOAD DATA和ALTER TABLE等陳述句時發生上述轉換,MySQL將生成一條警告訊息, 在這幾種陳述句執行完畢之后,你可以用SHOW WARNINGS陳述句去查看警告訊息的內容,

  • 如果需要在插人或更新資料時進行更嚴格的檢查,可以啟用以下兩種SQL模式之- :

mysql> SET sql_ mode = ' STRICT_ALL_TABLES';
mysql> SET sql_ mode = ' STRICT_TRANS_TABLES';

28、運算子

算術運算子

在這里插入圖片描述

邏輯運算子

在這里插入圖片描述

比較運算子

在這里插入圖片描述

29、復合陳述句與陳述句分隔符

走到這一步了,也該知道MySQL的執行,如果沒什么特殊說明都是一個分號一句的,不過有些陳述句需要形成一個陳述句塊,就像函式的那個{}一樣,

在MySQL陳述句中,也有這樣的分隔符:

  • 復合陳述句由begin開頭,由end結尾,
  • 使用delimiter命令把mysql程式的陳述句分隔符定義為另一個字符或字串,它必須是在存盤例程的定義里沒有出現過的,這樣-來, mysql程式就不會把分號解釋為陳述句終止符了,它將把整個物件定義作為一條語 句傳遞給服務器,在定義完存盤程式之后,可以把mysql程式的陳述句終止符重新定義為分號,下面的例子在定義一一個存盤程序時把mysq1程式的默認分隔符臨時改變為$,然后在恢復了mysql程式的默認分隔符之后執行了那個存盤程序:

在這里插入圖片描述

30、觸發器

觸發器是與特定資料表相關聯的存盤程序,當相應的資料表被INSERT、DELETE 或UPDATE陳述句修改時,觸發器將自動執行,觸發器可以被設定成在這幾種陳述句處理每個資料行之前或之后觸發,觸發器的定義包括一-條將在觸發器被觸發時執行的陳述句,

觸發器要用CREATE TRIGGER陳述句來創建,在觸發器的定義里需要表明它將由哪種陳述句(INSERT、UPDATE或DELETE)觸發,是在資料行被修改之前還是之后被觸發,觸發器創建陳述句的基本語法如下所示:

CREATE TRIGGER trigger_ name  		# the trigger name

{BEFORE | AFTER}  					# when the trigger activates

{INSERT | UPDATE | DELETE }  		# what statement activates it

ON tbl_ name  						# the associated table

FOR EACH ROW trigger_ stmt;  		# what the trigger does

來個栗子看看:

CREATE TABLE t (percent INT, dt DATETIME);
delimiter $

CREATE TRIGGER bi_t BEFORE INSERT ON t

FOR EACH ROW BEGIN

SET NEW.dt = CURRENT TIMESTAMP;IF NEW.percent < 0 THEN

SET NEW.percent= 0;

ELSEIF NEW.percent> 100 THEN

SET NEW.percent = 100;

END IF;

ENDS

mysql> delimiter ;

關于存盤程式就弄一個觸發器吧,

31、索引的使用

索引為什么能提高查詢效率?

查找演算法了解多少?
樹、B樹、紅黑時、哈希表了解多少?了解的話自然就知道了,不了解的話,就去了解吧哈哈哈,辣個是基礎,不了解怎么行,

用來加快查詢的技術有很多,其中最重要的是索引,通常,能夠造成查詢速度最大差異的是索引的正確使用,很多時候,當查詢速度很慢時,添加上索引后就能迅速解決問題,但情況也不總是這樣,因為優化并不總是- -件簡單的事情,然而,在許多情況下,假如你不使用索引,那么試圖通過其他途徑來提高性能則純粹是浪費時間,你應該首先使用索引來最大程度地改進性能,然后再看是否還有其他技術可以采用,

挑選索引

創建、洗掉索引第二篇說過了,現在學習一下如何 “因時制宜” 地挑選索引

盡量為用來搜索、分類或分組的資料列編制索引,不要為用來輸出的資料列編制索引,

你懂得,

盡量為短小的值建立索引,或者說,建立索引的值,要盡量短小,

你懂得,
要是不懂那我講得清楚點:
1、索引是不是也要匹配?
2、索引是不是也要一張索引表來存盤?
3、呼叫索引是是不是要呼叫索引表?

為字串的前綴設定索引

利用慢查詢日志找出拖慢進度的SQL陳述句

在這里插入圖片描述
具體看上面三節課的筆記中的第二節,

32、MySQL的查詢優化程式

當你發出一個選取資料行的查詢陳述句時,MySQL就會分析它,并考慮是否可以對它進行優化以加快查詢,

那么,我們要如何來配合這個查詢優化程式的作業呢?

33、使用explain 陳述句來驗證優化器操作

explain陳述句放在select之前,
在這里插入圖片描述

34、其他話

盡量使用資料型別相同的資料列進行比較
對帶有索引的資料進行比較時,如果它們的資料型別相同,查詢性能就會高一些,如果它們的資料型別不同,查詢性能就會低一些,

盡量不要在like模式的開始位置使用通配符
避免過多使用MySQL的自動型別轉換功能

emmm,難搞哦,,,

在這里插入圖片描述


35、C++語言使用MySQL

我也是個新手,所以這個整理的可能會比較雜,蠻看,等入門之后在拿個小專案練一下就熟悉了,

1、Linux下的MySQL環境搭建

使用命令(安裝mysql):

sudo apt-get install mysql-server
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
sudo apt-get install emma

這要安不上,度娘在邊上,

2、頭檔案

//Linux下
//mysqltest.cpp 代碼如下:

#include <stdio.h>

//確保在/usr/include/mysql下有mysql.h檔案
#include "mysql/mysql.h"
//windows下
#include <WinSock2.h> // 進行網路編程需要winsock2.h
 
#include <mysql.h>
 
#pragma comment(lib, “libmysql.lib”)

后面的示例代碼是一份windows下的,不過建議大家熟悉之后改成Linux版本的,畢竟咱這學C++的嘛,跟Linux感情還是好一點,

3、初見廬山真面目

/*連接句柄 整個MYSQL開發的核心*/
MYSQL * mysql;
 
/*初始化*/
MYSQL *mysql_init(MYSQL *mysql);
 
/*設定連接選項*/
int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg);
 
/*打開連接*/
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);
 
/*執行SQL陳述句*/
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length);
/*如果SQL陳述句是C風格字串,可以直接用下面的函式*/
int mysql_query(MYSQL *mysql, const char *query);
 
/*SQL陳述句一般只能是一條陳述句,如果你想在一個函式呼叫中執行多個SQL陳述句,需要以;隔開,并且設定在打開連接時設定屬性*/
CLIENT_MULTI_STATEMENTS
/*或者對已經打開的連接進行以下函式呼叫設定,其中mysql為MYSQL的指標*/
mysql_set_server_option(mysql,MYSQL_OPTION_MULTI_STATEMENTS_ON);
 
/*如果執行的是一個有回傳結果的陳述句,可以用下列函式獲取結果*/
MYSQL_RES *mysql_use_result(MYSQL *mysql);
MYSQL_RES *mysql_store_result(MYSQL *mysql);
/*其中前一個函式只是初始化MYSQL_RES結構體,并不真正從服務器獲取結果,后一個函式直接將全部資料讀取到客戶端*/
 
/*MYSQL_RES結構體可以通過以下函式獲得資料*/
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
/*該函式回傳的MYSQL_ROW型別實際為 char** 型別,通過下標操作可以取得每一列的值*/
 
/*可以通過以下函式獲得結果集的列數*/
unsigned int mysql_field_count(MYSQL *mysql);
unsigned int mysql_num_fields(MYSQL_RES *result);
/*獲得結果集的行數*/
my_ulonglong mysql_num_rows(MYSQL_RES *result);
 
/*使用完結果集后一定要記得釋放*/
void mysql_free_result(MYSQL_RES *result);
 
/*如果執行的SQL陳述句是無回傳結果的,比如DELETE INSERT等,可以使用以下函式獲取影響行數*/
my_ulonglong mysql_affected_rows(MYSQL *mysql);
 
/*最后使用完連接后需要釋放*/
void mysql_close(MYSQL *mysql);
 
/*錯誤處理*/
/*MYSQL的函式基本都遵循C語言的編程習慣,當回傳值為整數時,0代表成功,非0代表失敗,當回傳指標時,NULL代表失敗*/
/*如果函式執行失敗,你可以通過下列函式獲得資訊*/
unsigned int mysql_errno(MYSQL *mysql);//錯誤代號
const char *mysql_error(MYSQL *mysql);//英文錯誤資訊

4、撥開迷霧,看下一層迷霧

①呼叫mysql_real_connect函式連接Mysql資料庫,

mysql_real_connect函式的原型如下:

MYSQL * STDCALL 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 clientflag);

引數釋義:

mysql:前面定義的MYSQL變數;
host:MYSQL服務器的地址;
user:登錄用戶名;
passwd:登錄密碼;
db:要連接的資料庫;
port:MYSQL服務器的TCP服務埠;
unix_socket:unix連接方式,為NULL時表示不使用socket或管道機制;
clientflag:Mysql運行為ODBC資料庫的標記,一般取0,

連接失敗時該函式回傳0,

②呼叫mysql_real_query函式進行資料庫查詢,

mysql_real_query函式的原型如下:

int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned long length);

引數釋義:

mysql:前面定義的MYSQL變數;
q:SQL查詢陳述句;
length:查詢陳述句的長度,

查詢成功則該函式回傳0,

③通過呼叫mysql_store_result或mysql_use_result函式回傳的MYSQL_RES變數獲取查詢結果資料,

兩個函式的原型分別為:

MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql);
 
MYSQL_RES * STDCALL mysql_use_result(MYSQL *mysql);

這兩個函式分別代表了獲取查詢結果的兩種方式,
第一種,呼叫mysql_store_result函式將從Mysql服務器查詢的所有資料都存盤到客戶端,然后讀取;
第二種,呼叫mysql_use_result初始化檢索,以便于后面一行一行的讀取結果集,而它本身并沒有從服務器讀取任何資料,這種方式較之第一種速度更快且所需記憶體更少,但它會系結服務器,阻止其他執行緒更新任何表,而且必須重復執行mysql_fetch_row讀取資料,直至回傳NULL,否則未讀取的行會在下一次查詢時作為結果的一部分回傳,
故經常我們使用mysql_store_result,

④呼叫mysql_fetch_row函式讀取結果集資料,

上述兩種方式最后都是重復呼叫mysql_fetch_row函式讀取資料,mysql_fetch_row函式的原型如下:

MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);

引數釋義:

result就是mysql_store_result或mysql_use_result的回傳值,

該函式回傳MYSQL_ROW型的變數,即字串陣列,假設為row,則row[i]為第i個欄位的值,當到結果集尾部時,此函式回傳NULL,

⑤結果集用完后,呼叫mysql_free_result函式釋放結果集,以防記憶體泄露,

mysql_free_result函式的原型如下:

void STDCALL mysql_free_result(MYSQL_RES *result);
⑥不再查詢Mysql資料庫時,呼叫mysql_close函式關閉資料庫連接,
void STDCALL mysql_close(MYSQL *sock);

5、看個實體融會貫通一下

就是個實體,也不是我寫的,我也是剛入門,

    #include <WinSock2.h>
    #include <mysql.h>
 	#include <iostream>
 	
    #pragma comment(lib, “libmysql.lib”)
    using namespace std;

  int main(){

    MYSQL mysql;
 
    MYSQL_RES *res;
 
    MYSQL_ROW row;
 
    // 初始化MYSQL變數
 
    mysql_init(&mysql);
 
    // 連接Mysql服務器,本例使用本機作為服務器,訪問的資料庫名稱為“msyql”,引數中的user為你的登錄用戶名,***為登錄密碼,需要根據你的實際用戶進行設定
 
    if (!mysql_real_connect(&mysql, “127.0.0.1”, “user”, “123”, “mysql”, 330600)){
 
    	cout << “mysql_real_connect failure!” << endl;
 
    	return 0;
    }
 
    // 查詢mysql資料庫中的user表
 
    if (mysql_real_query(&mysql, “select * from user”, (unsigned long)strlen(“select * from user”)))
 
    {
 
    	cout << “mysql_real_query failure!” << endl;
 
    	return 0;
    }
 
    // 存盤結果集
 
    res = mysql_store_result(&mysql);
 
    ifNULL == res)
 
    {
 
    	cout << “mysql_store_result failure!” << endl;
	 
	    return 0;
    }
 
    // 重復讀取行,并輸出第一個欄位的值,直到row為NULL
 
    while (row = mysql_fetch_row(res))
    {
    	cout << row[0<< endl;
    }
 
    // 釋放結果集
 
    mysql_free_result(res);
 
    // 關閉Mysql連接
 
    mysql_close(&mysql);
 
    return 0; 
}

本篇也是本次入門之旅的最后一篇,之后更要多加練習


碼字不易,確定不來個三連加關注嗎?一周后,你會驚奇的發現,成了粉絲可見了,,,

順手收藏一波好習慣,劃著劃著,可就找不到了,

在這里插入圖片描述

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/142088.html

標籤:其他

上一篇:明明用了校園網,上不去學校內網

下一篇:echarts實作組織結構圖

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more