數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)
數(shù)據(jù)庫(kù)客戶端
MySQL作為數(shù)據(jù)庫(kù)服務(wù)器來(lái)運(yùn)行致燥,任何滿足mysql通信規(guī)范的軟件都可以作為客戶端來(lái)連接服務(wù)器杂靶。常用的圖形化客戶端:mysql_front碾盐,navcat和基于web的phpmyadmin屎鳍,MySQL自帶命令行客戶端。-
命令行客戶端
開(kāi)啟windows的命令行毙石,啟動(dòng)mysql服務(wù)端進(jìn)程廉沮,我們使用mysql客戶端來(lái)連接服務(wù)器。如果出現(xiàn)命令提示如下所示徐矩,則說(shuō)明沒(méi)有配置境變量滞时,導(dǎo)致系統(tǒng)找不到mysql.exe。C:\User> mysql -uroot -p 'mysql'不是內(nèi)部或外部命令滤灯,也不是可運(yùn)行的程序或批處理文件
解決方案
配置環(huán)境變量$PATH坪稽,指定mysql\bin\目錄。
每次進(jìn)入mysql\bin\目錄后鳞骤,再運(yùn)行mysql窒百。
-
連接服務(wù)器
服務(wù)器地址(IP或域名):端口(3306) -u用戶名 -p密碼
C:\User\> mysql -h localhost -uUsername -pPassword
-h 如果不寫(xiě)則默認(rèn)連接localhost
進(jìn)入剛安裝好的MySQL數(shù)據(jù)庫(kù)中,我們會(huì)發(fā)現(xiàn)內(nèi)置了三個(gè)數(shù)據(jù)庫(kù)information_schema(數(shù)據(jù)庫(kù)基本信息)豫尽,mysql(用戶基本信息)篙梢,performance_schema(數(shù)據(jù)庫(kù)優(yōu)化信息)這三個(gè)內(nèi)置數(shù)據(jù)庫(kù)很重要,不能隨便修改或刪除美旧。
數(shù)據(jù)庫(kù)入門語(yǔ)句
-
查看當(dāng)前服務(wù)器下面有哪些庫(kù)(database)
show databases;
-
創(chuàng)建數(shù)據(jù)庫(kù)
create database DBName[字符集聲明,整理集聲明];
-
刪除數(shù)據(jù)庫(kù)
drop database test2;
-
修改數(shù)據(jù)庫(kù)
只能修改數(shù)據(jù)庫(kù)的字符集和整理集渤滞,不能修改數(shù)據(jù)庫(kù)的名字
-
選擇數(shù)據(jù)庫(kù)
use DBName;
-
查看庫(kù)下的表
show tables;
-
刪除一張表
drop table tableName;
-
修改表名
rename table oldName to newName;
-
查看表結(jié)構(gòu)
desc tableName;
-
最簡(jiǎn)單的建表語(yǔ)句
create table 表名( 列1名稱 列1類型, 列2名稱 列2類型 );
-
為留言本建一張表
create table msg( id int, title varchar(60), name varchar(10), content varchar(1000) );
-
解決字符集的問(wèn)題
默認(rèn)的建表一般用utf8,我們?cè)趙indows下窗口是gbk榴嗅,因此需要聲明字符集妄呕。
所謂建表就是聲明列的過(guò)程,數(shù)據(jù)是以文件的形式放在硬盤或內(nèi)存中的录肯,不同的列類型占的空間不一樣趴腋,選列的原則是夠用又不浪費(fèi)。
詳解列類型
-
數(shù)值類型
a. 整數(shù)型:tinyint smallint mediumint int bigint
類型 字節(jié) 占位 無(wú)符號(hào) 有符號(hào) tinyint 1 8 0 ~ 2^8-1 -2^7 ~2^7-1 smallint 2 16 0 ~ 2^16-1 -2^15 ~ 2^15 -1 mediumint 3 24 0 ~ 2^24-1 -2^23 ~ 2^23 -1 int 4 32 0 ~ 2^32-1 -2^31 ~ 2^31 -1 默認(rèn)的整數(shù)類型是有符號(hào)的论咏,如果存儲(chǔ)無(wú)符號(hào)的數(shù)據(jù)應(yīng)顯示聲明
tinyint(M) unsigned zerofill的含義
M : 代表寬度优炬,對(duì)存儲(chǔ)范圍無(wú)影響,在zerofill時(shí)才有意義厅贪。
unsigned:無(wú)符號(hào)類型蠢护,對(duì)存儲(chǔ)范圍有影響,即數(shù)值非負(fù)养涮。
zerofill:零填充(如果某列是zerofill默認(rèn)就是unsigned)
M和zerofill標(biāo)記的字段是僅一種顯示效果葵硕,和數(shù)據(jù)的存儲(chǔ)范圍無(wú)關(guān)眉抬。
列可以聲明默認(rèn)值,而且推薦聲明默認(rèn)值
not null default 0
b. 小數(shù)型:
浮點(diǎn)型:float(M,D)(M代表總位數(shù)懈凹,D代表小數(shù)位)
定點(diǎn)型:decimal(M,D)
以float(4,2)為例蜀变,有符號(hào)時(shí)表示范圍-99.99 ~ 99.99,無(wú)符號(hào)時(shí)表示范圍0 ~ 99.99
decimal和float類型占有固定的字節(jié)數(shù)介评,為4字節(jié)或8字節(jié)库北。M<=23時(shí)占4個(gè)字節(jié),M>23時(shí)占8個(gè)字節(jié)decimal類型比f(wàn)loat類型更加精確们陆。
-
字符類型
定長(zhǎng)類型:char(M)寒瓦,M代表寬度,0<=M<=255坪仇,即可容納的字符數(shù)杂腰。
變長(zhǎng)類型:varchar(M),M代表寬度椅文,0<=M<=65535喂很,即可容納的字節(jié)數(shù)。(utf-8字符可容納22000個(gè)左右)
文本類型:text皆刺,可以存比較大的文本段恤筛,搜索速度稍慢,因此如果不是特別大的內(nèi)容芹橡,建議使用char和varchar來(lái)代替毒坛,text不用加默認(rèn)值,加了也沒(méi)用林说。
char類型和varchar類型的比較
char定長(zhǎng):M個(gè)字符煎殷,如果存的小于M個(gè)字符,實(shí)占M個(gè)字符
varchar變長(zhǎng):M個(gè)字符腿箩,如果存的小于M個(gè)字符豪直,設(shè)為N,N<=M 實(shí)占N+1-2個(gè)字節(jié)
類型 寬度 可存字符 實(shí)存字符 利用率 char(M) M M i i/M <= 100% varchar(M) M M i字符+(1-2)字節(jié) i/(i+1~2) < 100% char類型利用率可能達(dá)到100%珠移,但是varchar類型一定達(dá)不到100%弓乙。
char類型的速度相比varchar類型會(huì)稍快一些,如果是存姓名等定長(zhǎng)的字段钧惧,雖然空間有浪費(fèi)暇韧,但是考慮速度使用char類型會(huì)更好一些。
char類型如果不夠M個(gè)字符浓瞪,內(nèi)部用空格補(bǔ)齊懈玻,取出來(lái)的時(shí)候再把后面的空格去掉,所以如果內(nèi)容最后有空格再次取出時(shí)會(huì)被清除乾颁。
考慮空間利用率和存儲(chǔ)速度涂乌,像用戶名艺栈,四字成語(yǔ)等長(zhǎng)度比較固定的字段應(yīng)該采用char類型存儲(chǔ),而個(gè)人簡(jiǎn)介等不是特別長(zhǎng)的文本內(nèi)容應(yīng)該采用varchar類型來(lái)存儲(chǔ)湾盒。
-
日期時(shí)間類型
a. 年類型:year湿右,一個(gè)字節(jié)表示,范圍 1901 ~ 2155 [ 0000標(biāo)識(shí)錯(cuò)誤選擇 ]
如果輸入兩位罚勾,"00 ~ 69"表示2000 ~ 2069诅需,"70 ~ 99"表示1970 ~ 1999
如果記得麻煩,輸入的時(shí)候輸入四位
b. 日期類型:date荧库,典型格式"Y-m-d" 范圍 1000-01-01 ~ 9999-12-31
c. 時(shí)間類型:time,典型格式"H:i:s" 范圍 -838:59:59 ~ 838:59:59
d. 日期時(shí)間類型:datetime赵刑,典型格式"Y-m-d H:i:s" 范圍 "1000-01-01 ~ 9999-12-31 23:59:59"
注意事項(xiàng):在開(kāi)發(fā)中分衫,很少使用時(shí)間類型來(lái)表示一個(gè)需要精確到秒的列,原因是雖然日期時(shí)間類型能精確到秒而且方便查看般此,但是不方便計(jì)算蚪战。解決辦法是用時(shí)間戳來(lái)表示,即使用int類型來(lái)存儲(chǔ)時(shí)間戳铐懊。
時(shí)間戳:是1970-01-01 00:00:00到當(dāng)前的秒數(shù)邀桑,一般存注冊(cè)時(shí)間,商品發(fā)布時(shí)間等科乎,并不是使用datetime而是使用時(shí)間戳壁畸,因?yàn)閐atetime雖然直觀,但計(jì)算不夠方便茅茂,而用int類型存儲(chǔ)時(shí)間戳捏萍,方便計(jì)算,對(duì)于顯示來(lái)說(shuō)空闲,也可以方便格式化令杈。
對(duì)于類似于性別這樣的字段,可以聲明為tinyint碴倾,同時(shí)約定0和1分別代表什么逗噩,也可以使用枚舉類型enum('男',‘女’),但是這種設(shè)計(jì)不符合關(guān)系型數(shù)據(jù)庫(kù)的列的原子性設(shè)計(jì)原則跌榔,如果某一列的內(nèi)容僅具有幾種值异雁,那么應(yīng)該單獨(dú)設(shè)計(jì)一張表來(lái)保存這幾種值。
插入數(shù)據(jù)時(shí)除了數(shù)值類型其余類型數(shù)據(jù)應(yīng)該添加引號(hào)
簡(jiǎn)單的建表練習(xí)
create table php313(
id int unsigned primary key auto_increment,
name char(3) not null default '',
age tinyint unsigned not null default 0,
email varchar(30) not null default '',
tel char(11) not null default '',
salary decimal(7,2) not null default 0.0,
riqi date not null default "2012-03-13"
)charset utf8;
增刪改查操作
-
insert語(yǔ)法
insert into 表名(列1,...列n) values(值1,...值n); insert into 表名 values(值1,...值n)僧须; insert into 表名(列1,...列n) values(值1,...值n),(值1,...值n),(值1,...,值n);
-
update語(yǔ)法
update 表名 set 列1=新值1,列2=新值2 where expr;
-
delete語(yǔ)法
delete from 表名 where expr;
對(duì)where條件的理解:對(duì)滿足expr的行執(zhí)行相應(yīng)動(dòng)作片迅,如果不加where條件,則默認(rèn)對(duì)所有行執(zhí)行動(dòng)作皆辽。
-
select語(yǔ)法
查詢的五種子句:where(條件查詢)柑蛇,group by(分組)芥挣,having(篩選),order by(排序)耻台,limit(限制結(jié)果條數(shù))
-
where expression
用法:如果expression為真就將該行取出空免。
運(yùn)用場(chǎng)合:各種條件查詢場(chǎng)合,如按學(xué)號(hào)查詢學(xué)生盆耽,按價(jià)格查詢商品蹋砚,按發(fā)布時(shí)間查詢新聞等。
比較運(yùn)算符:<(小于) >(大于) =(等于) <=(小于等于) >=(大于等于) !=或<>(不等于) in 在某集合內(nèi) between and 在某范圍內(nèi)摄杂。
邏輯運(yùn)算符:NOT或!(邏輯非) OR或||(邏輯或) AND或&&(邏輯與)坝咐。
模糊查詢
%:通配任意字符 _ :通配單個(gè)字符
例子:查找"諾基亞"開(kāi)頭的所有商品
select goods_id,cat_id,goods_name from goods where goods_name like '諾基亞%'; select goods_id,cat_id,goods_name from goods where goods_name like '諾基亞__';
- group by col1,col2,...colN
用法:把行按字段分組
運(yùn)用場(chǎng)合:常見(jiàn)于統(tǒng)計(jì)場(chǎng)合,如按欄目計(jì)算帖子數(shù)析恢,統(tǒng)計(jì)每個(gè)人的平均成績(jī)等墨坚。
五個(gè)統(tǒng)計(jì)函數(shù)(也叫聚合函數(shù)):max()求最大,min()求最小映挂,sum()求總和泽篮,avg()求平均,count()求總行數(shù)柑船。
select count(*) from goods; select cat_id,max(shop_price) from goods group by cat_id;
五個(gè)聚合函數(shù)必須作用于select和from之間的字段上帽撑,只有單獨(dú)使用在某一列或者配合group by使用時(shí)才有意義,否則查詢出的列是不相匹配的鞍时。
要把列名當(dāng)成變量來(lái)看待亏拉,可以給列,表和計(jì)算結(jié)果取別名逆巍。3.having expr
用法:對(duì)查詢結(jié)果的篩選
where:針對(duì)原始表起作用专筷,作用的時(shí)間在結(jié)果之前。
having:對(duì)查詢結(jié)果其作用蒸苇,作用的時(shí)間在結(jié)果之后磷蛹。
例子:一張學(xué)生成績(jī)信息表如下:
姓名 科目 成績(jī) 張三 數(shù)學(xué) 90 張三 語(yǔ)文 50 張三 地理 40 李四 語(yǔ)文 55 李四 政治 45 王五 政治 30 查詢掛科兩門及兩門以上的同學(xué)的平均成績(jī)
思路:先計(jì)算所有同學(xué)的平均成績(jī),然后新建一個(gè)字段作為是否掛科標(biāo)記溪烤,統(tǒng)計(jì)這個(gè)標(biāo)記的和味咳,使用條件過(guò)濾。
select name,avg(grade) as average,sum(grade < 60) as notpass from grade group by name having notpass > 2;
4.order by
用法:按一個(gè)或多個(gè)字段對(duì)查詢結(jié)果進(jìn)行排序檬嘀。
知識(shí)點(diǎn)在本項(xiàng)目案例的運(yùn)用:對(duì)欄目的商品按價(jià)格由高到低或由低到高排序
知識(shí)點(diǎn)的運(yùn)用場(chǎng)合描述:各種排序場(chǎng)合槽驶,如熱點(diǎn)新聞,發(fā)帖狀元等鸳兽。
根據(jù)字段可以升序排列也可以降序排列掂铐,默認(rèn)是升序排列。
"字段名 desc"來(lái)聲明按降序排列,"字段名 asc"來(lái)聲明按升序排列全陨。
使用order by進(jìn)行排序時(shí)爆班,只通過(guò)一個(gè)字段有可能排不出結(jié)果,這時(shí)可以多字段排序辱姨。
order by 列1 [desc/asc],列2 [desc/asc]...
5.limit [offset, ] n
用法:limit在語(yǔ)句的最后柿菩,起到限制條目的作用。
offset:偏移量 n:取出的條數(shù)
limit 2,3 //取出第三條到第五條
offset如果不寫(xiě)雨涛,相當(dāng)于從頭開(kāi)始取
針對(duì)sql語(yǔ)句良好的理解模型:
where表達(dá)式:將表達(dá)式放在行中枢舶,看表達(dá)式是否為真。
列:理解為變量替久,可以運(yùn)算凉泄。
取出結(jié)果:理解為一張臨時(shí)表。
子查詢
where型子查詢:是指把內(nèi)層查詢的結(jié)果當(dāng)作外層查詢的比較條件
#查詢最新的商品 select goods_id,goods_name from goods where goods_id = (select max(goods_id) from goods ); #查詢每個(gè)欄目下的最新商品 select goods_id,goods_name from goods where goods_id in (select max(godos_id) from goods group by cat_id);
from型子查詢:是指把內(nèi)層查詢結(jié)果當(dāng)成臨時(shí)表蚯根,供外sql再次查詢后众。
#查詢每個(gè)欄目下最新的商品 select * from (select goods_id,cat_id,goods_name from goods order by cat_id asc,goods_id desc) as tmp group by cat_id; #查詢掛科兩門以上的平均分 select name,avg(grade) from grade where name in (select name from(select name,count(*) as notpass from grade where grade < 60 group by name having notpass >=2) as tmp) group by name;
where型子查詢和from型子查詢的區(qū)別:當(dāng)遇到兩條相同記錄時(shí),from型子查詢可能會(huì)只查詢到其中一條記錄稼锅,而where型子查詢會(huì)查詢出所有記錄。
注意from型子查詢的"as 臨時(shí)表"不能丟掉僚纷。
exists型子查詢:是指把外層的查詢結(jié)果拿到內(nèi)層矩距,看內(nèi)層的查詢結(jié)果是否成立
#查詢有商品的欄目 select cat_id,cat_name from category where exists(select * from goods where goods.cat_id=category.cat_id);
聯(lián)合查詢
union的用法:合并查詢結(jié)果。
作用:把兩次或多次的查詢結(jié)果合并起來(lái)怖竭。
要求:兩次查詢結(jié)果的列數(shù)一致锥债,可以來(lái)自于一張或多張表。
推薦:查詢的每一列對(duì)應(yīng)的列類型一致
#查詢大于5000或者小于2000元的商品 select goods_id,goods_name,shop_price from goods where shop_price > 5000 union select goods_id,goods_name,shop_price from goods where shop_price < 20; #查詢反饋表和評(píng)論表的內(nèi)容并合并起來(lái) select user_name,user_email,user_content from feedback where status=1 union select user_name,email,content from comment;
多次sql語(yǔ)句取出的列名可以不一致痊臭,此時(shí)以第一個(gè)sql取出的列名為準(zhǔn)哮肚。如果不同的語(yǔ)句中取出的行有完全相同的(每個(gè)列的值都相同),那么相同的行將會(huì)合并(去重復(fù))广匙。如果不去重復(fù)允趟,可以使用union all來(lái)指定。
#查詢所有的合并記錄鸦致,而不去除重復(fù)數(shù)據(jù) select id,sum(num) from (select * from ta union all select * from tb) as tmp group by id;
如果子句中有order by或limit潮剪,應(yīng)該用括號(hào)將子句包起來(lái),推薦放到所有子句之后分唾,即對(duì)最終合并的結(jié)果發(fā)揮作用抗碰。
(select goods_id,cat_id,goods_name,shop_price from goods where cat_id=4 order by shop_price desc) union (select goods_id,goods_name,shop_price from goods where cat_id=5 order by shop_price desc) order by shop_price desc;
在子句中order by配合limit使用時(shí)才有意義,如果order by不配合limit使用绽乔,會(huì)被語(yǔ)法分析器分析時(shí)去除弧蝇。
(select goods_id,cat_id,goods_name,shop_price from goods where cat_id=3 order by shop_price desc limit 3) union (select goods_id,cat_id,goods_name,shop_price from goods where cat_id=4 order by shop_price desc limit 2);
連接查詢
連接查詢步驟:先將兩張表連接起來(lái),再使用條件過(guò)濾一些數(shù)據(jù),最后像查詢一張表那樣查詢聯(lián)合表看疗,注意字段如果有重復(fù)應(yīng)該顯示聲明是哪一張表的字段沙峻。
select goods_id,goods.cat_id,cat_name,goods_name,shop_price from goods left join category on goods.cat_id=category.cat_id;
左連接 (left join)
select 列1,列2,...列n from tableA left join tableB on tableA.列=tableB.列 [此處表連接成一張大表,完全當(dāng)成普通表來(lái)看待] where group by having等查詢子句照常寫(xiě)
右連接 (right join)
select 列1,列2,...列n from tableA right join tableB on tableA.列=tableB.列 [此處表連接成一張大表鹃觉,完全當(dāng)成普通表來(lái)看待] where group by having等查詢子句照常寫(xiě)
內(nèi)連接 (inner join)
select 列1,列2,...列n from tableA inner join tableB on tableA.列=tableB.列 [此處表連接成一張大表专酗,完全當(dāng)成普通表來(lái)看待] where group by having等查詢子句照常寫(xiě)
左右連接以左表為準(zhǔn),去右表找匹配數(shù)據(jù)盗扇,找不到匹配用NULL補(bǔ)齊祷肯。
左連接與右連接的關(guān)系:左右連接可以相互轉(zhuǎn)化,A left join B <=> B right join A疗隶。推薦把右連接轉(zhuǎn)化成左連接來(lái)使用佑笋,并推薦使用左連接代替右連接,這樣做兼容性更好一點(diǎn)斑鼻。
內(nèi)連接:查詢左右表都有的數(shù)據(jù)蒋纬,即不要左右連接中的NULL那一部分,是左右連接的交集坚弱。
如果想要查出左右連接的并集蜀备,可以用union來(lái)達(dá)到目的,目前mysql不支持外連接outer join荒叶。
-
練習(xí)題
1.取出goods表碾阁,category表,brand表連接查詢得到以下字段
goods_id,goods_name,cat_id,cat_name,brand_id,brand_name
select goods_id,goods_name,category.cat_id,category.cat_name,brand.brand_id,brand.brand_name
from goods left join category on goods.cat_id=category.cat_id
left join brand on goods.brand_id=brand.brand_id;
2.面試題
Match賽程表
字段名稱 | 字段類型 | 描述 |
---|---|---|
matchID | int | 主鍵 |
hostTeamID | int | 主隊(duì)的ID |
guestTeamID | int | 客隊(duì)的ID |
matchResult | varchar(20) | 比賽結(jié)果些楣,如(2,0) |
matchTime | date | 比賽開(kāi)始時(shí)間 |
Team參賽隊(duì)伍表
字段名稱 | 字段類型 | 描述 |
---|---|---|
teamID | int | 主鍵 |
teamName | int | 隊(duì)伍名稱 |
Match的hostTeamID與guestTeamID都與Team中的teamID關(guān)聯(lián)脂凶,查出2006-6-1到2006-7-1之間舉行的所有比賽,并且用以下形式列出:拜仁 2:0 不來(lái)梅
select t1.tname as hname,mres,t2.tname as gname,matime from m
left join t as t1 on m.hid = t1.tid
left join t as t2
on m.gid = t2.tid
where matime between '2006-06-01' and '2006-07-01';
列的增刪改
-
增加列
alter table 表名 add 列聲明;
增加的列默認(rèn)放在表的最后一列愁茁,可以用after來(lái)聲明新增的列放在哪一列的后面
alter table 表名 add 列聲明 after 列名;
如果新增的列放在最前面蚕钦,則使用first關(guān)鍵字
alter table 表名 add 列聲明 first;
-
修改列
alter table 表名 change 列名 列聲明;
-
刪除列
alter table 表名 drop 列名;
視圖 view
-
視圖的定義
視圖是由查詢結(jié)果形成的一張?zhí)摂M表,沒(méi)有真實(shí)的數(shù)據(jù)存在鹅很,只是一種查詢產(chǎn)生的關(guān)系嘶居。
-
視圖的創(chuàng)建
create view 視圖名 select 語(yǔ)句;
-
視圖的修改
alter table 視圖名 as select 語(yǔ)句;
-
視圖的刪除
drop view 視圖名;
-
視圖的意義
a.可以達(dá)到簡(jiǎn)化查詢的目的,對(duì)于一個(gè)多步復(fù)雜查詢促煮,可以將中間結(jié)果保存為視圖食听,再針對(duì)視圖進(jìn)行查詢。
b.可以進(jìn)行權(quán)限控制污茵,把表的權(quán)限封閉樱报,但是開(kāi)放相應(yīng)的視圖權(quán)限,視圖里只開(kāi)發(fā)部分?jǐn)?shù)據(jù)泞当。
c.大數(shù)據(jù)分表時(shí)可以用到迹蛤,比如表的行數(shù)超過(guò)200萬(wàn)時(shí),就會(huì)變慢,可以把一張表的數(shù)據(jù)拆成四張表來(lái)存放盗飒,查詢時(shí)可以用視圖將四張表合并為一張來(lái)查詢嚷量。
-
視圖與表的關(guān)系
視圖是表的查詢結(jié)果,表的數(shù)據(jù)修改會(huì)影響視圖的結(jié)果逆趣,視圖的增刪改也可以影響到表蝶溶。但是視圖并不總是能夠增刪改的,只有視圖數(shù)據(jù)與表的數(shù)據(jù)一一對(duì)應(yīng)時(shí)宣渗,視圖的數(shù)據(jù)是可以修改的抖所。對(duì)于視圖的insert操作還應(yīng)注意視圖必須包含所有表中沒(méi)有默認(rèn)值的列。
-
視圖的algorithm
merge:當(dāng)引用視圖時(shí)痕囱,引用視圖的語(yǔ)句與定義視圖的語(yǔ)句合并田轧。
temptable:當(dāng)引用視圖時(shí),根據(jù)視圖的創(chuàng)建語(yǔ)句建立一張臨時(shí)表鞍恢。
undefined:未定義傻粘,系統(tǒng)傾向于merge模式。
merge模式與temptable模式的區(qū)別:
merge:意味著視圖只是一個(gè)語(yǔ)句規(guī)則帮掉,當(dāng)查詢視圖時(shí),把查詢視圖的語(yǔ)句(比如where子句)與創(chuàng)建時(shí)的語(yǔ)句(比如where子句)等合并弦悉,分析形成一條select語(yǔ)句。
#創(chuàng)建視圖的語(yǔ)句 create view g2 as select goods_id,cat_id,goods_name,shop_price from goods order by cat_id asc,shop_price desc; #查詢視圖的語(yǔ)句 select * from g2 group by cat_id; #最終執(zhí)行的語(yǔ)句 select goods_id,cat_id,goods_name,shop_price from goods group by cat_id order by cat_id asc,shop_price desc;
temptable:根據(jù)創(chuàng)建語(yǔ)句瞬間創(chuàng)建一張臨時(shí)表蟆炊,然后查詢視圖的語(yǔ)句從該臨時(shí)表查詢數(shù)據(jù)稽莉。通過(guò)顯示指定temptable模式可以達(dá)到子查詢的效果。
create algorithm=temptable view g2 as select goods_id,cat_id,goods_name,shop_price from goods order by cat_id asc,shop_price desc; #最終執(zhí)行兩句話盅称,首先取數(shù)據(jù)放在臨時(shí)表肩祥,然后查詢臨時(shí)表后室。
字符集與校對(duì)集
1.字符集:MySQL的字符集設(shè)置非常靈活缩膝,可以設(shè)置以下幾個(gè)層面:服務(wù)器默認(rèn)字符集,數(shù)據(jù)庫(kù)默認(rèn)字符集岸霹,表默認(rèn)字符集疾层,列默認(rèn)字符集。如果某一級(jí)別沒(méi)有指定字符集贡避,則繼承上一級(jí)痛黎。
以表聲明為utf8為例,存儲(chǔ)在表中的數(shù)據(jù)是utf8字符集刮吧。
[圖解MySQL字符設(shè)置]
1.告訴服務(wù)器客戶端的編碼 character_set_client
2.告訴轉(zhuǎn)換器轉(zhuǎn)換的編碼 character_set_connection
3.查詢結(jié)果使用什么編碼 character_set_results
如果以上三者為同一字符集N可以使用 set names N;
產(chǎn)生亂碼的情形:
client聲明與事實(shí)不符或result聲明與客戶端頁(yè)面不符湖饱。
丟失數(shù)據(jù)的情形:
character_set_connection和character_set_server的字符集比character_set_client小
2.校對(duì)集:校對(duì)集就是排序規(guī)則,一種字符集可以有一個(gè)或多個(gè)排序規(guī)則杀捻,utf8一般使用默認(rèn)的utf8_general_ci規(guī)則井厌,也可以使用二進(jìn)制規(guī)則utf8_bin
show character set; //查看字符集
show collation; //查看校對(duì)集
show colation like 'utf8%'; //查看utf8字符集對(duì)應(yīng)的校對(duì)集
觸發(fā)器 trigger
-
觸發(fā)器的作用
監(jiān)視某種動(dòng)作并觸發(fā)某種動(dòng)作,觸發(fā)器能監(jiān)視增刪改三種操作并出發(fā)增刪改三種操作。
-
觸發(fā)器的應(yīng)用場(chǎng)景
a. 當(dāng)向一張表中添加或刪除記錄時(shí)仅仆,需要在相關(guān)表中進(jìn)行同步操作器赞。比如,當(dāng)一個(gè)訂單產(chǎn)生時(shí)墓拜,訂單的所購(gòu)的商品的庫(kù)存量應(yīng)改相應(yīng)減少港柜。
b. 當(dāng)表上某列數(shù)據(jù)的值與其他表中的數(shù)據(jù)有聯(lián)系時(shí)。比如當(dāng)某客戶進(jìn)行欠款消費(fèi)咳榜,可以在生成訂單時(shí)通過(guò)設(shè)計(jì)觸發(fā)器判斷客戶的累計(jì)欠款是否超過(guò)了最大限度夏醉。
c. 當(dāng)需要對(duì)某張表進(jìn)行跟蹤時(shí)。比如贿衍,當(dāng)有新訂單產(chǎn)生時(shí)授舟,需要及時(shí)通知相關(guān)人員進(jìn)行處理,此時(shí)可以在訂單表上設(shè)計(jì)添加觸發(fā)器加以實(shí)現(xiàn)贸辈。
-
觸發(fā)器的四個(gè)要素
a. 監(jiān)視地點(diǎn):table
b. 監(jiān)視事件:insert/update/delete
c. 觸發(fā)時(shí)間:after/before
d. 觸發(fā)事件:insert/update/delete
-
觸發(fā)器的使用語(yǔ)法
創(chuàng)建觸發(fā)器的語(yǔ)法
create trigger triggerName after/before insert/update/delete on tableName for each row //這句話在MySQL數(shù)據(jù)庫(kù)中是固定的 begin sql語(yǔ)句; //一句或多句insert/update/delete范圍內(nèi) end$
刪除觸發(fā)器的語(yǔ)法
drop trigger triggerName;
-
觸發(fā)器引用行變量的值
a. 對(duì)于insert而言释树,新增的行用new來(lái)表示,行中每一列用new.列名來(lái)表示擎淤。
b. 對(duì)于delete而言奢啥,刪除的行用old來(lái)表示,行中每一列用old.列名來(lái)表示嘴拢。
c. 對(duì)于update而言桩盲,原來(lái)的行用old來(lái)表示,行中每一列的值用old.列名來(lái)表示席吴;新增的行用new來(lái)表示赌结,行中每一列的值用new.列名來(lái)表示。