MySQL常用語句講解匯總

?

一 數(shù)據(jù)庫常用操作

  • mysql -u+username -p+password:登陸數(shù)據(jù)庫管理系統(tǒng),如mysql -uroot -p123。

  • create database dbName:創(chuàng)建數(shù)據(jù)庫。

  • drop database dbName:刪除數(shù)據(jù)庫。

  • use dbName:使用指定數(shù)據(jù)庫,因?yàn)閿?shù)據(jù)庫管理系統(tǒng)中可能存在多個(gè)數(shù)據(jù)庫,通過名稱使用指定的數(shù)據(jù)庫。

  • show databases:展示數(shù)據(jù)庫管理系統(tǒng)中全部數(shù)據(jù)庫。

  • select database():顯示正在使用的數(shù)據(jù)庫。

  • set character_set_results=gbk:很多數(shù)據(jù)庫不支持中文,設(shè)置編碼方式,使中文正常顯示,主要用于解決在DOS窗口中顯示查詢結(jié)果時(shí)中文亂碼的問題。

  • source+path(.sql文件路徑):導(dǎo)入數(shù)據(jù)庫文件,生成數(shù)據(jù)庫,即根據(jù)sql腳本生成數(shù)據(jù)庫。

  • mysqldump mydatabase>保存目錄 -uroot -p123:將數(shù)據(jù)庫的全部信息保存到硬盤中的.sql腳本文件中,由于已經(jīng)指定用戶名與密碼,所以在不進(jìn)入數(shù)據(jù)庫的情況下操作(語句結(jié)尾不加分號)。

  • create user username identified by ‘password’:創(chuàng)建指定名稱與密碼的用戶,允許該用戶訪問數(shù)據(jù)庫。

  • drop user username”%”:刪除用戶。

二 表常用操作

  • create table tableName(columnName type(length)):創(chuàng)建數(shù)據(jù)庫。

  • drop table tableName:刪除數(shù)據(jù)庫。

  • alter table tableName add XXXX:向數(shù)據(jù)庫中增加字段。

  • alter table tableName drop columnName:刪除字段。

  • alter table tableName change oldName newName XXXX:覆蓋字段。

  • alter table tableName modify columnName XXXX:修改字段屬性。

  • create table copyTable as select columnName/* from oldTable:復(fù)制表,可以復(fù)制全部字段,也可以復(fù)制部分字段。

  • mysqldump mydatabase mytable>保存目錄 -uroot -p123:將數(shù)據(jù)庫中的某一張表中的全部信息保存到硬盤中的.sql腳本文件中,注意:數(shù)據(jù)庫與表之間用分號隔開,形成兩個(gè)字符,一個(gè)代表數(shù)據(jù)庫,一個(gè)代表數(shù)據(jù)庫中的表,如果用”.”連接,會被當(dāng)做一個(gè)字符,即數(shù)據(jù)庫,因?yàn)橄到y(tǒng)中不存在該名稱的數(shù)據(jù)庫,運(yùn)行時(shí)產(chǎn)生錯(cuò)誤。

  • select@@identity:獲取剛剛插入的數(shù)據(jù)的id。

三 SQL語言分類

1.DDL

Data Definition Language,數(shù)據(jù)定義語言,create/alter/drop。
? ? create:用于數(shù)據(jù)庫與表的創(chuàng)建。
? ? alter:用于表的修改。

  • ? ? ? ?alter table tbName add ?XXXX:向表中添加字段,或者為字段增加約束。

  • ? ? ? ?alter table tbName mofify XXXX:修改字段。

  • ? ? ? ?alter table tbName drop XXXX:刪除字段或者約束。

? ? drop:用于刪除數(shù)據(jù)庫、表、字段、字段約束。

2.DML

Data Manipulation Language,數(shù)據(jù)操縱語言,update/delete/insert。

3.DQL

Data Query Language,數(shù)據(jù)查詢語言,select。

4.TCL

Transaction Control Language,事務(wù)控制語言,commit/rollback。

5.DCL

Data Control Language,數(shù)據(jù)控制語言,控制訪問數(shù)據(jù)庫的權(quán)限,grant/revoke。?

四 DQL語句構(gòu)成

select columnName from tbName where 過濾條件 group by 分組字段 having 分組后過濾條件 order by 排序字段 limit;

1.執(zhí)行順序

from——where——group by——having——select——order by ——limit
  1. from:進(jìn)入表

  2. where:對直接從數(shù)據(jù)庫獲取的數(shù)據(jù)即原始數(shù)據(jù)進(jìn)行過濾。

  3. group by:后面跟用作分組的字段,可以是單一字段,也可以是組合字段。分組以后,對各組數(shù)據(jù)分別進(jìn)行處理,“select 分組字段,分組處理函數(shù)”,select加其他字段,將隨機(jī)生成,毫無意義;

  4. having:對分組后的組進(jìn)行過濾,保留或者刪除某些組,不是對組內(nèi)數(shù)據(jù)的處理,所以過濾條件中只能使用分組函數(shù)返回的字段,一個(gè)能反映組的特性的字段。

  5. select:獲取數(shù)據(jù)。

  6. order by:排序,asc升序,desc降序。排序字段可以有多個(gè),首先按照前面的字段排序,再按照后面的字段排序。

  7. limit:截取查詢結(jié)果,limit n–從0到n的數(shù)據(jù),不包括第n條;limit begin,length–從指定的起點(diǎn)截取指定長度的數(shù)據(jù),常用于分頁。

2.where與having區(qū)別

where用于在分組前過濾從數(shù)據(jù)庫中獲得的原始數(shù)據(jù),結(jié)果是刪除某些行,保留某些行,是針對行的操作;having用于在分組后對組進(jìn)行過濾,結(jié)果是刪除某些組,保留某些組,是針對組的操作。

3.重命名

select oldName (as) newName from table;

對查詢結(jié)果中的字段重新命名,操作查詢結(jié)果必須使用新的名稱,不改變數(shù)據(jù)庫中的名稱。
?

4.自增自減

sql支持在現(xiàn)有字段值基礎(chǔ)上進(jìn)行操作自增自減操作,如 update tb_xxx set count=count+5 。

五 條件查詢

用在where語句中,對從數(shù)據(jù)庫獲得的原始數(shù)據(jù)進(jìn)行過濾。

  • ?=:等于,可用于任何數(shù)據(jù)類型。

  • ?

  • ?>:小于。

  • ?!=:不等于,另一種方式。

  • ?is null:為null。

  • ?is not null:非空。

  • ?and:并且,同時(shí)滿足兩個(gè)條件,and的優(yōu)先級高于or,在兩者同時(shí)存在的情況下先執(zhí)行and。

  • ?or:或者,滿足其中一個(gè)條件即可。

  • ?between A and B:取值在某個(gè)連續(xù)區(qū)間內(nèi),A

  • ?in(list01,list02,…):取值在某個(gè)數(shù)據(jù)量有限的列表中。

  • ?not in(list01,list02):取值不在某個(gè)數(shù)據(jù)量有限的列表中。

  • ?like:模糊查詢,%代表0-n個(gè)字符,_代表一個(gè)字符,查找符合指定模板的字符。

六 數(shù)據(jù)處理函數(shù)

數(shù)據(jù)處理函數(shù)又叫做單行處理函數(shù),用來處理單行數(shù)據(jù),字段名作為方法的參數(shù)。

  • ?Lower():將查詢結(jié)果全部轉(zhuǎn)化為小寫。

  • ?Upper():將查詢結(jié)構(gòu)全部轉(zhuǎn)化為大寫。

  • ?trim():去除前導(dǎo)與后導(dǎo)空格。

  • ?substr(columnName,begin,length):截取查詢結(jié)果的一部分。

  • ?round():四舍五入。

  • ?rand():生成隨機(jī)數(shù)。

  • ?ifnull(columnName,defaultValue):如果查詢得到的數(shù)據(jù)為null,則賦一個(gè)默認(rèn)值。

七 分組函數(shù)

分組函數(shù)又叫做多行處理行數(shù),按照分組字段,對每一組數(shù)據(jù)分別進(jìn)行處理,每組數(shù)據(jù)輸出一條結(jié)果。分組行數(shù)自動忽略null。
?分組函數(shù)不能使用在where子句中,如 select xxx from xxx where xxx>sum(xxx),因?yàn)榉纸M函數(shù)只能在分組后使用。

  • ?sum():求和。

  • ?max():求最大值。

  • ?min():求最小值。

  • ?avg():求平均值。

  • ?count():獲得記錄總數(shù),count(*)獲得包括null在內(nèi)的全部記錄數(shù),count(columnName)獲得指定字段非null記錄數(shù)。

八 其他關(guān)鍵字

1.distinct

select distinct columnName01,columnName02 from table;

去除重復(fù)指定字段的重復(fù)記錄,既可以是單個(gè)字段,也可以是組合字段。distinct前面不可以出現(xiàn)任何字段,因?yàn)榍懊孀侄蔚臄?shù)據(jù)全部取出,后面的字段去除了重復(fù)記錄,導(dǎo)致兩個(gè)字段記錄數(shù)不相等,產(chǎn)生沖突。

2.union

select columnName01,...from tbName01 union select columnName02,...from tbName02;

合并結(jié)果集,將兩次分別查詢的結(jié)果合并為一個(gè)結(jié)果,把后面字段的查詢結(jié)果追加到前面對應(yīng)位置字段的查詢結(jié)果后面。

  • 前后查詢字段的個(gè)數(shù)必須相同,無法合并。

  • 當(dāng)前后對應(yīng)位置的兩個(gè)字段名稱不同時(shí),合并后的結(jié)果采用前面的字段名。

九 日期處理函數(shù)

1.通用性

由于不同數(shù)據(jù)庫處理日期的方式不一樣,為了提高數(shù)據(jù)的適用性,數(shù)據(jù)庫在存儲日期時(shí)通常采用字符串形式。

2.字符串轉(zhuǎn)化為日期

str_to_date(字符串,格式);

如果底層日期儲存采用的是date類型,而輸入的是字符串,那么在將數(shù)據(jù)存儲到數(shù)據(jù)庫前需要將字符串轉(zhuǎn)化為date類型,而這一操作只是告訴系統(tǒng)將字符串轉(zhuǎn)化為date類型數(shù)據(jù),并不能改變數(shù)據(jù)庫底層的儲存樣式。
date類型數(shù)據(jù)在數(shù)據(jù)庫統(tǒng)一采用"%Y-%d-%m %H-%i-%s"的存儲。

?3.日期轉(zhuǎn)化為字符串

date_format(日期字段,格式):

如果數(shù)據(jù)底層采用日期存儲格式,那么在獲取日期以后可以改變查詢結(jié)果集中日期的格式。

4.默認(rèn)格式

"%Y-%d-%m %H-%i-%s"

MySQL中date類型數(shù)據(jù)的默認(rèn)格式,如果字符串符合該格式,插入或者查詢時(shí)被自動轉(zhuǎn)化為date類型。

5.日期對比

在SQL語句中,采用關(guān)系運(yùn)算符>

十 表連接

1.背景

理論上將全部數(shù)據(jù)放到同一張表中很難實(shí)現(xiàn),實(shí)際上即使實(shí)現(xiàn)了,表也很龐大,很冗雜,不便于查詢與維護(hù),因此將不同的數(shù)據(jù)存放到不同的表中,需要時(shí)連接各表進(jìn)行查詢。

2.連接條件

兩張表連接時(shí),將其中一張表中的每行數(shù)據(jù)與另外一張表的全部數(shù)據(jù)進(jìn)行對比,如果滿足給定的條件,則將這兩行數(shù)據(jù)合并為一行,否則舍棄,繼續(xù)對比剩余行。

3.笛卡爾現(xiàn)象

如果表連接時(shí)未設(shè)置連接條件,那么返回的查詢結(jié)果數(shù)目是兩張表行數(shù)的乘積,這種現(xiàn)象被叫做笛卡爾現(xiàn)象。

4.連接的幾種方式

⑴內(nèi)連接

select t1.columnName01,t2.columnName02 from tbName01 t1(inner)join tbName02 t2 on 連接條件;
  • 兩張表進(jìn)行連接查詢,如果只顯示匹配數(shù)據(jù),那么采用內(nèi)連接的方式。

  • 為了指明字段所屬的表,為每一張參與連接的表指定別名,通過別名調(diào)用其中的字段。

?⑵外連接

select t1.columnName01,t2.columnName02 from tbName01 t1 right/left (outer) join tbName02 t2 on 連接條件;

外連接將連接指向的一張表中的數(shù)據(jù)全部返回,另一種表對應(yīng)字段無匹配數(shù)據(jù)時(shí)用null填充。在外連接中使用left,左邊表的數(shù)據(jù)被全部取出;使用right,右邊表的數(shù)據(jù)被全部取出。

5.多張表連接查詢

一張表A與多張表連接查詢,表A與其他表分別進(jìn)行連接,最終的結(jié)果是各個(gè)獨(dú)立連接查詢結(jié)果相同A表數(shù)據(jù)的組合,即將某一個(gè)連接查詢結(jié)果中的某一行A表字段全部取出,如果其他連接查詢結(jié)果都具有該A字段,則所有具有該字段的行合并為一行。
?

6.別名

表連接查詢時(shí)通常通過表的別名來引用字段,如果某個(gè)字段只出現(xiàn)在一張表中可以省略別名。

十一 約束

?1.約束類型

數(shù)據(jù)庫可以添加的約束有非空約束(not null)、唯一性約束(unique)、主鍵約束(primary key)、 ? ?外鍵約束(foreign key)。

2.unique

unique約束用來約束一個(gè)字段不能有重復(fù)數(shù)據(jù),允許多行數(shù)據(jù)同時(shí)為null。

多個(gè)字段可以聯(lián)合起來添加unique約束,只有在多個(gè)字段對應(yīng)數(shù)據(jù)均相同的情況下,才認(rèn)為是重復(fù)數(shù)據(jù)。

create tabletableName(columnName01,columnName02,unique(columnName01, columnName02));

3.primary key

數(shù)據(jù)庫中的重復(fù)數(shù)據(jù)不僅對實(shí)際應(yīng)用沒有意義,反而占用系統(tǒng)資源,使數(shù)據(jù)庫冗雜,操作緩慢,為了避免重復(fù)數(shù)據(jù) 的出現(xiàn),為表中的每一個(gè)行數(shù)據(jù)均設(shè)置一個(gè)唯一性標(biāo)識,這個(gè)標(biāo)識就是primary key。被設(shè)定為priamry key的字段 不僅不可以為null,而且不可以重復(fù),但不等于同時(shí)設(shè)置了not null與unique,因?yàn)檫€為該字段添加了索引index。

主鍵字段的創(chuàng)建

create table tableName(id int(1) primary key auto_increment);
  • 其中auto_increment為是主鍵的生成 策略,表示主鍵的值自動生成。

  • MySQL并未實(shí)現(xiàn)主鍵生成策略sequence,可以借助Hibernate框架實(shí)現(xiàn)。

  • 一張表中只能存在一個(gè)唯一性標(biāo)識,即只能有一個(gè)主鍵。?

  • 按照取值性質(zhì)不同,主鍵可以分為: 1.自然主鍵:主鍵值是自然數(shù),主鍵與當(dāng)前業(yè)務(wù)無關(guān),同一行中其他數(shù)據(jù)的改變不會導(dǎo)致主鍵值的改變。 2.業(yè)務(wù)主鍵:主鍵值與業(yè)務(wù)相關(guān),同一行中其他數(shù)據(jù)的改變可能導(dǎo)致主鍵的改變,一般主鍵不推薦設(shè)置成這種方式。

  • 主鍵可以由一個(gè)字段構(gòu)成,也可以由多個(gè)字段聯(lián)合構(gòu)成。在采用聯(lián)合主鍵的情況下,可能出現(xiàn)非主鍵字段對主鍵 字段的部分依賴,產(chǎn)生數(shù)據(jù)冗雜,違法數(shù)據(jù)庫設(shè)計(jì)第二范式,因此謹(jǐn)慎使用聯(lián)合主鍵。

4.foreign key ? ?

⑴背景

如果一張表A的某個(gè)字段引用另一張表B中的某個(gè)字段,為了保證引用的正確,在A表中添加外鍵。

⑵外鍵字段的創(chuàng)建

create table tbName(id (1) primary key auto_increment,name varchar(10) not ,classNo (1),foreign key(classNo)   references 父表(父表中被引用字段));
  • 在表創(chuàng)建完成以后,可以為表中字段添加約束:alter table tbName add 約束定義形式。

  • 一張表可以有多個(gè)外鍵字段,外鍵字段可以為null。

  • 父表中被引用字段數(shù)據(jù)不能重復(fù),必須有unique約束。

⑶級聯(lián)操作

為了保證子表中的數(shù)據(jù)跟隨父表的變化而變化,可以為外鍵添加級聯(lián)操作。
級聯(lián)關(guān)系是父表控制子表,使子表發(fā)生同樣的變化,不是子表控制父表,子表的變化不影響父表。不設(shè)置級聯(lián)操作時(shí),父表被引用字段被引用數(shù)據(jù)不能更改,外鍵字段可以更改為父表中主鍵字段的其他值。
級聯(lián)更新:

create table tbName(id (1) primary key auto_increment,name varchar(10) not (1),foreign key(classNo)   references 父表(父表中被引用字段)on update cascade);

當(dāng)父表中的數(shù)據(jù)更新時(shí),子表中的數(shù)據(jù)做出同樣的更新。
級聯(lián)刪除:

create table tbName(id (1) primary key auto_increment,name varchar(10) not (1),foreign key(classNo)   references 父表(父表中被引用字段)on delete cascade);

當(dāng)父表中的數(shù)據(jù)被刪除時(shí),子表中對應(yīng)的數(shù)據(jù)也同樣被刪除。
同時(shí)為外鍵設(shè)置級聯(lián)更新與級聯(lián)刪除:

create table tbName(id (1) primary key auto_increment,name varchar(10) not (1

⑷刪除順序

由于子表依賴于父表,創(chuàng)建時(shí)先創(chuàng)建父表,刪除時(shí)先刪除子表。

⑸一對多關(guān)聯(lián)關(guān)系

典型的一對多關(guān)系,在多的一方添加外鍵,即A表中的多行數(shù)據(jù)對應(yīng)B表中的一行數(shù)據(jù),那么在A表中添加外鍵,引用B表中的數(shù)據(jù)。

⑹約束名

可以使用“constraint name +約束定義形式”的格式,在表創(chuàng)建添加約束的同時(shí),為約束設(shè)定名稱,以便后續(xù)操作。

⑺外部定義

在表定義外部,通過約束名稱刪除約束:

alter table tbName drop foreign key name;

⑻外鍵使用限制

設(shè)置外鍵后,需要同時(shí)維護(hù)兩張表,增加了數(shù)據(jù)庫負(fù)擔(dān),降低了性能,因此盡量避免使用外鍵。

十二 索引

1.未使用索引時(shí)表的檢索方式?全盤檢索。

2.什么是索引?

  • 索引是一種提高查詢效率的策略,對應(yīng)于一個(gè)文件,文件中保存了索引字段排序后的信息以及其他信息。

  • 索引相當(dāng)于一本書的目錄,可以快速定位到一列數(shù)據(jù)中具有特定值的行。

3.索引適用的條件

  • 數(shù)據(jù)量較大。

  • 數(shù)據(jù)很少被DML語句操作,因?yàn)樗饕侄伟l(fā)生改變,索引文件需要更新,降低了表的更新速度。

  • 索引字段經(jīng)常出現(xiàn)在where語句中。

4.可以為一張表中的多個(gè)字段添加索引,多個(gè)索引有主次之分。

5.創(chuàng)建索引

create index indexName on tableName(columnName);

6.刪除索引

drop index indexName on tableName;

7.索引的創(chuàng)建與刪除格式不同與約束的格式,因?yàn)樗饕c約束是不同類型的屬性。

十三 事務(wù)

1.什么是事務(wù)?

不可再分割的工作單元,保證多個(gè)DML語句同時(shí)有效或者同時(shí)無效。

2.事務(wù)操作基于內(nèi)存

事務(wù)基于內(nèi)存中的數(shù)據(jù)進(jìn)行操作,每一步操作都會被保存到內(nèi)存中,提交時(shí)將內(nèi)存中的操作結(jié)果同步到數(shù)據(jù)庫,并且清空內(nèi)存;回滾時(shí)刪除內(nèi)存中的操作。在事務(wù)提交前,事務(wù)內(nèi)部的每一步操作都會基于內(nèi)存中的數(shù)據(jù)被執(zhí)行,而不是在事務(wù)提交的一刻才全部執(zhí)行,而是在事務(wù)提交前分步執(zhí)行,事務(wù)提交時(shí)將執(zhí)行結(jié)果寫入數(shù)據(jù)庫。可以概括為事務(wù)基于內(nèi)存,分步執(zhí)行。

3.特性(ACID)

  • A原子性:事務(wù)是一個(gè)最小的單元,不可再分。

  • C一致性:事務(wù)中的所有操作或者全部起作用,或者全部失效,不存在部分起作用,部分不起作用的情況。

  • I隔離性:事務(wù)之間相互隔離,彼此相互獨(dú)立。

  • D持久性:事務(wù)對數(shù)據(jù)庫的操作會反映到數(shù)據(jù)庫中。

4.關(guān)閉自動提交

MySQL在默認(rèn)情況下自動提交事務(wù),即每執(zhí)行一句DML語句,就會同步到數(shù)據(jù)庫,關(guān)閉自動提交的兩種方式:

start transaction-- DML---commit,或者start transaction--DML--rollback;  set autocommit=off(on);

以上兩種方式只對當(dāng)前會話有效。

5.隔離級別

  • read uncommitted:一個(gè)事務(wù)可以讀取另一個(gè)事務(wù)未提交的數(shù)據(jù),這個(gè)數(shù)據(jù)被稱為臟數(shù)據(jù)。

  • read committed:其他事務(wù)頻繁地提交數(shù)據(jù),另個(gè)事務(wù)(時(shí)間跨度大)在未提交之前多次讀取提交的數(shù)據(jù),可能出現(xiàn)多次讀取的數(shù)據(jù)不一致。

  • repeatable read:事務(wù)首次從數(shù)據(jù)庫中讀取數(shù)據(jù),然后將數(shù)據(jù)保存在內(nèi)存中,以后不是從數(shù)據(jù)庫,而是從內(nèi)存中讀取數(shù)據(jù)。這種隔離級別可能導(dǎo)致讀取的數(shù)據(jù)與數(shù)據(jù)庫中數(shù)據(jù)不一致,出現(xiàn)“幻想”。

  • serializable:一個(gè)事務(wù)操作完數(shù)據(jù)以后,其他事務(wù)才可以操作。

6設(shè)置隔離級別

  • set global transaction isolation level XXXX:對所用會話有效。

  • set session transaction isolation level XXXX:只對當(dāng)前會話有效。

7.查看隔離級別

  • select@@tx_isolation: 查看當(dāng)前會話的隔離級別,另一種方式 select@@session.tx_isolation。

  • select@@global.tx_isolation: 查看全局的事務(wù)隔離級別。

十四 行級鎖

1.什么是行級鎖?

行級鎖是一個(gè)數(shù)據(jù)庫事務(wù)隔離方面的概念,為查詢到的數(shù)據(jù)加鎖,當(dāng)前事務(wù)提交之前,不允許其他事務(wù)訪問鎖定的數(shù)據(jù)。

2.行級鎖實(shí)現(xiàn)

select ...for update;

在一般的DQL語句結(jié)尾添加“for update”,DQL語句查詢的字段就被鎖,然后再在事務(wù)內(nèi)部對鎖定的數(shù)據(jù)進(jìn)行其他操作。

3.數(shù)據(jù)庫線程安全問題的幾種解決方案

  1. java方面:為操作數(shù)據(jù)庫的代碼添加synchronized同步機(jī)制。

  2. 事務(wù)方面:serializable串行化。

  3. SQL語句方面:行級鎖。

十五 視圖View

1.什么是視圖?

視圖相當(dāng)于表的一個(gè)副本,是表隱藏了部分?jǐn)?shù)據(jù)與實(shí)現(xiàn)細(xì)節(jié)的結(jié)果,提供了一種比較安全的操作數(shù)據(jù)的方式。

2.創(chuàng)建

create view 視圖名 as select columnName01 as newName01,columnName02,...from tbName;

3.同步

視圖具有與表相同的屬性與操作,兩者綁定,對一個(gè)的操作也是對另一個(gè)的操作;

十六 SQL注入

1.什么是SQL注入?

攻擊者將SQL語句通過表單輸入或者請求地址中的請求參數(shù)注入到服務(wù)器中,執(zhí)行惡意的SQL命令,如select * from table where name=’name01’and password=’n’or’a’=’a’;

2.SQL發(fā)生的根本原因

編譯時(shí)把包含SQL關(guān)鍵字的用戶輸入一同編譯,這樣SQL語句發(fā)生扭曲。

3.防止SQL注入的一種方案

將SQL語句的框架與用戶輸入的參數(shù)分開,先編譯框架,然后接收參數(shù),這樣就會把含有SQL關(guān)鍵字的輸入當(dāng)做普通字符串了,不會執(zhí)行惡意的SQL命令。 ? ?

十七 存儲引擎(MySQL專有)

1.什么是存儲引用?

數(shù)據(jù)庫管理系統(tǒng)簡化了數(shù)據(jù)庫的創(chuàng)建與維護(hù),但底層依然沒有跳過對數(shù)據(jù)的基礎(chǔ)處理,比如將數(shù)據(jù)存放在什么樣的文件中,以什么樣的結(jié)構(gòu)存放、怎么訪問與修改等問題,存儲引擎是數(shù)據(jù)庫管理系統(tǒng)的底層實(shí)現(xiàn),是數(shù)據(jù)的底層具體存儲方式,是一種數(shù)據(jù)的存儲技術(shù)。
?2.存儲引擎是一個(gè)表級概念,可以為同一數(shù)據(jù)庫中不同的表設(shè)置不同的存儲引擎。

3.分類

⑴InnoDB

MySQL默認(rèn)的存儲引擎,支持事務(wù)、外鍵、行級鎖,MySQL程序崩潰后,提供自動恢復(fù),數(shù)據(jù)及其他信息以.frm文件格式存儲;

⑵MyISAM

? ? 底層有3個(gè)文件:

  • frm:存放表結(jié)構(gòu)。

  • MYD:存放數(shù)據(jù)。

  • MYI:存放索引。

特點(diǎn):

  • 不支持事務(wù)。

  • 支持壓縮只讀表。

  • 該引擎使用了索引,因此適用環(huán)境受索引的約束,主要用于數(shù)據(jù)量較大、數(shù)據(jù)很少更改的表。

⑶Memory

  • 數(shù)據(jù)與索引存儲在內(nèi)存中,因此檢索速度最快,缺點(diǎn)是無法持久。

  • 以.frm文件格式存儲信息。

  • 不支持事務(wù)。

?4.顯示MySQL支持的引擎

show enginesG:

十八 數(shù)據(jù)庫設(shè)計(jì)三范式

設(shè)計(jì)數(shù)據(jù)庫時(shí)應(yīng)遵循的基本原則:

1.有主鍵,字段不可再分

主鍵不僅可以可以作為數(shù)據(jù)的唯一標(biāo)識,避免數(shù)據(jù)重復(fù),同時(shí)內(nèi)含索引,提高了查詢速度。假如某個(gè)字段還可以再分,該字段相比與分割后的字段,維護(hù)不方便,查詢速度慢。

2.非主鍵字段完全依賴于主鍵,不能產(chǎn)生部分依賴

這條規(guī)范主要是為了限制聯(lián)合主鍵的使用,使得一張表中只能保存一種實(shí)體的信息。使用聯(lián)合主鍵時(shí),非主鍵字段可能只對聯(lián)合主鍵的一個(gè)字段存在依賴關(guān)系。詳細(xì)說,假定一張表采用聯(lián)合主鍵KA、KB,其中一個(gè)非主鍵字段C只依賴于KB,由于一行數(shù)據(jù)的唯一性由KA與KB共同確定,KB的某一值可以與KA的多個(gè)值搭配出現(xiàn)在多行,那么凡是在KB某個(gè)值出現(xiàn)的行,對應(yīng)的字段C某個(gè)確定的值C0也必定出現(xiàn),這樣C0就重復(fù)出現(xiàn)在多行中,造成數(shù)據(jù)冗雜。

3.不能出現(xiàn)傳遞依賴

某個(gè)非主鍵字段C依賴于另一個(gè)非主鍵字段B,而B完全依賴于主鍵字段A,那么C對A的依賴關(guān)系是通過B的傳遞建立起來的,C對A的依賴就是傳遞依賴。如果B重復(fù)出現(xiàn),那么C跟著重復(fù)出現(xiàn)。應(yīng)該另外建立一張表,以B為主鍵存儲B與C,在原表中為B建立外鍵,指向該表。

總之,將不同的對象分開存儲。而實(shí)際開發(fā)中,不一定要嚴(yán)格遵守三范式,以滿足項(xiàng)目需求為最高目的,有時(shí)為了追求速度可以犧牲結(jié)構(gòu)。

?

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊9 分享