【正文】
許多行,但您只想看其中的幾行,則可以利用LIMIT 子句,特別是與 ORDER BY 子句結(jié)合時更是如此。 ? LIMIT 也可以從查詢結(jié)果中取出中間部分。第一個值為結(jié)果中希望看到的第一個記錄(第一個結(jié)果記錄的編號為 0 而不是 1)。下面的查詢類似于前面那個查詢,但只顯示從第 11 行開始的5 個記錄 : ? Select last_name, first_name,birth from president order by birth limit 10,5。例如,利用 ORDER BYRAND( ) 與 LIMIT 結(jié)合,從 president 表中隨機抽取一個記錄 ? Select last_name,first_name from president order by rand() limit 1。 MySQL 還允許作為一個公式的結(jié)果來計算輸出列的值。下面的查詢求一個簡單表達式的值(常量)以及一個涉及幾個算術(shù)運算符和兩個函數(shù)調(diào)用的較復(fù)雜的表達式的值: ? Select 17,format(SQRT(3*3+4*4)。 ? 此查詢把名和姓連接起來,中間間隔一個空格,將總統(tǒng)名形成一個單一字符串,而且將出生城市和州連接在一起,中間隔一個逗號,形成出生地。如果表達式很長(如前面的一些查詢樣例中那樣),那么可能會出現(xiàn)一個很寬的列。這樣的名稱為列別名。 使用日期 ? 在 MySQL 中使用日期時要記住的是,在表示日期時首先給出年份。 MySQL 提供了幾種對日期進行處理的方法。(這點我們已經(jīng)看到幾次了。 ? ■ 提取日期值的組成部分,如年、月或日。 ? ■ 日期增加或減去一個間隔得出另一日期。 ? 為了測試或檢索日期的成分,可使用諸如 YEAR( )、 MONTH( ) 或 D AYOFMONTH( ) 這樣的函數(shù)。 ? 為了更詳細,詳細到天,可組合測試 MONTH( ) 和 D AYOFMONTH( ) 以找出在確定生日出生的總統(tǒng) ? Select last_name, first_name, birth from president where month(birth)=3 and dayofmonth(birth)=29。但是,不必按前面的查詢那樣插入一個特殊的日期。這樣可以知道日期間的間隔,這對于確定年齡是非常有用的。為此,可利用函數(shù) TO _ D AYS( ) 將出生日期和逝世日期轉(zhuǎn)換為天數(shù),求出差,然后除以 365 得出大概的年齡 : ? Select last_name,first_name,birth,death,floor((to_days(death)to_days(birth))/365) as age from president where death is not null order by age desc limit 5。這些函數(shù)取一個日期及時間間隔并產(chǎn)生一個新日期 ? Select date_add(“197011”, interval 10 year)。這樣,可以選擇記錄而不用提供精確的值。字符“ _”匹配任意單個字符,而 “ %”匹配任意字符序列(包括空序列)。下列模式匹配以 “ W”或 “ w”開始的姓: ? Select last_name,first_name from prisident where last_name like “W%”。 ? MySQL 還提供基于擴展正則表達式的模式匹配。匯總的一種簡單的形式是確定在一組值中哪些值是唯一值。例如,總統(tǒng)出生的各個州可按如下找出: ? Select distinct state from president order by state。如果使用 COUNT (*),它將給出查詢所選擇的行數(shù)。 ? Select count(*) from president。下面的查詢給出目前為止對班級進行了多少次測試: ? Select count(*) from event where type=?Q?。而 COUNT(col_name) 只對非 NULL 值進行計數(shù) ? Select count(*),count(suffix),count(death) from president。 ? Select count(distinct state) from president。例如,您可能根據(jù)下列的查詢結(jié)果知道班級中所有學(xué)生的人數(shù): ? Select count(*) from student。 ? Select count(*) from student where sex=?m?。因此,針對學(xué)生表可以按如下得出男孩和女孩的人數(shù): ? Select sex, count(*) from student group by sex。 ■ 不用編寫多個查詢,只需編寫單個查詢即可。 生成匯總 ? 前兩個優(yōu)點對于更方便地表示查詢很重要。在使用 GROUP BY 子句時,其結(jié)果是在要分組的列上進行排序的,但是可以使用 ORDER BY 來按不同的次序進行排序。 ? 如果增加、刪除或重新排序輸出列,必須注意檢查 O R D E R BY 子句,并且如果列號改變后還得記住它。如果想與計算出來的列一道使用 GROUP BY,正如 ORDER BY 一樣,應(yīng)該利用別名或列位置來引用它。別名就不存在這種問題。 ? COUNT( ) 可與 ORDER BY 和 LIMIT 組合來查找 president 表中 4 個產(chǎn)生總統(tǒng)多的州: ? Select state, count(*) as count from president group by state order by count desc limit 4。 ? Select state,count(*) as count from president group by state having count 1 order by conut desc。 H AVING 類似于 W H E R E,但它是在查詢結(jié)果已經(jīng)選出后才應(yīng)用的,用來縮減服務(wù)器實際送到客戶機的結(jié)果。 MIN( )、 MAX( )、 SUM( ) 和 AVG( ) 函數(shù)在確定列的最大、最小、總數(shù)和平均值時都非常有用,甚至可以同時使用它們 ? Select event_id min(score) as minimum,max(score) as maximum, max(score)min(score)+1 as range, sum(score) as total, avg(score) as average,count(score) as count from score group by event_id。 ? 在從多個表中選擇信息時,需要執(zhí)行一種稱為連接( j o i n)的操作。即通過協(xié)調(diào)各表中的值來完成這項工作。 ? 此查詢找出具有給定日期的記錄,然后利用該記錄中的事件 ID 查找具有相同事件 ID 的學(xué)分 ? 此查詢在兩個重要方面不同于我們曾經(jīng)編寫過的其他查詢。但是,一般在連接中我們對每個列都進行限定以便清晰地表示出每個列是屬于哪個表。 ? 名字顯示是利用 score 表和 student 表兩者都具有 student_id 列,使它們中的記錄可被連接這個事實來完成的。 ■ student_id 列現(xiàn)在不明確了(因為現(xiàn)在有兩個引用到的表都含有此列),因此必須限定 為 或 以表明使用的是哪個表。 ■ 此查詢是顯示學(xué)生名而不是學(xué)生 I D。) 從多個表中檢索信息 ? LEFT JOIN ? 要求 MySQL 對從連接首先給出的表中選擇每行生成一個輸出行(即LEFT JOIN 關(guān)鍵字左邊給出的表) 刪除或更新現(xiàn)有記錄 有時,希望除去某些記錄或更改它們的內(nèi)容。 DELETE 語句有如下格式: DELETE FROM t b l _ n a m e WHERE 要刪除的記錄 WHERE 子句指定哪些記錄應(yīng)該刪除。這意味著最簡單的 DELETE 語句也是最危險的。一定要當心! Delete from tbl_name 為了刪除特定的記錄,可用 WHERE 子句來選擇所要刪除的記錄。 DELETE 語句中的 WHERE 子句的一個限制是只能夠引用要刪除記錄的表中的列。 下面的查詢將每個學(xué)生的名字都更改為 “ Gee”: Update student set name=“Gee”。 正如 DELETE 語句一樣,對于 U P D AT E,用 SELECT 語句測試 WHERE 子句以確保選擇 正確的更新記錄是一個好辦法。 改變表的結(jié)構(gòu) ? 要用 A LTER TA B L E,可以對表重新命名,增加或刪除列,更改列的類型等等 ? Alter table member add member_id int unsigned not null auto_increment primary key。運行一個程序需要做很多輸入工作,這很快就會讓人厭煩。 ? ■ 利用外殼程序的命令歷史重復(fù)命令。 與 mysql 交互的技巧 ? 利用選項文件 ? 自版本 以來, MySQL 允許在一個選項文件中存儲連接參數(shù)。這些參數(shù)也可以為其他 MySQL 客戶機所用,如為 mysqlimport 所用。為了利用選項文件方法指定連接參數(shù),可建立一個名為 ~ / . m (即主目錄中的一個名為 . m 的文件)。文件的內(nèi)容所下所示 : ? [client] host=serverhost user=yourname password=yourpass ? [client] 行標記客戶機選項組的開始;它后跟的所有行都是為 MySQL 客戶機程序獲得選項值準備的,這些行一直沿續(xù)到文件的結(jié)尾或另一不同的參數(shù)組的開始。只有 [client] 行是必須的。并設(shè)置訪問權(quán)限。 ? 利用外殼程序的命令歷史 諸如 c s h、 tcsh 和 bash 這樣的外殼程序會在一個歷史列表中記下您的命令,并允許重復(fù)該列表中的命令。例如,如果最近調(diào)用了 m y s q l,可按如下命令再次執(zhí)行它: ? % !my ? 其中 “ ! ” 告訴外殼程序搜索整個命令歷史找到最近以 “ m y”開頭的命令,并像您打入的一樣發(fā)布它。可用這種方法選擇想要的命令,然后按 Enter 執(zhí)行它。例如,在csh 或 tcsh 中,可利用 alias 命令設(shè)置名為samp_db 的別名,如下所示: ? Alias samp_db ?mysql –h localhost –u root –p samp_db? ? 而 bash 中的語法稍有不同: ? Alias samp_db=?mysql –h localhost –u root –p samp_db? 與 mysql 交互的技巧 以較少的鍵入發(fā)布查詢 mysql 是一個與數(shù)據(jù)庫進行交互的極為有用的程序,但是其界面最適合于簡短的、單行的查詢。輸入一條查詢也不是很有趣的事,即使是一條較短的查詢也是如此,除非發(fā)現(xiàn)有錯誤才愿意重新鍵入它。 ■ 利用拷貝和粘貼。 ■ 利用現(xiàn)有數(shù)據(jù)來創(chuàng)建新記錄以避免鍵入 I N S E RT 語句??梢詫Ξ斍颁浫氲男羞M行處理,或調(diào)出以前輸入的行并重新執(zhí)行它們(原樣執(zhí)行或做進一步的修改后執(zhí)行)。如果錄入了一個有錯的查詢,那么可以調(diào)用該查詢并對其進行編輯以解決問題,然后再重新提交它。) 與 mysql 交互的技巧 用 MySQL 處理數(shù)據(jù) M y S Q L在處理這些數(shù)據(jù)類型時所出現(xiàn)的問題,主要內(nèi)容如下: ■ 通用數(shù)據(jù)類型,包括 NULL 值。有些列類型是相當常見的,如 CHAR 串類型。 ■ 恰當?shù)剡x擇表的列類型。 ■ 表達式求值規(guī)則。表達式求值的規(guī)則包括類型轉(zhuǎn)換規(guī)則,在一種類型的值用于另一類型的值的情況時需用到類型轉(zhuǎn)換規(guī)則。 MySQL 支持說明為整數(shù)(無小數(shù)部分)或浮點數(shù)(有小數(shù)部分)的值。整數(shù)由數(shù)字序列組成。例如, 0x0a 為十進制的 1 0,而 0 x ffff 為十進制的 6 5 5 3 5。即 0x0a 和 0x0A 都是合法的,但0X0a 和 0X0A 不是合法的。兩個阿拉伯數(shù)字序列可以分別為空,但不能同時為空。科學(xué)表示法由整數(shù)或浮點數(shù)后跟 “ e”或 “ E”、一個符號( “ +”或 “ ”)和一個整數(shù)指數(shù)來表示。而 不是合法的,因為指數(shù)前的符號未給出。 ? 數(shù)值前可放一個負號 “ ”以表示負值。既可用單引號也可用雙引號將串值括起來。每個序列以一個反斜杠( “ \”)開始,指出臨時不同于通常的字符解釋。 用 MySQL 處理數(shù)據(jù) ? 要在串中包括一個引號,可有如下三種選擇: ? ■ 如果串是用相同的引號括起來的,那么在串中需要引號的地方雙寫引號即可。 “He said, “” I told you so.”””。如: “I can?t” 。 ? ■ 用反斜杠方式表示;這種方法不去管用來將串括起的是單引號還是雙引號。 “I cant\? t” ? 在串的環(huán)境中,可用十六進制常數(shù)來指定串值。例如, 0 x 6 1 6 2 6 3作為串時為 “ a b c”。 MySQL 還支持日期 /時間的組合,如 “ 19990617 12:30:43”。 My