MySQL見聞錄 - 入門之旅

      網友投稿 893 2025-04-01

      在網上翻來覆去找不到一套適合新手自學的書,于是買了課,急急忙忙上完了課,又發現全還給老師了。


      這一系列文放在這里,從下載軟件開始,記錄一條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';

      1

      2

      3

      完成對新用戶 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 databases;

      指定當前使用數據庫為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 );

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      方式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環境十分適合。

      1

      2

      3

      4

      14、存儲引擎設定

      創建數據表時設定存儲引擎:create table temp(i int) engine = innoDB;

      這里插幾條,

      有時候雖然執行語句沒報錯,不過會有警告,但是警告不主動顯示。

      如果我們想看,就要主動讓它顯示:show warnings;

      create table if not exit tablename;

      1

      重復創建表是會報錯的。

      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);

      1

      tablename:要加索引的數據表

      index_name:索引名

      index_columns:要加索引的單列或多列,如果是多列要用逗號隔開。

      如果是一個primary key索引或spatial索引,則帶索引的列必須為not null。

      每個數據表只能有一個primary key。

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

      19、刪除索引

      drop index index_name on tablename;

      1

      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;

      1

      2

      3

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

      ALTER TABLE mytbl CHANGE i k MEDIUMINT UNSIGNED;

      1

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

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

      重新命名-個數據表。用RENAME子句給數據表起-個新名字:

      ALTER TABLE tbl name RENAME TO new_ tbl_ name;

      1

      另一個辦法是使用RENAMB TABLE 語句來重新命名數據表。下面是它的語法:

      RENAME TABLE old name TO new_ name;

      1

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

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

      1

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

      ALTER TABLE sampdb.t RENAME TO test. t; RENAME TABLE sampdb.t TO test.t:

      1

      2

      3

      不能把一個數據表重新命名為一個已有的名字。

      如果重新命名的某個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; //查看數據表的描述性信息

      1

      2

      3

      4

      5

      6

      7

      22、使用視圖

      視圖是一種虛表,它是從數據表或其他視圖中抽取出數據形成的臨時表,用來提供

      查看數據

      的另一種方式,可以簡化應用程序。

      創建視圖:

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

      1

      2

      查詢視圖的方法和效果與普通數據表一樣,使用視圖時,你只能引用當前視圖中存在的數據列。

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

      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)

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

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

      24、使用事務保存點

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

      有圖有真相:

      MySQL見聞錄 - 入門之旅

      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';

      1

      2

      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

      1

      2

      3

      4

      5

      6

      7

      8

      9

      來個栗子看看:

      CREATE TABLE t (percent INT, dt DATETIME);

      1

      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 ;

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      關于存儲程序就弄一個觸發器吧。

      31、索引的使用

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

      查找算法了解多少?

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

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

      挑選索引

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

      你懂得。

      你懂得。

      要是不懂那我講得清楚點:

      1、索引是不是也要匹配?

      2、索引是不是也要一張索引表來存儲?

      3、調用索引是是不是要調用索引表?

      具體看上面三節課的筆記中的第二節。

      32、MySQL的查詢優化程序

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

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

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

      explain語句放在select之前,

      34、其他話

      盡量使用數據類型相同的數據列進行比較

      對帶有索引的數據進行比較時,如果它們的數據類型相同,查詢性能就會高一些,如果它們的數據類型不同,查詢性能就會低一些。

      盡量不要在like模式的開始位置使用通配符

      避免過多使用MySQL的自動類型轉換功能

      emmm,難搞哦。。。

      35、C++語言使用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

      1

      2

      3

      4

      5

      6

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

      //Linux下 //mysqltest.cpp 代碼如下: #include //確保在/usr/include/mysql下有mysql.h文件 #include "mysql/mysql.h"

      1

      2

      3

      4

      5

      6

      7

      //windows下 #include // 進行網絡編程需要winsock2.h #include #pragma comment(lib, “libmysql.lib”)

      1

      2

      3

      4

      5

      6

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

      /*連接句柄 整個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);//英文錯誤信息

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      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);

      1

      參數釋義:

      mysql:前面定義的MYSQL變量;

      host:MYSQL服務器的地址;

      user:登錄用戶名;

      passwd:登錄密碼;

      db:要連接的數據庫;

      port:MYSQL服務器的TCP服務端口;

      unix_socket:unix連接方式,為NULL時表示不使用socket或管道機制;

      clientflag:Mysql運行為ODBC數據庫的標記,一般取0。

      連接失敗時該函數返回0。

      mysql_real_query函數的原型如下:

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

      1

      參數釋義:

      mysql:前面定義的MYSQL變量;

      q:SQL查詢語句;

      length:查詢語句的長度。

      查詢成功則該函數返回0。

      兩個函數的原型分別為:

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

      1

      2

      3

      這兩個函數分別代表了獲取查詢結果的兩種方式。

      第一種,調用mysql_store_result函數將從Mysql服務器查詢的所有數據都存儲到客戶端,然后讀取;

      第二種,調用mysql_use_result初始化檢索,以便于后面一行一行的讀取結果集,而它本身并沒有從服務器讀取任何數據,這種方式較之第一種速度更快且所需內存更少,但它會綁定服務器,阻止其他線程更新任何表,而且必須重復執行mysql_fetch_row讀取數據,直至返回NULL,否則未讀取的行會在下一次查詢時作為結果的一部分返回。

      故經常我們使用mysql_store_result。

      上述兩種方式最后都是重復調用mysql_fetch_row函數讀取數據。mysql_fetch_row函數的原型如下:

      MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);

      1

      參數釋義:

      result就是mysql_store_result或mysql_use_result的返回值。

      該函數返回MYSQL_ROW型的變量,即字符串數組,假設為row,則row[i]為第i個字段的值。當到結果集尾部時,此函數返回NULL。

      mysql_free_result函數的原型如下:

      void STDCALL mysql_free_result(MYSQL_RES *result);

      1

      void STDCALL mysql_close(MYSQL *sock);

      1

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

      #include #include #include #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; }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      53

      54

      55

      56

      57

      58

      59

      60

      61

      62

      63

      64

      65

      66

      67

      68

      69

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

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

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

      MySQL 數據庫

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:excel表格求和等于0怎么辦(excel表格中求和為0)
      下一篇:設置文字格式(word如何批量設置文字格式)
      相關文章
      youjizz亚洲| 日本亚洲精品色婷婷在线影院| 亚洲中文字幕久久无码| 亚洲字幕在线观看| 亚洲欧洲一区二区| 7777久久亚洲中文字幕蜜桃| 久久久无码精品亚洲日韩蜜臀浪潮 | 亚洲JIZZJIZZ中国少妇中文| 久久久久久久久无码精品亚洲日韩| 亚洲色成人网站WWW永久四虎| 亚洲色大成网站WWW国产| 亚洲色大成网站www久久九| 亚洲AV综合色区无码一二三区| 亚洲AV永久无码精品一福利| 老司机亚洲精品影院在线观看| 综合一区自拍亚洲综合图区| 国产成人亚洲精品无码AV大片| 国产AV日韩A∨亚洲AV电影| 亚洲国产一区视频| 久久亚洲中文字幕精品一区| 亚洲精品中文字幕乱码三区| 亚洲av综合avav中文| 亚洲伊人久久大香线蕉苏妲己| 亚洲视频小说图片| 亚洲AV成人噜噜无码网站| 亚洲综合av一区二区三区不卡 | 国产成人精品日本亚洲网址| 一本色道久久综合亚洲精品蜜桃冫| 亚洲人成色777777老人头| 国产偷国产偷亚洲清高APP| jlzzjlzz亚洲乱熟在线播放| 国产亚洲色婷婷久久99精品| 亚洲自偷自拍另类12p| 亚洲伊人久久大香线蕉影院| 亚洲日韩AV无码一区二区三区人| 国产精品国产亚洲区艳妇糸列短篇 | 亚洲午夜精品第一区二区8050| 亚洲色欲久久久综合网 | 激情婷婷成人亚洲综合| 亚洲色精品aⅴ一区区三区| 亚洲高清在线视频|