程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql數據庫replace、regexp的用法

mysql數據庫replace、regexp的用法

編輯:MySQL綜合教程

mysql數據庫replace、regexp的用法。本站提示廣大學習愛好者:(mysql數據庫replace、regexp的用法)文章只能為提供參考,不一定能成為您想要的結果。以下是mysql數據庫replace、regexp的用法正文


replace、regexp的用法
0 Comments | This entry was posted on Apr 08 2010
mysql replace用法
1.replace into
replace into table (id,name) values('1′,'aa'),('2′,'bb')
此語句的感化是向表table中拔出兩筆記錄。假如主鍵id為1或2不存在
就相當於
insert into table (id,name) values('1′,'aa'),('2′,'bb')
假如存在雷同的值則不會拔出數據
2.replace(object,search,replace)
把object中湧現search的全體調換為replace
select replace('www.163.com','w','Ww')—>WwWwWw.163.com
例:把表table中的name字段中的aa調換為bb
update table set name=replace(name,'aa','bb')
——————————————————————————–
由MySQL供給的形式婚配的其它類型是應用擴大正則表達式。當你對這類形式停止婚配測試時,應用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它們是同義詞)。
擴大正則表達式的一些字符是:
· ‘.'婚配任何單個的字符。
· 字符類“[...]”婚配在方括號內的任何字符。例如,“[abc]”婚配“a”、“b”或“c”。為了定名字符的規模,應用一個“-”。“[a-z]”婚配任何字母,而“[0-9]”婚配任何數字。
· “ * ”婚配零個或多個在它後面的字符。例如,“x*”婚配任何數目的“x”字符,“[0-9]*”婚配任何數目的數字,而“.*”婚配任何數目的任何字符。
假如REGEXP形式與被測試值的任何處所婚配,形式就婚配(這分歧於LIKE形式婚配,只要與全部值婚配,形式才婚配)。
為了定位一個形式以便它必需婚配被測試值的開端或開頭,在形式開端處應用“^”或在形式的開頭用“$”。
為了解釋擴大正則表達式若何任務,上面應用REGEXP重寫下面所示的LIKE查詢:
為了找出以“b”開首的名字,應用“^”婚配名字的開端:
mysql> SELECT * FROM pet WHERE name REGEXP ‘^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 |
+——–+——–+———+——+————+————+
假如你想強迫使REGEXP比擬辨別年夜小寫,應用BINARY症結字使個中一個字符串變成二進制字符串。該查詢只婚配稱號首字母的小寫‘b'。
mysql> SELECT * FROM pet WHERE name REGEXP BINARY ‘^b';
為了找出以“fy”開頭的名字,應用“$”婚配名字的開頭:
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-05-13 | NULL |
+——–+——–+———+——+————+——-+
為了找出包括一個“w”的名字,應用以下查詢:
mysql> SELECT * FROM pet WHERE name REGEXP ‘w';
+———-+——-+———+——+————+————+
| name| owner | species | sex | birth | 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|
+———-+——-+———+——+————+————+
既然假如一個正則表達式湧現在值的任何處所,其形式婚配了,就不用在先前的查詢中在形式的兩側放置一個通配符以使得它婚配全部值,就像你應用了一個SQL形式那樣。
為了找出包括正好5個字符的名字,應用“^”和“$”婚配名字的開端和開頭,和5個“.”實例在二者之間:
mysql> SELECT * FROM pet WHERE name REGEXP ‘^…..$';
+——-+——–+———+——+————+——-+
| name | owner | species | sex | birth | death |
+——-+——–+———+——+————+——-+
| Claws | Gwen| cat| m | 1994-03-17 | NULL |
| Buffy | Harold | dog| f | 1989-05-13 | NULL |
+——-+——–+———+——+————+——-+
你也能夠應用“{n}”“反復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 |
+——-+——–+———+——+————+——-+
附錄G:MySQL正則表達式 供給了關於正則表達式的句法的具體信息。
3.3.4.8. 計數行數據庫常常用於答復這個成績,“某個類型的數據在表中湧現的頻度?”例如,你能夠想要曉得你有若干寵物,或每位主人有若干寵物,或你能夠想要對你的植物停止各類類型的普查。
盤算你具有植物的總數量與“在pet表中有若干行?”是異樣的成績,由於每一個寵物有一個記載。COUNT(*)函數盤算行數,所以盤算植物數量的查詢應為:
mysql> SELECT COUNT(*) FROM pet;
+———-+
| COUNT(*) |
+———-+
| 9 |
+———-+
在後面,你檢索了具有寵物的人的名字。假如你想要曉得每一個主人有若干寵物,你可使用COUNT( )函數:
mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
+——–+———-+
| owner | COUNT(*) |
+——–+———-+
| Benny | 2 |
| Diane | 2 |
| Gwen| 3 |
| Harold | 2 |
+——–+———-+
留意,應用GROUP BY對每一個owner的一切記載分組,沒有它,你會獲得毛病新聞:
mysql> SELECT owner, COUNT(*) FROM pet;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),…)
with no GROUP columns is illegal if there is no GROUP BY clause
COUNT( )和GROUP BY以各類方法分類你的數據。以下例子顯示出停止植物普查操作的分歧方法。
每種植物的數目:
mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;
+———+———-+
| species | COUNT(*) |
+———+———-+
| bird | 2 |
| cat| 2 |
| dog| 3 |
| hamster | 1 |
| snake| 1 |
+———+———-+
每種性其余植物數目:
mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex;
+——+———-+
| sex | COUNT(*) |
+——+———-+
| NULL | 1 |
| f | 4 |
| m | 4 |
+——+———-+
(在這個輸入中,NULL表現“未知性別”。)
按品種和性別組合的植物數目:
mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
+———+——+———-+
| species | sex | COUNT(*) |
+———+——+———-+
| bird | NULL | 1 |
| bird | f | 1 |
| cat| f | 1 |
| cat| m | 1 |
| dog| f | 1 |
| dog| m | 2 |
| hamster | f | 1 |
| snake| m |1 |
+———+——+———-+
若應用COUNT( ),你不用檢索全部表。例如, 後面的查詢,當只對狗和貓停止時,應為:
mysql> SELECT species, sex, COUNT(*) FROM pet
-> WHERE species = ‘dog' OR species = ‘cat'
-> GROUP BY species, sex;
+———+——+———-+
| species | sex | COUNT(*) |
+———+——+———-+
| cat| f | 1 |
| cat| m | 1 |
| dog| f | 1 |
| dog| m | 2 |
+———+——+———-+
或,假如你僅須要曉得已知性其余按性其余植物數量:
mysql> SELECT species, sex, COUNT(*) FROM pet
-> WHERE sex IS NOT NULL
-> GROUP BY species, sex;
+———+——+———-+
| species | sex | COUNT(*) |
+———+——+———-+
| bird | f | 1 |
| cat| f | 1 |
| cat| m | 1 |
| dog| f | 1 |
| dog| m | 2 |
| hamster | f | 1 |
| snake| m | 1 |
+———+——+———-+
3.3.4.9. 應用1個以上的表
pet表追蹤你有哪一個寵物。假如你想要記載其它相干信息,例如在他們平生中看獸醫或什麼時候子女出身,你須要別的的表。這張表應當像甚麼呢?須要:
· 它須要包括寵物名字以便你曉得每一個事宜屬於哪一個植物。
· 須要一個日期以便你曉得事宜是甚麼時刻產生的。
· 須要一個描寫事宜的字段。
· 假如你想要對事宜停止分類,則須要一個事宜類型字段。
綜合上述身分,event表的CREATE TABLE語句應為:
mysql> CREATE TABLE event (name VARCHAR(20), date DATE,
-> type VARCHAR(15), remark VARCHAR(255));
關於pet表,最輕易的辦法是創立包括信息的用定位符分隔的文本文件來裝載初始記載:
name
date
type
remark
Fluffy
1995-05-15
litter
4 kittens, 3 female, 1 male
Buffy
1993-06-23
litter
5 puppies, 2 female, 3 male
Buffy
1994-06-19
litter
3 puppies, 3 female
Chirpy
1999-03-21
vet
needed beak straightened
Slim
1997-08-03
vet
broken rib
Bowser
1991-10-12
kennel
Fang
1991-10-12
kennel
Fang
1998-08-28
birthday
Gave him a new chew toy
Claws
1998-03-17
birthday
Gave him a new flea collar
Whistler
1998-12-09
birthday
First birthday
采取以下方法裝載記載:
mysql> LOAD DATA LOCAL INFILE ‘event.txt' INTO TABLE event;
依據你從曾經運轉在pet表上的查詢中學到的,你應當能履行對event表中記載的檢索;道理是一樣的。然則甚麼時刻event表自己不克不及答復你能夠問的成績呢?
當他們有了一窩小植物時,假定你想要找出每只寵物的年紀。我們後面看到了若何經由過程兩個日期盤算年紀。event表中有母親的臨盆日期,然則為了盤算母親的年紀,你須要她的出身日期,存儲在pet表中。解釋查詢須要兩個表:
mysql> SELECT pet.name,
-> (YEAR(date)-YEAR(birth)) - (RIGHT(date,5)<RIGHT(birth,5)) AS age,
-> remark
-> FROM pet, event
-> WHERE pet.name = event.name AND event.type = ‘litter';
+——–+——+—————————–+
| name| age | remark |
+——–+——+—————————–+
| Fluffy | 2 | 4 kittens, 3 female, 1 male |
| Buffy | 4 | 5 puppies, 2 female, 3 male |
| Buffy | 5 | 3 puppies, 3 female|
+——–+——+—————————–+
關於該查詢要留意的幾件工作:
FROM子句列出兩個表,由於查詢須要從兩個表提守信息。
當從多個表組合(聯絡)信息時,你須要指定一個表中的記載如何能婚配其它表的記載。這很簡略,由於它們都有一個name列。查詢應用WHERE子句基於name值來婚配2個表中的記載。
由於name列湧現在兩個表中,當援用列時,你必定要指定哪一個表。把表名附在列名前便可以完成。
你不用有2個分歧的表來停止聯絡。假如你想要將一個表的記載與統一個表的其它記載停止比擬,可以將一個表聯絡到本身。例如,為了在你的寵物當中滋生配頭,你可以用pet聯絡本身來停止類似品種的雄雌配對:
mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
-> FROM pet AS p1, pet AS p2
-> WHERE p1.species = p2.species AND p1.sex = ‘f' AND p2.sex = ‘m';
+——–+——+——–+——+———+
| name| sex | name| sex | species |
+——–+——+——–+——+———+
| Fluffy | f | Claws | m | cat|
| Buffy | f | Fang| m | dog|
| Buffy | f | Bowser | m | dog|
+——–+——+——–+——+———+
在這個查詢中,我們為表名指定別號以便能援用列而且使得每個列援用與哪一個表實例相干聯更直不雅。
3.4. 取得數據庫和表的信息假如你忘卻數據庫或表的名字,或給定的表的構造是甚麼(例如,它的列叫甚麼),怎樣辦?MySQL經由過程供給數據庫及其支撐的表的信息的幾個語句處理這個成績。
你曾經見到了SHOW DATABASES,它列出由辦事器治理的數據庫。為了找出以後選擇了哪一個數據庫,應用DATABASE( )函數:
mysql> SELECT DATABASE();
+————+
| DATABASE() |
+————+
| menagerie |
+————+
假如你還沒選擇任何數據庫,成果是NULL。
為了找出以後的數據庫包括甚麼表(例如,當你不克不及肯定一個表的名字),應用這個敕令:
mysql> SHOW TABLES;
+———————+
| Tables in menagerie |
+———————+
| event|
| pet|
+———————+
假如你想要曉得一個表的構造,可使用DESCRIBE敕令;它顯示表中每一個列的信息:
mysql> DESCRIBE pet;
+———+————-+——+—–+———+——-+
| Field| Type | Null | Key | Default | Extra |
+———+————-+——+—–+———+——-+
| name | varchar(20) | YES || NULL ||
| owner| varchar(20) | YES || NULL ||
| species | varchar(20) | YES || NULL | |
| sex| char(1)| YES || NULL ||
| birth| date | YES || NULL ||
| death| date | YES || NULL ||
+———+————-+——+—–+———+——-+
Field顯示列名字,Type是列的數據類型,Null表現列能否能包括NULL值,Key顯示列能否被索引而Default指定列的默許值。
假如表有索引,SHOW INDEX FROM tbl_name生成有關索引的信息。
明天在做mysql的一個搜刮的時刻發明我用 select name from contact where name like ‘%a%'的時刻出來的成果除包括a的名字外連包括中文“新”的名字也湧現在搜刮成果外面,這令我想弄清晰mysql的婚配形式和規矩究竟是怎樣樣的, 所以決議查查材料懂得懂得,別的在婚配的時刻正則表達式也很經常使用!所以預備在這裡記載我進修這兩個玩意的收成!
湧現這個成績的緣由是:MySQL在查詢字符串時是年夜小寫不敏感的,在編繹MySQL時普通以ISO-8859字符集作為默許的字符集,是以在比擬進程中中文編碼字符年夜小寫轉換形成了這類景象。
處理方法
1.在建表的時刻關於包括中文的字段加上“BINARY”屬性,使之停止二進制比擬,例如講″name char(10)”改成”name char(10) BINARY”。然則如許你對該表的該字段停止婚配的時刻是辨別年夜小寫的。
2. 假如應用源碼編譯MySQL,可以在編譯的時刻應用–with–charset=gbk參數,如許mysql就直接支撐中文查找和排序。
3. 應用mysql的locate函數來斷定。如:
SELECT * FROM table WHERE locate(substr,str)>0 ;
locate()有兩個情勢:LOCATE(substr,str), LOCATE(substr,str,pos)。前往substr在str中的地位,假如str不包括substr前往0。這個函數也是不辨別年夜小寫的。
4.如許應用sql語句:SELECT * FROM TABLE WHERE FIELDS LIKE BINARY ‘%FIND%',然則這和1一樣是辨別年夜小寫的假如你想停止不辨別年夜小寫的查詢的時刻就要應用upper或許lower停止轉換。
5.應用 binary和ucase函數及concat函數。ucase是講英文全體轉換年夜寫,concat對字符串停止銜接。新的sql語句以下:
select id,title,name from achech_com.news where binary ucase(title) like concat('%',ucase('a'),'%')
也能夠寫為select id,title,name from achech_com.news where binary ucase(title) like ucase('%a%')
檢索的成果還算滿足吧,不外速度能夠會是以而慢N毫秒喔。 由於應用like和%停止婚配的話對效力會有必定的影響。
正則表達式:
正則表達式是為龐雜搜刮指定形式的壯大方法。
^
所婚配的字符串今後面的字符串開首
mysql> select “fonfo” REGEXP “^fo$”; -> 0(表現不婚配)
mysql> select “fofo” REGEXP “^fo”; -> 1(表現婚配)
$
所婚配的字符串之前面的字符串開頭
mysql> select “fono” REGEXP “^fono$”; -> 1(表現婚配)
mysql> select “fono” REGEXP “^fo$”; -> 0(表現不婚配)
.
婚配任何字符(包含新行)
mysql> select “fofo” REGEXP “^f.*”; -> 1(表現婚配)
mysql> select “fonfo” REGEXP “^f.*”; -> 1(表現婚配)
a*
婚配隨意率性多個a(包含空串)
mysql> select “Ban” REGEXP “^Ba*n”; -> 1(表現婚配)
mysql> select “Baaan” REGEXP “^Ba*n”; -> 1(表現婚配)
mysql> select “Bn” REGEXP “^Ba*n”; -> 1(表現婚配)
a+
婚配1個或多個a字符的任何序列。
mysql> select “Ban” REGEXP “^Ba+n”; -> 1(表現婚配)
mysql> select “Bn” REGEXP “^Ba+n”; -> 0(表現不婚配)
a?
婚配一個或零個a
mysql> select “Bn” REGEXP “^Ba?n”; -> 1(表現婚配)
mysql> select “Ban” REGEXP “^Ba?n”; -> 1(表現婚配)
mysql> select “Baan” REGEXP “^Ba?n”; -> 0(表現不婚配)
de|abc
婚配de或abc
mysql> select “pi” REGEXP “pi|apa”; -> 1(表現婚配)
mysql> select “axe” REGEXP “pi|apa”; -> 0(表現不婚配)
mysql> select “apa” REGEXP “pi|apa”; -> 1(表現婚配)
mysql> select “apa” REGEXP “^(pi|apa)$”; -> 1(表現婚配)
mysql> select “pi” REGEXP “^(pi|apa)$”; -> 1(表現婚配)
mysql> select “pix” REGEXP “^(pi|apa)$”; -> 0(表現不婚配)
(abc)*
婚配隨意率性多個abc(包含空串)
mysql> select “pi” REGEXP “^(pi)*$”; -> 1(表現婚配)
mysql> select “pip” REGEXP “^(pi)*$”; -> 0(表現不婚配)
mysql> select “pipi” REGEXP “^(pi)*$”; -> 1(表現婚配)
{1} {2,3}
這是一個更周全的辦法,它可以完成後面好幾種保存字的功效
a*
可以寫成a{0,}
a
可以寫成a{1,}
a?
可以寫成a{0,1}
在{}內只要一個整型參數i,表現字符只能湧現i次;在{}內有一個整型參數i,
前面跟一個“,”,表現字符可以湧現i次或i次以上;在{}內只要一個整型參數i,
前面跟一個“,”,再跟一個整型參數j,表現字符只能湧現i次以上,j次以下
(包含i次和j次)。個中的整型參數必需年夜於等於0,小於等於 RE_DUP_MAX(默許是25
5)。 假如同時給定了m和n,m必需小於或等於n.
[a-dX], [^a-dX]
婚配任何是(或不是,假如應用^的話)a、b、c、d或X的字符。兩個其他字符之間的“-”字符組成一個規模,與從第1個字符開端到第2個字符之間的一切字符婚配。例如,[0-9]婚配任何十進制數字 。要想包括文字字符“]”,它必需緊跟在開括號“[”以後。要想包括文字字符“-”,它必需起首或最初寫入。關於[]對內不決義任何特別寄義的任何字符,僅與其自己婚配。
mysql> select “aXbc” REGEXP “[a-dXYZ]“; -> 1(表現婚配)
mysql> select “aXbc” REGEXP “^[a-dXYZ]$”; -> 0(表現不婚配)
mysql> select “aXbc” REGEXP “^[a-dXYZ] $”; -> 1(表現婚配)
mysql> select “aXbc” REGEXP “^[^a-dXYZ] $”; -> 0(表現不婚配)
mysql> select “gheis” REGEXP “^[^a-dXYZ] $”; -> 1(表現婚配)
mysql> select “gheisa” REGEXP “^[^a-dXYZ] $”; -> 0(表現不婚配)
[[.characters.]]
表現比擬元素的次序。在括號內的字符次序是獨一的。然則括號中可以包括通配符,
所以他能婚配更多的字符。舉例來講:正則表達式[[.ch.]]*c婚配chchcc的前五個字符

[=character_class=]
表現相等的類,可以取代類中其他相等的元素,包含它本身。例如,假如o和( )是
一個相等的類的成員,那末[[=o=]]、[[=( )=]]和[o( )]是完整等價的。
[:character_class:]
在括號外面,在[: 和:]中央是字符類的名字,可以代表屬於這個類的一切字符。
字符類的名字有: alnum、digit、punct、alpha、graph、space、blank、lower、uppe
r、cntrl、print和 xdigit
mysql> select “justalnums” REGEXP “[[:alnum:]] “; -> 1(表現婚配)
mysql> select “!!” REGEXP “[[:alnum:]] “; -> 0(表現不婚配)
alnum 文字數字字符
alpha 文字字符
blank 空白字符
cntrl 掌握字符
digit 數字字符
graph 圖形字符
lower 小寫文字字符
print 圖形或空格字符
punct 標點字符
space 空格、制表符、新行、和回車
upper 年夜寫文字字符
xdigit 十六進制數字字符
[[:<:]]
[[:>:]]
分離婚配一個單詞開首和開頭的空的字符串,這個單詞開首和開頭都不是包括在alnum中
的字符也不克不及是下劃線。
mysql> select “a word a” REGEXP “[[:<:]]word[[:>:]]”; -> 1(表現婚配)
mysql> select “a xword a” REGEXP “[[:<:]]word[[:>:]]”; -> 0(表現不婚配)
mysql> select “weeknights” REGEXP “^(wee|week)(knights|nights)$”; -> 1(表現
婚配)
要想在正則表達式中應用特別字符的文字實例,應在其後面加上2個反斜槓“\”字符。MySQL解析法式擔任說明個中一個,正則表達式庫擔任說明另外一個。例如,要想與包括特別字符“+”的字符串“1+2” 婚配,鄙人面的正則表達式中,只要最初一個是准確的:
mysql> SELECT ‘1+2′ REGEXP ‘1+2′; -> 0
mysql> SELECT ‘1+2′ REGEXP ‘1\+2′; -> 0
mysql> SELECT ‘1+2′ REGEXP ‘1\\+2′; -> 1
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved