在網上翻來覆去找不到一套適合新手自學的書,于是買了課,急急忙忙上完了課,又發現全還給老師了,
這一系列文放在這里,從下載軟體開始,記錄一條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”, 3306, 0, 0)){
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);
if (NULL == 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實作組織結構圖
