MySql數(shù)據(jù)庫(kù)基本操作

計(jì)算機(jī)誕生后,數(shù)據(jù)開(kāi)始在計(jì)算機(jī)中存儲(chǔ)并計(jì)算,并設(shè)計(jì)出了數(shù)據(jù)庫(kù)系統(tǒng),數(shù)據(jù)庫(kù)系統(tǒng)解決的問(wèn)題:持久化存儲(chǔ),優(yōu)化讀寫(xiě),保證數(shù)據(jù)的有效性。

當(dāng)前使用的數(shù)據(jù)庫(kù),主要分為兩類

1、文檔型,如sqlite,就是一個(gè)文件,通過(guò)對(duì)文件的復(fù)制完成數(shù)據(jù)庫(kù)的復(fù)制;

2、服務(wù)型,如mysql、oracle、postgre,數(shù)據(jù)存儲(chǔ)在一個(gè)物理文件中,但是需要使用終端以tcp/ip協(xié)議連接,進(jìn)行數(shù)據(jù)庫(kù)的讀寫(xiě)操作。

E-R模型

當(dāng)前物理的數(shù)據(jù)庫(kù)都是按照E-R模型進(jìn)行設(shè)計(jì)的,E表示entity,實(shí)體,R表示relationship,關(guān)系

ER模型是構(gòu)建現(xiàn)實(shí)世界和程序數(shù)據(jù)世界的橋梁,通過(guò)ER圖可以理清楚程序的業(yè)務(wù)關(guān)系,在工程中只有先把業(yè)務(wù)關(guān)系搞清楚了,才好設(shè)計(jì)數(shù)據(jù)庫(kù),才好進(jìn)行相應(yīng)的編碼工作。其實(shí)在一個(gè)大的工程中,設(shè)計(jì)數(shù)據(jù)庫(kù)和理清業(yè)務(wù)關(guān)系甚至要比實(shí)際的編碼時(shí)間都要長(zhǎng)。

關(guān)系描述兩個(gè)實(shí)體之間的對(duì)應(yīng)規(guī)則,包括

1.一對(duì)一

合法的情況下:一個(gè)男人娶一個(gè)女人,一個(gè)女人嫁一個(gè)男人

2.一對(duì)多

目前教室里,一個(gè)老師教多個(gè)學(xué)生,一個(gè)學(xué)生被一個(gè)老師教

一個(gè)教室里有很多學(xué)生,一個(gè)學(xué)生只能一個(gè)教室

3.多對(duì)多

在大學(xué)中,一個(gè)學(xué)生選很多課程,一個(gè)課程被學(xué)生選

在大學(xué)里,一個(gè)學(xué)生可以有很多老師,一個(gè)老師可以教很多學(xué)生

關(guān)系轉(zhuǎn)換為數(shù)據(jù)庫(kù)表中的一個(gè)列在關(guān)系型數(shù)據(jù)庫(kù)中一行就是一個(gè)對(duì)象

三范式

經(jīng)過(guò)研究和對(duì)使用中問(wèn)題的總結(jié),對(duì)于設(shè)計(jì)數(shù)據(jù)庫(kù)提出了一些規(guī)范,這些規(guī)范被稱為范式

1.第一范式(1NF):列不可拆分

2.第二范式(2NF):唯一標(biāo)識(shí)

3.第三范式(3NF):引用主鍵

簡(jiǎn)而言之:

說(shuō)明:后一個(gè)范式,都是在前一個(gè)范式的基礎(chǔ)上建立的。

數(shù)據(jù)類型

MySQL支持所有標(biāo)準(zhǔn)的SQL數(shù)據(jù)類型,主要分3類:數(shù)值類型、字符串類型、時(shí)間日期類型。

1、數(shù)值類型

1.1、整數(shù)類型

下面一張表就能解釋清楚:

1.2、定點(diǎn)數(shù)

DECIMAL和NUMERIC類型在MySQL中視為相同的類型。它們用于保存必須為確切精度的值。

我們看到上面這個(gè)例子中有兩個(gè)參數(shù),即DECIMAL(M,D),其中M表示十進(jìn)制數(shù)字總的個(gè)數(shù),D表示小數(shù)點(diǎn)后面數(shù)字的位數(shù),上例中的取值范圍為-999.99~999.99。

如果存儲(chǔ)時(shí),整數(shù)部分超出了范圍(如上面的例子中,添加數(shù)值為1000.01),MySql就會(huì)報(bào)錯(cuò),不允許存這樣的值。

如果存儲(chǔ)時(shí),小數(shù)點(diǎn)部分若超出范圍,就分以下情況:

若四舍五入后,整數(shù)部分沒(méi)有超出范圍,則只警告,但能成功操作并四舍五入刪除多余的小數(shù)位后保存。如999.994實(shí)際被保存為999.99。

若四舍五入后,整數(shù)部分超出范圍,則MySql報(bào)錯(cuò),并拒絕處理。如999.995和-999.995都會(huì)報(bào)錯(cuò)。

M的默認(rèn)取值為10,D默認(rèn)取值為0。如果創(chuàng)建表時(shí),某字段定義為decimal類型不帶任何參數(shù),等同于decimal(10,0)。帶一個(gè)參數(shù)時(shí),D取默認(rèn)值。

M的取值范圍為1~65,取0時(shí)會(huì)被設(shè)為默認(rèn)值,超出范圍會(huì)報(bào)錯(cuò)。

D的取值范圍為0~30,而且必須<=M,超出范圍會(huì)報(bào)錯(cuò)。

所以,很顯然,當(dāng)M=65,D=0時(shí),可以取得最大和最小值。

1.3、浮點(diǎn)數(shù)

浮點(diǎn)數(shù)是用來(lái)表示實(shí)數(shù)的一種方法,相對(duì)于定點(diǎn)數(shù)來(lái)說(shuō),在長(zhǎng)度一定的情況下,具有表示數(shù)據(jù)范圍大的特點(diǎn)。但同時(shí)也存在誤差問(wèn)題,如果希望保證值比較準(zhǔn)確,推薦使用定點(diǎn)數(shù)數(shù)據(jù)類型。

MySql中的浮點(diǎn)類型有float,double和real。他們定義方式為:FLOAT(M,D) 、 REAL(M,D) 、 DOUBLE PRECISION(M,D)。

REAL就是DOUBLE?,如果SQL服務(wù)器模式包括REAL_AS_FLOAT選項(xiàng),REAL是FLOAT的同義詞而不是DOUBLE的同義詞。

“(M,D)”表示該值一共顯示M位整數(shù),其中D位位于小數(shù)點(diǎn)后面。例如,定義為FLOAT(7,4)的一個(gè)列可以顯示為-999.9999。MySQL保存值時(shí)進(jìn)行四舍五入,因此如果在FLOAT(7,4)列內(nèi)插入999.00009,近似結(jié)果是999.0001。

FLOAT和DOUBLE中的M和D的取值默認(rèn)都為0,即除了最大最小值,不限制位數(shù)。

M取值范圍為0~255。FLOAT只保證6位有效數(shù)字的準(zhǔn)確性,所以FLOAT(M,D)中,M<=6時(shí),數(shù)字通常是準(zhǔn)確的。如果M和D都有明確定義,其超出范圍后的處理同decimal。

D取值范圍為0~30,同時(shí)必須<=M。double只保證16位有效數(shù)字的準(zhǔn)確性,所以DOUBLE(M,D)中,M<=16時(shí),數(shù)字通常是準(zhǔn)確的。如果M和D都有明確定義,其超出范圍后的處理同decimal。

FLOAT和DOUBLE中,若M的定義分別超出7和17,則多出的有效數(shù)字部分,取值是不定的,通常數(shù)值上會(huì)發(fā)生錯(cuò)誤。因?yàn)楦↑c(diǎn)數(shù)是不準(zhǔn)確的,所以我們要避免使用“=”來(lái)判斷兩個(gè)數(shù)是否相等。

內(nèi)存中,F(xiàn)LOAT占4-byte(1位符號(hào)位 8位表示指數(shù) 23位表示尾數(shù)),DOUBLE占8-byte(1位符號(hào)位 11位表示指數(shù) 52位表示尾數(shù))。

1.4、bit(1)

BIT數(shù)據(jù)類型可用來(lái)保存位字段值。BIT(M)類型允許存儲(chǔ)M位值。M范圍為1~64(即64位二進(jìn)制數(shù)),默認(rèn)為1,BIT其實(shí)就是存入二進(jìn)制的值,類似010110。

如果存入一個(gè)BIT類型的值,位數(shù)少于M值,則左補(bǔ)0.

如果存入一個(gè)BIT類型的值,位數(shù)多于M值,MySQL的操作取決于此時(shí)有效的SQL模式:

如果模式未設(shè)置,MySQL將值裁剪到范圍的相應(yīng)端點(diǎn),并保存裁減好的值。

如果模式設(shè)置為traditional(“嚴(yán)格模式”),超出范圍的值將被拒絕并提示錯(cuò)誤,并且根據(jù)SQL標(biāo)準(zhǔn)插入會(huì)失敗。

看下面官方給出的例子:

2、字符串類型

2.1、CHAR和VARCHAR類型

CHAR和VARCHAR類型聲明的長(zhǎng)度表示你想要保存的最大字符數(shù)。例如,CHAR(30)可以占用30個(gè)字符。默認(rèn)長(zhǎng)度都為255。

CHAR列的長(zhǎng)度固定為創(chuàng)建表時(shí)聲明的長(zhǎng)度。長(zhǎng)度可以為從0到255的任何值。當(dāng)保存CHAR值時(shí),在它們的右邊填充空格以達(dá)到指定的長(zhǎng)度。當(dāng)檢索到CHAR值時(shí),尾部的空格被刪除掉,所以,我們?cè)诖鎯?chǔ)時(shí)字符串右邊不能有空格,即使有,查詢出來(lái)后也會(huì)被刪除。在存儲(chǔ)或檢索過(guò)程中不進(jìn)行大小寫(xiě)轉(zhuǎn)換。

所以當(dāng)char類型的字段為唯一值時(shí),添加的值是否已經(jīng)存在以不包含末尾空格(可能有多個(gè)空格)的值確定,比較時(shí)會(huì)在末尾補(bǔ)滿空格后與現(xiàn)已存在的值比較。

VARCHAR列中的值為可變長(zhǎng)字符串。長(zhǎng)度可以指定為0到65,535之間的值(實(shí)際可指定的最大長(zhǎng)度與編碼和其他字段有關(guān),比如,本人MySql使用utf-8編碼格式,大小為標(biāo)準(zhǔn)格式大小的2倍,僅有一個(gè)varchar字段時(shí)實(shí)測(cè)最大值僅21844,如果添加一個(gè)char(3),則最大取值減少3。整體最大長(zhǎng)度是65,532字節(jié))。

同CHAR對(duì)比,VARCHAR值保存時(shí)只保存需要的字符數(shù),另加一個(gè)字節(jié)來(lái)記錄長(zhǎng)度(如果列聲明的長(zhǎng)度超過(guò)255,則使用兩個(gè)字節(jié))。

VARCHAR值保存時(shí)不進(jìn)行填充。當(dāng)值保存和檢索時(shí)尾部的空格仍保留,符合標(biāo)準(zhǔn)SQL。

如果分配給CHAR或VARCHAR列的值超過(guò)列的最大長(zhǎng)度,則對(duì)值進(jìn)行裁剪以使其適合。如果被裁掉的字符是空格,則會(huì)產(chǎn)生一條警告。如果裁剪非空格字符,則會(huì)造成錯(cuò)誤(而不是警告)并通過(guò)使用嚴(yán)格SQL模式禁用值的插入。

下面顯示了將各種字符串值保存到CHAR(4)和VARCHAR(4)列后的結(jié)果:

表中最后一行的值只適用在不使用嚴(yán)格模式時(shí);如果MySQL運(yùn)行使用嚴(yán)格模式,超過(guò)列長(zhǎng)度的值不保存,并且會(huì)出現(xiàn)錯(cuò)誤。因?yàn)榭崭竦脑?,相同的值存入到長(zhǎng)度都足夠的varvhar和char中,取出可能會(huì)不同,比如"a"和"a ?"。

2.2、BINARY和VARBINARY類型(2)

BINARY和VARBINARY類型類似于CHAR和VARCHAR類型,但是不同的是,它們存儲(chǔ)的不是字符字符串,而是二進(jìn)制串。所以它們沒(méi)有字符集,并且排序和比較基于列值字節(jié)的數(shù)值值。

當(dāng)保存BINARY值時(shí),在它們右邊填充0x00(零字節(jié))值以達(dá)到指定長(zhǎng)度。取值時(shí)不刪除尾部的字節(jié)。比較時(shí)所有字節(jié)很重要(因?yàn)榭崭窈?x00是不同的,0x00<空格),包括ORDER BY和DISTINCT操作。比如插入'a '會(huì)變成'a \0'。

對(duì)于VARBINARY,插入時(shí)不填充字符,選擇時(shí)不裁剪字節(jié)。比較時(shí)所有字節(jié)很重要。

當(dāng)類型為BINARY的字段為主鍵時(shí),應(yīng)考慮上面介紹的存儲(chǔ)方式。

2.3、BLOB和TEXT類型

BLOB是一個(gè)二進(jìn)制大對(duì)象,可以容納可變數(shù)量的數(shù)據(jù)。有4種BLOB類型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它們只是可容納值的最大長(zhǎng)度不同。

有4種TEXT類型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。這些對(duì)應(yīng)4種BLOB類型,有相同的最大長(zhǎng)度和存儲(chǔ)需求。

BLOB列被視為二進(jìn)制字符串。TEXT列被視為字符字符串,類似CHAR和BINARY。

在TEXT或BLOB列的存儲(chǔ)或檢索過(guò)程中,不存在大小寫(xiě)轉(zhuǎn)換。

在大多數(shù)方面,可以將BLOB列視為能夠足夠大的VARBINARY列。同樣,可以將TEXT列視為VARCHAR列。

BLOB和TEXT在以下幾個(gè)方面不同于VARBINARY和VARCHAR:

1、當(dāng)保存或檢索BLOB和TEXT列的值時(shí)不刪除尾部空格。(這與VARBINARY和VARCHAR列相同)。

2、比較時(shí)將用空格對(duì)TEXT進(jìn)行擴(kuò)充以適合比較的對(duì)象,正如CHAR和VARCHAR。

3、對(duì)于BLOB和TEXT列的索引,必須指定索引前綴的長(zhǎng)度。對(duì)于CHAR和VARCHAR,前綴長(zhǎng)度是可選的。

4、BLOB和TEXT列不能有默認(rèn)值。

MySQL Connector/ODBC將BLOB值定義為L(zhǎng)ONGVARBINARY,將TEXT值定義為L(zhǎng)ONGVARCHAR。

BLOB或TEXT對(duì)象的最大大小由其類型確定,但在客戶端和服務(wù)器之間實(shí)際可以傳遞的最大值由可用內(nèi)存數(shù)量和通信緩存區(qū)大小確定。你可以通過(guò)更改max_allowed_packet變量的值更改消息緩存區(qū)的大小,但必須同時(shí)修改服務(wù)器和客戶端程序。

3、時(shí)間日期類型

3.1、DATE, DATETIME, 和TIMESTAMP類型

這三者其實(shí)是關(guān)聯(lián)的,都用來(lái)表示日期或時(shí)間。

當(dāng)你需要同時(shí)包含日期和時(shí)間信息的值時(shí)則使用DATETIME類型。MySQL以'YYYY-MM-DD HH:MM:SS'格式檢索和顯示DATETIME值。支持的范圍為'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。

當(dāng)你只需要日期值而不需要時(shí)間部分時(shí)應(yīng)使用DATE類型。MySQL用'YYYY-MM-DD'格式檢索和顯示DATE值。支持的范圍是'1000-01-01'到 '9999-12-31'。

TIMESTAMP類型同樣包含日期和時(shí)間,范圍從'1970-01-01 00:00:01' UTC 到'2038-01-19 03:14:07' UTC。

3.2、TIME類型

MySQL以'HH:MM:SS'格式檢索和顯示TIME值(或?qū)τ诖蟮男r(shí)值采用'HHH:MM:SS'格式)。

TIME值的范圍可以從'-838:59:59'到'838:59:59'。小時(shí)部分會(huì)因此大的原因是TIME類型不僅可以用于表示一天的時(shí)間(必須小于24小時(shí)),還可能為某個(gè)事件過(guò)去的時(shí)間或兩個(gè)事件之間的時(shí)間間隔(可以大于24小時(shí),或者甚至為負(fù))。

對(duì)于指定為包括時(shí)間部分間割符的字符串的TIME值,如果時(shí)、分或者秒值小于10,則不需要指定兩位數(shù)。'8:3:2'與'08:03:02'相同。

為T(mén)IME列分配簡(jiǎn)寫(xiě)值時(shí)應(yīng)注意。沒(méi)有冒號(hào),MySQL解釋值時(shí)假定最右邊的兩位表示秒。(MySQL解釋TIME值為過(guò)去的時(shí)間而不是當(dāng)天的時(shí)間)。例如,你可能認(rèn)為'1112'和1112表示'11:12:00'(11點(diǎn)過(guò)12分),但MySQL將它們解釋為'00:11:12'(11分,12 秒)。同樣,'12'和12 被解釋為 '00:00:12'。相反,TIME值中使用冒號(hào)則肯定被看作當(dāng)天的時(shí)間。也就是說(shuō),'11:12'表示'11:12:00',而不是'00:11:12'。

3.3、YEAR類型

YEAR類型是一個(gè)單字節(jié)類型用于表示年。MySQL以YYYY格式檢索和顯示YEAR值。范圍是1901到2155。

可以指定各種格式的YEAR值:

1、四位字符串,范圍為'1901'到'2155'。

2、四位數(shù)字,范圍為1901到2155。

3、兩位字符串,范圍為'00'到'99'。'00'到'69'和'70'到'99'范圍的值被轉(zhuǎn)換為2000到2069和1970到1999范圍的YEAR值。

4、兩位整數(shù),范圍為1到99。1到69和70到99范圍的值被轉(zhuǎn)換為2001到2069和1970到1999范圍的YEAR值。請(qǐng)注意兩位整數(shù)范圍與兩位字符串范圍稍有不同,因?yàn)槟悴荒苤苯訉⒘阒付閿?shù)字并將它解釋為2000。你必須將它指定為一個(gè)字符串'0'或'00'或它被解釋為0000。

非法YEAR值被轉(zhuǎn)換為0000。

約束

1.主鍵primary key

2.非空not null

3.惟一unique

4.默認(rèn)default

5.外鍵foreign key

基本操作

·創(chuàng)建數(shù)據(jù)庫(kù):create database 數(shù)據(jù)庫(kù)名 charset=utf8;

·刪除數(shù)據(jù)庫(kù):drop database數(shù)據(jù)庫(kù)名;

·切換數(shù)據(jù)庫(kù):use數(shù)據(jù)庫(kù)名;

·查看當(dāng)前選擇的數(shù)據(jù)庫(kù):select database();

·查看當(dāng)前數(shù)據(jù)庫(kù)中所有表:show tables;

·創(chuàng)建表:create table表名(列及類型);? ? ??

主鍵本身是用來(lái)唯一標(biāo)識(shí)這一行,沒(méi)有業(yè)務(wù)邏輯意義,所以是什么值不重要,只要唯一就行,所以如果是主鍵不需要修改,auto_increment表示自動(dòng)增長(zhǎng),只能是數(shù)字類型。

如:

create table students(

id int auto_increment primary key,

sname varchar(10) not null

);

·修改表:alter table表名add|modify|drop列名類型;

如:alter table students add birthday datetime;

·刪除表:drop table表名;

·查看表結(jié)構(gòu):desc表名;

·更改表名稱:rename table原表名to新表名;

·查看表的創(chuàng)建語(yǔ)句:show create table '表名';

·查詢:select * from表名

·增加

全行插入:insert into表名values(...)

缺省插入:insert into表名(列1,...) values(值1,...)

同時(shí)插入多條數(shù)據(jù):insert into表名values(...),(...)...;

或insert into表名(列1,...) values(值1,...),(值1,...)...;

·主鍵列是自動(dòng)增長(zhǎng),但是在全列插入時(shí)需要占位,通常使用0,插入成功后以實(shí)際數(shù)據(jù)為準(zhǔn)

·修改:update 表名 set 列1=值1,... where條件

·刪除:delete?from 表名 where 條件

·邏輯刪除,本質(zhì)就是修改操作update

alter table students add isdelete bit default 0;

如果需要?jiǎng)h除則

update students isdelete=1 where ...;

備份與恢復(fù)

數(shù)據(jù)備份

·進(jìn)入超級(jí)管理員:sudo -s

·運(yùn)行mysqldump命令:mysqldump–uroot –p數(shù)據(jù)庫(kù)名> ~/備份文件.sql;

按提示輸入mysql的密碼

數(shù)據(jù)恢復(fù)

·連接mysql,創(chuàng)建數(shù)據(jù)庫(kù)

·退出連接,執(zhí)行命令:mysql -uroot -p數(shù)據(jù)庫(kù)名< ~/備份文件.sql

根據(jù)提示輸入mysql密碼

查詢:

聚合:

分組:分組前面查詢的內(nèi)容只能是聚合函數(shù)和分組

排序:

分頁(yè):

模糊查詢:like(%表示任意多個(gè)任意字符,??_表示一個(gè)任意字符)

查詢范圍:·in表示在一個(gè)非連續(xù)的范圍內(nèi),between ... and ...表示在一個(gè)連續(xù)的范圍內(nèi)。

非空判斷:is null和is not null

去重復(fù):distinct

多表直接查詢其實(shí)做的是一個(gè)笛卡爾積,可以看到結(jié)果并不是我們想要的:

多表查詢:

1、內(nèi)連接:join或inner join

以上兩種寫(xiě)法等效,可以看到在DEPT表中,有deptno為40的記錄,但在EMP表中,并沒(méi)有員工屬于40這個(gè)deptno,在進(jìn)行內(nèi)斂查詢時(shí),因?yàn)閚eptno為40無(wú)法匹配,所以就自動(dòng)將其刪除了,所以內(nèi)連接不會(huì)保留無(wú)法匹配的記錄。

內(nèi)連接同樣可以進(jìn)行一些篩選,有兩種方式的篩選,其效果相同:

2、外聯(lián)接:left/right outer join或 left/right join

right表示join右邊的是主表,左邊的是次表,進(jìn)行外聯(lián)接時(shí),主表無(wú)法匹配的記錄不會(huì)忽略,而會(huì)保留,次表中記錄的相應(yīng)內(nèi)容會(huì)用NULL填充。

自關(guān)聯(lián):

舉一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明自關(guān)聯(lián),假如現(xiàn)在有兩張表結(jié)構(gòu)如下:

觀察兩張表發(fā)現(xiàn),citys表比provinces表多一個(gè)列proid,其它列的類型都是一樣的,存儲(chǔ)的都是地區(qū)信息,而且每種信息的數(shù)據(jù)量有限,沒(méi)必要增加一個(gè)新表,或者將來(lái)還要存儲(chǔ)區(qū)、鄉(xiāng)鎮(zhèn)信息,都增加新表的開(kāi)銷(xiāo)太大。因此我們可以把這兩張表合并為一張表。

因?yàn)槭](méi)有所屬的省份,所以可以填寫(xiě)為null

城市所屬的省份pid,填寫(xiě)省所對(duì)應(yīng)的編號(hào)id

這就是自關(guān)聯(lián),表中的某一列,關(guān)聯(lián)了這個(gè)表中的另外一列,但是它們的業(yè)務(wù)邏輯含義是不一樣的,城市信息的pid引用的是省信息的id,在這個(gè)表中,結(jié)構(gòu)不變,可以添加區(qū)縣、鄉(xiāng)鎮(zhèn)街道、村社區(qū)等信息。

子查詢案例:

內(nèi)置函數(shù):

1、字符串函數(shù):

查看字符的ascii碼
查看ascii碼對(duì)應(yīng)的字符


字符串拼接
utf8編碼一個(gè)漢字占三個(gè)字節(jié)
從左截取字符串
從右截取字符串
截取指定為止的字符串
刪除左側(cè)空格
刪除右側(cè)空格


返回由是個(gè)空格組成的字符串
字符串替換
大小寫(xiě)轉(zhuǎn)換

2、數(shù)學(xué)函數(shù)

3、時(shí)間日期函數(shù)

視圖

為了引入視圖先看下面一個(gè)簡(jiǎn)單的查詢操作的例子:

這是一個(gè)簡(jiǎn)單的查詢命令,相對(duì)而言還是稍微有點(diǎn)長(zhǎng)的,在工作中,我們遇到的數(shù)據(jù)庫(kù)操作可能比這樣的SQL語(yǔ)句冗長(zhǎng)的多,每次重新再寫(xiě)相同的命令會(huì)顯得十分繁瑣,那么能不能像python中的函數(shù)那樣把SQL語(yǔ)句封裝起來(lái),每次只需要調(diào)用就可以進(jìn)行多次重復(fù)的操作而實(shí)現(xiàn)代碼復(fù)用呢?視圖就是實(shí)現(xiàn)一種類似的功能。視圖本質(zhì)就是對(duì)查詢的一個(gè)封裝,虛擬的表,一旦封裝的內(nèi)容改變了,視圖的內(nèi)容也隨著用,視圖就是用來(lái)進(jìn)行進(jìn)行查詢操作的。通過(guò)創(chuàng)建視圖,我們可以看到下面的代碼實(shí)現(xiàn)了和上述代碼相同的功能,且提高了代碼的復(fù)用性。

事務(wù)

當(dāng)一個(gè)業(yè)務(wù)邏輯需要多個(gè)sql完成時(shí),如果其中某條sql語(yǔ)句出錯(cuò),則希望整個(gè)操作都退回,即回到操作前的狀態(tài),保證數(shù)據(jù)的正確性。使用事務(wù)可以完成退回的功能,保證業(yè)務(wù)邏輯的正確性。

事物有兩個(gè)功能:有一個(gè)出問(wèn)題,回滾。都沒(méi)有問(wèn)題,提交。(同生共死)

表的引擎類型必須是innodb或bdb類型,才可以對(duì)此表使用事務(wù)

事務(wù)四大特性(簡(jiǎn)稱ACID)

1、原子性(Atomicity):事務(wù)中的全部操作在數(shù)據(jù)庫(kù)中是不可分割的,要么全部完成,要么均不執(zhí)行;

2、一致性(Consistency):幾個(gè)并行執(zhí)行的事務(wù),其執(zhí)行結(jié)果必須與按某一順序串行執(zhí)行的結(jié)果相一致;

3、隔離性(Isolation):事務(wù)的執(zhí)行不受其他事務(wù)的干擾,事務(wù)執(zhí)行的中間結(jié)果對(duì)其他事務(wù)必須是透明的;

4、持久性(Durability):對(duì)于任意已提交事務(wù),系統(tǒng)必須保證該事務(wù)對(duì)數(shù)據(jù)庫(kù)的改變不被丟失,即使數(shù)據(jù)庫(kù)出現(xiàn)故障。

事務(wù)語(yǔ)句:

開(kāi)啟begin;

提交commit;

回滾rollback;

例1:

開(kāi)始了一個(gè)事物,并運(yùn)行成功
但查詢的結(jié)果并沒(méi)有顯示新插入的記錄
進(jìn)行commit之后
再次查詢顯示新紀(jì)錄,要想使事物生效必須的提交


例2:

使用rollback命令之后事物中的操作均不會(huì)生效

與python交互

需安裝pip3和pyMySql模塊(針對(duì)python3.x版本)

sql語(yǔ)句用法舉例:

1、update main set num=floor(num/10)*10 where num between 20 and 39;

數(shù)據(jù)庫(kù)備份與恢復(fù):

創(chuàng)建數(shù)據(jù)庫(kù)并設(shè)置字符集和排序規(guī)則:create database 數(shù)據(jù)庫(kù)名 CHARACTER SET utf8 COLLATE utf8_general_ci;

備份整個(gè)數(shù)據(jù)庫(kù):mysqldump 數(shù)據(jù)庫(kù)名> 備份文件名.sql

備份數(shù)據(jù)庫(kù)單張表:mysqldump 數(shù)據(jù)庫(kù)名 表名 > 備份文件名.sql

從整庫(kù)備份文件中提取單張表的創(chuàng)建表語(yǔ)句:sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `表名`/!d;q' 整庫(kù)備份文件名.sql > 提取出來(lái)的sql文件名.sql

從整庫(kù)備份文件中提取單張表的插入數(shù)據(jù)sql語(yǔ)句:grep -i 'INSERT INTO `表名`'? 整庫(kù)備份文件名.sql >> 提取出來(lái)的sql文件名.sql

還原單張表:進(jìn)入mysql數(shù)據(jù)庫(kù),執(zhí)行source /home/yxx/提取出來(lái)的sql文件名.sql

將表中某一字段值中包含“XX”的部分替換成“AA”:

update proinfo set approved_param=REPLACE(approved_param,'公共事業(yè)','公共科技事業(yè)部');

將某一字段中指定部分的內(nèi)容(如‘(1111)’)替換為指定內(nèi)容:

update option_code set name=replace(name,substring(name,locate('(',name),(locate(')',name)-locate('(',name)+1)),'');

添加字段:

alter table table1 add transactor varchar(10) DEFAULT NULL;

新建數(shù)據(jù)庫(kù):

create database 數(shù)據(jù)庫(kù)名 CHARACTER SET utf8 COLLATE utf8_general_ci;

修改數(shù)據(jù)庫(kù)表名稱:

alter table briefing_water_level rename tongque_briefing_water;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容