本文目錄一覽:
- 1、實例講解如何使用C++操作MySQL數據庫類
- 2、詳解mysql的limit經典用法及優化實例
- 3、php mysql insert into 結合詳解及實例代碼
- 4、什麼是mysql多實例,如何配置mysql多實例
- 5、如何新建立一個mysql實例?
- 6、mysql中的一些稍微複雜用法實例代碼
實例講解如何使用C++操作MySQL數據庫類
/* * project: * 通用模塊 ( 用 c++ 處理 mysql 數據庫類,像ADO ) * * description: * * 通過DataBase,RecordSet,Record,Field類,實現對mysql數據庫的操作 * 包括連接、修改、添加、刪除、查詢等等,像ADO一樣操作數據庫,使 * 用方便 * * ( the end of this file have one sample, * welcom to use… ) * * * file:zlb_mysql.h * * author: @ zlb * * time:2005-12-12 * * * –*/ #ifndef ZLB_MYSQL_H #define ZLB_MYSQL_H #include “mysql.h” #include iostream #include vector #include string using namespace std; namespace zlb_mysql{ /* * 字段操作 */ class Field { public : /* 字段名稱 */ vectorstring m_name; /* 字段類型 */ vectorenum_field_types m_type; public : Field(); ~Field(); /* 是否是數字 */ bool IsNum(int num); /* 是否是數字 */ bool IsNum(string num); /* 是否是日期 */ bool IsDate(int num); /* 是否是日期 */ bool IsDate(string num); /* 是否是字符 */ bool IsChar(int num); /* 是否是字符 */ bool IsChar(string num); /* 是否為二進制數據 */ bool IsBlob(int num); /* 是否為二進制數據 */ bool IsBlob(string num); /* 得到指定字段的序號 */ int GetField_NO(string field_name); }; /* * 1 單條記錄 * 2 [int ]操作 [“”]操作 */ class Record { public: /* 結果集 */ vectorstring m_rs; /* 字段信息 佔用4字節的內存 當記錄數很大是回產生性能問題 */ Field *m_field; public : Record(){}; Record(Field* m_f); ~Record(); void SetData(string value); /* [“”]操作 */ string operator[](string s); string operator[](int num); /* null值判斷 */ bool IsNull(int num); bool IsNull(string s); /* 用 value tab value 的形式 返回結果 */ string GetTabText(); }; /* * 1 記錄集合 * 2 [int ]操作 [“”]操作 * 3 表結構操作 * 4 數據的插入修改 */ class RecordSet { private : /* 記錄集 */ vectorRecord m_s; /* 游標位置*/ unsigned long pos; /* 記錄數 */ int m_recordcount; /* 字段數 */ int m_field_num; /* 字段信息 */ Field m_field; MYSQL_RES * res ; MYSQL_FIELD * fd ; MYSQL_ROW row; MYSQL* m_Data ; public : RecordSet(); RecordSet(MYSQL *hSQL); ~RecordSet(); /* 處理返回多行的查詢,返回影響的行數 */ int ExecuteSQL(const char *SQL); /* 得到記錄數目 */ int GetRecordCount(); /* 得到字段數目 */ int GetFieldNum(); /* 向下移動游標 */ long MoveNext(); /* 移動游標 */ long Move(long length); /* 移動游標到開始位置 */ bool MoveFirst(); /* 移動游標到結束位置 */ bool MoveLast(); /* 獲取當前游標位置 */ unsigned long GetCurrentPos()const; /* 獲取當前游標的對應字段數據 */ bool GetCurrentFieldValue(const char * sFieldName,char *sValue); bool GetCurrentFieldValue(const int iFieldNum,char *sValue); /* 獲取游標的對應字段數據 */ bool GetFieldValue(long index,const char * sFieldName,char *sValue); bool GetFieldValue(long index,int iFieldNum,char *sValue); /* 是否到達游標尾部 */ bool IsEof(); /* 返回字段 */ Field* GetField(); /* 返回字段名 */ const char * GetFieldName(int iNum); /* 返回字段類型 */ const int GetFieldType(char * sName); const int GetFieldType(int iNum); /* 返回指定序號的記錄 */ Record operator[](int num); }; /* * 1 負責數據庫的連接關閉 * 2 執行sql 語句(不返回結果) * 3 處理事務 */ class DataBase { public : DataBase(); ~DataBase(); private : /* msyql 連接句柄 */ MYSQL* m_Data; public : /* 返回句柄 */ MYSQL * GetMysql(); /* 連接數據庫 */ int Connect(string host, string user, string passwd, string db, unsigned int port, unsigned long client_flag); /* 關閉數據庫連接 */ void DisConnect(); /* 執行非返回結果查詢 */ int ExecQuery(string sql); /* 測試mysql服務器是否存活 */ int Ping(); /* 關閉mysql 服務器 */ int ShutDown(); /* 主要功能:重新啟動mysql 服務器 */ int ReBoot(); /* * 說明:事務支持InnoDB or BDB表類型 */ /* 主要功能:開始事務 */ int Start_Transaction(); /* 主要功能:提交事務 */ int Commit(); /* 主要功能:回滾事務 */ int Rollback(); /* 得到客戶信息 */ const char * Get_client_info(); /* 主要功能:得到客戶版本信息 */ const unsigned long Get_client_version(); /* 主要功能:得到主機信息 */ const char * Get_host_info(); /* 主要功能:得到服務器信息 */ const char * Get_server_info(); /*主要功能:得到服務器版本信息*/ const unsigned long Get_server_version(); /*主要功能:得到 當前連接的默認字符集*/ const char * Get_character_set_name(); /* 主要功能返回單值查詢 */ char * ExecQueryGetSingValue(string sql); /* 得到系統時間 */ const char * GetSysTime(); /* 建立新數據庫 */ int Create_db(string name); /* 刪除制定的數據庫*/ int Drop_db(string name); }; }; #endif //ZLB_MYSQL_H /* * project: * 通用模塊 ( 用 c++ 處理 mysql 數據庫類,像ADO ) * * description: * * 通過DataBase,RecordSet,Record,Field類,實現對mysql數據庫的操作 * 包括連接、修改、添加、刪除、查詢等等,像ADO一樣操作數據庫,使 * 用方便 * * ( the end of this file have one sample, * welcom to use… ) * * * file:zlb_mysql.cpp * * author: @ zlb * * time:2005-12-12 * * * –*/ #include “stdafx.h” #include “zlb_mysql.h” namespace zlb_mysql{ /* +++++++++++++++++++++++++++++++++++++++++++++++++++ */ /* * 字段操作 */ Field::Field(){} Field::~Field(){} /* * 是否是數字 */ bool Field::IsNum(int num) { if(IS_NUM(m_type[num])) return true; else return false; } /* * 是否是數字 */ bool Field::IsNum(string num) { if(IS_NUM(m_type[GetField_NO(num)])) return true; else return false; } /* * 是否是日期 */ bool Field::IsDate(int num) { if( FIELD_TYPE_DATE == m_type[num] || FIELD_TYPE_DATETIME == m_type[num] ) return true; else return false; } /* 是否是日期 */ bool Field::IsDate(string num) { int temp; temp=GetField_NO(num); if(FIELD_TYPE_DATE == m_type[temp] || FIELD_TYPE_DATETIME == m_type[temp] ) return true; else return false; } /* * 是否是字符 */ bool Field::IsChar(int num) { if(m_type[num]==FIELD_TYPE_STRING || m_type[num]==FIELD_TYPE_VAR_STRING || m_type[num]==FIELD_TYPE_CHAR ) return true; else return false; } /* * 是否是字符 */ bool Field::IsChar(string num) { int temp; temp=this-GetField_NO (num); if(m_type[temp]==FIELD_TYPE_STRING || m_type[temp]==FIELD_TYPE_VAR_STRING || m_type[temp]==FIELD_TYPE_CHAR ) return true; else return false; } /* * 是否為二進制數據 */ bool Field::IsBlob(int num) { if(IS_BLOB(m_type[num])) return true; else return false; } /* * 是否為二進制數據 */ bool Field::IsBlob(string num) { if(IS_BLOB(m_type[GetField_NO(num)])) return true; else return false; } /* * 得到指定字段的序號 */ int Field::GetField_NO(string field_name) { for(unsigned int i=0;im_name.size ();i++) { if(!m_name[i].compare (field_name)) return i; } return -1; } /*—————————————————–*/ /* +++++++++++++++++++++++++++++++++++++++++++++++++++ */ /* * 1 單條記錄 * 2 [int ]操作 [“”]操作 */ Record::Record(Field * m_f) { m_field =m_f; } Record::~Record(){}; void Record::SetData(string value) { m_rs.push_back (value); } /* [“”]操作 */ string Record::operator[](string s) { return m_rs[m_field-GetField_NO(s)]; } string Record::operator[](int num) { return m_rs[num]; } /* null值判斷 */ bool Record::IsNull(int num) { if(“” == m_rs[num].c_str ()) return true; else return false; } bool Record::IsNull(string s) { if(“” == m_rs[m_field-GetField_NO(s)].c_str()) return true; else return false; } /* 主要-功能:用 value tab value 的形式 返回結果 */ string Record::GetTabText() { string temp; for(unsigned int i=0 ;im_rs.size();i++) { temp+=m_rs[i]; if(im_rs.size ()-1) temp+=”\t”; } return temp; } /*—————————————————–*/ /* +++++++++++++++++++++++++++++++++++++++++++++++++++ */ /* * 1 記錄集合 * 2 [int ]操作 [“”]操作 * 3 表結構操作 * 4 數據的插入修改 */ RecordSet::RecordSet() { res = NULL; row = NULL; pos = 0; } RecordSet::RecordSet(MYSQL *hSQL) { res = NULL; row = NULL; m_Data = hSQL; pos = 0; } RecordSet::~RecordSet() { } /* * 處理返回多行的查詢,返回影響的行數 * 成功返回行數,失敗返回-1 */ int RecordSet::ExecuteSQL(const char *SQL) { if ( !mysql_real_query(m_Data,SQL,strlen(SQL))) { //保存查詢結果 res = mysql_store_result(m_Data ); //得到記錄數量 m_recordcount = (int)mysql_num_rows(res) ; //得到字段數量 m_field_num = mysql_num_fields(res) ; for (int x = 0 ; fd = mysql_fetch_field(res); x++) { m_field.m_name.push_back(fd-name); m_field.m_type.push_back(fd-type); } //保存所有數據 while (row = mysql_fetch_row(res)) { Record temp(m_field); for (int k = 0 ; k m_field_num ; k++ ) { if(row[k]==NULL||(!strlen(row[k]))) { temp.SetData (“”); } else { temp.SetData(row[k]); } } //添加新記錄 m_s.push_back (temp); } mysql_free_result(res ) ; return m_s.size(); } return -1; } /* * 向下移動游標 * 返回移動後的游標位置 */ long RecordSet::MoveNext() { return (++pos); } /* 移動游標 */ long RecordSet::Move(long length) { int l = pos + length; if(l0) { pos = 0; return 0; }else { if(l = m_s.size()) { pos = m_s.size()-1; return pos; }else { pos = l; return pos; } } } /* 移動游標到開始位置 */ bool RecordSet::MoveFirst() { pos = 0; return true; } /* 移動游標到結束位置 */ bool RecordSet::MoveLast() { pos = m_s.size()-1; return true; } /* 獲取當前游標位置 */ unsigned long RecordSet::GetCurrentPos()const { return pos; } /* 獲取當前游標的對應字段數據 */ bool RecordSet::GetCurrentFieldValue(const char * sFieldName, char *sValue) { strcpy(sValue,m_s[pos][sFieldName].c_str()); return true; } bool RecordSet::GetCurrentFieldValue(const int iFieldNum,char *sValue) { strcpy(sValue,m_s[pos][iFieldNum].c_str()); return true; } /* 獲取游標的對應字段數據 */ bool RecordSet::GetFieldValue(long index,const char * sFieldName, char *sValue) { strcpy(sValue,m_s[index][sFieldName].c_str()); return true; } bool RecordSet::GetFieldValue(long index,int iFieldNum,char *sValue) { strcpy(sValue,m_s[index][iFieldNum].c_str()); return true; } /* 是否到達游標尾部 */ bool RecordSet::IsEof() { return (pos == m_s.size())?true:false; } /* * 得到記錄數目 */ int RecordSet::GetRecordCount() { return m_recordcount; } /* * 得到字段數目 */ int RecordSet::GetFieldNum() { return m_field_num; } /* * 返回字段 */ Field * RecordSet::GetField() { return m_field; } /* 返回字段名 */ const char * RecordSet::GetFieldName(int iNum) { return m_field.m_name.at(iNum).c_str(); } /* 返回字段類型 */ const int RecordSet::GetFieldType(char * sName) { int i = m_field.GetField_NO(sName); return m_field.m_type.at(i); } const int RecordSet::GetFieldType(int iNum) { return m_field.m_type.at(iNum); } /* * 返回指定序號的記錄 */ Record RecordSet::operator[](int num) { return m_s[num]; } /* ————————————————– */ /* +++++++++++++++++++++++++++++++++++++++++++++++++++ */ /* * 1 負責數據庫的連接關閉 * 2 執行sql 語句(不返回結果) * 3 處理事務 */ DataBase::DataBase() { m_Data = NULL; } DataBase::~DataBase() { if(NULL != m_Data) { DisConnect(); } } /* 返回句柄 */ MYSQL * DataBase::GetMysql() { return m_Data; } /* * 主要功能:連接數據庫 * 參數說明: * 1 host 主機ip地址或者時主機名稱 * 2 user 用戶名 * 3 passwd 密碼 * 4 db 欲連接的數據庫名稱 * 5 port 端口號 * 6 uinx 嵌套字 * 7 client_flag 客戶連接參數 * 返回值: 0成功 -1 失敗 */ int DataBase::Connect(string host, string user, string passwd, string db, unsigned int port, unsigned long client_flag) { if((m_Data = mysql_init(NULL)) mysql_real_connect( m_Data, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(),port , NULL, client_flag)) { //選擇制定的數據庫失敗 if ( mysql_select_db( m_Data, db.c_str () ) 0 ) { mysql_close( m_Data) ; return -1 ; } } else { //初始化mysql結構失敗 mysql_close( m_Data ); return -1 ; } //成功 return 0; } /* * 關閉數據庫連接 */ void DataBase::DisConnect( ) { mysql_close(m_Data) ; } /* * 主要功能: 執行非返回結果查詢 * 參數:sql 待執行的查詢語句 * 返回值; n為成功 表示受到影響的行數 -1 為執行失敗 */ int DataBase::ExecQuery(string sql) { if(!mysql_real_query(m_Data,sql.c_str (),(unsigned long)sql.length()) ) { //得到受影響的行數 return (int)mysql_affected_rows(m_Data) ; } else { //執行查詢失敗 return -1; } } /* * 主要功能:測試mysql服務器是否存活 * 返回值:0 表示成功 -1 失敗 */ int DataBase::Ping() { if(!mysql_ping(m_Data)) return 0; else return -1; } /* * 主要功能:關閉mysql 服務器 * 返回值;0成功 -1 失敗 */ int DataBase::ShutDown() { if(!mysql_shutdown(m_Data,SHUTDOWN_DEFAULT)) return 0; else return -1; } /* * 主要功能:重新啟動mysql 服務器 * 返回值;0表示成功 -1 表示失敗 */ int DataBase::ReBoot() { if(!mysql_reload(m_Data)) return 0; else return -1; } /* * 說明:事務支持InnoDB or BDB表類型 */ /* * 主要功能:開始事務 */ int DataBase::Start_Transaction() { if(!mysql_real_query(m_Data, “START TRANSACTION” , (unsigned long)strlen(“START TRANSACTION”) )) { return 0; } else //執行查詢失敗 return -1; } /* * 主要功能:提交事務 * 返回值:0 表示成功 -1 表示失敗 */ int DataBase::Commit() { if(!mysql_real_query( m_Data, “COMMIT”, (unsigned long)strlen(“COMMIT”) ) ) { return 0; } else //執行查詢失敗 return -1; } /* * 主要功能:回滾事務 * 返回值:0 表示成功 -1 表示失敗 */ int DataBase::Rollback() { if(!mysql_real_query(m_Data, “ROLLBACK”, (unsigned long)strlen(“ROLLBACK”) ) ) return 0; else //執行查詢失敗 return -1; } /* 得到客戶信息 */ const char * DataBase::Get_client_info() { return mysql_get_client_info(); } /*主要功能:得到客戶版本信息*/ const unsigned long DataBase::Get_client_version() { return mysql_get_client_version(); } /* 主要功能:得到主機信息 */ const char * DataBase::Get_host_info() { return mysql_get_host_info(m_Data); } /* 主要功能:得到服務器信息 */ const char * DataBase::Get_server_info() { return mysql_get_server_info( m_Data ); } /* 主要功能:得到服務器版本信息 */ const unsigned long DataBase::Get_server_version() { return mysql_get_server_version(m_Data); } /*主要功能:得到 當前連接的默認字符集*/ const char * DataBase::Get_character_set_name() { return mysql_character_set_name(m_Data); } /* * 主要功能返回單值查詢 */ char * DataBase::ExecQueryGetSingValue(string sql) { MYSQL_RES * res; MYSQL_ROW row ; char *p = NULL; if(!mysql_real_query( m_Data, sql.c_str(),(unsigned long)sql.length())) { //保存查詢結果 res = mysql_store_result( m_Data ) ; row = mysql_fetch_row( res ) ; p = ((row[0]==NULL)||(!strlen(row[0])))?”-1″:row[0]; mysql_free_result( res ) ; } else //執行查詢失敗 p = “-1”; return p; } /* * 得到系統時間 */ const char * DataBase::GetSysTime() { return ExecQueryGetSingValue(“select now()”); } /* * 主要功能:建立新數據庫 * 參數:name 為新數據庫的名稱 * 返回:0成功 -1 失敗 */ int DataBase::Create_db(string name) { string temp ; temp=”CREATE DATABASE “; temp+=name; if(!mysql_real_query( m_Data,temp.c_str () , (unsigned long)temp.length ()) ) return 0; else //執行查詢失敗 return -1; } /* * 主要功能:刪除制定的數據庫 * 參數:name 為欲刪除數據庫的名稱 * 返回:0成功 -1 失敗 */ int DataBase::Drop_db(string name) { string temp ; temp=”DROP DATABASE “; temp+=name; if(!mysql_real_query( m_Data,temp.c_str () , (unsigned long)temp.length ()) ) return 0; else //執行查詢失敗 return -1; } /*—————————————————–*/ }; /* * 使用例子 */ #include “zlb_mysql.h” using namespace std; void main() { zlb_mysql::DataBase zlb; //連接數據庫 if(-1 == zlb.Connect(“localhost”/*本地數據庫,可以是遠程 ip*/, “root”/*用戶名*/,”apple”/*密碼*/, “test”/*數據庫名*/, 0,0/*兩個標誌,mysql文檔有說明,一般為0*/)) { std::cout”connect failed “std::endl; } else { std::cout”connect success”std::endl; } //通過返回的數據庫句柄,建立記錄急,你可以通過返回的這個句柄建立多個記錄急 zlb_mysql::RecordSet rs(zlb.GetMysql()); rs.ExecuteSQL(“select * from testtable”);//這個語句大家都知道是什麼意思了 coutrs.GetRecordCount()/*返回的總的記錄數*/endl; coutrs.GetFieldNum()/*返回的總的字段數*/endl; coutrs[0].GetTabText()/*返回第一條記錄,你也可以rs[1].GetTabText() 如果你有多條記錄, */ endl; /*實現遍列,也可以使用後面的遍列方式*/ for(int i=0;irs.GetRecordCount();++i) { for(int j =0;jrs.GetFieldNum();++j) coutrs[i][j]; coutendl; } zlb_mysql::Field *fd = rs.GetField();/*你可以通過這樣的方式,獲取字段的信息*/ coutfd-GetField_NO(“Password”)/*返回我表裡的 Password 字段的位置,不 是記錄的位置*/ endl; coutrs[0][“Password”]endl;/*輸出第0行第Password列的值*/ coutrs[0][fd-GetField_NO(“Password”)]endl;/*你也可以這樣*/ coutrs.GetFieldName(0)/*獲取字段的名字*/endl; coutrs.GetFieldType(“UserName”)/*獲取字段的類型,是mysql里定義的*/endl; coutrs.GetCurrentPos()/*獲取當前記錄的位置*/endl; char s[50]; rs.GetCurrentFieldValue(1,s);/*獲取當前記錄對應字段的值*/ coutsendl; coutrs.Move(1)endl;/*移動游標,正數往前 負數往後*/ coutrs.GetCurrentPos()endl; rs.GetCurrentFieldValue(1,s); coutsendl; rs.MoveFirst();/*移動游標到最前*/ while(!rs.IsEof()/*判斷是否到達游標尾,實現遍列*/) { rs.GetCurrentFieldValue(“UserName”,s); couts”\t”; rs.GetCurrentFieldValue(“Password”,s); couts”\t
“; rs.MoveNext(); } rs.GetFieldValue(0,”UserName”,s);/*獲取指定行 的記錄值*/ couts”\t”; rs.GetFieldValue(0,”Password”,s); couts”\t
“; }
詳解mysql的limit經典用法及優化實例
用法一
複製代碼
代碼如下:
SELECT
`keyword_rank`.*
FROM
`keyword_rank`
WHERE
(advertiserid=’59’)
LIMIT
2
OFFSET
1;
比如這個SQL
,limit後面跟的是2條數據,offset後面是從第1條開始讀取。
用法二
複製代碼
代碼如下:
SELECT
`keyword_rank`.*
FROM
`keyword_rank`
WHERE
(advertiserid=’59’)
LIMIT
2,1;
而這個SQL,limit後面是從第2條開始讀,讀取1條信息。
這兩個千萬別搞混哦。
用法三
複製代碼
代碼如下:
select
*
from
tablename
條件語句
limit
100,-1
從第100條後開始-最後一條的記錄
用法四
複製代碼
代碼如下:
select
*
from
tablename
條件語句
limit
15
相當於limit
0,15
.查詢結果取前15條數據用法五
mysql低版本不支持limit
offset
limit
offset
在mysql
4.0以上的版本中都可以正常運行,在舊版本的mysql
3.23中無效
limit
m
offset
n
等價於
limit
m,n
limit
的優化
mysql的limit給分頁帶來了極大的方便,但數據量一大的時候,limit的性能就急劇下降
來源:一畝三分地博客
MYSQL的優化是非常重要的。其他最常用也最需要優化的就是limit。mysql的limit給分頁帶來了極大的方便,但數據量一大的時候,limit的性能就急劇下降。
同樣是取10條數據
複製代碼
代碼如下:
select
*
from
yanxue8_visit
limit
10000,10
select
*
from
yanxue8_visit
limit
0,10
就不是一個數量級別的。
網上也很多關於limit的五條優化準則,都是翻譯自mysql手冊,雖然正確但不實用。今天發現一篇文章寫了些關於limit優化的,很不錯。
文中不是直接使用limit,而是首先獲取到offset的id然後直接使用limit
size來獲取數據。根據他的數據,明顯要好於直接使用limit。這裡我具體使用數據分兩種情況進行測試。(測試環境win2033+p4雙核
(3GHZ)
+4G內存
mysql
5.0.19)
1、offset比較小的時候。
複製代碼
代碼如下:
select
*
from
yanxue8_visit
limit
10,10
多次運行,時間保持在0.0004-0.0005之間
複製代碼
代碼如下:
Select
*
From
yanxue8_visit
Where
vid
>=(
Select
vid
From
yanxue8_visit
Order
By
vid
limit
10,1
)
limit
10
多次運行,時間保持在0.0005-0.0006之間,主要是0.0006
結論:偏移offset較小的時候,直接使用limit較優。這個顯然是子查詢的原因。
2、offset大的時候。
複製代碼
代碼如下:
select
*
from
yanxue8_visit
limit
10000,10
多次運行,時間保持在0.0187左右
複製代碼
代碼如下:
Select
*
From
yanxue8_visit
Where
vid
>=(
Select
vid
From
yanxue8_visit
Order
By
vid
limit
10000,1
)
limit
10
多次運行,時間保持在0.0061左右,只有前者的1/3。可以預計offset越大,後者越優。
以後要注意改正自己的limit語句,優化一下mysql了
php mysql insert into 結合詳解及實例代碼
php
mysql
insert
into
結合詳解
ySQL
INSERT
INTO語句在實際應用中是經常使用到的語句,所以對其相關的內容還是多多掌握為好。
向數據庫表插入數據
INSERT
INTO
語句用於向數據庫表添加新記錄。
語法
INSERT
INTO
table_name
VALUES
(value1,
value2,….)
您還可以規定希望在其中插入數據的列:
INSERT
INTO
table_name
(column1,
column2,…)
VALUES
(value1,
value2,….)
注釋:SQL
語句對大小寫不敏感。INSERT
INTO
與
insert
into
相同。
1.insert語句一次可以插入多組值,每組值用一對圓括號括起來,用逗號分隔,如下:
insert
into
`news`(title,body,time)
values(‘title
1′,’body
1′,now()),(‘title
2′,’body
2′,now());
2.Insert
Select
語句,將查詢的結果插入到新的表,顧名思義,它由一條insert語句和一條select語句組成
insert
into
news_one(id,title,body,time)
select
id,title,body,time
from
news_two;
要注意的是,這兩個表的結構要完全相同,列名可以不同。
在php中使用方法
下面是
“insert.php”
頁面的代碼:
?php
$con
=
mysql_connect(“localhost”,”peter”,”abc123″);
if
(!$con)
{
die(‘Could
not
connect:
‘
.
mysql_error());
}
mysql_select_db(“my_db”,
$con);
$sql=”INSERT
INTO
Persons
(FirstName,
LastName,
Age)
VALUES
(‘$_POST[firstname]’,’$_POST[lastname]’,’$_POST[age]’)”;
if
(!mysql_query($sql,$con))
{
die(‘Error:
‘
.
mysql_error());
}
echo
“1
record
added”;
mysql_close($con)
?
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
什麼是mysql多實例,如何配置mysql多實例
mysql的多實例有兩種方式可以實現,兩種方式各有利弊。第一種是使用多個配置文件啟動不同的進程來實現多實例,這種方式的優勢邏輯簡單,配置簡單,缺點是管理起來不太方便。第二種是通過官方自帶的mysqld_multi使用單獨的配置文件來實現多實例,這種方式定製每個實例的配置不太方面,優點是管理起來很方便,集中管理。
如何新建立一個mysql實例?
在原有實例下創建副本應該可以達到效果。
大多情況下,需要可靠而有效地克隆 MySQL 實例數據。這包括 MySQL 高可用的解決方案,其中需要在將實例加入組複製集群之前配置實例,或者在經典複製模型中將其添加為 Slave。
為複製拓撲而創建 MySQL 副本一直很麻煩。涉及的步驟很多,首先要備份 MySQL 服務器,通過網絡將備份傳輸到我們想要添加到複製集的新 MySQL 節點,然後在該節點上恢復備份並手動啟動 MySQL 服務器。為了高可用,最好還要將其正確設置備份的 GTID,並啟動並運行群集。涉及的手動步驟數量過多不利於高可用。CLONE 插件解決了這個問題並簡化了副本配置。使您可以使用 MySQL 客戶端(和 SQL 命令)來配置新節點並在發生時觀察克隆進度。無需手動處理多個步驟並維護自己的基礎架構來配置新的 MySQL 節點。
MySQL 8.0.17 引入了 CLONE SQL 語句,使當前的 MySQL 服務器成為另一個運行在不同節點的 MySQL 服務器的“克隆”。我們將執行 clone 語句的服務器實例稱為“受體”。克隆的源服務器實例稱為“供體”。供體克隆以一致的快照存儲在 InnoDB 存儲引擎中的所有數據和元數據,以替換受體中的數據。
成功執行 CLONE SQL 語句後,將自動重新啟動受體服務器。重新啟動涉及恢復克隆的快照數據,就像用老方法複製數據一樣。恢復完成後,受體就是供體的克隆版,隨時可以使用!
這裡有一些關於克隆過程的重要注意事項。
不克隆 MySQL 配置參數,並且受體保留所有原始配置參數,如克隆之前。這樣做是因為許多配置可能特定於節點(例如 PORT),因此保留它們似乎是一個不錯的選擇。另一方面,一些存儲配置確實需要在供體和受體之間匹配(例如 innodbpagesize),如果這樣的配置參數不匹配,CLONE 將報告錯誤。
CLONE 插件不會克隆二進制日誌。
CLONE 插件目前僅支持 InnoDB 存儲引擎。在其他存儲引擎(如 MyISAM 和 CSV)中創建的表將被克隆為空表。克隆基礎架構的設計允許克隆 MySQL 支持的任何存儲引擎。但是,只有 InnoDB 序列化和反序列化方法已經實現並經過測試。
克隆會阻止供體中的所有並發 DDL。
需要注意的事實是受體放棄所有數據以及任何二進制日誌,以便成為供體實例的克隆。在執行 CLONE 之前,如果認為有必要,需要備份當前受體數據。
mysql中的一些稍微複雜用法實例代碼
前言
mysql的語法相信對大家來說都不是難事,但是本文主要給分享了一些mysql複雜用法的相關內容,通過這篇文章相信大家會對mysql更深的了解一些,下面話不多說了,來一起看看詳細的介紹吧
一對多數據顯示成一行
GROUP_CONCAT(expr)
1、涉及的表關係:teacher表、teacher_subject_rel表(教師所能教的學科表)、subject表
2、業務場景:
需要拉取所有教師的編號(teacher_no)、學科名(subject_name)。
nbsp
教師表(teacher)和學科(teacher_subject_rel)是一對多關係,
往往查詢出現的是同一教師多條
數據。我們希望得到每個教師一條數據
學科拼接成一條
1、基本語法
group_concat(
[DISTINCT]
要連接的字段
[Order
BY
排序字段
ASC/DESC]
[Separator
‘分隔符’]
)
2、例子
SELECT
t.teacher_id
as
‘教師id’,
t.teacher_no
‘教師編號’,
(
SELECT
GROUP_CONCAT(s.subject_name)
FROM
teacher_subject_rel
tsr
LEFT
JOIN
`subject`
s
ON
tsr.subject_id
=
s.subject_id
WHERE
t.teacher_id
=
tsr.teacher_id
)
AS
‘學科’
FROM
teacher
t
子查詢、查詢臨時表、EXISTS
例子
SELECT
*
FROM
(
SELECT
o.id,
o.student_intention_id,
s.
NAME,
s.area_id,
a.area_name,
s.exam_year,
o.
STATUS,
CASE
o.
STATUS
WHEN
‘1’
THEN
‘待提交’
WHEN
‘2’
THEN
‘待指派’
WHEN
‘3’
THEN
‘已完成’
WHEN
‘4’
THEN
‘處理中’
END
statusName,
CASE
o.emergency_degree
WHEN
‘1’
THEN
‘正常’
WHEN
‘2’
THEN
‘緊急’
WHEN
‘3’
THEN
‘非常緊急’
END
emergencyDegreeName,
o.emergency_degree,
o.update_time,
(
SELECT
first_lesson_time
FROM
jx_strategy
WHERE
jx_lesson_plan_order_id
=
o.id
AND
STATUS
IN
(2,
7)
AND
first_lesson_time
now()
ORDER
BY
first_lesson_time
ASC
LIMIT
1
)
AS
first_time,
(
SELECT
deal_user_id
FROM
jx_strategy
WHERE
jx_lesson_plan_order_id
=
o.id
AND
STATUS
7
AND
deal_user_id
ORDER
BY
id
DESC
LIMIT
1
)
AS
deal_user_id
FROM
jx_lesson_plan_order
o
LEFT
JOIN
student
s
ON
s.student_intention_id
=
o.student_intention_id
LEFT
JOIN
area
a
ON
s.area_id
=
a.id
WHERE
o.
STATUS
1
AND
s.phone
=
‘18501665888’
AND
o.emergency_degree
=
1
AND
o.
STATUS
=
2
AND
s.exam_year
=
‘2015’
AND
o.update_time
=
‘2018-08-14
20:28:55′
AND
o.update_time
=
‘2018-08-14
20:28:55′
)
AS
a
WHERE
1
=
1
AND
a.deal_user_id
=
145316
AND
a.first_time
=
‘2018-08-17
00:00:00′
AND
a.first_time
=
‘2018-08-30
00:00:00′
AND
EXISTS
(
SELECT
*
FROM
jx_strategy
js
WHERE
js.jx_lesson_plan_order_id
=
a.id
AND
js.
STATUS
IN
(2,
7)
AND
js.subject_id
IN
(2,
3)
)
ORDER
BY
a.update_time
DESC
LIMIT
0,
10
update
關聯變量條件修改
1、涉及的表關係:
user_info表中的
id_number(身份證號)
teacher表中的birth字段、
關聯關係usrer_id
=
teacher_id
2、業務場景:獲取用戶身份證上的出生日期將出生日期更新在birth字段
UPDATE
teacher
t
INNER
JOIN
(
SELECT
t.teacher_id,
t.birth,
u.id_number,
CONCAT(SUBSTRING(u.id_number,
7,
4),
‘-‘,
SUBSTRING(u.id_number,
11,
2),
‘-‘,
SUBSTRING(u.id_number,
13,
2))
as
birth1,
u.reg_date,
t.exit_time
from
teacher
t
INNER
JOIN
user_info
u
ON
u.user_id
=
t.teacher_id
)
info
on
info.teacher_id
=
t.teacher_id
SET
t.birth
=
info.birth1
WHERE
info.reg_date
‘2018-08-20
00:00:00′
and
info.id_number
is
not
NULL
and
(info.birth
is
NULL
or
t.birth
=
”)
and
t.is_train
=
1
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
您可能感興趣的文章:MySQL在關聯複雜情況下所能做出的一些優化Mysql一些複雜的sql語句(查詢與刪除重複的行)深入mysql
“ON
DUPLICATE
KEY
UPDATE”
語法的分析MySQL
最基本的SQL語法/語句MySQL與Oracle的語法區別詳細對比淺析Mysql
Join語法以及性能優化MySQL
ALTER語法的運用方法MySQL
prepare語句的SQL語法MySQL進階SELECT語法篇MySQL
SQL
語法參考
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/206396.html