where子句和having子句主要是用來篩選符合條件的元組,其後緊跟的即為條件表達式。
0.and, or條件的連接
用法和一般編程語言一樣,主要用於條件的拼接。and兩邊都為真,則結果為真。or兩邊只要一個為真,則結果為真。
如果,where子句需要3個或者更多的條件,且同時使用了and和or操作符,那麼應該用圓括號來明確意圖,以便數據庫或者日後自己或他人能夠理解代碼,增強可讀性。如:
select emp_id from employee where end_date is null and (title='Teller' or start_date<'2007-01-01');
1.not條件的否定
not即為非運算,它使條件取反。
2.相等條件
形式為‘column=expression',例如:
這些條件被成為相等條件,因為它們將一個表達式等於另一個表達式。
select pt.name product_type, p.name product from product p inner join product_type pt on p.product_type_cd = pt.product_type_cd where pt.name = 'Customer Accounts';
選出name為Customer Accounts的產品。
3.不等條件
這個是用來判斷兩個表達式不相等的。操作符為'<>'或'!='。例如,選取name不為Customer Accounts的產品:
select pt.name product_type, p.name product from product p inner join product_type pt on p.product_type_cd = pt.product_type_cd where pt.name <> 'Customer Accounts';
4.范圍條件
常見的能夠表示范圍的有:<, >, <=, >=, between...and...。重點說明的是between...and...,所選條件包括符合兩個端點的元組(范圍上下限閉合),並且一定要確定好上下界,下限在between後面,上限在and後面,錯誤的使用將造成問題,這是因為between...and...在數據庫執行時被轉化為<=和>=兩個操作條件。如:
正確使用:
而錯誤的使用:
這裡數據庫實際執行的是一下語句:
select emp_id, fname, lname, start_date from employee where start_date >= '2007-01-01' and start_date <= '2005-01-01';
因為不存在某個日期大於2007-01-01,卻又小於2005-01-01,所以結果當然是空值。
對於數字或者日期的范圍,結果能夠很輕易的看出來,但是對於一般字符串的范圍,結果就不那麼容易了,必需知道所使用字符集中個字符的字典順序。
5.成員條件
對於一個條件:where product_cd = 'CHK' or product_cd='SAV' or product_cd='CD' or product_cd='MM';顯然這樣書寫非常麻煩,這裡僅僅包含了4個條件,但當條件有幾十個的話,這樣的書寫非常令人乏味。這時可以使用in操作符。上面的可以寫成:
select account_id, product_cd, cust_id, avail_balance from account where product_cd in ('CHK', 'SAV', 'CD', 'MM');
產生的效果,和第一種是相同的,但簡便了許多。
6.匹配條件
通常情況下,經常使用通配符去進行匹配操作。對於SQL提供的一些內置函數雖然可以完成任務,但靈活性相對差一些。通配符如下:
select lname from employee where lname like '_a%e%';
這段代碼的目的是從employee表中,選取lname中第一個字符為任意,第二個必須為a和e可以出現在後面任意位置的lname。
還有一種是通過正則表達式,以後學習。感覺路好長啊。。。。