MYSQL入門學習

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  不具有詞分隔符的語言不能恰當地返回全文本搜索結果。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章