MYSQL入門學習之一:基本操作
1、登錄數據庫 www.2cto.com
命令:mysql -u username –p (mysql -h主機地址 -u用戶名 -p用戶密碼)
描述:輸入命令回車,即可輸入密碼了。密碼驗證通過即可進入數據庫了。
2、查看數據狀態
命令:show database;
描述:該命令會顯示現存的所有數據庫。
3、建立與刪除數據庫
命令:create database db;
描述:db可以替換爲要建立數據庫的名稱。
命令:drop database db;
描述:該命令徹底刪除名稱爲db的數據庫,不論數據庫內是否存有數據,所以切記謹慎使用。
4、選用某個數據庫
命令:use db;
描述:該命令使的當前會話進入db命名的數據庫,可以進行建立修改刪除表格和插入數據等操作。
命令:select database();
描述:查看當前正在使用的數據庫名稱
5、查看當前系統狀態
命令:select now();
描述:得知現在的日期和時間
命令:select user();
描述:得知當前登錄mysql的用戶
命令:select version();
描述:得知當前mysql的版本
6、創建表格 www.2cto.com
命令:create table tablename (filed1,filed2,filed3,...,filedN);
描述:建立名稱爲tablename的表格,字段名稱分別由filedN指定。
聲明字段屬性(filedN)的基本語法爲:
字段名稱 數據類型與大小 是否可以爲空 是否爲主鍵 默認值 備註
其中字段名稱、數據類型與大小是一定要有的,其他可以不寫。
各項的規定可以簡單介紹如下:
字段名稱:使用英文字母、數字和下劃線比較好。不區分大小寫,長度不應超過64。
數據類型與大小:例如 int、int unsigned、char(10)等。
是否爲空:not null 表示這個字段不允許爲空,如果沒有指定,表示可以爲空。
是否爲主鍵:如果語句中包含primary key,即表示爲主鍵。
默認值:如果寫了 default 'abc'即表示該字段的默認值爲 abc,如果插入新數據沒有指定該字段的值,則會以默認值插入。
備註:在備註中,如果插入auto_increment語句,表示該字段在插入新數據時會自動增加(限於整型)。而在插入新數據時,該字段指定爲NULL即可。
示例:create table abc (number int not null primary key auto_increment,name char(10) default 'unknow');
7、刪除表格
命令:drop table tablename;
描述:刪除名稱爲 tablename 的表格,如同刪除數據庫命令一樣,要謹慎使用。
8、顯示錶格狀態
命令:show tables;
描述:顯示數據庫中建立了那些表格。
命令:desc(describe) tablename;
描述:顯示名稱爲tablename的表格的結構。
9、表名稱與結構的修改
命令:alter table tablename add fieldN+1
描述:添加一個字段進入表格,fieldN+1與上面描述寫法一致。
命令:alter table oldtablename rename newtablename;
描述:修改表oldtablename名稱爲newtablename。
命令:alter table tablename modify filedN;
描述:修改表tablename中字段filedN的屬性,filedN中指明需要改的字段名稱和新的屬性。
命令:alter table tablename change oldfiledN newfiledN;
描述:改變表tablename字段filedN 爲filedN+1;oldfiledN只需指明需要改的字段名稱,而newfiledN中需要指明新的字段名稱和類型。
如:alter table newname change follow newfollow varchar(40);
命令:alter table tablename drop filedN;
描述:刪除表tablename中的filedN字段。
10、創建數據庫
Mysql> Create Database 數據庫名;
11、創建用戶並授權
Mysql> grant 權限 on 數據庫名.* to 用戶名@登錄主機 identified by "密碼";
如:grant all on test.* to test@localhost identified by "test";
12、修改密碼
mysqladmin -u用戶名 -p舊密碼 password 新密碼
13、刪除用戶
Mysql> use mysql;delete from user where user="zaho" host="localhost";
14、把sql文件導入數據庫
Mysql -uroot -p databasename < d:\datasource\databasename.sql
如:mysql -utest -ptest test < h:\tmp\create.sql
MYSQL入門學習之四:MYSQL的數據類型
一、整型 www.2cto.com
整數類型是數據庫中最基本的數據類型。標準SQL中支持INTEGER和SMALLINT這兩種整數類型。MySQL數據庫除了支持這兩種類型外,還擴展支持了TINYINT、MEDIUMINT和BIGINT。
各種整數類型的取值範圍、存儲的字節數如下:
整型 字節數 無符號數的取值範圍 有符號數的取值範圍
TINYINT 1 0~255 -128~127
SMALLINT 2 0~65535 -32768~12767
MEDIUMINT 3 0~16777215 -8388608~8388607
INT 4 0~4294967295 -2147483648~2147483647
INTEGER 4 0~4294967295 -2147483648~2147483647
BIGINT 8 0~18446744073709551615 -9223372036954775808~9223372036854775807
二、浮點數類型和定點數類型
MySQL使用浮點數類型和定點數類型來表示小數。浮點數類型包括單精度浮點數(FLOAT類型)和雙精度浮點數(DOUBLE類型)。定點數類型就是DECIMAL型。
FLOAT型、DOUBLE型、DECIMAL型的取值範圍、存儲的字節數如下:
小數類型 字節數 負數取值範圍 無符號取值範圍
FLOAT 4 -3.402823466E+38~ 0和1.175494351E-38~
-1.175494351E-38 3.402823466E+38
DOUBLE 8 1.7976931348623157E+308~ 0和2.2250738585072014E~
-2.2250738585072014E-308 1.7976931348623157E+308
DECIMAL(M,D) M+2 DOUBLE型 同DOUBLE型
或DEC(M,D)
M:最大長度(包括小數部分,但不包括小數點)
D:小數點後保留長度
對於浮點數和定點數,當插入值的精度高於實際定義的精度,系統會自動進行四捨五入處理。其目的是爲了使該值的精度達到要求。浮點數進行四捨五入不會報警,定點數出現警告。
在未指定精度的情況下,浮點數和定點數有其默認的精度。FLOAT類型和DOUBLE類型默認會保存實際精度。這個精度與操作系統和硬件的精度有關。DECIMAL類型默認整數位爲10, 小數位爲0,即默認爲整數。 www.2cto.com
在MySQL中,定點數精度比浮點數要高。而且,浮點數會出現誤差。如果要對數據的精度要求比較高,應該選擇定點數。
三、日期和時間類型
1、DATETIME類型
DATETIME類型表示同時包含日期和時間信息的值。MySQL以'YYYY-MM-DD HH:MM:SS'格式檢索和顯示DATETIME值。支持的範圍爲'1000-01-01 00:00:00'~'9999-12-31 23:59:59'。
2、DATE類型
DATE類型表示只有日期值而沒有時間值的值。MySQL用'YYYY-MM-DD'格式檢索和顯示DATE值。支持的範圍爲'1000-01-01'~'9999-12-31'。
3、TIME類型
TIME值可以使用多種表示格式。
'D HH:MM:SS.fraction'格式的字符串。還可以使用下面任何一種“非嚴格”語法'HH:MM:SS.fraction'、'HH:MM:SS'、'HH:MM'、'D HH:MM:SS'、'D HH:MM'、'D HH'或'SS'。這裏D表示日,可以取0~34的值。請注意MySQL不保存分數。
'HHMMSS'格式的沒有間隔符的字符串,被假定爲是有意義的時間。例如,'101112'被理解爲'10:11:12',但'109712'是不合法的(它有一個沒有意義的分鐘部分),其將變爲'00:00:00'。
HHMMSS格式的數值,被假定爲是有意義的時間。例如,101112被理解爲'10:11:12'。下面的格式也可以理解:SS、MMSS、HHMMSS、HHMMSS.fraction。請注意MySQL不保存分數。
4、YEAR類型
YEAR類型是一個單字節類型,用於表示年。MySQL以YYYY格式檢索和顯示YEAR值。範圍爲1901~2155。
可以指定各種格式的YEAR值。
四位字符串,範圍爲'1901'~'2155'。
四位數字,範圍爲1901~2155。
兩位字符串,範圍爲'00'~'99'。'00'~'69'和'70'~'99'範圍的值分別被轉換爲2000~2069和1970~1999範圍的YEAR值。
兩位整數,範圍爲1~99。1~69和70~99範圍的值分別被轉換爲2001~2069和1970~1999範圍的YEAR值。請注意兩位整數範圍與兩位字符串範圍稍有不同,因爲不能直接將零指定爲數字並將它解釋爲2000。必須將它指定爲一個字符串'0'或'00'或它被解釋爲0000。
5、TIMESTAMP類型
TIMESTAMP類型使用4個字節來表示日期和時間。TIMESTAMP類型的範圍從1970-01-001 08:00:01到2038-01-19 11:14:07。MySQL中也是以'YYYY-MM-DD HH:MM:SS'的形式顯示TIMESTAMP類型的值。從其形式可以看出,TIMESTAMP類型與DATETIME類型顯示的格式一樣的。給TIMESTAMP類型的字段賦值的表示方法基本與DATETIME類型相同。值的注意的是,TIMESTAMP類型範圍比較小,沒有DATETIME類型的範圍大。因此,輸入值時要保證在TIMESTAMP類型時有效範圍內。
四、字符串類型
字符串類型是在數據庫中存儲字符串的數據類型。
1、CHAR類型和VARCHAR類型
CHAR類型和VARCHAR類型都是在創建表時指定最大長度,其基本形式如下:
字符串類型(M)
例如,CHAR(4)就是指數據類型爲CHAR類型,其最大長度爲4。
CHAR類型的長度是固定的,在創建表時就指定了。其長度可以是0~255的任意值。
例如,CHAR(100)就是指定CHAR類型的長度爲100。
VARCHAR類型的長度是可變的,在創建時指定了最大長度。定義時,其最大值可以取0~65535之間的任意值。指定VARCHAR類型的最大值以後,其長度可以在0到最大長度之間。例如,VARCHAR(100)的最大長度是100。但是,不是每條記錄都要佔100個位置。而是在這個最大值範圍內,使用多少分配多少。VARCHAR類型實際佔用的空間爲字符串的實際長度加1。這樣,可以有效的節約系統的空間。
2、TEXT類型
TEXT類型是一種特殊的字符串類型。TEXT只能保存字符數據,如文章等。TEXT類型包含TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。
類型 允許的長度 存儲空間
TINYTEXT 0~255字節 值的長度+2個字節
TEXT 0~65535字節 值的長度+2個字節
MEDIUMTEXT 0~167772150字節 值的長度+3個字節
LONGTEXT 0~4294967295字節 值的長度+4個字節
從表可以看出,各種TEXT類型的區別在於允許的長度和存儲空間不同。因此在這幾種TEXT中,根據需求選取既能滿足需要以最節約空間的類型即可。
3、ENUM類型(枚舉類型) www.2cto.com
ENUM類型又稱爲枚舉類型。在創建表時,ENUM類型的取值範圍就以列表的形式指定了。
屬性名 ENUM('值1', '值2',...., '值n');
其中, '屬性名'參數指定字段名稱;'值n'參數表示列表中的第n個值,這些值末尾的空格將會被系統直接刪除。
ENUm類型的值只能列表中的一個元素。其取值列表中最多能有65535個值。列表中的每個值都有一個順序排序的編號,MySQL中存入的是這個編號,而不是列表中的值。
如果ENUm類型加上了NOT NULL屬性,其默認值爲取值列表的第1個元素。如果不加NOT NULL屬性,ENUm類型將允許插入NULL,而且NULL爲默認值。
CREATE TABLE IF NOT EXISTS `test`.`enum_tbl`(
`a` ENUM('male','female'),
`b` ENUM('true','false') NOT NULL
);
INSERT INTO `test`.`enum_tbl`
VALUES('male', 'true'),(NULL, 'false'), (NULL, NULL),(20, 20);
SELECT * FROM `enum_tbl`;
4、SET類型
基本形式如下:
屬性名 set('值1','值2','值3'...'值n');
其中,'屬性名'參數指定字段名稱;'值n'參數列表中的第n個值,這些值末尾的空格將會被系統直接刪除。其基本形式與ENUM類型一樣。
SET類型的值可以取列表中一個元素或者多個元素的組合。取多個元素時,不同元素之間用逗號隔開。SET類型的值最多隻能是64個元素構成的組合。列表中的每一個值都有一個順序排列的編號。MySQL中存入的是這個編號,而不是列表中的值。
插入記錄時,SET字段裏的元素順序無關緊要。存入MySQL數據庫後,數據庫系統會自動按照定義時的順序顯示。 www.2cto.com
CREATE TABLE IF NOT EXISTS `test`.`set_tbl`(
`a` SET('a','b','c','d','e','f','g')
);
INSERT INTO `test`.`set_tbl` VALUES('f'),('a,b,c'),('d,e,a');
INSERT INTO `test`.`set_tbl` VALUES('h');
SELECT * FROM `set_tbl`;
五、二進制類型
二進制類型是在數據庫中存儲二進制數據的數據類型。
二進制類型 取值範圍
BINARY(M) 字節數爲M,允許長度爲0~M的定長二進制字符串
VARBINARY(M) 允許長度爲0~M的變長二進制字符串,字節數爲值的長度加一
BIT(M) M位二進制數據,M最大值爲64
TINYBLOB 可變長二進制數據,最多255個字節
BLOB 可變長二進制數據,最多(2[16]-1)個字節
MEDIUMBLOB 可變長二進制數據,最多(2[24]-1)個字節
LONGBLOB 可變長二進制數據,最多(2[32]-1)個字節
1、BINARY和VARBINARY類型
BINARY和VARBINARY類型都是在創建表時指定了最大長度,其基本形式如下 :
字符串類型(M)
這與CHAR類型和VARCHAR類型相似。
例如,BINARY(10)就是指數據類型爲BINARY類型,其最大長度爲10。
BINARY類型的長度是固定的,在創建表是就指定了。不足最大長度的空間由"\0"補全。例如,BINARY(50)就是指定BINARY類型的長度爲50。
VARBINARY類型的長度是可變的,在創建表時指定了最大長度。指定好了VARBINARY類型的最大值以後,基長度可以在0到最大長度之間。例如,VARBINARY(50)的最大字節長度是50。但是,不是每條記錄的字節長度都是50。在這個最大範圍內,使用多少分配多少。VARBINARY類型實際佔用的空間爲實際長度加一。這樣,可以有效的節約系統的空間。
2、BIT類型
BIT類型也是創建表時指定了最大長度,其基本形式如下:
BIT(M)
其中,'M'指定了該二進制的數的最大字節長度爲M,M的最大值爲64。例如,BIT(4)就是數據類型BIT類型,長度爲4.若字段的類型BIT(4),存儲的數據是從0到15。因爲,變成二進制以後,15的值爲1111,其長度爲4。如果插入的值爲16,其二進制數爲10000,長度爲5,超過了最大長度。因此大於等於16的數是不能插入到BIT(4)類型的字段中的。在查詢BIT類型的數據時,要用BIN(字段名+0)來將值轉換爲二進制顯示。
3、BLOB類型
BLOB類型是一種特殊的二進制類型。BLOB可以用來保存數據量很大的二進制數據,如圖片等。BLOB類型包括TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。這幾種BLOB類型最大的區別就是能夠保存的最大長度不同。LONGBLOB的長度最大,TINYBLOB的長度最小。
BLOB類型與TEXT類型很類似。不同點在於BLOB類型用於存儲二進制數據,BLOB類型數據是根據其二進制編碼進行比較和排序。而TEXT類型是文本模式進行比較和排序的。
MYSQL入門學習之五:MYSQL的字符集
MySQL的字符集支持(Character Set Support)有兩個方面:字符集(Character set)和排序方式(Collation)。 www.2cto.com
對於字符集的支持細化到四個層次:服務器(server),數據庫(database),數據表(table)和連接(connection)。
一、MySQL默認字符集
MySQL對於字符集的指定可以細化到一個數據庫,一張表,一列,應該用什麼字符集。
但是,傳統的程序在創建數據庫和數據表時並沒有使用那麼複雜的配置,它們用的是默認的配置,那麼,默認的配置從何而來呢?
(1)編譯MySQL 時,指定了一個默認的字符集,這個字符集是 latin1;
(2)安裝MySQL 時,可以在配置文件 (my.ini) 中指定一個默認的的字符集,如果沒指定,這個值繼承自編譯時指定的;
(3)啓動mysqld 時,可以在命令行參數中指定一個默認的的字符集,如果沒指定,這個值繼承自配置文件中的配置,此時 character_set_server 被設定爲這個默認的字符集;
(4)當創建一個新的數據庫時,除非明確指定,這個數據庫的字符集被缺省設定爲character_set_server;
(5)當選定了一個數據庫時,character_set_database 被設定爲這個數據庫默認的字符集;
(6)在這個數據庫裏創建一張表時,表默認的字符集被設定爲 character_set_database,也就是這個數據庫默認的字符集;
(7)當在表內設置一欄時,除非明確指定,否則此欄缺省的字符集就是表默認的字符集; www.2cto.com
簡單的總結一下,如果什麼地方都不修改,那麼所有的數據庫的所有表的所有欄位的都用latin1存儲,不過我們如果安裝 MySQL,一般都會選擇多語言支持,也就是說,安裝程序會自動在配置文件中把default_character_set 設置爲 UTF-8,這保證了缺省情況下,所有的數據庫的所有表的所有欄位的都用 UTF-8 存儲。
二、查看字符集
1、查看MySQL數據庫服務器和數據庫字符集
mysql> show variables like '%char%';
+--------------------------+------------------------------------------+
| Variable_name | Value |
+--------------------------+------------------------------------------+
| character_set_client | latin1 |-- 客戶端字符集
| character_set_connection | latin1 |
| character_set_database | latin1 |-- 數據庫字符集
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |-- 服務器字符集
| character_set_system | utf8 |
| character_sets_dir | D:\APMServ5.2.6\MySQL5.1\share\charsets\ |
+--------------------------+------------------------------------------+
2、查看MySQL數據表(table)的字符集
mysql> show table status from test like '%test%';
+---------------+--------+---------+------------+ +-------------------+
| Name | Engine | Version | Row_format | | Collation |
+---------------+--------+---------+------------+ +-------------------+
| test_char | MyISAM | 10 | Fixed | | hebrew_general_ci |
| test_inn | InnoDB | 10 | Compact | | latin1_swedish_ci |
| test_inn2 | InnoDB | 10 | Compact | | utf8_general_ci |
| test_priority | MyISAM | 10 | Dynamic | | latin1_swedish_ci |
| test_trans | InnoDB | 10 | Compact | | latin1_swedish_ci |
| test_view | NULL | NULL | NULL | | NULL |
+---------------+--------+---------+------------+ +-------------------+ www.2cto.com
3、查看MySQL數據列(column)的字符集
mysql> show full columns from v9_picture;
+-------------+-----------------------+----------------+
| Field | Type | Collation |
+-------------+-----------------------+----------------+
| id | mediumint(8) unsigned | NULL |
| catid | smallint(5) unsigned | NULL |
| typeid | smallint(5) unsigned | NULL |
| title | char(80) | gbk_chinese_ci |
| style | char(24) | gbk_chinese_ci |
| thumb | char(100) | gbk_chinese_ci |
| keywords | char(40) | gbk_chinese_ci |
| description | char(255) | gbk_chinese_ci |
| posids | tinyint(1) unsigned | NULL |
| url | char(100) | gbk_chinese_ci |
| listorder | tinyint(3) unsigned | NULL |
| status | tinyint(2) unsigned | NULL |
| sysadd | tinyint(1) unsigned | NULL |
| islink | tinyint(1) unsigned | NULL |
| username | char(20) | gbk_chinese_ci |
| inputtime | int(10) unsigned | NULL |
| updatetime | int(10) unsigned | NULL |
+-------------+-----------------------+----------------+
三、設置及修改字符集
1、創建數據庫指定數據庫的字符集
mysql> create database mydb character set gb2312;
mysql> use mydb
mysql> show variables like 'character_set_database';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| character_set_database | gb2312 |
+------------------------+--------+
2、修改數據庫的字符集
(1)、通過SQL修改
mysql> alter database mydb character set utf8;
mysql> show variables like 'character_set_database';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| character_set_database | utf8 |
+------------------------+-------+
(2)、通過配置文件修改
修改文件$MYSQL_HOME\data\mydb\db.opt的內容
default-character-set=utf8
default-collation=utf8_general_ci
爲
default-character-set=latin1
default-collation=latin1_swedish_ci
重啓MYSQL後生效
3、通過SQL修改字符集
mysql> set character_set_client=utf8;
mysql> set character_set_connection=utf8;
mysql> set character_set_database=utf8;
mysql> set character_set_results=utf8;
mysql> set character_set_server=utf8;
mysql> set character_set_system=utf8;
mysql> set collation_connection=utf8;
mysql> set collation_database=utf8;
mysql> set collation_server=utf8;
MYSQL入門學習之二:使用正則表達式搜索
MYSQL入門學習之二:使用正則表達式搜索
一、正則表達式介紹
www.2cto.com
正則表達式是用來匹配文本的特殊的串(字符集合)。
二、使用MySQL正則表達式
1、MySQL僅僅支持多數正則表達式實現的一個很小的子集。
2、LIKE匹配整個列值;而REGEXP匹配列值的子串,如果被匹配的文本在列值中出現,REGEXP將會找到它,相應的行將被返回。看下面的例子:
www.2cto.com
[sql]
mysql>select username from v9_admin where username like 'space';
Emptyset (0.00 sec)
mysql>select username from v9_admin where username REGEXP 'space';
+-----------+
|username |
+-----------+
|warmspace |
+-----------+
1 rowin set (0.02 sec)
3、默認MySQL中的正則表達式匹配不區分大小寫,可使用BINARY關鍵字區分大小寫,如
[sql]
mysql>select username from v9_admin
-> where username REGEXP BINARY'SPACCE';
Emptyset (0.04 sec)
4、進行OR匹配:爲搜索兩個串之一,使用|,如下所示:
[sql]
mysql>select roleid from v9_admin_role
-> where roleid REGEXP '1|3';
+--------+
|roleid |
+--------+
| 1 |
| 3 |
+--------+
2 rowsin set (0.00 sec)
5、匹配幾個字符之一:匹配任何單一字符。如下所示:
[sql]
mysql>select name from v9_collection_node
-> where name REGEXP '005-[123]';
+-----------------+
|name |
+-----------------+
|101-02-01-005-2 |
|101-02-01-005-1 |
|101-02-01-005-3 |
+-----------------+
3 rowsin set (0.00 sec)
正如所見,[]是另一種形式的OR語句。'005-[123]'與’005-[1|2|3]’是等價的。
匹配除給定字符外的字符:
[sql]
mysql>select name from v9_collection_node
-> where name REGEXP '005-[^123]';
+-------------------+
|name |
+-------------------+
|101-02-01-005-4.2 |
|101-02-01-005-4 |
|101-02-01-005-5 |
+-------------------+
3 rowsin set (0.00 sec)
6、可使用-來定義一個範圍。如[1-9],[a-b]。
[sql]
mysql>select name from v9_collection_node
-> where name REGEXP '005-[1-3]';
+-----------------+
|name |
+-----------------+
|101-02-01-005-2 |
|101-02-01-005-1 |
|101-02-01-005-3 |
+-----------------+
3 rowsin set (0.00 sec)
7、爲了匹配特殊字符,必須用\\爲前導,例如\\-,\\.等。這種處理即轉義(escaping)。
多數正則表達式實現使用單個反斜槓轉義特殊字符,但MYSQL要求兩個(MYSQL自己解釋一個,正則表達式庫解釋另一個)。
\\也用來引用元字符(具有特殊含義的字符),如下表:
8、爲了更方便工作,可以使用預定義的字符集,稱爲字符類(character class)。
[sql]
mysql> select name fromv9_collection_node
-> where name REGEXP '[[:digit:]]';
+-------------------+
| name |
+-------------------+
| 101-10-01-002-1 |
| 101-02-01-005-4.2 |
| 101-02-01-005-2 |
| 101-02-01-005-1 |
| 101-02-01-005-3 |
| 101-02-01-005-4 |
| 101-02-01-005-5 |
| 101-10-01-002-2 |
| 101-11-04-001-1 |
+-------------------+
9 rowsin set (0.00 sec)
9、使用正則表達式重複元字符匹配多個實例:
[sql]
mysql> select name fromv9_collection_node
-> where name REGEXP '1{2}';
+-----------------+
| name |
+-----------------+
| 101-11-04-001-1 |
+-----------------+
1 rowin set (0.00 sec)
10、定位符(爲了匹配特定位置的文本):
[sql]
mysql> select name from v9_collection_node
-> where name REGEXP '2$';
+-------------------+
| name |
+-------------------+
| 101-02-01-005-4.2 |
| 101-02-01-005-2 |
| 101-10-01-002-2 |
+-------------------+
3 rows in set (0.00 sec)
11、使REGEXP起類似LIKE的作用,它們的區別在於LIKE匹配整個串而REGEXP匹配子串。利用定位符,通過用^開始每個表達式,用$結束每個表達式。
12、簡單的正則表達式測試:可以在不使用數據庫表的情況下用SELECT來測試正則表達式。REGEXP檢查總是返回0或1(匹配)。
[sql]
mysql> select 'hello' REGEXP'[0-9]';
+------------------------+
| 'hello' REGEXP '[0-9]' |
+------------------------+
| 0 |
+------------------------+
1 row in set (0.00 sec)
MYSQL入門學習之三:全文本搜索
一、理解全文本搜索
www.2cto.com
1、MyISAM支持全文本搜索,而InnoDB不支持。
2、在使用全文本搜索時,MySQL不需要分別查看每個行,不需要分別分析和處理每個詞。MySQL創建指定列中各詞的一個索引,搜索可以針對這些詞進行。這樣MySQL可以快速有效地決定哪些詞匹配,哪些詞不匹配,它們匹配的頻率,等等。
二、使用全文本搜索
1、爲了進行全文本搜索,必須索引被搜索的列,而且要隨着數據的改變不斷地重新索引。在對錶列進行適當設計後,MySQL會自動進行所有的索引和重新索引。
在索引之後,SELECT可與Match()和Against()一起使用以實際執行搜索。
2、一般在創建表時啓用全文本搜索。
[sql]
create table productnotes
(
note_id int not nullauto_increment,
note_text text null,
primary key(note_id),
fulltext(note_text)
)engine=MyISAM;
在定義之後,MySQL自動維護該索引。在增加、更新或刪除行時,索引隨之自動更新。
3、不要在導入數據時使用FULLTEXT。
www.2cto.com
4、進行全文本搜索
Match()指定被搜索的列,Against()指定要使用的搜索表達式。
[sql]
mysql> select * from productnotes
-> whereMatch(note_text) Against('designed');
+---------+---------------------------------------------------------------------
------------------------------------------------------+
| note_id | note_text
|
+---------+---------------------------------------------------------------------
------------------------------------------------------+
| 6 | LimsLink isdesigned to interface output from chromatography data sy
stems (CDSs) to LIMS. |
| 5 | This line ofproprietary reagents, containers, and automation tools
is designed for genomics and drug discovery research. |
+---------+---------------------------------------------------------------------
------------------------------------------------------+
2 rows in set (0.03 sec)
5、傳遞給Match()的值必須與FULLTEXT()定義中的相同。如果指定多個列,則必須列出它們(而且次序正確)。
6、除非使用BINARY方式,否則全文本搜索不區分大小寫。
[sql]
mysql> select * from productnotes
-> where BINARYMatch(note_text) Against('line');
+---------+---------------------------------------------------------------------
------------------------------------------------------+
| note_id | note_text
|
+---------+---------------------------------------------------------------------
------------------------------------------------------+
| 5 | This line ofproprietary reagents, containers, and automation tools
is designed for genomics and drug discovery research. |
+---------+---------------------------------------------------------------------
------------------------------------------------------+
1 row in set (0.05 sec)
7、全文本搜索的一個重要部分就是對結果排序。具有較高等級的行先返回。
等級由MySQL根據行中詞的數目、唯一詞的數目、整個索引中詞的總數以及包含該詞的行的數目計算出來。文本中詞先前的行的等級值比詞靠後的行的等級值高。
[sql]
mysql> select note_id, Match(note_text) Against('This line')as rank,note_text
-> fromproductnotes
-> whereMatch(note_text) Against('This line');
+---------+------------------+--------------------------------------------------
----------------------------------------------------------------------------+
| note_id | rank | note_text
|
+---------+------------------+--------------------------------------------------
----------------------------------------------------------------------------+
| 5 |0.81339610830754 | This line of proprietary reagents,. containers, a
nd automation tools is designed. for genomics and drugdiscovery .research. |
| 7 |0.76517958501676 | specificities include both alpha–beta and beta–
beta. This line from chromatography .data systems (CDSs) and toLIMS. |
+---------+------------------+--------------------------------------------------
----------------------------------------------------------------------------+
2 rows in set (0.00 sec)
8、查詢擴展 www.2cto.com
在使用查詢擴展時,MySQL對數據和索引進行兩遍掃描來完成搜索。
首先,進行一個基本的全文本搜索,找出與搜索條件匹配的所有行;
其次,MySQL檢查這些匹配行並選擇所有有用的詞;
再次,MySQL再次進行全文本搜索,這次不僅使用原來的條件,而且還使用所有有用的詞。
利用查詢擴展,能找出可能相關的結果,即使它們並不精確包含所查找的詞。
表中的行越多,使用查詢擴展返回的結果越好。
查詢擴展功能在MySQL4.1.1中引入。
[sql]
mysql> select note_id, Match(note_text) Against('This line')as rank,note_text
-> fromproductnotes
-> where Match(note_text)Against('This line' with query expansion);
+---------+------------------+--------------------------------------------------
----------------------------------------------------------------------------+
| note_id | rank | note_text
|
+---------+------------------+--------------------------------------------------
----------------------------------------------------------------------------+
| 5 | 0.81339610830754| This line of proprietary reagents,. containers, a
nd automation tools is designed. for genomics and drugdiscovery .research. |
| 7 |0.76517958501676 | specificities include both alpha–beta and beta–
beta. This line from chromatography .data systems (CDSs) and toLIMS. |
| 3 | 0 | Human S-100. monoclonal.and polyclonal specifici
ties include both alpha–beta and beta–beta isoforms. |
| 6 | 0 | LimsLink is .designed to interfaceoutput. from c
hromatography .data systems (CDSs) and to LIMS. |
| 1 | 0 | PepTool allows users tostore, manage. analyze, a
nd visualize protein data. |
+---------+------------------+--------------------------------------------------
----------------------------------------------------------------------------+
5 rows in set (0.00 sec)
9、布爾文本搜索(boolean mode)
以布爾方式,可以提供關於如下內容的細節:
要匹配的詞; www.2cto.com
要排斥的詞;
排列提示;(指定某些詞比其他詞更重要)
表達式分組;
另外一些內容。
[sql]
mysql> select note_id,note_text
-> fromproductnotes
-> whereMatch(note_text) Against('line' in boolean mode);
+---------+---------------------------------------------------------------------
---------------------------------------------------------+
| note_id | note_text
|
+---------+---------------------------------------------------------------------
---------------------------------------------------------+
| 5 | This line ofproprietary reagents,. containers, and automation tools
is designed. for genomicsand drug discovery .research. |
| 7 | specificitiesinclude both alpha–beta and beta–beta. This line fro
m chromatography .data systems (CDSs) and to LIMS. |
+---------+---------------------------------------------------------------------
---------------------------------------------------------+
2 rows in set (0.00 sec)
即使沒有FULLTEXT索引也可以使用布爾文本搜索。但是非常緩慢。
mysql> select note_id,note_text/*匹配line且不包含systems*/
-> fromproductnotes
-> whereMatch(note_text) Against('line -systems*' in boolean mode);
+---------+---------------------------------------------------------------------
---------------------------------------------------------+
| note_id | note_text
|
+---------+---------------------------------------------------------------------
---------------------------------------------------------+
| 5 | This line ofproprietary reagents,. containers, and automation tools
is designed. forgenomics and drug discovery .research. |
+---------+---------------------------------------------------------------------
---------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select note_id,note_text/*匹配line且匹配systems*/
-> fromproductnotes
-> whereMatch(note_text) Against('+line +systems' in boolean mode);
+---------+---------------------------------------------------------------------
---------------------------------------------------+
| note_id | note_text
|
+---------+---------------------------------------------------------------------
---------------------------------------------------+
| 7 | specificitiesinclude both alpha–beta and beta–beta. This line fro
m chromatography .data systems (CDSs) and to LIMS. |
+---------+---------------------------------------------------------------------
---------------------------------------------------+
1 row in set (0.00 sec)
mysql> select note_id,note_text/*匹配line或匹配systems*/
-> fromproductnotes
-> whereMatch(note_text) Against('line systems' in boolean mode);
+---------+---------------------------------------------------------------------
---------------------------------------------------------+
| note_id | note_text
|
+---------+---------------------------------------------------------------------
---------------------------------------------------------+
| 5 | This line ofproprietary reagents,. containers, and automation tools
is designed. forgenomics and drug discovery .research. |
| 6 | LimsLink is.designed to interface output. from chromatography .data
systems (CDSs) and toLIMS. |
| 7 | specificitiesinclude both alpha–beta and beta–beta. This line fro
m chromatography .data systems (CDSs) and to LIMS. |
+---------+---------------------------------------------------------------------
---------------------------------------------------------+
3 rows in set (0.00 sec)
mysql> select note_id,note_text/*匹配短語*/
-> fromproductnotes
-> whereMatch(note_text) Against('"This line"' in boolean mode);
+---------+---------------------------------------------------------------------
---------------------------------------------------------+
| note_id | note_text
|
+---------+---------------------------------------------------------------------
---------------------------------------------------------+
| 5 | This line ofproprietary reagents,. containers, and automation tools
is designed. forgenomics and drug discovery .research. |
| 7 | specificitiesinclude both alpha–beta and beta–beta. This line fro
m chromatography .data systems (CDSs) and to LIMS. |
+---------+---------------------------------------------------------------------
---------------------------------------------------------+
2 rows in set (0.00 sec)
10、使用說明
l 在索引全文本數據時,短詞被忽略且從索引中排除。短詞的定義爲那些具有3個或臉上以下字符的詞(如果需要,這個數目可以更新)。
l MySQL帶有一個內建的非用詞(stopword)列表,這些詞在索引全文本數據時總是被忽略。如果需要,可以覆蓋這個列表。
l MySQL規定了一條50%規則,如果一個詞出現在50%以上的行中,則將它作爲一個非用詞忽略。50%規則不用於IN BOOLEAN MODE。
l 如果表中的行數少於3行,則全文本搜索不返回結果(因爲每個詞或者不出現,或者至少出現在50%的行中)。
l 忽略詞中的單引號。如,don’t索引爲dont。
l 不具有詞分隔符的語言不能恰當地返回全文本搜索結果。