mysql-001 MySQL安裝: (5.0為例) 原始來源:http://dk.spot.idv.tw/database/mysql-note-1 開始前請留意5.0的原廠說明,很多說明上所提到的用法可能無法很正確的達到效果,原因是功能保留或功能尚未完整實作,因此這些語法可以被接受,但可能無法實作。 此部份只簡單說明讓MySQL可以Run起來,詳細設定請參閱使用說明書Windows版本安裝(快速安裝法):
Linux版本安裝: 如果你是RH系列或FC系列,請抓取rpm版本,指令如下: #rpm -ivh mysql-版本.rpm 注意,4.1之後官網將rpm分成server、client、max三個主要套件,server是必須安裝的, client是用戶工具,max則是附帶的更多功能,基本上RH系列或FC系列上面都會預設搭載MySQL,所以要安裝前請先留意有沒有舊版本,建議使用 yum指令來進行安裝,如下: #yum install mysql 如果要檢查現在的版本你可以用 #yum list mysql 如果不想使用舊版本要改用新的,Google一下版本轉換注意的事項(最重要的就是備份拉),接著移除舊版,並安裝新版本 #yum remove mysql #yum localinstall mysql-新版本.rpm 記得有分三個主要套件,最後啟動服務 #service mysqld start 如果要預設字碼字集,必須先找出my.cnf,通常在/etc/my.cnf,打開編輯,在[mysqld]下方加入底下兩行 default-character-set=utf8default-collation=utf8_general_ci 再來於[client]底下加入 default-character-set=utf8然後重開mysqld就可以了 由Client Tool登入MySQL資料庫 : mysql -u [username] -h [hostname] -p[password] [databasename] 資料庫的使用: mysql> use 資料庫; 不管是更換資料庫或者剛要使用資料庫,皆使用use這個指令
mysql> describe 資料表; 上面describe指令,可以列出後方資料表的欄位屬性
SELECT 欄位1[,欄位2,欄位3,...] FROM 資料表 欄位是列出的資料表中的欄位,FROM後面資料表是要查詢的資料表,這個部分只是基本的語法,下面會加入更多的用法。
SELECT '字串',欄位1[,欄位2,欄位3,...] FROM 資料表 輸入的字串會被每一筆列出的資料都列出
SELECT DISTINCT 欄位1[,欄位2,...] FROM 資料表 預設上重複的資料通通會被列出,也就是用ALL的結果,如果加上DISTINCT則,當資料出現兩筆以上相同時,只會列出一筆
SELECT 欄位 FROM 資料表 WHERE 條件 WHERE用來設定要列出的條件 ex: SELECT *
合併不一定只有兩個表格進行,可以多個表格同時進行合併,不舉例子了,發揮想像力..Orz
|
開始前的說明:
資料庫建立: CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name[create_specification [, create_specification] ...] 說明:DATABASE與SCHEMA是相同的作用,都是建立資料庫的意思,IF NOT EXISTS是當資料庫存在時,則不建立,如果資料庫存在但沒有加上此語法,會出現錯誤db_name就是要建立的資料庫名稱了 create_specification說明: [DEFAULT] CHARACTER SET charset_name| [DEFAULT] COLLATE collation_name DEFAULT 可以省略,事實上整個create_specification都可以省略,建立時會以資料庫預設作為設定,這個語法用來指定資料庫的字碼與字集,charset_name是字集名稱,collation_name是校對字集名稱,MySQL5.0所提供的字集可以用 show collation語法來查詢,如果需要查詢某個字碼的校對字集也可以使用show collation like '%字碼%'來查詢 ex: CREATE DATABASE test_db 資料庫修改: 修改資料庫設定只需要將CREATE改成ALTER就可以了,其餘語法相同 資料庫刪除: DROP {DATABASE | SCHEMA} [IF EXISTS] db_name資料庫的刪除是簡單的,IF EXISTS是當資料庫存在時則進行刪除,如果資料庫不存在,不會出現錯誤訊息
資料表建立: 建立的語法分為三種:
TEMPORARY 代表建立的資料表是暫時的,離線之後就會消失, IF NOT EXISTS 與建立資料庫相同,create_definition與table_option用於定義這個資料表,下面再一起說明,第二種語法中的 select_statement是用來,進行查詢語法,將查詢結果直接寫入這個剛建立的資料表中,第三種語法LIKE old_tbl_name與(LIKE old_tbl_name)是相同的,建立一個相同於old_tbl_name(已經存在的資料表)的資料表 基本上表格建立語法分為三大部分: CREATE ...........( column-wide的限制 table-wide的限制 ) table屬性設定 第一、column-wide限制 這裡所說的限制是指關聯式資料庫三大限制的限制,包含1.值域限制domain constraints 2.key值必須唯一,且不可為null 3.被參考的欄位必須唯一,且不可為null,可已有多行限制,每行限制以逗號隔開,語法如下: col_name data_type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT][UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT 'string'] [reference_definition] reference_definition: REFERENCES tbl_name [(index_col_name,...)][MATCH FULL | MATCH PARTIAL | MATCH SIMPLE] [ON DELETE reference_option] [ON UPDATE reference_option] reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION說明: ex: CREATE TABLE test_tbl( 外來鍵不寫範例了,因為應用性質不大,只適用於InnoDB,雖然其他引擎也會接受這樣的語法,但卻沒有任何作用。 第二、table-wide的限制: 實際上與column-wide大同小異,語法如下: [CONSTRAINT [symbol]] PRIMARY KEY [index_type](index_col_name,...)| [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...) [reference_definition] | {INDEX|KEY} [index_name] [index_type] (index_col_name,...) | [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY][index_name] [index_type] (index_col_name,...) | {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name](index_col_name,...) | CHECK (expr) 說明: ex: CREATE TABLE student( 第三、table屬性設定: {ENGINE|TYPE} [=] engine_name| AUTO_INCREMENT [=] value | AVG_ROW_LENGTH [=] value | [DEFAULT] CHARACTER SET charset_name | CHECKSUM [=] {0 | 1} | COLLATE collation_name | COMMENT [=] 'string' | CONNECTION [=] 'connect_string' | DATA DIRECTORY [=] 'absolute path to directory' | DELAY_KEY_WRITE [=] {0 | 1} | INDEX DIRECTORY [=] 'absolute path to directory' | INSERT_METHOD [=] { NO | FIRST | LAST } | MAX_ROWS [=] value | MIN_ROWS [=] value | PACK_KEYS [=] {0 | 1 | DEFAULT} | PASSWORD [=] 'string' | ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT} | UNION [=] (tbl_name[,tbl_name]...) ENGINE 與TYPE是相同的作用,=之後指定要使用哪一種引擎,指定的引擎套件必須已經安裝否則無法使用, AUTO_INCREMENT指定自動編號起使值,AVG_ROW_LENGTH指定平均資料的長度,通常用在這個table存放的資料屬於巨量的資料時,DEFAULT CHARACTER SET指定預設的字集,COLLATE指定校對字集,CHECKSUM是檢查和如果設定為1,則會自動檢查以確保資料的正確,但效能會大大的降低,不建議使用,而且只能用於MyISAM引擎,COMMENT是備註,只能設定60個字元以內,CONNECTION的作用不是很清楚,有點類似COMMENT,有點類似FTP連線公告,MAX_ROWS最多可存放的資料筆數,MIN_ROWS設定最少可放筆數,但MIN_ROWS我覺得怪怪的,因為如果設定了這個,在資料還沒寫入之前,筆數會是0,這樣不就有問題了?不瞭解為什麼,或許是用於刪除資料時,資料不可少於這個設定,PACK_KEYS如果設定為1,則會建立一個索引來增加查詢速度,但會大大降低新增、修改效能,如果設定DEFAULT,則只針對CHAR與VARCHAR型態欄位進行索引, PASSWORD這個不是用以設定密碼,而是用來進行編碼使用的字串,資料會與PASSWORD所指定的字串混和編碼後寫入frm檔案中, DELAY_KEY_WRITE如果設定為1,則資料修改會當表格關閉時才會寫入,ROW_FORMAT指定資料寫入儲存模式,這裡不說明了,不建議使用,UNION用於MERGE引擎,也不說明拉。忘了說明一下多個table屬性設定請用逗號隔開,或者換行也可以。
CREATE TABLE student( 資料表修改: ALTER [IGNORE] TABLE tbl_namealter_specification [, alter_specification] ... alter_specification: 增加 ADD [COLUMN] column_definition [FIRST | AFTER col_name ]| ADD [COLUMN] (column_definition,...) | ADD {INDEX|KEY} [index_name] [index_type] (index_col_name,...) | ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type](index_col_name,...) | ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,...) | ADD [FULLTEXT|SPATIAL] [INDEX|KEY] [index_name](index_col_name,...) | ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...) [reference_definition] 修改 | ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}| CHANGE [COLUMN] old_col_name column_definition[FIRST|AFTER col_name] | MODIFY [COLUMN] column_definition [FIRST | AFTER col_name] 刪除 | DROP [COLUMN] col_name| DROP PRIMARY KEY | DROP {INDEX|KEY} index_name | DROP FOREIGN KEY fk_symbol table屬性設定 | DISABLE KEYS| ENABLE KEYS | RENAME [TO] new_tbl_name | ORDER BY col_name | CONVERT TO CHARACTER SET charset_name [COLLATE collation_name] | [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name] | DISCARD TABLESPACE | IMPORT TABLESPACE | table_option ... 資料表的修改實際上與建立是很相似的,增加欄位或者限制,則前方加上ADD,不同的地方在於 [FIRST | AFTER col_name ]這是指定新增的欄位要放在那個欄位的前面或者後面,當然不指定的狀況下會放在最後的欄位之後。 修改欄位分為三種方法,第一種使用ALTER語法來設定或者刪除預設值,第二種CHANGE語法,這是MySQL自訂的語法,要注意的是,這個語法需要寫兩次欄位名稱,第一個欄位為原本的欄位名稱,第二個為新的欄位名稱,其餘與建立欄位相同,但如果不需要更改欄位名稱,則兩個欄位名稱都指定相同即可,第三種使用MODIFY語法,這是Oracle使用的語法,也是比較多人使用的語法,後方跟建立欄位相同寫法 刪除欄位或限制,使用DROP語法來進行,這部分應該不用說明了蠻簡單的,要注意一點,就是如果索引與外來鍵建立時沒有命名,可能會無 法刪除。 欄位屬性設定部分,DISABLE KEYS這個功能是停止更新索引的建立,這用於大量資料寫入時,因為需要大量索引建立而拖慢速度的問題,而ENABLE KEYS則剛好相反,當需要大量寫入具有索引的欄位時,可以先停止索引更新,資料寫入完畢之後在打開ENABLE KEYS,MYSQL會使用較快速的演算法來更新索引,ORDER BY可以預先指定資料表資料的排序方式,也就是說當使用SELECT進行查詢時,不需要指定ORDER BY他就會幫你把他排好,但是有一點需要注意,再修改ORDER BY之後所新增的資料或者刪除的資料並不會照你所要求的方式來進行排序的動作,而是照原本系統的方式來排,也就是會自動排在最後面,DISCARD TABLESPACE與IMPORT TABLESPACE是用於INNODB來增加ibd檔案的空間,這個部分我比較不清楚,因為還沒去研究過Innodb的細節,其餘的資料表屬性部分都跟建立資料表雷同。 資料型態:
這些資料型態,通常被分為六大部分整數、浮點數、字元、二進位、日期、其他。
建立資料表的基本範例: CREATE TABLE test( 刪除資料表: DROP TABLE [IF EXISTS] tb_name; |
資料新增: INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES ({expr | DEFAULT},...),(...),... [ ON DUPLICATE KEY UPDATE col_name=expr, ... ] 新增語法LOW_PRIORITY、DELAYED等等的項目實際上是很少用到的, 通常只會用到底下部分: INSERT INTO tbl_name[(col_name,...)]VALUES({expr|DEFAULT}) ex:加上欄位的寫法: INSERT INTO student(name,std_num,sex) ex:不加欄位寫法: INSERT INTO studentVALUES('John','E0001','M');
連續新增: ex: 利用不同欄位指定另一個欄位的值: ex: 利用SELECT語法進行新增: INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE][INTO] tbl_name [(col_name,...)] SELECT ... [ ON DUPLICATE KEY UPDATE col_name=expr, ... ] 此語法使用SELECT查詢的資料,必須欄位與查詢值相對應,包含欄位的型態、值域、數量等 修改資料: UPDATE [LOW_PRIORITY] [IGNORE] tbl_nameSET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_condition] [ORDER BY ...] [LIMIT row_count] ex:
資料刪除: DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name[WHERE where_condition] [ORDER BY ...] [LIMIT row_count] ex:
使用者建立: 使用者建立方式有三種,第一種直接由mysql資料庫中user資料表來建立,但這樣的方式太麻煩了,所以底下列出的方式不包含此種方法 第一種:CREATE USER語法 CREATE USER user [IDENTIFIED BY [PASSWORD] 'password'][, user [IDENTIFIED BY [PASSWORD] 'password']] 此語法適用於只有建立使用者及密碼部分,user代表使用者名稱,而IDENTIFIED BY後方指定密碼,此密碼會自動加密,另外使用者部分必須指定使用者與來源主機,並以@來分隔,此語法可以一次建立多個使用者,參考範例如下: ex:
第二種:利用GRANT產生使用者,並指定權限 此種方法原本是用於指定使用者資料庫的使用權限,但如果使用者不存在,則會自動建立,語法如下: GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...ON [object_type] {tbl_name | * | *.* | db_name.*} TO user [IDENTIFIED BY [PASSWORD] 'password'] [, user [IDENTIFIED BY [PASSWORD] 'password']] ... [REQUIRE NONE | [{SSL| X509}] [CIPHER 'cipher' [AND]] [ISSUER 'issuer' [AND]] [SUBJECT 'subject']] [WITH with_option [with_option] ...] 實際上此語法大部分只會用到下面部分 GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...ON [object_type] {tbl_name | * | *.* | db_name.*} TO user [IDENTIFIED BY [PASSWORD] 'password'] [, user [IDENTIFIED BY [PASSWORD] 'password']] ... [WITH with_option [with_option] ...] priv_type是指定授權種類,這個部分下面說明 column_list 可以指定授權給欄位,這表示只能使用控制欄位的語法,如:SELECT,INSERT,UPDATE,DELETE ON object_type 可以指定三種,TABLE, FUNCTION,PROCEDURE,當object_type有使用時,後方必須指定object_type所要授權的物件,例如:指定 FUNCTION,則後方必須接著function的名稱,如果不指定,則後方可以是tbl_name,*,*.*或者db_name,也就是說可以指定資料表或者整個資料庫給使用者,指定時可以採用萬用字元*來代替全部,例如:指定test這個資料庫給使用者,則指定test給使用者即可,如果只需要 test之內的所有資料表,則指定test.*給使用者 TO user 這裡與 CREATE USER語法的user相同,必須指定使用者名稱與主機名稱,使用者名稱請不要給空字串,因為那代表匿名anonymous,而且使用者不可以使用 wildcard字元來取代,但host名稱可以使用wildcard,例如:'myname'@'192.168.100.%',這裡不是用*這個字元而是%這個字元,與SELECT時所使用的wildcard相同意義 IDENTIFIED BY password 指定使用者的密碼,這與CREATE USER語法相同,指定密碼,但如果只是授權給一個已經存在的使用者時,可以不需要指定密碼,也就是這個部分語法可以省略,因為使用者可能有自己的密碼,這樣會造成覆蓋原有密碼的情形,除非確定要更改他的密碼 WITH with_option 這個語法用以指定一些使用者的限制如下: GRANT OPTION: MAX_QUERIES_PER_HOUR等後四個項目: 此語法的簡單範例:
建立管理者身份:
REQUIRE這個選項比較特別,這裡可以指定連線加密方式,通常不指定除非真的有這樣的需求, 連線進行加密會導致系統負擔,增加CPU的工作量 ,除非有這樣的需求才進行設定,加密方式SSL對應CHIPHER語法,而X509對應ISSUER與SUBJECT,但這部分我不是很懂,無法加以說明,有機會深入研究再來補完 priv_type ,這部分包含很多項目,可以透過show privileges指令來列出相關訊息,因為篇幅過長底下列出項目與使用範圍部分:
解除授權: GRANT可以對使用者授權,那麼送出的權限能不能收回,當然可以,使用REVOKE語法,將權限收回來,但請記住,解除授權不等於刪除使用者,也就是說當你解除授權後,使用者只是沒有權力進行解除權力部分的動作,但仍然可以登入資料庫,這點必須特別注意,語法如下: REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...ON [object_type] {tbl_name | * | *.* | db_name.*} FROM user [, user] ... 上面語法實際上與GRANT相同,只有少部分的差異,在priv_type指定上,是要解除的權限,ON則是由什麼地方解除,而FROM則是指定由誰身上解除,使用方法都與GRANT相同,所以不加以說明,但有一個地方需要注意,解除GRANT OPTION權限,實際上GRANT OPTION是屬於priv_type的一部份,但在GRANT時,習慣上會使用WITH來指定,但在解除的時候,必須將GRANT OPTION當成priv_type來看待,範例如下: REVOKE GRANT OPTION 全部解除: REVOKE ALL 更改使用者: 這個語法只有在5.0.2之後版本才有,可以更改使用者名稱,語法如下: RENAME USER old_user TO new_user[, old_user TO new_user] ... 這語法應該很容易理解才對,所以不加以說明了 ex: 刪除使用者: 在早期版本的MySQL中,刪除使用者必須透過mysql這個系統資料庫的user資料表來進行刪除, 如果沒有特別瞭解這個資料庫架構的人來說,是件很容易出錯的事情,在5.0.2之後提供了一個刪除使用者的語法: DROP USER user[,user...]這樣的語法簡單又好用,而且超容易瞭解他在幹嘛..^^ ,但因為有了這樣簡單的語法,所以使用前一定要三思,要知道自己到底在做啥,不然後果不堪設想 |
索引建立: 索引在MySQL中分為一般索引、唯一索引、主索引、全文索引四類,至於什麼是索引,索引就像是書本前方的目錄一樣,當你需要察看某個主題時,你只需要尋找索引列表的主題,然後直接翻開他所對應的頁數即可,而不需要一頁一頁的翻,索引就是這樣的東西。 目標是你要找的資料,但過程透過索引指向目標來取得,這樣的動作在查詢語法(SELECT),並不會有任何差異,因為索引是內部的動作,你只看到結果,那如何指定索引?該指定誰當索引?索引會指定給某個欄位或者某些欄位,這些欄位會具有相同的特質,就是這個欄位或這些欄位經常出現在WHERE語法後方,也就是經常當作條件來進行搜尋的欄位,就像書本的目錄一樣,你一定會先找"某個主題",這就是你要查詢的條件,在開始之前,必須先有個認知,索引可以加速搜尋速度,但相對的必須付出一定的代價,第一、索引會導致新增修改刪除時效率降低,第二、索引表會隨著資料而越來越大,除非資料真的很慢,而且資料筆數實在龐大,或者客戶要求,通常這樣的情況才會設定索引 實際上MySQL(二)、(三)這兩篇當中已經有提到索引相關的部分內容,例如在CREATE TABLE時建立索引,還有GRANT中指定建立索引的權限等,權限部分就不再提及了 一般索引: 一般索引針對一般欄位進行索引表的建立,這些欄位的值不需要特別限制,所已被稱為一般索引,建立的方法有兩種一種是在CREATE TABLE時: CREATE TABLE tbl_name(column_definition... {INDEX|KEY} [index_name] (index_col_name,...)); index_col_name: col_name [(length)] [ASC | DESC]column_definition 是欄位的建立部分,請參考之前文章,一般索引可以使用INDEX這個關鍵字也可以使用KEY這個字,所代表的意義相同,後方接著索引的名稱,如果不指定則會以欄位名稱來指定索引名稱,這個有助於刪除索引時可以指定要刪除的索引名稱,接著小括弧內放入要進行索引的欄位,可以多個欄位進行索引,欄位以逗號分隔 但在索引欄位index_col_name後方又可指定length,這代表只使用最前面指定長度的內容來進行索引,被稱為partial index,這裡要特別注意欄位是文字型態時,指定的length是以字集的字來計算,也就是如果指定的字集為big5_chinese_ci,則一個中文字代表一個長度,如果欄位是是屬於二元型態,則以byte來計算,另外TEXT與BLOB以上的欄位一定要指定length才行,另外length最大可以到1000,而InnoDB則可以到767 ASC與DESC這是指定索引建立的順序,是要根據正向還是反向來建立,通常不指定,因為效果不大 唯一索引: 唯一索引顧名思義,要進行索引欄位的值只能唯一, 這與一般索引不同,因為唯一所以查詢時的動作會有不同,查詢速度也會比一般索引來的快,建立方式有三種,第一種是在column_definition中指定UNIQUE關鍵字: CREATE TABLE tbl_name(col_name data_type ... [UNIQUE], ... ); 第二種則是在table-wide部分建立: CREATE TABLE tabl_name(column_definition... [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [USING {BTREE | HASH} ] (index_col_name,...) ); index_col_name: col_name [(length)] [ASC | DESC]CONSTRAINT symbol是指定限制名稱,因為索引只能進行刪除與新增無法進行修改,但透過CONSTRAINT的命名,則能夠以ALTER TABLE語法來進行修改的動作,但只有唯一索引可以這麼做,語法大部分都與一般索引相同,其中USING部分,這是指定索引的種類,BTREE是一種樹狀結構,他不是二元樹,原本以為B是Binary意思,但請教我的老師之後,發現並非如此,網路上查了一下發現B代表Bayer也就是這種結構的創建者名稱,需要瞭解更多請至Wikipedia查詢 BTREE ,BTREE是比BinaryTree來的更有效率的結構,而HASH是雜湊方式,這需要注意一下,MyISAM只支援BTREE,全部引擎當中只有MEMORY/HEAP支援HASH與BTREE兩種,所以通常USING不指定,第三種方法,後面一併介紹 全文索引: 全文索引通常針對大篇幅文章內容來進行索引,所以欄位型態上通常都是TEXT以上的型態,這裡需要特別留意,全文索引只能指定在文字型態欄位上,其他型態不支援,因為索引的內容較多,所耗損的空間量相對比較大,而且搜尋速度也相對慢很多,如果索引所提高的效益比這些不利因素來的大,建立索引是應該的,建立方法有兩種,第一種透過CREATE TABLE語法: CREATE TABLE tbl_name(column_definition... {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...)); 其實上面這語法應該很容易就可以看得出來,因為他與一般索引相同,只是前方多了FULLTEXT關鍵字,但有個地方很怪異SPATIAL這是什麼?這是空間索引,這部分很少用到,因為他是針對地理資訊系統(GIS)所使用的欄位型態"Spatial Data"來進行索引,這通常只有研究GIS的人才會去使用,我沒研究過..^^,有興趣查DOC,另外全文索引不能指定索引長度,也就是上面一般索引中所提的length部分 第二種方式也是唯一索引、一般索引沒有講到的部分,利用CREATE INDEX語法來建立索引: CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_nameindex_type] ON tbl_name (index_col_name,...)index_col_name: col_name [(length)] [ASC | DESC]index_type: USING {BTREE | HASH}上面語法應該很容易理解才對,一般索引則不需指定[UNIQUE|FULLTEXT|SPATIAL]這三者,就是一般索引,ON後方必須指定目前索引在那個資料表,由哪些欄位來建立索引,其餘部分與CREATE TABLE語法建立方式相同 實際上CREATE INDEX語法是對應到ALTER TABLE語法的ADD語法上,所以可以透過ALTER TABLE語法來建立索引也是其中一種方法,這部分請參考MySQL(二) 主索引: 所謂的主索引,就是指PRIMARY KEY,者部分應該不需要提了,這與CREATE TABLE及ALTER TABLE有關 索引表刪除: 建立後的索引要刪除方法有兩種,一種透過ALTER TABLE語法來刪除,另外可以透過DROP INDEX來刪除: DROP INDEX index_name ON tbl_name這個語法很簡單,但有個疑問,我該如何得知資料表有哪些索引,這些索引名稱是什麼?要得知索引名稱可以透過SHOW指令來查詢: SHOW INDEX FROM tbl_name此時會列出底下訊息
Table:資料表名稱 上面Key_name就是索引的名稱,刪除時index_name就是指定這個名稱來進行刪除 全文索引的使用: 全文索引的使用(全文檢索),與其他的搜尋有點差異性,因為全文檢索採用的是權重,進行索引的欄位內容會被採用自然語言演算法進行拆解,然後依照出現的次數安排權重,出現次數越少權值越高,被搜尋到的時間越短,出現次數越多權值越低,搜尋的時間越長,甚至可能成為權值0,當權值為0,則有可能無法被搜尋出來,權值為0的可能性有兩種:
檢索的方法:採用MATCH(...)AGAINST(...)來進行條件比對 SELECT *FROM table_name WHERE MATCH(欄位1,欄位2...) AGAINST('字串'); MATCH(...)指定要使用全文檢索的搜尋欄位,而AGAINT('字串')指定要搜尋的字串,搜尋出來的資料會依照權值排序,MATCH會傳回權值大小,當權值為0,條件接收之後,會不成立,則該資料不取,如具有權值,權值會以小數點方式呈現 IN BOOLEAN MODE: IN BOOLEAN MODE有點類似正規表示式,採用一些特殊字元來進行搜尋 +:將權值提升至最大,也就是說,在+號後方的文字必須出現在搜尋出來的每筆資料中 -:將權值降為0,當權值為0,將無法被搜尋出來,-號後方的文字將不會出現在所有搜尋資料中 >與<:>增加權值,<減少權值 ( ):利用子查詢查出之結果來進行檢索,也可以採用集合方式 ~:類似-號,但是不會將指定字串排除在資料之外,而是將權值設為負值,此時同等於最低權值的資料,將會被列於資料的最後,通常使用於常出現但不須排除的字串 *:類似萬用字元,書上說這是截斷運算子,利用*來替代未知字串,例如以App開頭的字,此時搜尋採用App*,這樣Apple、Application、Apply、Appserv都會被搜尋到 ":雙引號,用來指定片語,例如要搜尋一個句子,利用雙引號將某個句子包起來,這樣搜尋時必須完全符合雙引號的字串才能被搜尋出來 語法: SELECT *FROM table_name WHERE MATCH(欄位1,欄位2...) AGAINST('字串' IN BOOLEAN MODE); 字串中採用上方字元來調整適用範圍 書上範例: SELECT * FROM MemData 其餘索引檢索的注意事項: 檢索內容必須為進行索引內容才能進行索引,如採多欄位索引,此時要有效使用索引進行搜尋,必須注意一些事項,如索引建立時採用(col1,col2,col3)來進行索引,則MySQL會建立三份索引表col1一份,(col1,col2)一份,(col1, col3)一份,所以當進行檢索時,條件必須與此三份索引表進行AND的條件才能有效使用,此點必須特別注意 |
此篇屬雜項紀錄,一些零散指令的紀錄(不定時更新中) 結束符號定義 mysql>delimiter [符號] 說明: 此命令用於設定mysql client mode中語法的結束字符 ex:delimiter $$ 將結束符號由;號變成$$符號 關於 Linux中的連線方法,client登入時,可以採用兩種方式進行登入 1.TCP/IP方式,也就是透過網路進行登入,一般採用此種,此種方式可以指定主機名稱、IP、網址、localhost等方式 2.Socket方式,透過Socket介面進行登入,此種方式只能用於Linux/Unix上 $mysql -u root -p --protocol=socket 將--protocol指定採用socket進行登入,預設為tcp 更新RAM中的授權資料 mysql>FLUSH PRIVILEGES; 說明: FLUSH語法很多,FLUSH的作用,用於刷新記憶體中的暫存資料,當剛設定某使用者的授權資料,或者更動使用者的資料時,記憶體中的資料可能不會馬上更動,此時可以使用此語法強制刷新 Group By [group_field] WITH ROLLUP 此語法在集總函式處理時,除了集總函式本身產生的集總結果外,會在每個群組下方多出群組小計,如果群組為多欄位時,除了每個群組進行小計外,另外會於查詢最後列出總計,此方法必須採用集總函式才會有對應的資料出現,另外總計與小計只會出現在集總函式結果欄位,其他欄位對於ROLLUP處理後,因為不知該放入什麼值,所以補上Null ex:SELECT last_name,age,count(*) FROM user GROUP BY last_name,age WITH ROLLUP;
|
此篇記錄有關MySQL的一些外部命令(client端工具、server端工具),持續更新中 mysqladmin 此命令屬於client端工具,透過外部命令對mysql進行控制,與mysql互動模式(mysql命令)不同 $mysqladmin [options] command [command-options] [command [command-options]] ... 關於常用command create db_name 建立資料庫,後方db_name為資料庫名稱 drop db_name 刪除資料庫,後方db_name為資料庫名稱 extended-status 顯示伺服器狀態、變數與變數值 flush-hosts 刷新所有主機快取 flush-logs 刷新log的紀錄 flush-privileges 刷新記憶體中的授權表 ,也可以採用reload flush-status 清除所有狀態的變數 flush-tables 刷新所有資料表 flush-threads 刷新所有執行緒 kill id,id,... 踢除某些執行緒,id為執行緒的編號,執行緒所指的是,每個使用者在MySQL server中正在運行的程序,id可以透過processlist查得每個使用者執行狀態 old-password new-password 設定新密碼(採用舊版本4.01的雜湊進行加密) password new-password 設定新密碼,採用目前版本的方式加密,下方是關於密碼的注意事項 If the new-password value contains spaces or other characters that are special to your command interpreter, you need to enclose it within quotes. On Windows, be sure to use double quotes rather than single quotes; single quotes are not stripped from the password, but rather are interpreted as part of the password. For example: shell> mysqladmin password "my new password" ping 檢查MySQL server是否運作中,如果正在運作中,則傳回0,反之傳回1,但如果伺服器拒絕檢查(權限不足),同樣會傳回0,但會出現錯誤訊息 processlist 列出所有正在運作中的執行緒,此命令與互動模式中的SHOW PROCESSLIST作用相同,也可以附加--verbose引數,列出詳細資訊,此時會與互動模式中的SHOW FULL PROCESSLIST相同 reload 更新授權表與flush-privileges相同作用 refresh 更新所有資料表與開啟、關閉的log檔 shutdown 停止server start-slave 開始複製資料至附屬伺服器(多資料庫同步所採用的相關命令) status 列出server的簡短狀態訊息 stop-slave 停止附屬伺服器(多資料庫同步所採用的相關命令) variables 列出伺服器系統變數與值 以上為常用的command,大部分command都可以採用短語法(四個字) ex:mysqladmin -u root -p proc 關於常用option --help, -? 列出說明 --character-sets-dir=path 指定字集檔案位置 --compress, -C 壓縮client端與server端之間的資訊傳遞(必須雙方都可以支援壓縮才行) --count=N, -c N 指定命令重複次數,需與--sleep一起使用 --default-character-set=charset_name 指定預設的字集 --force, -f 強制,當資料庫進行刪除時,不顯示任何提示 --host=host_name, -h host_name 指定連結的資料庫伺服器位置或者主機名稱 --password[=password (INSECURE)], -p[password (INSECURE)] 指定登入密碼,如過不給值則會提示輸入密碼,如果給值則會直接進行登入,但密碼會以明碼顯示 --port=port_num, -P port_num 指定port --protocol={TCP|SOCKET|PIPE|MEMORY} 指定連接方式,採用TCP、SOCKET、PIPE等方式,預設為TCP --relative, -r 當使用--sleep重複執行命令時,列出現在與之前一次的差異,只能與 extended-status 一起使用 --silent, -s 靜默模式,也就是當無法連線時,不顯示任何訊息 --sleep=delay, -i delay 重複執行命令時,指定每個命令間格多少秒執行一次 --socket=path, -S path 指定socket file路徑,如果在windows上則代表pipe line路徑 --ssl* 使用SSL進行連線 --user=user_name, -u user_name 指定登入帳號(使用者) --verbose, -v 印出更多資訊(詳細資訊) --version, -V 顯示版本 --vertical, -E 垂直輸出訊息 --wait[=count], -w[count] 當連線無法建立時,嘗試重複登入,後方count指定登入次數 指定變數:--variable_name=value connect_timeout 指定連線的timeout時間(斷線時間),預設為43200(12小時) shutdown_timeout 等待server關機的時間,預設3600秒(1小時) 不建議的變數指定方法: --set-variable=variable_name=var_value |