知識點總結:html
1.建立數據庫:mysql
create database_name;
2.刪除數據庫:web
drop database_name;
3.選擇/切換數據庫正則表達式
use database_name;
4.建立數據表:sql
create table table_name(column_name column_type);
例:數據庫
create table if not exists table1( id int auto_increment primary key, name varchar(20) not null, password varchar(40) not null)enging=InnoDB default charset=utf8;
注:MySQL命令終止符爲分號(;)。express
附:存儲引擎(enging):
mysql中的數據用各類不一樣的技術存儲在文件(或者內存)中。這些技術中的每一種技術都使用不一樣的存儲機制、索引技巧、鎖定水平而且最終提供普遍的不一樣的功能和能力。經過選擇不一樣的技術,你可以得到額外的速度或者功能,從而改善你的應用的總體功能。例如,若是在研究大量的臨時數據,也許須要使用內存存儲引擎。內存存儲引擎可以在內存中存儲全部的表格數據。又或者,你也許須要一個支持事務處理的數據庫(以確保事務處理不成功時數據的回退能力)。這些不一樣的技術以及配套的相關功能在MySQL中被稱做存儲引擎(也稱做表類型)。MySQL默認配置了許多不一樣的存儲引擎,能夠預先設置或者在MySQL服務器中啓用。你能夠選擇適用於服務器、數據表和表格的存儲引擎,以便在選擇如何存儲你的信息,如何檢索這些信息以及你須要你的數據結合什麼性能和功能的時候爲你提供的最大的靈活性。 安全
分類:
MyISAM:擁有較高的插入,查詢速度,但不支持事務;
InnoDB:5.5版本後MySQL的默認數據庫,事務型數據庫的首選引擎,支持ACID事務,支持行級鎖定;
BDB:源自Berkeley DB,事務型數據庫的另外一種選擇,支持COMMIT和ROLLBACK等其餘事務特性;
Memory:全部數據置於內存的存儲引擎,擁有極高的插入,更新和查詢效率。可是會佔用和數據量成正比的內存空間。而且其內容會在MySQL重啓時丟失;
Merge:將必定數量的MyISAM表聯合而成一個總體,在超大規模數據存儲時頗有用;
Archive:很是適合存儲大量的獨立的,做爲歷史紀錄的數據。由於他們不常常被讀取。Archive擁有高效的插入速度,但其對查詢的支持相對較差;
Federated:將不一樣的MySQL服務器聯合起來,邏輯上組成一個完整的數據庫。很是適合分佈式應用;
Cluster/NDB:高冗餘的存儲引擎,用多臺數據機器聯合提供服務以提升總體性能和安全性。適合數據量大,安全和性能要求高的應用;
CSV:邏輯上由逗號分割數據的存儲引擎。它會在數據庫子目錄裏爲每一個數據表建立一個 .CSV文件。這是一種普通文本文件,每一個數據行佔用一個文本行。CSV存儲引擎不支持索引;
BlackHole:黑洞引擎,寫入的任何數據都會消失,通常用於記錄binlog作複製的中繼。
5.刪除數據表:服務器
drop table table_name;
注:執行刪除命令後全部數據都會消失,因此要很是當心。分佈式
附:
刪除表內數據,用delete:delete from 表名 where 刪除條件;
清除表內數據,保存表結構,用truncate:truncate table 表名;
刪除表用drop:drop table 表名;
1.當你再也不須要該表時,用drop;
2.當你仍要保留該表,但要刪除全部記錄時,用truncate;
3.當你要刪除部分記錄時,用delete。
6.插入數據:
insert into table_name(field1,field2,...fieldN)values(value1,value2,...valueN);
注:若是數據是字符型,必須使用單引號或者雙引號。
例:
插入單條數據:
insert into table_name(name,password,date)values("kwonjiyong","peaceminusone",now());
插入多條數據:
insert into table_name(name,password,date)values("kwonjiyong","peaceminusone",now()),("zhangqi","xxxidaizy",now())...; //now()是一個mysql函數,該函數返回日期和時間。
其中id若是設置了auto_increment(自動增長)能夠不提供,也能夠根據須要本身設置;
7.查詢數據:
select * from table_name;//查詢數據表中的全部數據
select column_name,column_name from table_name [where 條件][limit N][offset M];
注:
1.查詢時可使用一個或者多個表,表之間使用( ,)分割,並使用where語句來設定查詢條件;
2.select命令能夠讀取一條或者多條記錄;
3.可使用(*)來代替其餘字段,select語句會返回表的全部字段數據;
4.可使用where語句來包含任何條件;
5.可使用limit屬性來設定返回的記錄數;
6.能夠經過offset指定select語句開始查詢的數據偏移量,默認狀況下,偏移量爲0。
附:limit和offset用法:
select * from table limit 2,1; //含義是跳過2條取出1條數據,limit後面是從第2條開始讀,讀取1條信息,即讀取第3條數據
select * from table limit 2 offset 1; //含義是從第1條(不包括)數據開始取出2條數據,limit後面跟的是2條數據,offset後面是從第1條開始讀取,即讀取第2,3條
8.where子句:
1.能夠在 where 子句中指定任何條件;
2.可使用 and 或者 or 指定一個或多個條件;
3.where 子句也能夠運用於SQL的 delete 或者 update 命令;
4.where 子句相似於程序語言中的 if 條件,根據mysql表中的字段值來讀取指定的數據;
5.操做符 ( =,<>,!=,>,<,>=,<= )可用於where子句中;
6.mysql的 where 子句的字符串比較是不區分大小寫的。可使用binary關鍵字來設定where子句的字符串比較是區分大小寫的,例:
select * from 表名 where name='Aaa'; //不區分大小寫 select * from 表名 where binary name='Aaa'; //區分大小寫
9.update查詢:
使用update命令修改mysql數據表數據:
update 表名 set field1=new_value1,field2=new_value2 [where 條件];
當須要字段中的特定字符串批量修改成其餘字符串時,可以使用如下操做:
update table_name set field =replace(field,'old_string','new_string')[where 條件];
注:
1.能夠同時更新一個或多個字段;
2.能夠在where子句中指定任何條件;
3.能夠在一個單獨表中同時更新數據。
10.delete語句:
delete from table_name [where 條件]; delete from table_name;//刪除表中的全部數據
注:
1.若是沒有指定where子句,mysql表中的全部記錄將被刪除;
2.能夠在where子句中指定任何條件;
3.能夠在單表中一次性刪除記錄。
11.like子句:
select * from table_name where field1 like condition1;
注:
1.能夠在where子句中指定任何條件;
2.能夠在where子句中使用like子句;
3.可使用like子句代替等號 = ;
4.like一般與 % 一塊兒使用;
5.可使用 and 或者 or 指定一個或多個條件;
6.能夠在delete或update命令中使用where...like 子句來指定條件。
附:
1.SQL like子句中使用百分號 % 字符來表示任意字符;
2.若是沒有使用百分號 % ,like子句與等號 = 的效果是同樣的。
12.union:
select expression1,expression2,...expressionN from table1_name [where conditions]union [all|distinct] select expression1,expression2,...expressionN from table2_name [where conditions];
參數:
distinct:可選,刪除結果集中重複的數據。默認狀況下union操做符已經刪除了重複數據,因此distinct修飾符對結果沒有影響。
all:可選,返回全部結果集,包含重複數據。
注:
1.union操做符用於鏈接兩個以上的select語句的結果組合到一個結果集中。多個select語句會刪除重複的數據。
13.排序:
若是須要對讀取的數據進行排序,可使用 order by 子句來設定想按哪一個字段哪一種方式來進行非排序,再返回搜索結果。
select field1,field2,...fieldN table_name1,table_name2... order by fueld1,[field2...][asc [desc]]
注:
1.可使用任何字段來做爲排序的條件,從而返回排序後的查詢結果;
2.能夠設定多個字段來排序;
3.可使用asc或desc關鍵字來設置查詢結果是按照升序或降序排列。默認狀況下,它是按升序排列;
4.能夠添加where...like子句來設置條件。
14.group by分組:
select column_name,function(column_name) from table_name where column_name operator value group by column_name;
1.group by 語句根據一個或多個列對結果集進行分組;
2.在分組的列上可使用count,sum,avg等函數。
15.鏈接的使用:
能夠在select,update和delete語句中使用mysql的join來聯合多表查詢。join 按照功能大體分爲以下三類:
1.inner join(內鏈接,或等值鏈接):獲取兩個表中字段匹配關係的記錄;
2.left join(左鏈接):獲取左表全部記錄,即便右表沒有對應匹配的記錄;
3.right join(右鏈接):與left join相反,用於獲取右表全部記錄,即便左表沒有對應匹配的記錄。
例:
select table1.username,table1.password,table2.id from table1 (inner) join table2 on table1.country=table2.country; select table1.username,table1.password,table2.id from table1,table2 where table1.country=table2.country;
以上兩種方式等價。
16.null值處理:
三大運算符:
1.is null:當列的值是null,此運算符返回true;
2.is not null:當列的值不爲null,運算符返回true;
3.<=>:比較運算符(不一樣於=運算符),當比較的兩個值爲null時返回true;
注:
關於null的條件比較運算是比較特殊的。不能使用 =null 或 !=null 在列中查找null值。在mysql中,null值與任何其餘值的比較(即便是null)永遠返回false,即null=null返回false。mysql中處理null使用 is null 和 is not null 運算符。
17.正則表達式:
mysql中使用regexp操做符來進行正則表達式匹配:
例:
select name from table1 where name regexp '^st';//查找name字段中以'st'爲開頭的全部數據 select name from table1 where name regexp 'ok$';//查找name字段中以'ok'爲結尾的全部數據 select name from table1 where name regexp 'mar';//查找name字段中包含'mar'字符串的全部數據 select name from table1 where name regexp '^[aeiou]|ok&';//查找name字段中以元音字符開頭或以'ok'結尾的全部數據
附:
^ :匹配輸入字符串的開始位置;
$ :匹配輸入字符串的結束位置;
. :匹配除"\n"以外的任何單個字符;
[...] :字符集合。匹配所包含的任意一個字符。例如,'[abc]'能夠匹配 "plain" 中的 'a' ;
[^...] :負值字符集合。匹配未包含的任意字符。例如,‘[^abc]’能夠匹配 "plain" 中的 'p' ;
p1|p2|p3 :匹配p1或p2或p3。例如 'z|food' 能匹配"z"或"food"。'(z|f)ood'則匹配"zood"或"food";
* :匹配前面的子表達式零次或屢次。例如,'zo*'能匹配"z"以及"zoo"。* 等價於{0,};
+ :匹配前面的子表達式一次或屢次。例如,'zo+'能匹配"zo"以及"zoo",但不能匹配"z"。+等價於{1,};
{n} :n是一個非負整數。匹配肯定的n次。例如,'o{2}'不能匹配"Bob"中的'o',可是能匹配"food"中的兩個'o';
{n,m} :m和n均爲非負整數,其中n<=m。最少匹配n次且最多匹配m次。
18.事務:
注:
1.在mysql中只有使用了Innodb數據庫引擎的數據庫或表才支持事務;
2.事務處理能夠用來維護數據庫的完整性,保證成批的SQL語句要麼所有執行,要麼所有不執行;
3.事務用來管理insert,update,delete語句;
4.事務必須知足(ACID):原子性、一致性、隔離性、持久性:
mysql事務處理主要有兩種方法:
1.用begin,rollback,commit來實現
begin:開始一個事務
rollback:事務回滾
commit:事務確認
2.直接用set來改變mysql的自動提交模式:
set autocommit=0 :禁止自動提交
set autocommit=1 :開啓自動提交
19.alter命令:
1.刪除,添加或修改表字段:
alter table table_name drop i;//刪除表的i字段(若是表中只剩一個字段則沒法使用drop刪除字段) alter table table_name add i int;//向表中添加i字段並定義數據類型(字段會自動添加到表字段的末尾) alter table table_name add i int first;//新增字段會設定爲第一列 alter table table_name add i int after c;//設定位於c字段以後
2.修改字段類型及名稱(使用modify或change):
alter table table_name modify c char(10);//將字段c的類型改成char(10) alter table table_name change i j bigint; alter table table_name change j j int;//change關鍵字以後緊跟的是你要修改的字段名,而後指定新字段名及類型
3.alter table 對null值和默認值的影響(若是不設默認值,mysql會自動將該字段設爲null):
alter table table_name modify j bigint not null default 100;//指定字段j爲not null 且默認值爲100
4.修改字段默認值:
alter table table_name alter i set default 1000;//修改i字段默認值爲1000 alter table table_name alter i drop default;//刪除i字段的默認值 alter table table_name enging=myisam;//修改存儲引擎爲myisam
5.修改表名:
alter table table_name rename to new_table;
6.刪除外鍵約束:
alter table table_name drop foreign key keyName;
7.修改字段的相對位置:
alter table table_name modify column1 type1 first|after column2;//type1爲column1字段原來的類型
20.索引:
1.普通索引:
(1).建立索引:
create index indexName on mytable(username(length));
(2).修改表結構(添加索引):
alter table table_name add index indexName(columnName);
(3).建立表的時候直接指定:
create table mytable(id int not null,username varchar(16) not null,index [indexName](username(length)));
(4).刪除索引:
drop index [indexName] on mytable;
2.惟一索引:
(1).建立索引:
create unique index indexName on mytable(username(length));
(2).修改表結構:
alter table table_name add unique [indexName](username(length));
(3).建立表的時候直接指定:
create table mytable (id int nopt null,username varchar(16) not null,unique [indexName](username(length)));
3.使用alter命令添加和刪除索引:
例:
alter table table_name add index (c);//在表中添加索引 alter table table_name drop index c;//刪除索引
4.使用alter命令添加和刪除主鍵:
alter table table_name modify i int not null;//添加主鍵索引時,須要確保該主鍵默認不爲空(not null) alter table table_name add primary key (i); alter table table_name drop primary key;//刪除主鍵
5.顯示索引信息(經過添加\G來格式化輸出信息):
show index from table_name;\G
21.臨時表:
臨時表用於保存一些臨時數據,臨時表只在當前鏈接可見,當關閉鏈接時,mysql會自動刪除表並釋放全部空間。若是你使用了其餘mysql客戶端程序鏈接mysql數據庫服務器來建立臨時表,那麼只有在關閉客戶端程序時纔會銷燬臨時表,也能夠手動銷燬。
1.新建臨時表:
create temporary table table_name(name varchar(10),price double not null default 0.00,count int not null default 0);
當使用show tables命令顯示數據表列表時,將沒法看到臨時表。若是退出當前mysql會話,再使用select命令來讀取原先建立的臨時表數據,會發現數據庫中沒有該表的存在,由於在退出時臨時表已經被銷燬了。
2.刪除臨時表:
drop table table_name;
22.複製表:
完整的複製mysql數據表:
1.使用show create table 命令獲取建立數據表(create table)語句,該語句包含了原數據表的結構,索引等;
2.複製如下命令顯示的SQL語句,修改數據表名,並執行SQL語句,經過以上命令將徹底的複製數據表結構;
3.若是想複製表的內容,可使用insert into ...select語句來實現。
例:
1.獲取數據表的完整結構:
show create table table_self;
2.修改SQL語句的數據表名,並執行SQL語句:
create table clone_tbl(...);
3.執行完步驟2後,將在數據庫中建立新的克隆表clone_tbl。若是想拷貝數據表的數據可使用insert into...select語句來實現:
insert into clone_tbl(column1,column2,...columnN) select column1,column2,...columnN from table_self;
附:
另外一種完整複製表的方法:
create table targetTable like sourceTable; insert into targetTable select * from sourceTable;
能夠拷貝一個表中其中的一些字段:
create table newadmin as(select username,password from admin);
能夠將新建的表的字段更名:
create table newadmin as(select id,username as uname,password as pass from admin);
能夠拷貝一部分數據:
create table newadmin as(select * from admin where left(username,1)='s');
能夠在建立表的同時定義表中的字段信息:
create table newadmin(id int not null auto_increment primary key)as(select * from admin);
mysql複製表的兩種方式:
1.只複製表結構到新表:
create table 新表 select * from 舊錶 where 1=2; //where 1=2 永遠不成立,因此select * from 舊錶 where 1=2 返回一個空集合,只返回舊錶的字段 或者 create table 新表 like 舊錶;
2.複製表結構及數據到新表:
create table 新表 select * from 舊錶;
23.元數據:
1.獲取查詢語句影響的記錄數:查詢結果信息:select,update或delete語句影響的記錄數;
2.數據庫和數據表的信息:包含了數據庫及數據表的結構信息;
show tables;
show databases;
3.mysql服務器信息:包含了數據庫服務器的當前狀態,版本號等。
select version(); //服務器版本信息 select database();//當前數據庫名(或者返回空) select user(); //當前用戶名 shoew status; //服務器狀態 show varibles; //服務器配置變量
24.序列使用:
mysql序列是一組整數:1,2,3,..,因爲一張數據表只能有一個字段自增主鍵,若是想實現其餘字段也自動增長,可使用序列。
1.使用auto_increment
2.獲取auto_increment值:
last_insert_id();//獲取最後的插入表中的自增列的值
3.重置序列:若是刪除了多行記錄,並但願對剩下數據的auto_increment列從新排列,能夠刪除自增的列而後從新添加:
alter table table_name drop id; alter table table_name add id int not null auto_increment primary key;
4.設置序列的開始值:通常序列的開始值爲1,若是須要指定,可經過下列語句實現:
create table table_name(id int not null auto_increment primary,...)auto_increment=100;
也能夠在表建立成功後,使用:
alter table t auto_increment=100;
25.mysql處理重複數據:
1.防止表中 出現重複數據:
(1).能夠經過設置primary key(主鍵)或unique(惟一)索引來保證數據的惟一性。若是設置了惟一索引,那麼在插入重複數據時,SQL語句將沒法執行成功,並拋出錯。
(2).使用insert ignore into執行後不會出錯,也不會向數據表中插入重複數據,該語句會忽略數據庫中已經存在的數據,若是數據庫沒有數據,就插入新的數據,若是有數據的話就跳過這條數據。
(3).insert ignore into 當插入數據時,在設置了記錄的惟一性後,若是插入重複數據,將不返回錯誤,只以警告形式返回。而 replace into into 若是存在primary或unique相同的記錄,則先刪除掉,再插入新記錄。
2.統計重複數據:
select count(*) as repetitions,last_name,first_name from person_tbl group by last_name,first_name having repetitions > 1;
該語句將返回person_tbl表中重複的記錄數。通常狀況下,查詢重複的值,請執行如下操做:
(1).肯定哪一列包含的值可能會重複;
(2).在列選擇列表中使用count(*)列出的那些列;
(3).在group by子句中列出的列;
(4).having子句設置重複數大於1。
3.過濾重複數據:
若是須要讀取不重複的數據能夠在select語句中使用distinct關鍵字來過濾重複數據:
select distinct last_name,first_name from person_tbl;
也可使用group by來讀取數據表中不重複的數據:
select last_name,first_name from person_tbl group by(last_name,first_name);
4.刪除重複數據:
create table tmp select last_name,first_name,sex from person_tbl group by(last_name,first_name,sex); drop table person_tbl; alter table tmp rename to person_tbl
也能夠在數據表中添加index(索引)和primary key(主鍵)來刪除表中的重複記錄:
alter ignore table person_tbl add primary key(last_name,first_name);
26.MySQL及SQL注入:
若是經過網頁獲取用戶輸入的數據並將其插入一個mysql數據庫,就有可能發生SQL注入安全問題。
SQL注入,就是經過把SQL命令插入到web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。
防止SQL注入,須要注意如下幾點:
1.永遠不要信任用戶的輸入。對用戶的輸入進行校驗,能夠經過正則表達式,或限制長度;對單引號和雙"-"進行轉換等;
2.永遠不要使用動態拼裝SQL,可使用參數化的SQL或者直接使用存儲過程進行數據查詢存取;
3.永遠不要使用管理員權限的數據庫鏈接,爲每一個應用使用單獨的權限有限的數據庫鏈接;
4.不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息;
5.應用的異常信息應該給出儘量少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝;
6.SQL注入的檢測方法通常採起輔助軟件或網站平臺來檢測,軟件通常採用SQL注入檢測工具jsky,網站平臺有億思網站安全平臺檢測工具,MDCSOFT SCAN等。採用MDCSOFT-IPS能夠有效的防護SQL注入,XSS攻擊等。
like語句中的注入:
like查詢時,若是用戶輸入的值有"_"和"%",則會出現這種狀況:用戶原本只是想查詢"abcd_",查詢結果中卻有"abcd_"、"abcde"、"abcdf"等等;用戶要查詢"30%"(注:百分之三十)時也會出現問題。
27.導出數據:
1.使用select...into outfile語句導出數據:
select * from tbl into outfile '/self/xxx.txt';
能夠經過命令選項來設置數據輸出的指定格式,如下爲導出CSV格式:
select * from passwd into outfile 'xxx.txt' fields terminated by ',' enclosed by '"' lines terminated by '\r\n';
生成一個文件,各值用逗號隔開(這種格式能夠被許多程序使用):
select a,b,a+b into outfile 'xxx.txt' fields terminated by ',' optionally enclosed by '"' lines terminated by '\n' from test_table;
附:
select ...into outfile 語句有如下屬性:
(1).load data infile是select...into outfile的逆操做,select句法。爲了將一個數據庫的數據寫入一個文件,使用select...into outfile,爲了將文件讀回數據庫,使用load data infile;
(2).select...into outfile'file_name'形式的select能夠把被選擇的行寫入一個文件中。該文件被建立到服務器主機上,所以您必須擁有file權限,才能使用此語法;
(3).輸出不能是一個已存在的文件。防止文件數據被篡改;
(4).你須要有一個登陸服務器的帳號來檢索文件,不然select...into outfile不會起任何做用;
(5).在UNIX中,該文件被建立後是可讀的,權限由MySQL服務器所擁有。這意味着,雖然能夠讀取該文件,但可能沒法將其刪除。
2.導出表做爲原始數據:
3.導出SQL格式的數據:
(1).須要導出整個數據庫的數據,可使用如下命令:
$ mysqldump -u root -p db_name>database_dump.txt password ******
(2).須要備份整個數據庫,可使用如下命令:
$ mysqldump -u root -p --all-database>database_dump.txt password ******
4.將數據表及數據庫拷貝至其餘主機:
在源主機上執行如下命令,將數據備份至dump.txt中:
$ mysqldump -u root -p database_name table_name>dump.txt password ******
若是完整備份數據庫,則無需使用特定的表名稱。
若是須要將備份的數據庫導入到mysql服務器中,可使用如下命令,使用如下命令須要確認數據庫已經建立:
$ mysql -u root -p database_name<dump.txt password ******
28.MySQL導入數據:
1.使用load data導入數據:
load data local infile 'dump.txt' into table mytbl;
以上實例從當前目錄中讀取文件dump.txt,將該文件中的數據插入到當前數據庫的mytbl表中。若是指定local關鍵字,則代表從客戶主機上按路徑讀取文件。若是沒有指定,則文件在服務器上按路徑讀取文件。
2.使用mysqlimport導入數據:
$mysqlimport -u root -p --local database_name dump.txt password ******