




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第4章MYSQL高級(jí)特性本章要點(diǎn):v 集合函數(shù)與時(shí)間函數(shù)v 字符串的模式匹配v 如何創(chuàng)建索引v 檢索數(shù)據(jù)中的一些技巧第三章向你初步介紹了SQL。你學(xué)會(huì)了如何用SELECT語(yǔ)句進(jìn)行查詢,你還學(xué)會(huì)了如何建立自己的表以及如何錄入數(shù)據(jù)等。在這一章里,你將加深你SQL語(yǔ)言知識(shí)。你將學(xué)習(xí)如何建立索引來(lái)加快查詢速度。你還將學(xué)會(huì)如果用更多的SQL語(yǔ)句和函數(shù)來(lái)操作表中的數(shù)據(jù)。尤其是對(duì)檢索語(yǔ)句SELECT的使用,其中技巧繁多,可以說(shuō)這是SQL語(yǔ)言中最重要的語(yǔ)句,也是使用者最常使用的語(yǔ)句。本章將詳細(xì)介紹SELECT語(yǔ)句的用法。無(wú)論如何,這里的介紹都不能包括SQL語(yǔ)言的所有技巧,讀者應(yīng)該在平時(shí)的不斷使用中積累經(jīng)驗(yàn)。4
2、.1 集合函數(shù)到現(xiàn)在為止,你只學(xué)習(xí)了如何根據(jù)特定的條件從表中取出一條或多條記錄。但是,假如你想對(duì)一個(gè)表中的記錄進(jìn)行數(shù)據(jù)統(tǒng)計(jì)。例如,如果你想統(tǒng)計(jì)存儲(chǔ)在表中的一次民意測(cè)驗(yàn)的投票結(jié)果。或者你想知道一個(gè)訪問者在你的站點(diǎn)上平均花費(fèi)了多少時(shí)間。要對(duì)表中的任何類型的數(shù)據(jù)進(jìn)行統(tǒng)計(jì),都需要使用集合函數(shù)。你可以統(tǒng)計(jì)記錄數(shù)目,平均值,最小值,最大值,或者求和。當(dāng)你使用一個(gè)集合函數(shù)時(shí),它只返回一個(gè)數(shù),該數(shù)值代表這幾個(gè)統(tǒng)計(jì)值之一。這些函數(shù)的最大特點(diǎn)就是經(jīng)常和GROUP BY語(yǔ)句配合使用,需要注意的是集合函數(shù)不能和非分組的列混合使用。4.1.1 行列計(jì)數(shù)l 計(jì)算查詢語(yǔ)句返回的記錄行數(shù)直接計(jì)算函數(shù)COUNT(*)的值,例如
3、,計(jì)算pet表中貓的只數(shù):mysql>SELECT count(*) FROM pet WHERE species=cat;+-+| count(*) |+-+| 2 |+-+4.1.2統(tǒng)計(jì)字段值的數(shù)目例如,計(jì)算pet表中species列的數(shù)目:mysql> SELECT count(species) FROM pet;+-+| count(species) |+-+| 9 |+-+如果相同的種類出現(xiàn)了不止一次,該種類將會(huì)被計(jì)算多次。如果你想知道種類為某個(gè)特定值的寵物有多少個(gè),你可以使用WHERE子句,如下例所示: mysql> SELECT COUNT(species) F
4、ROM pet WHERE species='cat' ;注意這條語(yǔ)句的結(jié)果:+-+| COUNT(species) |+-+| 2 |+-+這個(gè)例子返回種類為'cat'的作者的數(shù)目。如果這個(gè)名字在表pet中出現(xiàn)了兩次,則次函數(shù)的返回值是2。 而且它和上面提到過的語(yǔ)句的結(jié)果是一致的:SELECT count(*) FROM pet WHERE species=cat實(shí)際上,這兩條語(yǔ)句是等價(jià)的。假如你想知道有多少不同種類的的寵物數(shù)目。你可以通過使用關(guān)鍵字DISTINCT來(lái)得到該數(shù)目。如下例所示: mysql> SELECT COUNT(DISTINCT sp
5、ecies) FROM pet;+-+| COUNT(DISTINCT species) |+-+| 5 |+-+如果種類'cat'出現(xiàn)了不止一次,它將只被計(jì)算一次。關(guān)鍵字DISTINCT 決定了只有互不相同的值才被計(jì)算。 通常,當(dāng)你使用COUNT()時(shí),字段中的空值將被忽略。另外,COUNT()函數(shù)通常和GROUP BY子句配合使用,例如可以這樣返回每種寵物的數(shù)目:mysql> SELECT species,count(*) FROM pet GROUP BY species;+-+-+| species | count(*) |+-+-+| bird | 2 | ca
6、t | 2 | dog | 3 | hamster | 1 | snake | 1 |+-+-+4.1.3 計(jì)算字段的平均值需要計(jì)算這些值的平均值。使用函數(shù)AVG(),你可以返回一個(gè)字段中所有值的平均值。 假如你對(duì)你的站點(diǎn)進(jìn)行一次較為復(fù)雜的民意調(diào)查。訪問者可以在1到10之間投票,表示他們喜歡你站點(diǎn)的程度。你把投票結(jié)果保存在名為vote的INT型字段中。要計(jì)算你的用戶投票的平均值,你需要使用函數(shù)AVG(): SELECT AVG(vote) FROM opinion 這個(gè)SELECT語(yǔ)句的返回值代表用戶對(duì)你站點(diǎn)的平均喜歡程度。函數(shù)AVG()只能對(duì)數(shù)值型字段使用。這個(gè)函數(shù)在計(jì)算平均值時(shí)也忽略空值。
7、 再給出一個(gè)實(shí)際例子,例如我們要計(jì)算pet表中每種動(dòng)物年齡的平均值,那么使用AVG()函數(shù)和GROUP BY子句:mysql> SELECT species,AVG(CURDATE()-birth) FROM pet GROUP BY species;返回的結(jié)果為:+-+-+| species | AVG(CURDATE()-birth) |+-+-+| bird | 34160 | cat | 74959.5 | dog | 112829.66666667 | hamster | 19890 | snake | 49791 |+-+-+4.1.4 計(jì)算字段值的和假設(shè)你的站點(diǎn)被用來(lái)出售某
8、種商品,已經(jīng)運(yùn)行了兩個(gè)月,是該計(jì)算賺了多少錢的時(shí)候了。假設(shè)有一個(gè)名為orders的表用來(lái)記錄所有訪問者的定購(gòu)信息。要計(jì)算所有定購(gòu)量的總和,你可以使用函數(shù)SUM(): SELECT SUM(purchase_amount) FROM orders 函數(shù)SUM()的返回值代表字段purchase_amount中所有值的總和。字段purchase_amount的數(shù)據(jù)類型也許是DECIMAL類型,但你也可以對(duì)其它數(shù)值型字段使用函數(shù)SUM()。用一個(gè)不太恰當(dāng)?shù)睦诱f(shuō)明,我們計(jì)算pet表中同種寵物的年齡的總和:mysql> SELECT species,SUM(CURDATE()-birth) FR
9、OM pet GROUP BY species;你可以查看結(jié)果,與前一個(gè)例子對(duì)照:+-+-+| species | SUM(CURDATE()-birth) |+-+-+| bird | 68320 | cat | 149919 | dog | 338489 | hamster | 19890 | snake | 49791 |+-+-+4.1.5 計(jì)算字段值的極值求字段的極值,涉及兩個(gè)函數(shù)MAX()和MIN()。例如,還是pet表,你想知道最早的動(dòng)物出生日期,由于日期最早就是最小,所以可以使用MIN()函數(shù):mysql> SELECT MIN(birth) FROM pet;+-+|
10、MIN(birth) |+-+| 1989-05-13 |+-+但是,你只知道了日期,還是無(wú)法知道是哪只寵物,你可能想到這樣做:SELECT name,MIN(birth) FROM pet;但是,這是一個(gè)錯(cuò)誤的SQL語(yǔ)句,因?yàn)榧虾瘮?shù)不能和非分組的列混合使用,這里name列是沒有分組的。所以,你無(wú)法同時(shí)得到name列的值和birth的極值。MIN()函數(shù)同樣可以與GROUP BY子句配合使用,例如,找出每種寵物中最早的出生日期:mysql> SELECT species,MIN(birth) FROM pet GROUP BY species;下面是令人滿意的結(jié)果:+-+-+| spe
11、cies | MIN(birth) |+-+-+| bird | 1997-12-09 | cat | 1993-02-04 | dog | 1989-05-13 | hamster | 1999-03-30 | snake | 1996-04-29 |+-+-+另一方面,如果你想知道最近的出生日期,就是日期的最大值,你可以使用MAX()函數(shù),如下例所示: mysql> SELECT species,MAX(birth) FROM pet GROUP BY species; +-+-+| species | MAX(birth) |+-+-+| bird | 1998-09-11 | c
12、at | 1994-03-17 | dog | 1990-08-31 | hamster | 1999-03-30 | snake | 1996-04-29 |+-+-+4.1.6 總結(jié)在本節(jié)中,介紹了一些典型的集合函數(shù)的用法,包括計(jì)數(shù)、均值、極值和總和,這些都是SQL語(yǔ)言中非常常用的函數(shù)。這些函數(shù)之所以稱之為集合函數(shù),是因?yàn)樗鼈儜?yīng)用在多條記錄中,所以集合函數(shù)最常見的用法就是與GROUP BY子句配合使用,最重要的是集合函數(shù)不能同未分組的列混合使用。4.2 操作日期和時(shí)間日期和時(shí)間函數(shù)對(duì)建立一個(gè)站點(diǎn)是非常有用的。站點(diǎn)的主人往往對(duì)一個(gè)表中的數(shù)據(jù)何時(shí)被更新感興趣。通過日期和時(shí)間函數(shù),你可以在秒級(jí)跟
13、蹤一個(gè)表的改變。日期和時(shí)間類型是DATETIME、DATE、TIMESTAMP、TIME和YEAR。這些的每一個(gè)都有合法值的一個(gè)范圍,而“零”當(dāng)你指定確實(shí)不合法的值時(shí)被使用。注意,MySQL允許你存儲(chǔ)某個(gè)“不嚴(yán)格地”合法的日期值,例如1999-11-31,原因我們認(rèn)為它是應(yīng)用程序的責(zé)任來(lái)處理日期檢查,而不是SQL服務(wù)器。為了使日期檢查更“快”,MySQL僅檢查月份在0-12的范圍,天在0-31的范圍。上述范圍這樣被定義是因?yàn)镸ySQL允許你在一個(gè)DATE或DATETIME列中存儲(chǔ)日期,這里的天或月是零。這對(duì)存儲(chǔ)你不知道準(zhǔn)確的日期的一個(gè)生日的應(yīng)用程序來(lái)說(shuō)是極其有用的,在這種情況下,你簡(jiǎn)單地存儲(chǔ)日
14、期象1999-00-00或1999-01-00。(當(dāng)然你不能期望從函數(shù)如DATE_SUB()或DATE_ADD()得到類似以這些日期的正確值)。4.2.1 返回當(dāng)前日期和時(shí)間通過函數(shù)GETDATE(),你可以獲得當(dāng)前的日期和時(shí)間。例如,l CURDATE() 返回當(dāng)前日期CURRENT_DATE 以'YYYY-MM-DD'或YYYYMMDD格式返回今天日期值,取決于函數(shù)是在一個(gè)字符串還是數(shù)字上下文被使用。 mysql> select CURDATE();+-+| CURDATE() |+-+| 2001-02-20 |+-+mysql> select CURDATE
15、() + 0;+-+| CURDATE()+0 |+-+| 20010220 |+-+l CURTIME() 返回當(dāng)前時(shí)間以'HH:MM:SS'或HHMMSS格式返回當(dāng)前時(shí)間值,取決于函數(shù)是在一個(gè)字符串還是在數(shù)字的上下文被使用。 mysql> select CURTIME();+-+| CURTIME() |+-+| 10:42:38 |+-+mysql> select CURTIME() + 0;+-+| CURTIME()+0 |+-+| 104525 |+-+l NOW() 返回當(dāng)前時(shí)期和時(shí)間NOW()以YYYY-MM-DD HH:MM:SS的格式或者YYYY
16、MMDDHHMMSS的格式返回日期和時(shí)間值,取決于上下文。mysql>select now();+-+| now() |+-+| 2001-02-20 10:45:57 |+-+mysql>select now()+0;+-+| now()+0 |+-+-+這些得到當(dāng)前日期和時(shí)間的函數(shù),對(duì)于日期和時(shí)間的計(jì)算很方便,尤其是計(jì)算一個(gè)時(shí)間到現(xiàn)在的時(shí)間差。例如,在pet表中,我們以天為單位計(jì)算寵物的年齡:mysql> SELECT name,CURDATE()-birth FROM pet;+-+-+| name | CURDATE()-birth |+-+-+| Fluffy |
17、80016 | Claws | 69903 | Buffy | 119707 | Chirpy | 29309 | Fang | 109393 | Bowser | 109389 | Whistler | 39011 | Slim | 49791 | Puffball | 19890 |+-+-+4.2.2 自動(dòng)記錄數(shù)據(jù)的改變時(shí)間TIMESTAMP列類型提供一種類型,TIMESTAMP值可以從1970的某時(shí)的開始一直到2037年,精度為一秒,其值作為數(shù)字顯示。你可以使用它自動(dòng)地用當(dāng)前的日期和時(shí)間標(biāo)記INSERT或UPDATE的操作。如果你有多個(gè)TIMESTAMP列,只有第一個(gè)自動(dòng)更新。 自動(dòng)更
18、新第一個(gè)TIMESTAMP列在下列任何條件下發(fā)生: l 列沒有明確地在一個(gè)INSERT或LOAD DATA INFILE語(yǔ)句中指定。 l 列沒有明確地在一個(gè)UPDATE語(yǔ)句中指定且一些另外的列改變值。(注意一個(gè)UPDATE設(shè)置一個(gè)列為它已經(jīng)有的值,這將不引起TIMESTAMP列被更新,因?yàn)槿绻阍O(shè)置一個(gè)列為它當(dāng)前的值,MySQL為了效率而忽略更改。) l 你明確地設(shè)定TIMESTAMP列為NULL. 除第一個(gè)以外的TIMESTAMP列也可以設(shè)置到當(dāng)前的日期和時(shí)間,只要將列設(shè)為NULL,或NOW()。 例如,創(chuàng)建如下的表:mysql> CREATE TABLE student-> (
19、-> id int,-> name char(16),-> english tinyint,-> chinese tinyint,-> history tinyint,-> time timestamp-> );向表中插入記錄,可以查看效果:mysql> INSERT student(id,name,englisht,Chinese,history) VALUES(11,”Tom”,66,93,67);查看記錄的存儲(chǔ)情況:mysql> SELECT * FROM student;+-+-+-+-+-+-+| id | name | engl
20、ish | chinese | history | time |+-+-+-+-+-+-+-+-+-+-+-+-+你可以看到time列紀(jì)錄下了數(shù)據(jù)錄入時(shí)的時(shí)間值。如果你更新改記錄,在查看操作的結(jié)果:mysql> UPDATE student SET english=76 WHERE id=11;mysql> SELECT * FROM student;+-+-+-+-+-+-+| id | name | english | chinese | history | time |+-+-+-+-+-+-+-+-+-+-+-+-+可以清楚的看到,time列的時(shí)間被自動(dòng)更改為修改記錄的時(shí)間
21、。有時(shí)候你希望不更改任何值,也能打到修改TIMESTAMP列的值,這時(shí)只要設(shè)置該列的值為NULL,MySQL就可以自動(dòng)更新TIMESTAMP列的值:mysql> UPDATE student SET time=NULL WHERE id=11;mysql> select * from student where id=11;+-+-+-+-+-+-+| id | name | english | chinese | history | time |+-+-+-+-+-+-+-+-+-+-+-+-+通過明確地設(shè)置希望的值,你可以設(shè)置任何TIMESTAMP列為不同于當(dāng)前日期和時(shí)間的值,
22、即使對(duì)第一個(gè)TIMESTAMP列也是這樣。例如,如果,當(dāng)你創(chuàng)建一個(gè)行時(shí),你想要一個(gè)TIMESTAMP被設(shè)置到當(dāng)前的日期和時(shí)間,但在以后無(wú)論何時(shí)行被更新時(shí)都不改變,你可以使用這樣使用: l 讓MySQL在行被創(chuàng)建時(shí)設(shè)置列,這將初始化它為當(dāng)前的日期和時(shí)間。 l 當(dāng)你執(zhí)行隨后的對(duì)該行中其他列的更改時(shí),明確設(shè)定TIMESTAMP列為它的當(dāng)前值。 例如,當(dāng)你在修改列時(shí),可以把原有的值付給TIMESTAMP列:mysql> UPDATE student SET english=66,time=time WHERE id=11;mysql> select * from student where
23、 id=11;+-+-+-+-+-+-+| id | name | english | chinese | history | time |+-+-+-+-+-+-+| 11 | Tom | 6+-+-+-+-+-+-+另一方面,你可能發(fā)現(xiàn),當(dāng)你想要實(shí)現(xiàn)上面這個(gè)效果時(shí),很容易用一個(gè)你用NOW()初始化的DATETIME列然后不再改變它,這樣也許直接些。 但是,TIMESTAMP列的以后好處是存儲(chǔ)要求比較小,節(jié)省空間。TIMESTAMP的存儲(chǔ)需求是4字節(jié),而DATETIME列的存儲(chǔ)需求是8字節(jié)。4.2.3 返回日期和時(shí)間范圍當(dāng)你分析表中的數(shù)據(jù)時(shí),你也許希望取出某個(gè)特定時(shí)間的數(shù)據(jù)。我們用下面一個(gè)表
24、來(lái)模仿一個(gè)web站點(diǎn)的記錄。mysql> CREATE TABLE weblog-> (-> data float,-> entrydate datetime-> );然后隨機(jī)的增加幾個(gè)數(shù)據(jù):mysql> INSERT weblog VALUES(rand(),now();rand()函數(shù)返回一個(gè)隨機(jī)的浮點(diǎn)值,now()函數(shù)返回當(dāng)前時(shí)間。多執(zhí)行上面語(yǔ)句幾次,得到一個(gè)作為測(cè)試的表。最為測(cè)試你還可以增加一個(gè)值:mysql> INSERT weblog VALUES(rand(),”2001-02-08”);這條語(yǔ)句,插入一個(gè)entry為”2001-02-0
25、8 00:00:00”的值(假定現(xiàn)在為2001年2月8日),你可以查看這個(gè)表的值:mysql> select * from weblog;+-+-+| data | entrydate |+-+-+| 0.973723 | 2001-02-08 00:00:00 | 0.437768 | 2001-02-08 13:57:06 | 0.327279 | 2001-02-08 13:57:09 | 0.0931809 | 2001-02-08 13:58:29 | 0.198805 | 2001-02-08 13:57:54 |+-+-+你也許對(duì)特定的某一天中比如說(shuō)2001年2月18日訪問
26、者在你站點(diǎn)上的活動(dòng)感興趣。要取出這種類型的數(shù)據(jù),你也許會(huì)試圖使用這樣的SELECT語(yǔ)句: mysql> SELECT * FROM weblog WHERE entrydate="2001-02-08" 不要這樣做。這個(gè)SELECT語(yǔ)句不會(huì)返回正確的記錄它將只返回值為2000-02-08 00:00:00的記錄,換句話說(shuō),只返回當(dāng)天零點(diǎn)零時(shí)的記錄。上面語(yǔ)句的結(jié)果為: +-+-+| data | entrydate |+-+-+| 0.973723 | 2001-02-08 00:00:00 |+-+-+要返回正確的記錄,你需要適用日期和時(shí)間范圍。有不止一種途徑可以做到
27、這一點(diǎn)。1、使用關(guān)系運(yùn)算符和邏輯運(yùn)算符來(lái)限制時(shí)間范圍例如,下面的這個(gè)SELECT 語(yǔ)句將能返回正確的記錄: mysql> SELECT * FROM weblog -> WHEREentrydate>="2001-02-08" AND entrydate<"2001-02-09" ;這個(gè)語(yǔ)句可以完成任務(wù),因?yàn)樗x取的是表中的日期和時(shí)間大于等于2001-02-08 00:00:00并小于2001-02-09 00:00:00的記錄。換句話說(shuō),它將正確地返回2000年2月8日這一天輸入的每一條記錄。 其結(jié)果為:+-+-+| data
28、| entrydate |+-+-+| 0.973723 | 2001-02-08 00:00:00 | 0.437768 | 2001-02-08 13:57:06 | 0.327279 | 2001-02-08 13:57:09 | 0.0931809 | 2001-02-08 13:58:29 | 0.198805 | 2001-02-08 13:57:54 |+-+-+2、另一種方法是,你可以使用LIKE來(lái)返回正確的記錄。通過在日期表達(dá)式中包含通配符“”,你可以匹配一個(gè)特定日期的所有時(shí)間。這里有一個(gè)例子: mysql> SELECT * FROM weblog WHERE ent
29、rydate LIKE '2001-02-08%' ;這個(gè)語(yǔ)句可以匹配正確的記錄。因?yàn)橥ㄅ浞啊贝砹巳魏螘r(shí)間。 +-+-+| data | entrydate |+-+-+| 0.973723 | 2001-02-08 00:00:00 | 0.437768 | 2001-02-08 13:57:06 | 0.327279 | 2001-02-08 13:57:09 | 0.0931809 | 2001-02-08 13:58:29 | 0.198805 | 2001-02-08 13:57:54 |+-+-+3、上面兩種方法的異同由于使用關(guān)系運(yùn)算符進(jìn)行的是比較過程,時(shí)轉(zhuǎn)換成
30、內(nèi)部的存儲(chǔ)格式后進(jìn)行的,因此,因此時(shí)間的書寫可以不是那么嚴(yán)格要求。例如,下面幾種寫法是等價(jià)的:mysql> SELECT * FROM weblog WHERE entrydate>="2001-02-08"mysql> SELECT * FROM weblog WHERE entrydate>="2001-2-8"mysql> SELECT * FROM weblog WHERE entrydate>="2001*02*08"mysql> SELECT * FROM weblog WHERE
31、 entrydate>="20010208"SELECT * FROM weblog WHERE entrydate>="2001/2/8"而使用LIKE運(yùn)算符和模式匹配,是通過比較串值進(jìn)行的,因此必須使用標(biāo)準(zhǔn)的時(shí)間書寫格式,YYYY-MM-DD HH-MM-SS。4.2.5 比較日期和時(shí)間已知兩個(gè)日期,比較它們的前后,可以直接求出它們的差和零值比較,也可以利用已知的時(shí)間函數(shù):TO_DAYS(date) 給出一個(gè)日期date,返回一個(gè)天數(shù)(從0年的天數(shù)),date可以是一個(gè)數(shù)字,也可以是一個(gè)串值,當(dāng)然更可以是包含日期的時(shí)間類型。 mysql&
32、gt; select TO_DAYS(960501);+-+| TO_DAYS(960501) |+-+| 729145 |+-+mysql> select TO_DAYS('1997-07-01');+-+| TO_DAYS('1997-07-01') |+-+| 729571 |+-+例如:返回2個(gè)時(shí)間相差的天數(shù)(21世紀(jì)已經(jīng)過去了多少天)mysql> select to_days(now()-to_days('20010101');+-+| to_days(now()-00000012000000)-to_days('2
33、0010101') |+-+| 38 |+-+4.3 字符串模式匹配MySQL提供標(biāo)準(zhǔn)的SQL模式匹配,以及一種基于象Unix實(shí)用程序如vi、grep和sed的擴(kuò)展正則表達(dá)式模式匹配的格式。 4.3.1 標(biāo)準(zhǔn)的SQL模式匹配SQL的模式匹配允許你使用“_”匹配任何單個(gè)字符,而“%”匹配任意數(shù)目字符(包括零個(gè)字符)。在 MySQL中,SQL的模式缺省是忽略大小寫的。下面顯示一些例子。注意在你使用SQL模式時(shí),你不能使用=或!=;而使用LIKE或NOT LIKE比較操作符。 例如,在表pet中,為了找出以“b”開頭的名字: mysql> SELECT * FROM pet WHERE
34、 name LIKE "b%"+-+-+-+-+-+-+| name | owner | species | sex | birth | death |+-+-+-+-+-+-+| Buffy | Harold | dog | f | 1989-05-13 | NULL | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |+-+-+-+-+-+-+為了找出以“fy”結(jié)尾的名字: mysql> SELECT * FROM pet WHERE name LIKE "%fy"+-+-+-+-+-+-
35、+| name | owner | species | sex | birth | death |+-+-+-+-+-+-+| Fluffy | Harold | cat | f | 1993-02-04 | NULL | Buffy | Harold | dog | f | 1989-05-13 | NULL |+-+-+-+-+-+-+為了找出包含一個(gè)“w”的名字: mysql> SELECT * FROM pet WHERE name LIKE "%w%"+-+-+-+-+-+-+| name | owner | species | sex | birth |
36、death |+-+-+-+-+-+-+| Claws | Gwen | cat | m | 1994-03-17 | NULL | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |+-+-+-+-+-+-+為了找出包含正好5個(gè)字符的名字,使用“_”模式字符: mysql> SELECT * FROM pet WHERE name LIKE "_"+-+-+-+-+-+-+| name | owner | sp
37、ecies | sex | birth | death |+-+-+-+-+-+-+| Claws | Gwen | cat | m | 1994-03-17 | NULL | Buffy | Harold | dog | f | 1989-05-13 | NULL |+-+-+-+-+-+-+4.3.2 擴(kuò)展正則表達(dá)式模式匹配由MySQL提供的模式匹配的其他類型是使用擴(kuò)展正則表達(dá)式。當(dāng)你對(duì)這類模式進(jìn)行匹配測(cè)試時(shí),使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它們是同義詞)。 擴(kuò)展正則表達(dá)式的一些字符是: “.”匹配任何單個(gè)的字符。 一個(gè)字符類“.”匹配在方括
38、號(hào)內(nèi)的任何字符。例如,“abc”匹配“a”、“b”或“c”。為了命名字符的一個(gè)范圍,使用一個(gè)“-”。“a-z”匹配任何小寫字母,而“0-9”匹配任何數(shù)字。 “ * ”匹配零個(gè)或多個(gè)在它前面的東西。例如,“x*”匹配任何數(shù)量的“x”字符,“0-9*”匹配的任何數(shù)量的數(shù)字,而“.*”匹配任何數(shù)量的任何東西。 正則表達(dá)式是區(qū)分大小寫的,但是如果你希望,你能使用一個(gè)字符類匹配兩種寫法。例如,“aA”匹配小寫或大寫的“a”而“a-zA-Z”匹配兩種寫法的任何字母。 如果它出現(xiàn)在被測(cè)試值的任何地方,模式就匹配(只要他們匹配整個(gè)值,SQL模式匹配)。 為了定位一個(gè)模式以便它必須匹配被測(cè)試值的開始或結(jié)尾,在模
39、式開始處使用“”或在模式的結(jié)尾用“$”。 為了說(shuō)明擴(kuò)展正則表達(dá)式如何工作,上面所示的LIKE查詢?cè)谙旅媸褂肦EGEXP重寫: 為了找出以“b”開頭的名字,使用“”匹配名字的開始并且“bB”匹配小寫或大寫的“b”: mysql> SELECT * FROM pet WHERE name REGEXP "bB"+-+-+-+-+-+-+| name | owner | species | sex | birth | death |+-+-+-+-+-+-+| Buffy | Harold | dog | f | 1989-05-13 | NULL | Bowser | D
40、iane | dog | m | 1989-08-31 | 1995-07-29 |+-+-+-+-+-+-+為了找出以“fy”結(jié)尾的名字,使用“$”匹配名字的結(jié)尾: mysql> SELECT * FROM pet WHERE name REGEXP "fy$"+-+-+-+-+-+-+| name | owner | species | sex | birth | death |+-+-+-+-+-+-+| Fluffy | Harold | cat | f | 1993-02-04 | NULL | Buffy | Harold | dog | f | 1989
41、-05-13 | NULL |+-+-+-+-+-+-+為了找出包含一個(gè)“w”的名字,使用“wW”匹配小寫或大寫的“w”: mysql> SELECT * FROM pet WHERE name REGEXP "wW"+-+-+-+-+-+-+| name | owner | species | sex | birth | death |+-+-+-+-+-+-+| Claws | Gwen | cat | m | 1994-03-17 | NULL | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | Whis
42、tler | Gwen | bird | NULL | 1997-12-09 | NULL |+-+-+-+-+-+-+既然如果一個(gè)正規(guī)表達(dá)式出現(xiàn)在值的任何地方,其模式匹配了,就不必再先前的查詢中在模式的兩方面放置一個(gè)通配符以使得它匹配整個(gè)值,就像如果你使用了一個(gè)SQL模式那樣。 為了找出包含正好5個(gè)字符的名字,使用“”和“$”匹配名字的開始和結(jié)尾,和5個(gè)“.”實(shí)例在兩者之間: mysql> SELECT * FROM pet WHERE name REGEXP ".$"+-+-+-+-+-+-+| name | owner | species | sex | bir
43、th | death |+-+-+-+-+-+-+| Claws | Gwen | cat | m | 1994-03-17 | NULL | Buffy | Harold | dog | f | 1989-05-13 | NULL |+-+-+-+-+-+-+你也可以使用“n”“重復(fù)n次”操作符重寫先前的查詢: mysql> SELECT * FROM pet WHERE name REGEXP ".5$"+-+-+-+-+-+-+| name | owner | species | sex | birth | death |+-+-+-+-+-+-+| Claws | Gwen | cat | m | 1994-03-17 | NULL | Buffy | Harold | dog | f | 1989-05-13 | NULL |+-+-+-+-+-+-+4.3.3 總結(jié)4.3節(jié)介紹了有關(guān)字符串模式匹配的有關(guān)知識(shí)。標(biāo)準(zhǔn)的SQL模式匹配是SQL語(yǔ)言的標(biāo)準(zhǔn),可以被其它關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)接受。擴(kuò)展正規(guī)表達(dá)式模式匹配是根據(jù)Unix系統(tǒng)的標(biāo)準(zhǔn)開發(fā)了,一般只可使用在MySQL上,但是其功能要比標(biāo)準(zhǔn)的SQL模式匹配
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 報(bào)刊亭承攬合同(4篇)
- 電子專業(yè)培訓(xùn)合同(4篇)
- 購(gòu)買市中心房產(chǎn)合同書(4篇)
- 新的土地集體租賃合同格式(3篇)
- 四年級(jí)信息技術(shù)上冊(cè) 回收站(一)教學(xué)設(shè)計(jì) 教科版
- 全國(guó)電子工業(yè)版初中信息技術(shù)第二冊(cè)第2單元2.3活動(dòng)1《認(rèn)識(shí)網(wǎng)絡(luò)新媒體》教學(xué)設(shè)計(jì)
- 北師大版數(shù)學(xué)二年級(jí)下冊(cè)《測(cè)量》單元整體教學(xué)設(shè)計(jì)
- 2025至2030年中國(guó)低邊拼密鋁扣板數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 內(nèi)江2025年四川內(nèi)江市東興區(qū)招募特聘動(dòng)物防疫專員12人筆試歷年參考題庫(kù)附帶答案詳解
- 八上第二單元大單元教學(xué)設(shè)計(jì)
- 2025-2030中國(guó)鍛造(鍛件)行業(yè)投資策略及規(guī)劃建議研究研究報(bào)告
- 2025年上半年四川廣元旺蒼縣引進(jìn)高層次人才23人重點(diǎn)基礎(chǔ)提升(共500題)附帶答案詳解
- 骨科快速康復(fù)護(hù)理理念
- GB 5009.268-2025食品安全國(guó)家標(biāo)準(zhǔn)食品中多元素的測(cè)定
- 設(shè)備部門級(jí)安全培訓(xùn)
- 智研咨詢發(fā)布:2025年中國(guó)家庭智能機(jī)器人行業(yè)市場(chǎng)現(xiàn)狀及投資前景分析報(bào)告
- 華為經(jīng)營(yíng)管理叢書華為的研發(fā)管理
- 2025年安徽國(guó)際商務(wù)職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能考試題庫(kù)及答案1套
- 2024北京理工大附中高一(下)期中英語(yǔ)試題及答案
- 干洗店中央洗衣工廠崗位職責(zé)及管理手冊(cè)
- 2024年數(shù)學(xué)新高考I卷評(píng)析及教學(xué)建議
評(píng)論
0/150
提交評(píng)論