1. 選擇(Selection)作用於行! 選擇是單目運算,其運算對象是一個表。該運算按給定的條件,從表中選出滿足條件的行形成一個新表作為運算結果。 選擇運算的記號為sF(R)。其中s是選擇運算符,下標F是一個條件表達式,R是被操作的表。 若要在學生情況表中找出學生表中性別為女的行形成一個新表,則運算式為:sF(學生)F:性別=“女”,該選擇運算的結果如下: www.2cto.com 學 號 姓 名 專 業 名 性 別 出 生 日 期 總 學 分 備 注 081103 王燕 計算機 女 1989-10-06 50 2.投影(projection)作用於列! 投影也是單目運算,該運算從表中選出指定的屬性值組成一個新表,記為:?A(R)。其中A是屬性名(即列名)表,R是表名。 若在學生情況表中對學號、姓名和總學分投影,運算式為:?學號,姓名,總學分(學生)該運算得到如下: 學 號 姓 名 總 學 分 081101 王林 50 081102 程明 50 081103 王燕 50 3.連接(join) 連接是把兩個表中的行按照給定的條件進行拼接而形成新表,記為:RS。其中,R、S是被操作的表,F是條件。 兩個表連接最常用的條件是兩個表的某些列值相等,這樣的連接稱為等值連接。 數據庫應用中最常用的是“自然連接”。進行自然連接運算要求兩個表有共同屬性(列),自然連接運算的結果表是在參與操作兩個表的共同屬性上進行等值連接後再去除重復的屬性後所得的新表。自然連接運算記為:RS,其中R和S是參與運算的兩個表。 4.選擇列 基本查詢(單表查詢):select 列1,列2,。。。from 表名 1)看所有字段 :select * fromproduct; 2)部分字段(選擇指定的列): select 字段名1,字段名2 from product; 使用SELECT語句選擇一個表中的某些列,各列名之間要以逗號分隔 3)給列加列標題 當希望查詢結果中的某些列或所有列顯示時且使用自己選擇的列標題時,可以在列名之後使用AS子句來更改查詢結果的列別名。 字段名 [as] 列標題 如果列標題中有空格,要使用單引號,中括號內的內容都可以省略。 select pnumber as 產品編號,pname as 產品名稱 from product; 說明:不允許在where子句中使用列別名。這是因為,執行where代碼時,可能尚未確定列值。例如,下述查詢是非法的: SELECT 性別 ASSEX FROM XS WHERE SEX=0; 4)替換查詢結果中的數據 在對表進行查詢時,有時對所查詢的某些列希望得到的是一種概念而不是具體的數據。例如查詢XS表的總學分,所希望知道的是學習的總體情況,這時,就可以用等級來替換總學分的具體數字。 格式為: case when 條件1 then 表達式1 when 條件2 then 表達式2 …… www.2cto.com else 表達式 end case: 替換查詢中的結果(case是一行,所以中間打回車不用分號或逗號) 例1: select 學號,姓名,case when 性別=1then '男' when 性別=0then '女' end as 性別 from xs; 例2: select學號, 姓名, case when 總學分 isnull then '尚未選課' when 總學分 < 50 then '不及格' when總學分 >=50 and 總學分<=52 then '合格' else '優秀' (或者可以簡單的這麼寫:when總學分>52 then '優秀' when總學分 >=50 then '合格' else '不及格' 即:先寫大的後寫小的) end as等級 from XS www.2cto.com 5)計算列 使用select對列進行查詢時,在結果中可以輸出對列值計算後的值,即select字句可使用表達式作為結果。 計算列值使用算術運算符:+、-、*、/和%(取余)後面細講。 例1:select 學號,姓名,總學分+5 from xs;(字段總學分+5會顯示在列標題處) 例2:select 學號,課程號, 成績*1.20 as 成績 120 from XS_KC 5. 使用數據庫和表的主要目的是存儲數據以便在需要時進行檢索、統計或組織輸出,通過SQL語句的查詢可以從表或視圖中迅速方便地檢索數據。SQL的SELECT語句可以實現對表的選擇、投影及連接操作。 select語句(是SQL的核心)可以從一個或多個表中選取特定的行和列,結果通常是生成一個臨時表(即不會改變原來的表結構)。在執行過程中系統根據用戶的標准從數據庫中選出匹配的行和列,並將結果放到臨時的表中,這就是實現選擇和投影運算的一個形式。 6. 選擇行 where 條件 where子句會根據條件對from子句的中間結果中的行一行一行地進行判斷,當條件為true的時候,一行就被包含到where子句的中間結果中。 判定運算包括比較運算、模式匹配、范圍比較、空值比較和子查詢。 1). 比較運算 比較運算符用於比較兩個表達式值,MySQL支持的比較運算符有:=(等於)、<(小於)、<=(小於等於)、>(大於)、>=(大於等於)、<=>(相等或都等於空)、<>(不等於)、!=(不等於)。 比較運算的語法格式為: www.2cto.com expression { = | < | <= | > | >= | <=> |<> | != } expression 其中expression是除TEXT和BLOB外類型的表達式。 當兩個表達式值均不為空值(NULL)時,除了“<=>”運算符,其他比較運算返回邏輯值TRUE(真)或FALSE(假);而當兩個表達式值中有一個為空值或都為空值時,將返回unknown。 MySQL有一個特殊的等於運算符“<=>”,當兩個表達式彼此相等或都等於空值時,它的值為TRUE,其中有一個空值或都是非空值但不相等,這個條件就是FALSE。沒有UNKNOWN的情況。 例:查詢XS表中備注為空的同學的情況。 SELECT 姓名,學號,出生日期,總學分 FROM XS WHERE 備注<=>NULL; 2).邏輯運算符: and or not 例1: 計算機系女生記錄 表中女用0表示 select 姓名,專業名,性別 from xs where 專業名='計算機' and 性別=0 例2: 查看不是1990年出生的學生的姓名; select 姓名 fromxs where 出生日期<'1990-01-01'or 出生日期>'1990-12-31'; 或: select 姓名 fromxs where not(出生日期>='1990-01-01'and 出生日期<='1990-12-31'); 7. 模式匹配:模糊查詢 匹配符:% _ www.2cto.com %:任意多個任意字符 ; _:任意單個字符 like運算符: like運算符用於指出一個字符串是否與指定的字符串相匹配,其運算對象可以是char、varchar、text、datetime等類型的數據,返回邏輯值TRUE或FALSE。 使用LIKE進行模式匹配時,常使用特殊符號_和%,可進行模糊查詢。“%”代表0個或多個字符,“_”代表單個字符。 escape_character:轉義字符,escape_character沒有默認值,且必須為單個字符。當要匹配的字符串中含有與特殊符號(_和%)相同的字符時,此時應通過該字符前的轉義字符指明其為模式串中的一個匹配字符。使用關鍵字escape可指定轉義符。 由於MySQL默認不區分大小寫,要區分大小寫時需要更換字符集的校對規則。 例1:查詢XSCJ數據庫XS表中姓“王”的學生學號、姓名及性別。 SELECT 學號,姓名,性別 FROM XS WHERE 姓名 LIKE '王%'; 例2:name中倒數第二個字母是b的姓名 name like '%b_' 8. 如果我們想要查找特殊符號中的一個或全部(_和%),我們必須使用一個轉義字符。 例:查詢XS表中名字包含下畫線的學生學號和姓名。 SELECT 學號,姓名 FROM XS WHERE 學號 LIKE '%#_%' ESCAPE'#'; 說明:定義了“#”為轉義字符以後,語句中在“#”後面的“_”就失去了它原來特殊的意義。也可以不用“#”用其他任何符號。 9. regexp運算符(改運算符不是SQL標准的一部分。即也許在MySQL中能用,在sever SQl中卻用不了,跨平台性不高,所以慎用) www.2cto.com regexp運算符用來執行更復雜的字符串比較運算。regexp是正則表達式(regular expression)的縮寫。和LIKE運算符一樣,regexp運算符有多種功能,但它不是SQL標准的一部分,regexp運算符的一個同義詞是rlike。 語法格式: match_expression [ not ][ regexp | rlike] match_expression like運算符有兩個符號具有特殊的含義:“_”和“%”。而regexp運算符則有更多的符號有特殊的含義,參見下表: 特殊字符 含 義 特殊字符 含 義 ^ 匹配字符串的開始部分 [abc] 匹配方括號裡出現的字符串abc $ 匹配字符串的結束部分 [a-z] 匹配方括號裡出現的a~z之間的1個字符 . 匹配任何一個字符(包括回車和新行) [^a-z] 匹配方括號裡出現的不在a~z之間的1個字符 * 匹配星號之前的0個或多個字符任何序列 | www.2cto.com 匹配符號左邊或右邊出現的字符串 + 匹配加號之前的1個或多個字符的任何序列 [[. .]] 匹配方括號裡出現的符號(如空格、換行、括號、句號、冒號、加號、連字符等) ? 匹配問號之前0個或多個字符 [[:<:]和[[:>:]] 匹配一個單詞的開始和結束 {n} 匹配括號前的內容出現n次的序列 [[: :] 匹配方括號裡出現的字符中的任意一個字符 () 匹配括號裡的內容 10. where子句必須緊跟from子句之後,在where子句中,使用一個條件從from子句的中間結果中選取行。其基本格式為: where where_definition 其中,where_definition為查詢條件。語法格式為: where_definition: <precdicate> | <precdicate>{ and | or } <precdicate> | (where_definition) | not where_definition 其中,predicate為判定運算,結果為true、false或unknown。 <predicate>: expression { = | < | <= | > | >= | <=> | <> | !=} expression /*比較運算*/ | match_expression [ NOT ] like match_expression [ ESCAPE'escape_character ' ] /*like運算符*/ | match_expression [ NOT ][ regexp |rlike] match_expression /*regexp運算符*/ | expression [ not ] between expression and expression /*指定范圍*/ | expression is [ not ] null /*是否空值判斷*/ | expression [ not] in ( subquery | expression [,…n] ) /*in子句*/ | expression { = | <| <= | > | >= | <=> | <> | !=} {all | some | any} (subquery ) www.2cto.com /*比較子查詢*/ | exist ( subquery ) /*exist子查詢*/ 說明: In關鍵字既可以指定范圍,也可以表示子查詢。 在SQL中,返回邏輯值(TRUE或FALSE)的運算符或關鍵字都可稱為謂詞。 作者 tianyazaiheruan