【文章內(nèi)容簡(jiǎn)介】
說(shuō)明 event 和 score 表是由每個(gè)表中的 event_id 值的匹配連接起來(lái)的: where … event,event_id = 從多個(gè)表中檢索信息 ? 此查詢中的其他列( d a t e、 s c o r e、 t y p e)可單獨(dú)使用而不用表名限定符,因?yàn)樗鼈冊(cè)诒碇兄怀霈F(xiàn)一次,從而不會(huì)出現(xiàn)含混。但是,一般在連接中我們對(duì)每個(gè)列都進(jìn)行限定以便清晰地表示出每個(gè)列是屬于哪個(gè)表。 ? Select , , , from event, score, student where = “19990823” and = and = 。 ? 名字顯示是利用 score 表和 student 表兩者都具有 student_id 列,使它們中的記錄可被連接這個(gè)事實(shí)來(lái)完成的。此查詢與前一個(gè)查詢的差別在于: ■ student 表被增加到了 FROM 子句中,因?yàn)槌?event 表和 score 表外還用到了它。 ■ student_id 列現(xiàn)在不明確了(因?yàn)楝F(xiàn)在有兩個(gè)引用到的表都含有此列),因此必須限定 為 或 以表明使用的是哪個(gè)表。 ■ WHERE 子句有一個(gè)附加項(xiàng),它說(shuō)明根據(jù)學(xué)生 ID 將 score 表記錄與 student 表記錄進(jìn)行 匹配。 ■ 此查詢是顯示學(xué)生名而不是學(xué)生 I D。(當(dāng)然,如果愿意的話,可以兩者都顯示。) 從多個(gè)表中檢索信息 ? LEFT JOIN ? 要求 MySQL 對(duì)從連接首先給出的表中選擇每行生成一個(gè)輸出行(即LEFT JOIN 關(guān)鍵字左邊給出的表) 刪除或更新現(xiàn)有記錄 有時(shí),希望除去某些記錄或更改它們的內(nèi)容。 DELETE 和 U P D ATE 語(yǔ)句令我們能做到這一點(diǎn)。 DELETE 語(yǔ)句有如下格式: DELETE FROM t b l _ n a m e WHERE 要?jiǎng)h除的記錄 WHERE 子句指定哪些記錄應(yīng)該刪除。它是可選的,但是如果不選的話,將會(huì)刪除所有的記錄。這意味著最簡(jiǎn)單的 DELETE 語(yǔ)句也是最危險(xiǎn)的。這個(gè)查詢將清除表中的所有內(nèi)容。一定要當(dāng)心! Delete from tbl_name 為了刪除特定的記錄,可用 WHERE 子句來(lái)選擇所要?jiǎng)h除的記錄。這類似于SELECT 語(yǔ)句中的 WHERE 子句 Delete from president where state = “OH”。 DELETE 語(yǔ)句中的 WHERE 子句的一個(gè)限制是只能夠引用要?jiǎng)h除記錄的表中的列。 刪除或更新現(xiàn)有記錄 為了修改現(xiàn)有記錄,可利用 U P D ATE 語(yǔ)句,它具有下列格式: U P D ATE t b l_n a m e SET 要更改的列 WHERE 要更新的記錄 這里的 WHERE 子句正如 DELETE 語(yǔ)句一樣,是可選的,因此如果不指定的話,表中的每個(gè)記錄都被更新。 下面的查詢將每個(gè)學(xué)生的名字都更改為 “ Gee”: Update student set name=“Gee”。 下面的語(yǔ)句將更新 Jerome 的電子郵件和通信地址: Update member set =??, street=?123 elm?, city=?Anytown?, state=?NY?, zip=?01003? where last_name=?york? and first_name=?Jerome?。 正如 DELETE 語(yǔ)句一樣,對(duì)于 U P D AT E,用 SELECT 語(yǔ)句測(cè)試 WHERE 子句以確保選擇 正確的更新記錄是一個(gè)好辦法。如果選擇條件范圍太窄或太寬,就會(huì)使更新的記錄太少或太多。 改變表的結(jié)構(gòu) ? 要用 A LTER TA B L E,可以對(duì)表重新命名,增加或刪除列,更改列的類型等等 ? Alter table member add member_id int unsigned not null auto_increment primary key。 與 mysql 交互的技巧 ? 在激活 mysql 時(shí),有可能需要指定諸如主機(jī)名、用戶名或口令這樣的連接參數(shù)。運(yùn)行一個(gè)程序需要做很多輸入工作,這很快就會(huì)讓人厭煩。有幾種方法可最小化所做的鍵入工作,使連接更為容易,它們分別為: ? ■ 利用選項(xiàng)文件存儲(chǔ)連接參數(shù)。 ? ■ 利用外殼程序的命令歷史重復(fù)命令。 ? ■ 利用外殼程序的別名或腳本定義 mysql 命令行快捷鍵。 與 mysql 交互的技巧 ? 利用選項(xiàng)文件 ? 自版本 以來(lái), MySQL 允許在一個(gè)選項(xiàng)文件中存儲(chǔ)連接參數(shù)。然后在運(yùn)行mysql 時(shí)就不用重復(fù)鍵入這些參數(shù)了;僅當(dāng)您曾經(jīng)在命令行上鍵入過(guò)它們時(shí)可以使用。這些參數(shù)也可以為其他 MySQL 客戶機(jī)所用,如為 mysqlimport 所用。這也表示在使用這些程序時(shí),選項(xiàng)文件減少了鍵入工作。為了利用選項(xiàng)文件方法指定連接參數(shù),可建立一個(gè)名為 ~ / . m (即主目錄中的一個(gè)名為 . m 的文件)。選項(xiàng)文件是一個(gè)無(wú)格式的文本文件,因此可用任何文本編輯器來(lái)創(chuàng)建它。文件的內(nèi)容所下所示 : ? [client] host=serverhost user=yourname password=yourpass ? [client] 行標(biāo)記客戶機(jī)選項(xiàng)組的開(kāi)始;它后跟的所有行都是為 MySQL 客戶機(jī)程序獲得選項(xiàng)值準(zhǔn)備的,這些行一直沿續(xù)到文件的結(jié)尾或另一不同的參數(shù)組的開(kāi)始。在連接到服務(wù)器時(shí),用指定的主機(jī)名、用戶名和口令替換 serverhost、 yourname 和yourpass。只有 [client] 行是必須的。定義參數(shù)值的行都是可選的;可以僅指定那些所需要的參數(shù)。并設(shè)置訪問(wèn)權(quán)限。 與 mysql 交互的技巧 ? 在 Windows 下,選項(xiàng)文件的內(nèi)容是相同的,但其名稱不同( c : \ m y. c n f),而且不調(diào)用 chmod 命令。 ? 利用外殼程序的命令歷史 諸如 c s h、 tcsh 和 bash 這樣的外殼程序會(huì)在一個(gè)歷史列表中記下您的命令,并允許重復(fù)該列表中的命令。如果采用的是這樣的外殼程序,其歷史列表可幫助免除完整命令的鍵入。例如,如果最近調(diào)用了 m y s q l,可按如下命令再次執(zhí)行它: ? % !my ? 其中 “ ! ” 告訴外殼程序搜索整個(gè)命令歷史找到最近以 “ m y”開(kāi)頭的命令,并像您打入的一樣發(fā)布它。有的外殼程序還允許利用上箭頭和下箭頭鍵(或許是 CtrlP 和 C t r l N)在歷史列表中上下移動(dòng)??捎眠@種方法選擇想要的命令,然后按 Enter 執(zhí)行它。 tcsh 和 bash 有這種功能,而其他外殼程序也可能有 與 mysql 交互的技巧 ? 利用外殼程序的別名或腳本,如果使用的外殼程序提供別名功能,那么可以設(shè)置允許通過(guò)鍵入簡(jiǎn)短名調(diào)用長(zhǎng)命令的命令快捷鍵。例如,在csh 或 tcsh 中,可利用 alias 命令設(shè)置名為samp_db 的別名,如下所示: ? Alias samp_db ?mysql –h localhost –u root –p samp_db? ? 而 bash 中的語(yǔ)法稍有不同: ? Alias samp_db=?mysql –h localhost –u root –p samp_db? 與 mysql 交互的技巧 以較少的鍵入發(fā)布查詢 mysql 是一個(gè)與數(shù)據(jù)庫(kù)進(jìn)行交互的極為有用的程序,但是其界面最適合于簡(jiǎn)短的、單行的查詢。當(dāng)然, mysql 自身并不關(guān)心某個(gè)查詢是否分成多行,但是長(zhǎng)的查詢很不好鍵入。輸入一條查詢也不是很有趣的事,即使是一條較短的查詢也是如此,除非發(fā)現(xiàn)有錯(cuò)誤才愿意重新鍵入它。有幾種可用來(lái)避免不必要的鍵入或重新鍵入的技巧: ■ 利用 mysql 的輸入行編輯功能。 ■ 利用拷貝和粘貼。 ■ 以批方式運(yùn)行 m y s q l。 ■ 利用現(xiàn)有數(shù)據(jù)來(lái)創(chuàng)建新記錄以避免鍵入 I N S E RT 語(yǔ)句。 與 mysql 交互的技巧 ? 利用 mysql 的輸入行編輯器 ? mysql 具有內(nèi)建的 GNU Readline 庫(kù),允許對(duì)輸入行進(jìn)行編輯。可以對(duì)當(dāng)前錄入的行進(jìn)行處理,或調(diào)出以前輸入的行并重新執(zhí)行它們(原樣執(zhí)行或做進(jìn)一步的修改后執(zhí)行)。在錄入一行并發(fā)現(xiàn)錯(cuò)誤時(shí),這是非常方便的;您可以在按Enter 鍵前,在行內(nèi)退格并進(jìn)行修正。如果錄入了一個(gè)有錯(cuò)的查詢,那么可以調(diào)用該查詢并對(duì)其進(jìn)行編輯以解決問(wèn)題,然后再重新提交它。(如果您在一行上鍵入了整個(gè)查詢,這是最容易的方法。) 與 mysql 交互的技巧 用 MySQL 處理數(shù)據(jù) M y S Q L在處理這些數(shù)據(jù)類型時(shí)所出現(xiàn)的問(wèn)題,主要內(nèi)容如下: ■ 通用數(shù)據(jù)類型,包括 NULL 值。 ■ 特殊數(shù)據(jù)類型,以及描述每種列類型的屬性。有些列類型是相當(dāng)常見(jiàn)的,如 CHAR 串類型。而有的如 A U TO_INCREMENT 整型和 T I M E S TAMP 日期類型,其性能很特殊,應(yīng)該加以理解以免出錯(cuò)。 ■ 恰當(dāng)?shù)剡x擇表的列類型。在創(chuàng)建表時(shí),重要的是要了解怎樣為自己的目的選擇最好的類型,以及在幾種類型都可以用于想要存儲(chǔ)的值時(shí)選擇一種類型。 ■ 表達(dá)式求值規(guī)則。 MySQL 提供了許多可用于表達(dá)式的運(yùn)算符和函數(shù),以便對(duì)數(shù)據(jù)進(jìn)行檢索、顯示和處理。表達(dá)式求值的規(guī)則包括類型轉(zhuǎn)換規(guī)則,在一種類型的值用于另一類型的值的情況時(shí)需用到類型轉(zhuǎn)換規(guī)則。 用 MySQL 處理數(shù)據(jù) ? 數(shù)值值 ? 數(shù)值是諸如 48 或 這樣的值。 MySQL 支持說(shuō)明為整數(shù)(無(wú)小數(shù)部分)或浮點(diǎn)數(shù)(有小數(shù)部分)的值。整數(shù)可按十進(jìn)制形式或十六進(jìn)制形式表示。整數(shù)由數(shù)字序列組成。以十六進(jìn)制形式表示的整數(shù)由 “ 0 x”后跟一個(gè)或多個(gè)十六進(jìn)制數(shù)字( ” 0”到 “ 9”及 “ a”到 “ f”)組成。例如, 0x0a 為十進(jìn)制的 1 0,而 0 x ffff 為十進(jìn)制的 6 5 5 3 5。十六進(jìn)制數(shù)字不區(qū)分大小寫(xiě),但其前綴 “ 0 x”不能為 “ 0 X”。即 0x0a 和 0x0A 都是合法的,但0X0a 和 0X0A 不是合法的。 ? 浮點(diǎn)數(shù)由一個(gè)阿拉伯?dāng)?shù)字序列、一個(gè)小數(shù)點(diǎn)和另一個(gè)阿拉伯?dāng)?shù)字序列組成。兩個(gè)阿拉伯?dāng)?shù)字序列可以分別為空,但不能同時(shí)為空。 ? MySQL 支持科學(xué)表示法??茖W(xué)表示法由整數(shù)或浮點(diǎn)數(shù)后跟 “ e”或 “ E”、一個(gè)符號(hào)( “ +”或 “ ”)和一個(gè)整數(shù)指數(shù)來(lái)表示。 +12 和 都是合法的科學(xué)表示法表示的數(shù)。而 不是合法的,因?yàn)橹笖?shù)前的符號(hào)未給出。指數(shù)前的 “ e”也是一個(gè)合法的十六進(jìn)制數(shù)字,因此有可能會(huì)弄錯(cuò)。 ? 數(shù)值前可放一個(gè)負(fù)號(hào) “ ”以表示負(fù)值。 用 MySQL 處理數(shù)據(jù) ? (字符)串值 ? 串是諸如 “ Madison, Wi s c o n s i n”或 “ patient shows improvement”這樣的值。既可用單引號(hào)也可用雙引號(hào)將串值括起來(lái)。串中可使用幾個(gè)轉(zhuǎn)義序列,它們用來(lái)表示特殊的字符,見(jiàn)表。每個(gè)序列以一個(gè)反斜杠( “ \”)開(kāi)始,指出臨時(shí)不同于通常的字符解釋。注意 NUL 字節(jié)與 NULL 值不同; NUL 為一個(gè)零值字節(jié),而 NULL 為沒(méi)有值。 用 MySQL 處理數(shù)據(jù) ? 要在串中包括一個(gè)引號(hào),可有如下三種選擇: ? ■ 如果串是用相同的引號(hào)括起來(lái)的,那么在串中需要引號(hào)的地方雙寫(xiě)引號(hào)即可。如: ?I can ? ?t?。 “He said, “” I told you so.”””。 ? ■ 如果串是用另外的引號(hào)括起來(lái)的,則不需要雙寫(xiě)相應(yīng)引號(hào)。如: “I can?t” 。 ?He said, “I told you so.” ?。 ? ■ 用反斜杠方式表示;這種方法不去管用來(lái)將串括起的是單引號(hào)還是雙引號(hào)。如: ?I can\?t?。 “I cant\? t” ? 在串的環(huán)境中,可用十六進(jìn)制常數(shù)來(lái)指定串值。其語(yǔ)法與前面描述的數(shù)值值相同,但是每對(duì)十六進(jìn)制的數(shù)字都被看作 ASCII 代碼并轉(zhuǎn)換為字符,其結(jié)果用于串。例如, 0 x 6 1 6 2 6 3作為串時(shí)為 “ a b c”。 用 MySQL 處理數(shù)據(jù) ? 日期和時(shí)間值 ? 日期和時(shí)間是一些諸如 “ 1 9 9 9 0 6 1 7”或 “ 1 2 : 3 0 : 4 3”這樣的值。 MySQL 還支持日期 /時(shí)間的組合,如 “ 19990617 12:30:43”。要特別注意這樣一個(gè)事實(shí),即 MySQL 是按年 月 日的順序表示日期的。 MySQL 的初學(xué)者通常對(duì)這一點(diǎn)很驚奇,其實(shí)這是 ANSI SQL 的標(biāo)準(zhǔn)格式??梢岳?D AT E _ F O R M AT( ) 函數(shù)以任意形式顯示日期值,但是缺省顯示格式首先顯示年,而且輸入值也必須首先給出年。 ? NULL 值 ? NULL 是一種 “ 無(wú)類型 ” 的值。它過(guò)去慣常表示的意思是 “ 無(wú)值 ” 、 “ 未知值 ” 、 “ 丟失的值 ” 、 “ 溢出值 ” 以及 “ 沒(méi)有上述值 ” 等??蓪?NULL 值插入表中、從表中檢索它們