第一篇:My SQL 第7章 教案
7.1 存儲(chǔ)過(guò)程
一、存儲(chǔ)過(guò)程的創(chuàng)建格式: a)格式:
create procedure 存儲(chǔ)過(guò)程名稱(chēng)([參數(shù)列表])[begin]
存儲(chǔ)過(guò)程中執(zhí)行的命令序列;[end] 結(jié)束符
b)參數(shù)的定義(參數(shù)可有可無(wú),但小括號(hào)必須要),包括三部分: i.輸入|輸出模式
1.in 輸入型參數(shù)(默認(rèn)),從外部調(diào)用環(huán)境將值輸入到存儲(chǔ)過(guò)程內(nèi)部,傳遞的方向:實(shí)參值-?形參變量 2.out 輸出型參數(shù),從存儲(chǔ)過(guò)程輸出值到外部調(diào)用環(huán)境的變量,傳遞的方向:形參變量-?實(shí)參變量
3.in|out 輸入|輸出型參數(shù),從外部調(diào)用環(huán)境將值輸入到存儲(chǔ)過(guò)程內(nèi)部,對(duì)數(shù)據(jù)進(jìn)行處理,然后將新的結(jié)果再由存儲(chǔ)過(guò)程輸出到外部調(diào)用環(huán)境的變量,傳遞的方向:實(shí)參變量-?形參變量-?實(shí)參變量 ii.iii.iv.參數(shù)名稱(chēng) 數(shù)據(jù)類(lèi)型 例如:
1.create procedure addValue1(in oper1 int,in oper2 int,out sum int)……
2.create procedure swapValue(inout oper1 int,inout oper2 int)……
c)結(jié)束符的定義: i.結(jié)束符定義的原因:因?yàn)樵趍ySQL環(huán)境中 默認(rèn)使用分號(hào) 作為結(jié)束符號(hào),而每條語(yǔ)句輸入完成后也是使用分號(hào)作為結(jié)束標(biāo)記的。因此在定義存儲(chǔ)過(guò)程的內(nèi)部,如果需要寫(xiě)入多條語(yǔ)句,那么在第一條語(yǔ)句結(jié)束寫(xiě) 分號(hào) 的時(shí)候,整個(gè)存儲(chǔ)過(guò)程的定義也就被結(jié)束了,因此,需要為mySQL環(huán)境定義額外的結(jié)束符作為結(jié)束標(biāo)記。
ii.結(jié)束符定義的格式: delimiter 結(jié)束符號(hào) iii.結(jié)束符的使用:
1.在存儲(chǔ)過(guò)程內(nèi)部(即begin end之間)仍然使用 分號(hào) 作為語(yǔ)句的結(jié)束標(biāo)志。
2.在存儲(chǔ)過(guò)程定義結(jié)束后(即 end 的后面)需要使用自己定義的結(jié)束符作為整個(gè)存儲(chǔ)過(guò)程定義結(jié)束的標(biāo)志。d)在存儲(chǔ)過(guò)程中處理2條以上命令的時(shí)候,應(yīng)該加上begin...end,如果只包含1條語(yǔ)句,可以省略begin...end關(guān)鍵字。i.例如:
create procedure pro1()set @a=100;$
create procedure pro2()begin set @a=100;set @b=1000;end;$
二、簡(jiǎn)單存儲(chǔ)過(guò)程的例題 a)不執(zhí)行任何操作的存儲(chǔ)過(guò)程
delimiter!
create procedure pro3()begin end!
b)存儲(chǔ)過(guò)程的執(zhí)行:call 存儲(chǔ)過(guò)程名稱(chēng)([實(shí)參列表]);
c)在別的數(shù)據(jù)庫(kù)語(yǔ)言中這樣做是不允許的。因?yàn)樗鼈円骲egin 和 end 之間至少存在一條語(yǔ)句。如下面的代碼: create procedure pro4()begin null;end!使用null關(guān)鍵字表示不執(zhí)行任何操作,但是這樣做在MySQL中是不允許的。
d)查看錯(cuò)誤信息
show errors
三、存儲(chǔ)過(guò)程中的注釋符號(hào): a)單行注釋符 i.--
該注釋符需要注意:注釋符和注釋的內(nèi)容之間要
有空格,否則語(yǔ)法錯(cuò)誤 ii.# 該注釋符和注釋的內(nèi)容之間的空格可有可無(wú)
b)多行注釋符 i./*……*/ c)例題:
create procedure pro5()begin set @a=100;--定義一個(gè)用戶(hù)變量@a set @b=1000;#定義一個(gè)用戶(hù)變量@b set @c=1000;/*定義一個(gè)
用戶(hù)變量@c*/ end;$
四、局部變量的定義和使用
a)局部變量的概念:在存儲(chǔ)過(guò)程內(nèi)部聲明的變量,稱(chēng)為局部變量,這樣的變量只能局限于存儲(chǔ)過(guò)程內(nèi)部使用。該變量不同于前面學(xué)的用戶(hù)變量。b)局部變量的定義: i.在begin…end之間進(jìn)行定義。ii.使用declare關(guān)鍵字進(jìn)行定義,并且定義的同時(shí)可以賦值。格式: declare 變量名,[變量2] 數(shù)據(jù)類(lèi)型 [default 默認(rèn)值];注意,此處只能使用default設(shè)置默認(rèn)值,不能用等號(hào) iii.必須遵循先定義后使用的原則。
c)局部變量與用戶(hù)變量的不同: i.ii.命名格式不同:局部變量前面沒(méi)有@
定義和使用范圍不同:局部變量只能在當(dāng)前定義它的存儲(chǔ)過(guò)程內(nèi)部使用;而用戶(hù)變量可以在當(dāng)前的整個(gè)會(huì)話范圍使用,包括存儲(chǔ)過(guò)程。iii.用戶(hù)變量不用事先定義,可以直接賦值使用,而且數(shù)據(jù)類(lèi)型是隨著賦予它的值而確定的。但局部變量必須先定義后使用,見(jiàn)下面的兩個(gè)例子。iv.賦值方式不同,如下面。
d)分別使用set和select關(guān)鍵字為局部變量和用戶(hù)變量賦值
首先要注意,為局部變量或用戶(hù)變量賦值時(shí),不能直接寫(xiě)成變量名 = 值;等號(hào) 運(yùn)算符應(yīng)該 配合set或 select 關(guān)鍵字一起使用。i.局部變量的賦值: 1.set 局部變量名=值 2.set 局部變量名:=值
3.select值 into 局部變量名
注意:由于局部變量的局限性,所以為局部變量的賦值的這些語(yǔ)句只能在存儲(chǔ)過(guò)程內(nèi)部執(zhí)行。ii.用戶(hù)變量的賦值方式: 1.set @用戶(hù)變量名=值
2.set @用戶(hù)變量名:=值
3.select 值 into @用戶(hù)變量名
4.select @用戶(hù)變量名:=值
--這種形式只能用在用戶(hù)變
--量的賦值上
注意:由于用戶(hù)變量可以在整個(gè)會(huì)話的范圍內(nèi)使用,所以這些命令既可以在存儲(chǔ)過(guò)程內(nèi)部執(zhí)行,也可以在存儲(chǔ)過(guò)程的外部執(zhí)行。iii.局部變量與用戶(hù)變量的定義、賦值例題: 1.例6:局部變量的定義與賦值 create procedure pro6()begin declare a,b,c,d int;set a=10;set b:=20;select 30 into c;--select d:=40;end$ 2.例7:用戶(hù)變量的定義與賦值 create procedure pro7()begin set @a=10;set @b:=20;select 30 into @c;--這種格式也可以直接在提示符下使用
select @d:=40;end$ 3.例8:局部變量與用戶(hù)變量不同的使用范圍 call pro6()$ call pro7()$
select a$--局部變量a超出了使用范圍,訪問(wèn)失敗 select @a$--用戶(hù)變量@a可以在整個(gè)會(huì)話中使用
五、有參數(shù)存儲(chǔ)過(guò)程的定義與調(diào)用 a)不同模式的形參對(duì)應(yīng)的實(shí)參: i.ii.iii.in模式的形參,它的實(shí)參可以是常量、變量和表達(dá)式; out模式的形參,它的實(shí)參只能是變量; inout模式的形參,它的實(shí)參只能是變量;
b)輸入型參數(shù)與輸出型參數(shù)的使用 i.例1:
create procedure addValue(in oper1 int,in oper2 int,out sum int)begin set sum=oper1+oper2;
end$ 或者寫(xiě)成:set sum:=oper1+oper2;select oper1+oper2 into sum;也就是說(shuō),形參本質(zhì)與局部變量相同,所以賦值方式也相同。注意:add是關(guān)鍵字 sum不是關(guān)鍵字 上面存儲(chǔ)過(guò)程的調(diào)用: delimiter;set @number;call addValue(10,20,@number);select @number;ii.例2:使用用戶(hù)變量保存存儲(chǔ)過(guò)程的值
delimiter $ create procedure addValue1(in x int,in y int)begin select @z:=x+y;
end$ call addValue1(1,2)$ select @z$ c)輸入輸出型參數(shù)的使用 i.寫(xiě)法一:
delimiter$ create procedure swapValue(inout oper1 int,inout oper2 int)begin set oper1=oper1+oper2;set oper2=oper1-oper2;set oper1=oper1-oper2;end$ ii.寫(xiě)法二:
create procedure swapValue1(inout oper1 int,inout oper2 int)begin declare temp int;set temp=oper1;set oper1=oper2;set oper2=temp;end$ iii.調(diào)用: set @a=10,@b=20$ call swapValue(@a,@b)$ select @a,@b$
六、標(biāo)準(zhǔn)SQL語(yǔ)句在存儲(chǔ)過(guò)程中的使用 a)DML語(yǔ)句在存儲(chǔ)過(guò)程中的使用 i.insert 語(yǔ)句在存儲(chǔ)過(guò)程中的使用
create procedure insert_xs(in xh char(6),xm char(8),zym char(10),xb tinyint,csrq date,zxf tinyint)begin insert into xs(學(xué)號(hào),姓名,專(zhuān)業(yè)名,性別,出生日期,總學(xué)分)values(xh,xm,zym,xb,csrq,zxf);end$ 調(diào)用插入的存儲(chǔ)過(guò)程:
call insert_xs('1','張三','軟件開(kāi)發(fā)',1,'1990-9-8',40)$ call insert_xs('2','李四','軟件開(kāi)發(fā)',1,'1990-9-8',40)$ ii.update語(yǔ)句在存儲(chǔ)過(guò)程中的使用
create procedure update_xs(in xh char(6),zym char(10))begin update xs set 專(zhuān)業(yè)名=zym where 學(xué)號(hào)=xh;end$ 調(diào)用修改的存儲(chǔ)過(guò)程: call update_xs('2','計(jì)算機(jī)網(wǎng)絡(luò)')$ iii.delete語(yǔ)句在存儲(chǔ)過(guò)程中的使用
create procedure delete_xs_byID(in xh char(6))begin delete from xs where 學(xué)號(hào)=xh;end$ 調(diào)用刪除的存儲(chǔ)過(guò)程: call delete_xs_byID('1')$ iv.select語(yǔ)句在存儲(chǔ)過(guò)程中的使用
create procedure select_xs_byID(xh char(6),out name char(8))begin select 姓名 into name from xs where 學(xué)號(hào)=xh;end$ 注意兩點(diǎn):
調(diào)用查詢(xún)的存儲(chǔ)過(guò)程:
call select_xs_byID('081101',@name)$ select @name$ b)DCL語(yǔ)句在存儲(chǔ)過(guò)程中的使用 c)DDL語(yǔ)句在存儲(chǔ)過(guò)程中的使用
七、流程控制語(yǔ)句在存儲(chǔ)過(guò)程中的使用
八、處理程序和條件
九、游標(biāo)的定義與使用
十、刪除存儲(chǔ)過(guò)程
十一、修改存儲(chǔ)過(guò)程
7.2 存儲(chǔ)函數(shù)
第二篇:mysql教案講解
1、數(shù)據(jù)庫(kù)概述
1.1 什么是數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)DataBase 就是一個(gè)存儲(chǔ)數(shù)據(jù)的倉(cāng)庫(kù)。
為了方便數(shù)據(jù)的存儲(chǔ)和管理,它將數(shù)據(jù)按照特定的規(guī)律存儲(chǔ)在磁盤(pán)上。通過(guò)數(shù)據(jù)庫(kù)管理系統(tǒng),可有效地組織和管理存儲(chǔ)在數(shù)據(jù)庫(kù)中的數(shù)據(jù)。
1.2 文件與文件系統(tǒng)
所謂“文件”一般指存儲(chǔ)在外部介質(zhì)上數(shù)據(jù)的集合,是操作系統(tǒng)(確切地說(shuō)是文件系統(tǒng))管理數(shù)據(jù)的基本單位。
1.3 文件系統(tǒng)和數(shù)據(jù)庫(kù)系統(tǒng)之間的區(qū)別和聯(lián)系
1.3.1 區(qū)別
(1)文件系統(tǒng)用文件將數(shù)據(jù)長(zhǎng)期保存在外存上,數(shù)據(jù)庫(kù)系統(tǒng)用數(shù)據(jù)庫(kù)統(tǒng)一存儲(chǔ)數(shù)據(jù);
(2)文件系統(tǒng)中的程序和數(shù)據(jù)有一定的聯(lián)系,數(shù)據(jù)庫(kù)系統(tǒng)中的程序和數(shù)據(jù)分離;
(3)文件系統(tǒng)用操作系統(tǒng)中的存取方法對(duì)數(shù)據(jù)進(jìn)行管理,數(shù)據(jù)庫(kù)系統(tǒng)用DBMS統(tǒng)一管理和控制數(shù)據(jù)
(4)文件系統(tǒng)實(shí)現(xiàn)以文件為單位的數(shù)據(jù)共享,數(shù)據(jù)庫(kù)系統(tǒng)實(shí)現(xiàn)以記錄和字段為單位的數(shù)據(jù)共享。
1.3.2 聯(lián)系
(1)均為數(shù)據(jù)組織的管理技術(shù);
(2)均由數(shù)據(jù)管理軟件管理數(shù)據(jù),程序與數(shù)據(jù)之間用存取方法進(jìn)行轉(zhuǎn)換;(3)數(shù)據(jù)庫(kù)系統(tǒng)是在文件系統(tǒng)的基礎(chǔ)上發(fā)展而來(lái)
1.3.3 讀寫(xiě)數(shù)據(jù)庫(kù)與讀寫(xiě)文件哪個(gè)更快 1.4 數(shù)據(jù)存儲(chǔ)方式
學(xué)校需要存儲(chǔ)學(xué)生和教師信息 公司需要存儲(chǔ)員工信息和公司的資料
這些數(shù)據(jù)或者信息是如何存儲(chǔ)的?數(shù)據(jù)存儲(chǔ)方式經(jīng)歷了三個(gè)階段:人工管理階段、文件系統(tǒng)階段、數(shù)據(jù)庫(kù)系統(tǒng)階段(注:新興數(shù)據(jù)存儲(chǔ)系統(tǒng)--例如google的bigtable)。
1.4.1 人工管理階段
磁帶、磁盤(pán)、手工記錄
1.4.2 文件系統(tǒng)階段
數(shù)據(jù)存儲(chǔ)在計(jì)算機(jī)的磁盤(pán)上,數(shù)據(jù)以文件的形式出現(xiàn),通過(guò)文件系統(tǒng)來(lái)管理這些文件,文件系統(tǒng)通過(guò)路徑和文件訪問(wèn)文件中的數(shù)據(jù)
1.4.3 數(shù)據(jù)庫(kù)系統(tǒng)階段
使用專(zhuān)門(mén)的數(shù)據(jù)庫(kù)來(lái)管理數(shù)據(jù)。用戶(hù)在數(shù)據(jù)庫(kù)系統(tǒng)中建立數(shù)據(jù)庫(kù),然后在數(shù)據(jù)庫(kù)中建立表,最后將數(shù)據(jù)存儲(chǔ)在這些表中--表是數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)的基本單位。
用戶(hù)通過(guò)數(shù)據(jù)庫(kù)管理系統(tǒng)來(lái)查詢(xún)表中的數(shù)據(jù)。1.5 常用的數(shù)據(jù)庫(kù)
甲骨文的Oracle:大型數(shù)據(jù)庫(kù),Linux/WINDOWS/Soloras/SUSE Sybase:大型數(shù)據(jù)庫(kù)
Mysql:開(kāi)源,中大型數(shù)據(jù)庫(kù),Linux/Windows/… 微軟SQL Server:Windows Postgre SQL:安全開(kāi)源免費(fèi),中型,Linux Access:
SQLITE:小型數(shù)據(jù)庫(kù),Linux/Windows,嵌入式系統(tǒng)
1.6 數(shù)據(jù)庫(kù)技術(shù)構(gòu)成
數(shù)據(jù)庫(kù)技術(shù)是解決數(shù)據(jù)存儲(chǔ)、管理、統(tǒng)計(jì)、查詢(xún)等處理而使用的一門(mén)廣泛技術(shù) 數(shù)據(jù)Data:是數(shù)據(jù)庫(kù)中存儲(chǔ)的基本對(duì)象,是描述事物的符號(hào),如數(shù)字、文件、圖形、圖像等
數(shù)據(jù)庫(kù)Database,DB:是長(zhǎng)期儲(chǔ)存在計(jì)算機(jī)內(nèi)、有組織的、可共享的數(shù)據(jù)集合。數(shù)據(jù)庫(kù)管理系統(tǒng) Database Management System,DBMS:是位于用戶(hù)與操作系統(tǒng)之間的管理數(shù)據(jù)庫(kù)的軟件(定義、管理和維護(hù)數(shù)據(jù))。MySql是一中DBMS。數(shù)據(jù)庫(kù)系統(tǒng) Database System--DBS:是指在計(jì)算機(jī)系統(tǒng)中引入數(shù)據(jù)庫(kù)后的系統(tǒng)。其組成如下:計(jì)算機(jī)系統(tǒng)、數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)管理系統(tǒng)及其開(kāi)發(fā)工具、人員(數(shù)據(jù)庫(kù)管理員DBA、終端用戶(hù))
通常情況下,把數(shù)據(jù)庫(kù)系統(tǒng)簡(jiǎn)稱(chēng)為數(shù)據(jù)庫(kù)。
SQL(Structed Query Language)語(yǔ)言 :結(jié)構(gòu)化查詢(xún)語(yǔ)言,是數(shù)據(jù)庫(kù)管理系統(tǒng)通過(guò)SQL語(yǔ)句來(lái)操作數(shù)據(jù)庫(kù)中的數(shù)據(jù)。標(biāo)準(zhǔn)的SQL命令,比如“Select”、“Insert”、“Update”、“Delete”、“Create”和 “Drop”常常被用于完成絕大多數(shù)數(shù)據(jù)庫(kù)的操作。
數(shù)據(jù)庫(kù)訪問(wèn)技術(shù):
ODBC(Open Database Connectivity開(kāi)放式數(shù)據(jù)庫(kù)連接)
是應(yīng)用程序和數(shù)據(jù)庫(kù)系統(tǒng)之間的中間件,用來(lái)在數(shù)據(jù)庫(kù)管理系統(tǒng)中存取數(shù)據(jù)的標(biāo)準(zhǔn)應(yīng)用程序接口。
它通過(guò)使用相應(yīng)應(yīng)用平臺(tái)上和所需數(shù)據(jù)庫(kù)對(duì)應(yīng)的驅(qū)動(dòng)程序與應(yīng)用程序的交互來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作,避免了在應(yīng)用程序中直接調(diào)用與數(shù)據(jù)庫(kù)相關(guān)的操作,從而提供了數(shù)據(jù)庫(kù)的獨(dú)立性。
JDBC / JDO(Java Data Base Connectivity,java數(shù)據(jù)庫(kù)連接)
是一種用于執(zhí)行SQL語(yǔ)句的Java API,可以為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一訪問(wèn),它由一組用Java語(yǔ)言編寫(xiě)的類(lèi)和接口組成。JDBC提供了一種基準(zhǔn),據(jù)此可以構(gòu)建更高級(jí)的工具和接口,使數(shù)據(jù)庫(kù)開(kāi)發(fā)人員能夠編寫(xiě)數(shù)據(jù)庫(kù)應(yīng)用程序,同時(shí),JDBC也是個(gè)商標(biāo)名。
C API(C語(yǔ)言連接數(shù)據(jù)庫(kù))
MySQL提供C語(yǔ)言使用的API.C代碼的API是隨MySQL一起發(fā)布的.它包含在mysqlclient庫(kù)中, 可以使C程序來(lái)訪問(wèn)數(shù)據(jù)庫(kù).綜上所述,數(shù)據(jù)庫(kù)技術(shù)主要包括:數(shù)據(jù)庫(kù)系統(tǒng)、SQL語(yǔ)句、數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)
1.7 MySQL邏輯架構(gòu)
一張好的圖片會(huì)是你更容易理解MySQL各個(gè)組件的工作方式。
1、最上一層所包含的服務(wù)并不是MySQL所獨(dú)有的技術(shù)。它們都是服務(wù)于C/S程序或者是這些程序所需要的:連接處理,身份驗(yàn)證,安全性等等。
2、第二層是我們所感興趣的。這是MySQL的核心部分。包括了查詢(xún)的解析,分析,優(yōu)化,緩存以及所有內(nèi)置的函數(shù)(如日期,時(shí)間,數(shù)學(xué)運(yùn)算,加密)。還有一些功能是涉及到了存儲(chǔ)引擎,如存儲(chǔ)過(guò)程,觸發(fā)器,視圖等。
3、第三層包括了存儲(chǔ)過(guò)程。它們負(fù)責(zé)存儲(chǔ)和獲取所有存儲(chǔ)在MySQL中的數(shù)據(jù)。就像Linux眾多的文件系統(tǒng)一樣。每個(gè)存儲(chǔ)引擎都有自己的優(yōu)點(diǎn)和缺陷。服務(wù)器是通過(guò)存儲(chǔ)引擎API來(lái)與它們交互的。這個(gè)接口隱藏了各個(gè)存儲(chǔ)引擎不同的地方。對(duì)于查詢(xún)層盡可能的透明。這個(gè)API包含了很多底層的操作。如開(kāi)始一個(gè)事物,或者取出有特定主鍵的行。存儲(chǔ)引擎不能解析SQL,互相之間也不能通信。僅僅是簡(jiǎn)單的響應(yīng)服務(wù)器的請(qǐng)求。
連接管理和安全
在服務(wù)器內(nèi)部,每個(gè)client連接都有自己的線程。這個(gè)連接的查詢(xún)都在一個(gè)單獨(dú)的線程中執(zhí)行。這個(gè)線程存在于一個(gè)核心或者CPU中。服務(wù)器緩存了線程,因此不需要為每個(gè)client連接單獨(dú)創(chuàng)建和銷(xiāo)毀線程。
當(dāng)clients(也就是應(yīng)用程序)連接到了MySQL服務(wù)器。服務(wù)器需要對(duì)它進(jìn)行身份驗(yàn)證。這個(gè)身份驗(yàn)證是基于用戶(hù)名,主機(jī),以及密碼。也使用了X.509的SSL連接。clients一連接上,服務(wù)器就驗(yàn)證它的權(quán)限。如這個(gè)client是否可以查詢(xún)world數(shù)據(jù)庫(kù)下的Country表的數(shù)據(jù)。這部分將在獨(dú)立的章節(jié)進(jìn)行說(shuō)明。
優(yōu)化和執(zhí)行 MySQL的解析查詢(xún)是創(chuàng)建了一個(gè)內(nèi)部的結(jié)構(gòu)(一個(gè)語(yǔ)法分析樹(shù))。之后就進(jìn)行了各種各樣的優(yōu)化。這些優(yōu)化包括了,查詢(xún)語(yǔ)句的重寫(xiě),讀表的順序,索引的選擇等等。你可以通過(guò)查詢(xún)語(yǔ)句的關(guān)鍵詞對(duì)優(yōu)化器進(jìn)行一定的提示。這樣做會(huì)影響到它的優(yōu)化方式。你也可以讓服務(wù)器對(duì)于各種優(yōu)化進(jìn)行說(shuō)明。這樣可以得知服務(wù)器的運(yùn)行策略以及為了獲得更好的效率,可以做更多的優(yōu)化工作,如查詢(xún)優(yōu)化等。優(yōu)化器會(huì)在以后的教程中詳細(xì)介紹。
優(yōu)化器是不會(huì)關(guān)心表所用到的存儲(chǔ)引擎的類(lèi)型,但是存儲(chǔ)引擎會(huì)影響到服務(wù)器優(yōu)化查詢(xún)的方式。優(yōu)化器需要知道存儲(chǔ)引擎的一些特性,這些操作的消耗以及表數(shù)據(jù)的一些統(tǒng)計(jì)信息。例如,一些存儲(chǔ)引擎支持索引,這對(duì)于查詢(xún)是非常有用的。
在解析查詢(xún)之前,要查詢(xún)緩存,這個(gè)緩存只能保存查詢(xún)信息以及結(jié)果數(shù)據(jù)。如果請(qǐng)求一個(gè)查詢(xún)?cè)诰彺嬷写嬖?,就不需要解析,?yōu)化和執(zhí)行查詢(xún)了。直接返回緩存中所存放的這個(gè)查詢(xún)的結(jié)果。
MySQL體系結(jié)構(gòu)介紹:
存儲(chǔ)引擎負(fù)責(zé)管理數(shù)據(jù)存儲(chǔ),以及MySQL的索引管理。通過(guò)定義的API,MySQL服務(wù)器能夠與存儲(chǔ)引擎進(jìn)行通信。每個(gè)存儲(chǔ)引擎均是1個(gè)繼承類(lèi),每個(gè)類(lèi)實(shí)例作為處理程序而被引用。
針對(duì)需要與特殊表一起工作的每個(gè)線程,處理程序是在1個(gè)處理程序的基礎(chǔ)上實(shí)例化的。例如,如果3個(gè)連接全都在相同的表上工作,需要?jiǎng)?chuàng)建3個(gè)處理程序?qū)嵗?/p>
一旦創(chuàng)建了處理程序?qū)嵗琈ySQL服務(wù)器將向處理程序發(fā)送命令,以便執(zhí)行數(shù)據(jù)存儲(chǔ)和檢索任務(wù),如打開(kāi)表、操縱行和管理索引等。
能夠以累進(jìn)方式創(chuàng)建定制存儲(chǔ)引擎:開(kāi)發(fā)人員能夠以只讀存儲(chǔ)引擎啟動(dòng),隨后添加對(duì)INSERT、UPDATE和DELETE操作的支持,甚至能夠增加對(duì)索引功能、事務(wù)和其他高級(jí)操作的支持
2.Linux平臺(tái)下安裝配置MySQL MySQL語(yǔ)言
SQL功能強(qiáng)大,但是概括起來(lái),它可以分成以下幾組:
DDL(數(shù)據(jù)定義語(yǔ)言): 用于定義數(shù)據(jù)的結(jié)構(gòu),比如 創(chuàng)建、修改或者刪除數(shù)據(jù)庫(kù)對(duì)象;
DML(數(shù)據(jù)操作語(yǔ)言):用于檢索或者修改數(shù)據(jù);
DCL(數(shù)據(jù)控制語(yǔ)言):用于定義數(shù)據(jù)庫(kù)用戶(hù)的權(quán)限。
3.1 DDL 可以用于創(chuàng)建用戶(hù)和重建數(shù)據(jù)庫(kù)對(duì)象。下面是DDL命令: CREATE TABLE:創(chuàng)建數(shù)據(jù)庫(kù)表 ALTER TABLE :修改數(shù)據(jù)庫(kù)表 DROP TABLE :丟棄數(shù)據(jù)庫(kù)表 CREATE INDEX :創(chuàng)建索引 DROP INDEX:丟棄索引
3.2 DML 可以細(xì)分為以下的幾個(gè)語(yǔ)句: SELECT:用于檢索數(shù)據(jù);
INSERT:用于增加數(shù)據(jù)到數(shù)據(jù)庫(kù);
UPDATE:用于從數(shù)據(jù)庫(kù)中修改現(xiàn)存的數(shù)據(jù)
DELETE:用于從數(shù)據(jù)庫(kù)中刪除數(shù)據(jù)。
3.3 DCL 用于創(chuàng)建關(guān)系用戶(hù)訪問(wèn)以及授權(quán)的對(duì)象。下面是幾個(gè)DCL命令:
ALTER PASSWORD :修改訪問(wèn)授權(quán)密碼 GRANT :授權(quán)用戶(hù)訪問(wèn)數(shù)據(jù)庫(kù)表 REVOKE :廢除用戶(hù)授權(quán) CREATE SYNONYM:
3.4 表、字段、記錄
在關(guān)系型數(shù)據(jù)庫(kù)中,表就是一個(gè)數(shù)據(jù)的集合體,簡(jiǎn)單地理解就是一個(gè)二維(行與列有簡(jiǎn)單對(duì)應(yīng)關(guān)系的)數(shù)據(jù)表格。
字段是指表格中的列,即具有相同屬性的數(shù)據(jù)集合,每個(gè)字段都必須有一個(gè)唯一的名稱(chēng),稱(chēng)為字段名。例如,在表格中,如果用一列存放“性別”,“性別”就是一個(gè)字段名。記錄是指表格中的行,它由若干個(gè)字段值構(gòu)成。例如,用于記錄每個(gè)成員的表中,可以有昵稱(chēng)、年齡、性別、電子郵件等字段,添加進(jìn)表中的每一個(gè)成員,都包含有昵稱(chēng)、年齡、性別、電子郵件這些數(shù)據(jù),每個(gè)成員的這些數(shù)據(jù)構(gòu)成一條記錄。
下面給出一張學(xué)生表,表中id、name、gender、birth、class都是字段,而行中包含了這個(gè)表的一個(gè)記錄,即每個(gè)學(xué)生的ID,名字,性別,生日等:
4.MySQL數(shù)據(jù)庫(kù)基本操作
4.1 基本操作
4.1.1 連接登錄MySql 語(yǔ)法:mysql-u用戶(hù)名-p密碼-h服務(wù)器名稱(chēng)-P端口
1)、連接到本機(jī) mysql-u root-p Enter password: **-----------------------2)、連接到遠(yuǎn)程主機(jī)上 mysql-h localhost-u root-p Enter password: ** 4.1.2 退出MySql操作界面
mysql> quit;mysql>exit;4.1.3 修改密碼
mysqladmin-u root –psa(舊密碼)password chx(新密碼)4.1.4 顯示當(dāng)前存在的數(shù)據(jù)庫(kù)
mysql> show databases;
或者多行命令 mysql> show
-> databases->;
4.1.5 創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)
語(yǔ)法:create database [if not exists] 數(shù)據(jù)庫(kù)名稱(chēng) [default character set '字符集'] mysql> create database if not exists db1 default character set 'utf8';4.1.6 刪除一個(gè)數(shù)據(jù)庫(kù)
語(yǔ)法:drop database [if exists] 數(shù)據(jù)庫(kù)名稱(chēng) mysql> drop database db1;4.1.7 選擇數(shù)據(jù)庫(kù)并顯示當(dāng)前選擇的數(shù)據(jù)庫(kù)
mysql> use mysql;4.1.8 顯示當(dāng)前數(shù)據(jù)庫(kù)中存在的表
語(yǔ)法:show tables [like '表達(dá)式']
mysql> show tables;4.2 SQL數(shù)據(jù)類(lèi)型
smallint32 位元的整數(shù)。
decimal(p,s)32位元的實(shí)數(shù)。
Doublen 長(zhǎng)度的字串,n不能超過(guò) 254。
varchar(n)和 char(n)一樣,不過(guò)其單位是兩個(gè)字元 double-bytes,n不能超過(guò)127。這個(gè)形態(tài)是為了支援兩個(gè)字元長(zhǎng)度的字體,例如中文字。
vargraphic(n)包含了 年份、月份、日期。
time包含了 年、月、日、時(shí)、分、秒、千分之一秒。
4.3 主鍵、外鍵、索引
主鍵(primary key)能夠唯一標(biāo)識(shí)表中某一行的屬性或?qū)傩越M。一個(gè)表只能有一個(gè)主鍵,但可以有多個(gè)候選索引。主鍵常常與外鍵構(gòu)成參照完整性約束,防止出現(xiàn)數(shù)據(jù)不一致。主鍵可以保證記錄的唯一和主鍵域非空,數(shù)據(jù)庫(kù)管理系統(tǒng)對(duì)于主鍵自動(dòng)生成唯一索引,所以主鍵也是一個(gè)特殊的索引。
比如學(xué)生表里有學(xué)號(hào)和姓名,姓名可能有重名的,但學(xué)號(hào)確是唯一的,你要從學(xué)生表中搜索一條紀(jì)錄如查找一個(gè)人,就只能根據(jù)學(xué)號(hào)去查找,這才能找出唯一的一個(gè),這就是主鍵;如:id int(10)not null primary key auto_increment ;自增長(zhǎng)的類(lèi)型 外鍵(foreign key)是用于建立和加強(qiáng)兩個(gè)表數(shù)據(jù)之間的鏈接的一列或多列。外鍵約束主要用來(lái)維護(hù)兩個(gè)表之間數(shù)據(jù)的一致性。簡(jiǎn)言之,表的外鍵就是另一表的主鍵,外鍵將兩表聯(lián)系起來(lái)。一般情況下,要?jiǎng)h除一張表中的主鍵必須首先要確保其它表中的沒(méi)有相同外鍵(即該表中的主鍵沒(méi)有一個(gè)外鍵和它相關(guān)聯(lián))。索引(index)是用來(lái)快速地尋找那些具有特定值的記錄。主要是為了檢索的方便,是為了加快訪問(wèn)速度,按一定的規(guī)則創(chuàng)建的,一般起到排序作用。所謂唯一性索引,這種索引和前面的“普通索引”基本相同,但有一個(gè)區(qū)別:索引列的所有值都只能出現(xiàn)一次,即必須唯一??偨Y(jié):
主鍵一定是唯一性索引,唯一性索引并不一定就是主鍵。一個(gè)表中可以有多個(gè)唯一性索引,但只能有一個(gè)主鍵。主鍵列不允許空值,而唯一性索引列允許空值。
主鍵可以被其他字段作外鍵引用,而索引不能作為外鍵引用。
4.4 數(shù)據(jù)表操作 4.4.1 創(chuàng)建一個(gè)表
語(yǔ)法:create table [if not exists] 數(shù)據(jù)表名稱(chēng)(列定義[,....])示例:
mysql> create table tb1(-> id int auto_increment primary key,-> name varchar(20)->);
列定義:
列名稱(chēng) 數(shù)據(jù)類(lèi)型 [null|not null] [primary key][unique][auto_increment][default 默認(rèn)值]
4.4.2顯示表(db)的內(nèi)容
mysql>select * from tb1;4.4.3 查看表tb1的字段描述
語(yǔ)法:show columns from 數(shù)據(jù)表 語(yǔ)法:desc[ribe] 數(shù)據(jù)表
mysql> show columns from tb1;mysql> describe tb1;mysql> desc tb1;4.4.4 修改數(shù)據(jù)表
語(yǔ)法如下:
ALTER TABLE “table_name“ 【改變方式】 改變方式分:
ADD :在表中增加一列,ADD 列名 數(shù)據(jù)類(lèi)型
CHANGE:修改表中某一列的名字,CHANGE 列名 新列名 MODIFY:改變某一列的數(shù)據(jù)類(lèi)型,MODIFY 列名 數(shù)據(jù)類(lèi)型
DROP:丟棄某一列
1· 添加列
語(yǔ)法1:alter table 數(shù)據(jù)表名稱(chēng) add 列定義 first 語(yǔ)法2:alter table 數(shù)據(jù)表名稱(chēng) add 列定義 after 列名稱(chēng) 語(yǔ)法3:alter table 數(shù)據(jù)表名稱(chēng) add(列定義,...)示例:
mysql> alter table tb1 add age int first;mysql> alter table tb1 add age2 int default 10 after id;mysql> alter table tb1 add sex tinyint default 0;2· 刪除列
語(yǔ)法:alter table 數(shù)據(jù)表名稱(chēng) drop 列名稱(chēng) 示例:
mysql> alter table tb1 drop age 3· 修改列定義 語(yǔ)法:
alter table 數(shù)據(jù)表名稱(chēng) modify 列名稱(chēng) 數(shù)據(jù)類(lèi)型 示例:
mysql> alter table tb1 add memo varchar(100);mysql> alter table tb1 modify memo char(1);mysql> desc tb1;4· 修改列名稱(chēng)及定義 語(yǔ)法:
alter table 數(shù)據(jù)表名稱(chēng) change 舊列名稱(chēng) 新的列名稱(chēng) 列定義 示例:
mysql> alter table tb1 change memo memo1 varchar(200);4.4.5 修改數(shù)據(jù)表名稱(chēng)
語(yǔ)法:
alter table 數(shù)據(jù)表名稱(chēng) rename 新表名稱(chēng) 示例:
mysql> alter table tb1 rename user;4.4.6 刪除數(shù)據(jù)表
語(yǔ)法:drop table [if exists] 數(shù)據(jù)表名稱(chēng) 4.4.7 清空數(shù)據(jù)表
語(yǔ)法: TRUNCATE TABLE ”表格名“ 如清空grade表:
TRUNCATE TABLE grade 4.4.8 插入記錄
語(yǔ)法:
INSERT INTO “表格名”(“列1”, “列2”,...)VALUES(“值1”, “值2”,...);
例如向student表中插入一條學(xué)生記錄:
INSERT INTO student(name, gender, birth,class)VALUES(‘Sun Nan’, ‘M’, ‘1973-03-19’, 1);注:因?yàn)閕d字段為自增長(zhǎng)的,所以可以不用指定值,另,插入的時(shí)候如果指定列的值為唯一屬性的話則插入相同的值時(shí)會(huì)失敗。比如說(shuō)在student表中,不能存在兩條id為2的記錄,但可以存在兩條name為“Sun Nan”的記錄。
4.4.9更新記錄
格式:UPDATE “表格名” SET 列1 = [新值1], 列2=[新值2]… WHERE {條件};如我們修改“Sun Nan”同學(xué)的出生日期為“1972-08-29”,所在的班級(jí)id為2,執(zhí)行的語(yǔ)句為:
UPDATE student SET birth=‘1972-08-29’, class=2 WHERE name=‘Sun Nam’;
4.4.10 刪除記錄
格式:DELETE FROM ”表名" WHERE {條件} 如從grade表中刪除student_id為2的記錄: DELETE FROM grade WHERE student_id=2;如果要?jiǎng)h除表中所有的數(shù)據(jù): DELTE FROM grade;
5.練習(xí)
創(chuàng)建學(xué)生表student : create table student(id
int auto_increment,name
varchar(32),gender
int default 1,birth
varchar(20),class
int,primary key(id));創(chuàng)建班級(jí)表class create table class(id
int not null,class_name
varchar(32),begin_time
varchar(20),teacher
varchar(32),primary key(id));創(chuàng)建成績(jī)表grade: create table grade(id
int auto_increment,student_id
int,class
int,chinese
int,math
int,exam_time
varchar(20),primary key(id));
6.select 語(yǔ)句
SELECT語(yǔ)句主要被用于查詢(xún)數(shù)據(jù)庫(kù)中的一個(gè)或多個(gè)表里的數(shù)據(jù)。格式:
SELECT [ 例如: mysql> select * from user;mysql> select name from user; 許多子句及它們的結(jié)合都可以用于SELECT語(yǔ)句中: FROM:指定從哪些表中獲取數(shù)據(jù) DISTINCT:消除重復(fù)的記錄行 WHERE:只返回滿足特定條件(也叫過(guò)濾器)的記錄行 ORDER BY:按照表達(dá)式列表排序記錄 LIMIT:返回特定部分的數(shù)據(jù),而不是所有的結(jié)果集 格式: SELECT DISTINCT 6.1使用FROM ? ? ? FROM子句在SELECT語(yǔ)句中是可選項(xiàng),它出現(xiàn)在語(yǔ)句的表達(dá)式之后 FROM子句指定語(yǔ)句要處理的表。表的別名 在SQL語(yǔ)句里,在FROM子句里引用的表可以給定一個(gè)臨時(shí)的名稱(chēng),該名稱(chēng)叫做表的別名。? 示例: mysql> select id, name, sex, age from user where id = 1; mysql> select u.id, u.name, u.sex, u.age from user u where id = 1;6.2 使用DISTINCT ? 如果查詢(xún)的結(jié)果中包含重復(fù)的記錄,該重復(fù)記錄要被刪除以生成每行都是唯一的結(jié)果集。為了達(dá)到這個(gè)目的,可在SELECT關(guān)鍵字后添加DISTINCT關(guān)鍵字。? ? 在指定的列里,DISTINCT將所有的NULL值當(dāng)作相同的值。示例: mysql> select distinct work from user;6.3使用WHERE ? MySQL支持許多不同類(lèi)型的運(yùn)算符,這依賴(lài)于操作數(shù)的數(shù)據(jù)類(lèi)型,或操作數(shù)與運(yùn)算符處理的值的數(shù)據(jù)類(lèi)型。 – 運(yùn)算 – 比較 – 邏輯 ? 示例: mysql> select * from user where age<20; mysql> select * from user where age >30 and(work='java' or work='c++');mysql> select * from user where age >30 and work in('java','c++');6.4關(guān)于NULL 如果有一個(gè)操作數(shù)的結(jié)果是NULL,則大多數(shù)運(yùn)算符的求值結(jié)果也會(huì)是NULL。當(dāng)NULL值表達(dá)式在函數(shù)中被用于操作數(shù)時(shí),運(yùn)算符將產(chǎn)生NULL。 WHERE子句也有相同的情況,WHERE子句會(huì)丟棄那些條件不是TRUE的記錄。示例: mysql> select NULL+age from user;6.5 在SELECT語(yǔ)句里使用ORDER BY 如果有必要讓輸出記錄按某一特定的順序返回,可以使用ORDER BY子句以顯示如何排序結(jié)果集。示例: mysql> select * from user order by age;DESC:降序 ASC:升序 示例: mysql> select * from user order by age desc;mysql> select * from user order by age asc;6.6 在SELECT語(yǔ)句里使用LIMIT 當(dāng)一個(gè)查詢(xún)返回許多記錄行時(shí),有必要通過(guò)增加LIMIT子句來(lái)限定只顯示部分記錄。LIMIT子句可以采用以下一個(gè)或兩個(gè)參數(shù): LIMIT row_count LIMIT skip_count, row_count 示例: mysql> select * from user limit 5;mysql> select * from user limit 5,5;它常見(jiàn)的用處是獲取包含某個(gè)特定列的最小或最大值的行 示例(查找user表中年齡最大的): mysql> select * from user order by age desc limit 1; 6.7 聚集查詢(xún)結(jié)果 有可能出現(xiàn)這種情況,結(jié)果集里的一行對(duì)應(yīng)于底層基表里的一組記錄行。這個(gè)過(guò)程叫聚合,并且這樣一個(gè)結(jié)果集被稱(chēng)為聚集。計(jì)算一組值的摘要值的函數(shù)(例如AVG())被稱(chēng)為“聚集”函數(shù)。MIN()求最小值 MAX()求最大值 SUM()求和 AVG()求平均數(shù) COUNT()求條目數(shù) 示例: mysql> select min(age)from user;mysql> select max(age)from user;mysql> select sum(age)from user;mysql> select avg(age)from user;示例(使用count(*)統(tǒng)計(jì)user表中用戶(hù)的個(gè)數(shù)): mysql> select count(*)from user;示例(指定統(tǒng)計(jì)memo列,NULL值不會(huì)被統(tǒng)計(jì)): mysql> select count(memo)from user;6.8 用SELECT與GROUP BY分組 所有在GROUP BY子句中指定的表達(dá)式里,具有相同結(jié)合值的記錄行將按一組處理,在結(jié)果集里以一行結(jié)束。 聚集函數(shù)可以與GROUP BY一起使用將記錄分組。當(dāng)帶有GROUP BY子句時(shí),聚集函數(shù)將為每個(gè)組統(tǒng)計(jì)值。示例(求每個(gè)工作員工的平均年齡): mysql> select avg(age), work from user group by work;示例(求每個(gè)工作員工的總年齡): mysql> select count(*), sum(age), work from user group by work;6.9 使用UNION UNION關(guān)鍵字能夠?qū)蓚€(gè)或多個(gè)SELECT語(yǔ)句的結(jié)果連接起來(lái)。其語(yǔ)句是: SELECT … UNION SELECT … 缺省地,UNION消除結(jié)果集中的重復(fù)記錄。為了獲得所有的記錄行,可用UNION ALL取代每個(gè)UNION實(shí)例。UNION在下面情況下將很有用: 多個(gè)表中有相似的信息,并且需要從這些表中立刻獲取記錄。 需要從同一個(gè)表中獲取幾組記錄,但是表現(xiàn)每組的條件并不容易寫(xiě)在一個(gè)單個(gè)的WHERE子句里。示例: mysql> select * from user where age < 20-> union-> select * from user where name = '張三'; MySQL學(xué)習(xí)心得 第一章 一、數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)是操作和管理數(shù)據(jù)庫(kù)的大型軟件,它按一定的數(shù)據(jù)模型組織數(shù)據(jù)。 例如:Oracle、SQL Server、MySQL、Access。 二、數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)在數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)支持下建立的計(jì)算機(jī)應(yīng)用系統(tǒng),簡(jiǎn)寫(xiě):DBAS。 例如:.net Java。 三、字符集從大到小排序:utf8--gbk--gb2312。 四、mysql的特點(diǎn): 適用于中小型網(wǎng)站中,體積小、速度快、總體擁有成本低,尤其是有開(kāi)放源碼這一特點(diǎn)。 五、目前Internet上滸的網(wǎng)站構(gòu)架方式是LAMP(Linux+apache+mysql+php)即使用Linux作為操作系統(tǒng),Apache作為Web服務(wù)器,MySQL作為數(shù)據(jù)庫(kù),PHP作為服務(wù)器端腳本解釋器,由于4個(gè)軟件都是遵循GPL的開(kāi)放源碼軟件,因此使用這種方式不用花一分錢(qián)就可以建立起一個(gè)穩(wěn)定、免費(fèi)的網(wǎng)站系統(tǒng)。 第二章 一、安裝過(guò)程中遇到的問(wèn)題及解決方法: 安裝過(guò)程中沒(méi)有完成時(shí)計(jì)算機(jī)關(guān)機(jī)。(沒(méi)有刪除完文件)安裝完成時(shí)找不到所配置的路徑。(可以從配置文件中找到) 安裝完成后無(wú)法正常使用。(在計(jì)算機(jī)管理中重新啟動(dòng)MySQL服務(wù))安裝到一半時(shí)沒(méi)有出現(xiàn)下一步。(誤把配置文件刪除了)安裝到最后一步時(shí)start service錯(cuò)誤。到控制面板里面先把mysql刪除.到c盤(pán)C:Program Files目錄下把mysql目錄刪除.如果在其他盤(pán)還有設(shè)置目錄也要?jiǎng)h除.空目錄也要?jiǎng)h除 到regedit把注冊(cè)表 HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/Eventlog/Applications/MySQL HKEY_LOCAL_MACHINE/SYSTEM/ControlSet002/Services/Eventlog/Applications/MySQL HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Applications/MySQL 有的話,全部刪除!(技巧:用F3循環(huán)查找“mysql”)如果任務(wù)管理器里有關(guān)mysql內(nèi)容也刪除 把防火墻關(guān)了 重新裝mysql(這里我沒(méi)有重啟計(jì)算機(jī)) 重裝時(shí)候有必要的話,重啟計(jì)算機(jī),停用IIS,和刪除temp里的臨時(shí)文件.實(shí)在不行的話,配置mysql時(shí)候,把mysql服務(wù)換個(gè)服務(wù)名.使用時(shí)輸入中文會(huì)出錯(cuò)。(在配置時(shí)在“Character Set”選框中將latinl修改為gb2312;也可以在配置文件中修改) 二、啟動(dòng)服務(wù)器的方法: ① 方法1: 在 “計(jì)算機(jī)管理”中的“服務(wù)”項(xiàng)目中啟動(dòng)與停止。② 方法2: 使用命令(net start mysql和net stop mysql) 三、連接MySQL 格式: mysql-h主機(jī)地址-u用戶(hù)名 -p用戶(hù)密碼 ①先在打開(kāi)DOS窗口,然后進(jìn)入目錄 mysqlbin(如果設(shè)置了環(huán)境變量,則直接輸入命令即可。)②鍵入命令mysql-uroot-proot ③接回車(chē)即可進(jìn)入到MYSQL中了 MYSQL的提示符是:mysql> 注明:直接打開(kāi)Mysql command line client 四、MySQL注釋符有三種: ①#...②“--...” ③ 五、忘記密碼重新更改密碼 先停止mysql服務(wù),修改D:MySQLMySQL Server 5.0 目錄下的my.ini文件,在[mysqld]下添加skip-grant-tables 啟動(dòng)mysql服務(wù)后就可以以空密碼登錄,之后別忘記修改root密碼 use mysql update user set password=password('hanaixia')where user='root';(分號(hào)不能少)password('hanaixia')此處必須用函數(shù)設(shè)置。 修改密碼后需要重新啟動(dòng)服務(wù)或者使用 flush privileges;語(yǔ)句,用于從mysql數(shù)據(jù)庫(kù)中的授權(quán)表重新載入權(quán)限。 把 skip-grant-tables 這一句刪掉再重啟mysql服務(wù)。 Mysql命令:在mysql的bin目錄下執(zhí)行: Mysql –h host_name –u user_name –p password Use 數(shù)據(jù)庫(kù)名;選定默認(rèn)數(shù)據(jù)庫(kù)(切換數(shù)據(jù)庫(kù))查詢(xún)當(dāng)前使用的數(shù)據(jù)庫(kù):select database(); Show databases;顯示所有數(shù)據(jù)庫(kù); Show tables ;顯示默認(rèn)數(shù)據(jù)庫(kù)下的所有表; Show status;顯示服務(wù)器狀態(tài)信息 c;放棄正在輸入的命令; h;顯示命令清單; s;顯示mysql服務(wù)器狀態(tài)信息; q;退出mysql; Describe 表名:查看表結(jié)構(gòu); 檔案柜相當(dāng)于數(shù)據(jù)庫(kù),抽屜相當(dāng)于表,抽屜中的文件相當(dāng)于記錄; 0x:加1到9的數(shù)字或者a到f就可以構(gòu)成16進(jìn)制了。注意零x中的x不能大寫(xiě)。字符串:?jiǎn)我?hào)或者雙引號(hào)引起來(lái)的都是字符串; Tinyint是1字節(jié); Smallint是2字節(jié); Mediumint是3字節(jié); Int是4字節(jié) Bigint是8字節(jié); 刪除主表前,先刪除子表。選擇主鍵的原則: 1)最少性:盡量選擇單個(gè)鍵做為主鍵 2)穩(wěn)定性:盡量選擇數(shù)值更新少的列作為主鍵。查看自定義函數(shù)創(chuàng)建信息: Show create function function_name;類(lèi)型總結(jié): Tinyint :占一個(gè)字節(jié),它的范圍是-128到127 Smallint:占2個(gè)字節(jié),它的范圍是-2的15次方到2的15次方減一; Mediumint:占3個(gè)字節(jié),它的范圍是-2的23次方到2的23次方減一; Int:占4個(gè)字節(jié),它的范圍是-2的31次方到2的31次方減一; Bigint:占8個(gè)字節(jié),它的范圍是-2的63次方到2的63次方減一; Float:占4個(gè)字節(jié) Double:占8個(gè)字節(jié) Decimal(m,n):占m個(gè)字節(jié); Char(10)和char(10 char)是一樣的; 數(shù)值列的完整性約束講解: Auto increment(自動(dòng)標(biāo)識(shí)列):在需要產(chǎn)生唯一標(biāo)示符號(hào)或者順序值的時(shí)候,可用此屬性。值從1開(kāi)始,一般在插入null到auto increment列時(shí),mysql會(huì)插入比當(dāng)前列最大值大1的值。一個(gè)表中最多能有一個(gè)此屬性的列。對(duì)于想使用此屬性的列應(yīng)該定義為not null,并定義為primary key或者定義為unique。 Null 和not null:默認(rèn)是null,如果在插入數(shù)據(jù)時(shí),指定了not null,那么在插入數(shù)據(jù)時(shí)必須要在此字段插入數(shù)據(jù)。如果指定了null ,那么在插入數(shù)據(jù)時(shí),如果沒(méi)有給此字段插入數(shù)據(jù),此字段就插入null.mysql-h host-u user-p menagerie 注意,剛才顯示的命令行中的menagerie不是你的 密碼。如果你想要在命令行上在-p選項(xiàng)后提供 密碼,則不能插入空格(例如,如-pmypassword,不是-p mypassword)。但是,不建議在命令行輸入密碼,因?yàn)檫@樣會(huì)暴露 密碼,能被在機(jī)器上登錄的其它用戶(hù)窺探到。 查詢(xún)當(dāng)前日期:使用curdate()函數(shù),任何表都可以的。Select curdate()from cjym;可以通過(guò)year,month,day獲取它的年月日。Select year(curdate())from cjym;Select month(curdate())from cjym;Select day(curdate())from cjym;Mysql中的_和%表示單個(gè)字符和零個(gè)或者多個(gè)字符; 有l(wèi)ike 和not like比較操作符; 要想找出你的服務(wù)器支持哪個(gè)存儲(chǔ)引擎,執(zhí)行下面的語(yǔ)句: Show engines;Select 1/7;都可以; 日期和時(shí)間類(lèi)型: Time :時(shí)間; Date:日期; Datetime:日期和時(shí)間; 創(chuàng)建表: Create table student(Student_id int(10)not null primary key auto_increment, Student_name varchar(20));注意在創(chuàng)建表的時(shí)候,如果是手動(dòng)寫(xiě)sql語(yǔ)句的時(shí)候自動(dòng)標(biāo)示符要寫(xiě)這樣的 auto_increment;有個(gè)下劃線; 更改表結(jié)構(gòu)操作: 給表添加一條字段:在最前面加字段用first,在最后面加用after;默認(rèn)在最后加; Alter table student add age int first;給表設(shè)定默認(rèn)值: Alter table student alter column_name set default default_value;給表中的字段添加主鍵;如果主鍵存在則出現(xiàn)錯(cuò)誤; Alter table student add primary key(column_name);刪除表中的一列: Alter table student drop column_name;刪除表中的主鍵: Alter table student drop primary key;更改表的名字: Alter table student rename as new_tablename;修改表中的字段類(lèi)型: Alter table student modify sno int;運(yùn)算符: Between。。and用于檢驗(yàn)一個(gè)值(一個(gè)求值表達(dá)式)是否存在一個(gè)指定的范圍內(nèi); Select 10 between 1 and 100;結(jié)果是1:表示是真的; In 用于檢驗(yàn)一個(gè)值(一個(gè)表達(dá)式)是否包含在一個(gè)指定的集合中。 Select 2 in(1,2,3,4,5,6),’a’ in(‘b’,’e’,.’h’);結(jié)果顯示1和0;1表示真,0表示假; Is null和is not null來(lái)測(cè)定是否為空; 特殊的運(yùn)算符:<=>:mysql稱(chēng)它為null安全的等于; Select null=null,null< = >null;結(jié)果顯示null和1; Regexp運(yùn)算符; Mysql中的元字符; 邏輯運(yùn)算符:and(&&),or(||),not(!)插入數(shù)據(jù)時(shí),插入多行值時(shí): 插入多行數(shù)據(jù): Insert into 表名(列名)Select 列名 From 表名; 更改記錄的操作語(yǔ)法格式: Update 表名 set 列名=更新值 [where 更新條件] 刪除記錄的操作格式: Delete from 表名 [where 刪除條件]; 表和字段的引用方式有兩種: 絕對(duì)引用:數(shù)據(jù)庫(kù)名.表名(.字段名);相對(duì)引用:表名.(字段名); Where子句使用的謂詞: Between。。and。。在兩數(shù)之間 Not between ….and ….不在兩數(shù)之間 In:是否在特定的集合里。Not in :與上面相反。Like:是否匹配一個(gè)模式; Regexp:檢查一個(gè)值是否匹配一個(gè)常規(guī)表達(dá)式; 復(fù)制表: Create table student select name,age from stu;復(fù)制表后,表中的字段和stu表中的字段一樣并且記錄數(shù)也是存在的; 學(xué)習(xí)地址:http:// Mysql的存儲(chǔ)過(guò)程: Create procedure p()Begin End; delimiter // create procedure math_demo()begin declare i int default 0; declare d decimal(10,4)default 0; declare f float default 0; while i < 10000 do set d = d +.0001; set f = f +.0001E0; set i = i + 1; end while; select d,f;end // call math_demo(); mysql中的自定義方法的使用 delimiter // create function function_name()returns return_type;begin end;// 執(zhí)行mysql自定義的函數(shù)用 Select function_name(); #mysql中的存儲(chǔ)過(guò)程 delimiter // create procedure math_demo()begin declare i int default 0; declare d decimal(10,4)default 0;…….return return_value; declare f float default 0; while i < 10000 do set d = d +.0001; set f = f +.0001E0; set i = i + 1; end while; select d,f;end // call math_demo();// delimiter // create function xiaoxiao()returns int begin return 2;end;// #在mysql中創(chuàng)建的自定義函數(shù)要加的delimiter,都要一次性選中執(zhí)行。每條語(yǔ)句都要用分號(hào)結(jié)束。delimiter // create function xiaoxiao1()returns int begin return 2;end // #執(zhí)行mysql中的自定義函數(shù) select xiaoxiao1(); 根據(jù)一個(gè)布爾值來(lái)檢驗(yàn)一個(gè)值,在這里布爾值可以是true,false,unknown; 運(yùn)算符: 等號(hào):=,<=>,不等號(hào):!=,<>;賦值號(hào)::=;? XOR 邏輯XOR。當(dāng)任意一個(gè)操作數(shù)為 NULL時(shí),返回值為NULL。對(duì)于非 NULL 的操作數(shù),假如一個(gè)奇數(shù)操作數(shù)為非零值,則計(jì)算所得結(jié)果為 1,否則為 0。 a XOR b 的計(jì)算等同于(a AND(NOT b))OR((NOT a)和 b)。 Coalesce();函數(shù)的使用方法: 返回值為列表中第一非null值,在沒(méi)有非null值的情況下返回null。 Greatest();函數(shù)的使用及功能說(shuō)明: 當(dāng)函數(shù)有2個(gè)或者2個(gè)以上的參數(shù)時(shí),返回參數(shù)中的最大參數(shù)值,比較參數(shù)所依據(jù)的規(guī)律同least()函數(shù)相同。 Interval();函數(shù)的使用及功能說(shuō)明: INTERVAL(N,N1,N2,N3,...) 假如N < N1,則返回值為0;假如N < N2 等等,則返回值為1;假如N 為NULL,則返回值為-1。所有的參數(shù)均按照整數(shù)處理。為了這個(gè)函數(shù)的正確運(yùn)行,必須滿足 N1 < N2 < N3 < ……< Nn。其原因是使用了二分查找(極快速)。 Least();函數(shù)的使用及功能說(shuō)明: · LEAST(value1,value2,...) 在有兩個(gè)或多個(gè)參數(shù)的情況下,返回值為最小(最小值)參數(shù)。用一下規(guī)則將自變量進(jìn)行對(duì)比: o 假如返回值被用在一個(gè) INTEGER 語(yǔ)境中,或是所有參數(shù)均為整數(shù)值,則將其作為整數(shù)值進(jìn)行比較。 假如返回值被用在一個(gè) REAL語(yǔ)境中,或所有參數(shù)均為實(shí)值,則 將其作為實(shí)值進(jìn)行比較。 o 假如任意一個(gè)參數(shù)是一個(gè)區(qū)分大小寫(xiě)的字符串,則將參數(shù)按照區(qū)分大小寫(xiě)的字符串進(jìn)行比較。 o 在其它情況下,將參數(shù)作為區(qū)分大小寫(xiě)的字符串進(jìn)行比較。o 假如任意一個(gè)自變量為NULL,則 LEAST()的返回值為NULL。 二,控制流函數(shù) Case的使用: 格式1: Case value when [compare_value] then result_value when [compare_value2] then result_value2 else result_value3 end 格式2: case when value=[compare_value1] then result_value else result_value2 end ? IF(expr1,expr2,expr3) 如果 expr1 是TRUE(expr1 <> 0 and expr1 <> NULL),則 IF()的返回值為expr2;否則返回值則為 expr3。IF()的返回值為數(shù)字值或字符串值,具體情況視其所在語(yǔ)境而定。 ASCII()函數(shù)查看對(duì)應(yīng)符號(hào)的ascii碼。 MySql問(wèn)題解決總結(jié) ERROR 1045(28000): Access denied for user 'root'@'localhost'(using password: YES)ERROR 1045(28000): Access denied for user 'root'@'localhost'(using password: NO) 這種問(wèn)題就是mysql密碼需要重置; 重置方式: 1.打開(kāi)/etc/mysql/debian.cnf文件,里面存儲(chǔ)了相關(guān)的密碼,我的文件信息如下 sudovi /etc/mysql/debian.cnf# Automatically generated for Debian scripts.DO NOT TOUCH![client] host = localhost user = debian-sys-maint password = 6x1XG2B5p75WtFV2 socket = /var/run/mysqld/mysqld.sock [mysql_upgrade] host = localhost user = debian-sys-maint password = 6x1XG2B5p75WtFV2 socket = /var/run/mysqld/mysqld.sock basedir = /usr 在[client]段有user=以及password=這兩行,這就是通過(guò)apt-get安裝mysql,系統(tǒng)給我們?cè)O(shè)置的mysql登錄名和密碼 2.輸入命令: mysql-udebian-sys-maint-pdebian-sys-maint即debian.cnf中user=后面的內(nèi)容.回車(chē)后會(huì)提示輸入密碼,此時(shí)把password=后面的內(nèi)容復(fù)制粘貼后回車(chē)即可進(jìn)行mysql 控制臺(tái) 3.進(jìn)入控制臺(tái)后.按以下步驟進(jìn)行: use mysql;update user set password=PASSWORD('新密碼')where user='root';FLUSH PRIVILEGES;此時(shí)可以輸入quit;退出后用root帳號(hào)登錄,也可以繼續(xù)其他操作. 文檔為doc格式 Mysql數(shù)據(jù)庫(kù)學(xué)習(xí)心得 由于工作中需要使用mysql,筆者通過(guò)網(wǎng)上學(xué)習(xí),動(dòng)手實(shí)踐,終于從一個(gè)"數(shù)據(jù)庫(kù)菜鳥(niǎo)"變成了能熟練操作mysql的"準(zhǔn)大蝦"了,:)。現(xiàn)將學(xué)習(xí)心得整理如下。 MySQL是完...... 1 . 數(shù)據(jù)庫(kù)創(chuàng)建 : Create database db_name; 數(shù)據(jù)庫(kù)刪除 : Drop database db_name; 刪除時(shí)可先判斷是否存在,寫(xiě)成 : drop database if exits db_name 2 . 建表 : 創(chuàng)建數(shù)據(jù)表...... 查詢(xún)(R)Selec子句 書(shū)寫(xiě)順序 Select distinct:要返回的列或表達(dá)式 From:從中檢索數(shù)據(jù)的表 Where:行級(jí)過(guò)濾/分組前過(guò)濾 group by:分組說(shuō)明 having:組級(jí)過(guò)濾/分組后過(guò)濾 order by:輸...... 我的MYSQL學(xué)習(xí)心得(十一) 視圖 我的MYSQL學(xué)習(xí)心得(一) 簡(jiǎn)單語(yǔ)法 我的MYSQL學(xué)習(xí)心得(二) 數(shù)據(jù)類(lèi)型寬度 我的MYSQL學(xué)習(xí)心得(三) 查看字段長(zhǎng)度 我的MYSQL學(xué)習(xí)心得(四) 數(shù)據(jù)類(lèi)型 我的MYSQ...... 我的MYSQL學(xué)習(xí)心得 一、使用視圖的理由是什么? 1.安全性。一般是這樣做的:創(chuàng)建一個(gè)視圖,定義好該視圖所操作的數(shù)據(jù)。之后將用戶(hù)權(quán)限與視圖綁定。這樣的方式是使用到了一個(gè)特...... 1.安裝Mysql注意:選擇語(yǔ)言
2.Doc系統(tǒng)下進(jìn)入Mysql
mysql -u用戶(hù)名 -p密碼
3.常用的命令:
1.查看mysql下所有的數(shù)據(jù)庫(kù):show databases;
2.創(chuàng)建數(shù)據(jù)庫(kù)的命令:create database 數(shù)據(jù)...... PHP亂碼?Mysql亂碼?怎么解決?
PHP亂碼或者mysql亂碼,多半是因?yàn)闆](méi)有統(tǒng)一編碼,要解決PHP/mysql亂碼,只要做到三碼合一即可.
所謂三碼,是指文件編碼,頁(yè)面編碼聲明和數(shù)據(jù)庫(kù)字符...... 在 MySQL下,在進(jìn)行中文模糊檢索時(shí),經(jīng)常會(huì)返回一些與之不相關(guān)的記錄,如查找 "%a%" 時(shí),返回的可能有中文字符,卻沒(méi)有a字符存在。本人以前也曾遇到過(guò)類(lèi)似問(wèn)題,經(jīng)詳細(xì)閱讀MySQL的Manua......] [
第三篇:MySQL學(xué)習(xí)心得
第四篇:mySql總結(jié)
第五篇:mysql問(wèn)題解決總結(jié)
聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶(hù)自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),工作人員會(huì)在5個(gè)工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。 Mysql數(shù)據(jù)庫(kù)學(xué)習(xí)心得
MySql知識(shí)點(diǎn)總結(jié)
mysql數(shù)據(jù)庫(kù)要點(diǎn)總結(jié)
我的MYSQL學(xué)習(xí)心得
我的MYSQL學(xué)習(xí)心得
Mysql常用語(yǔ)句小結(jié)
PHP MySql亂碼解決方案
MySQL中文模糊搜索解決方案