where子句用於從表中或臨時數據集中查找滿足指定條件的記錄,可用於select、update和delete語句中的條件。
一、生成測試數據
用以下SQL創建超女基本信息表(T_GIRL),插入一些測試數據。
create table T_GIRL
(
id char(4) not null, -- 編號
name varchar2(10) not null, -- 姓名
yz varchar2(10) null, -- 顏值
sc varchar2(10) null, -- 身材
weight number(4,1) not null, -- 體重
height number(3) not null, -- 身高
birthday date not null, -- 出生時間
memo varchar2(1000) null -- 備注
);
insert into T_GIRL(id,name,yz,birthday,sc,weight,height,memo)
values('0101','西施','漂亮',to_date('2000-01-01 01:12:35','yyyy-mm-dd hh24:mi:ss'),
'火辣',48.5,170,'這是一個非常漂亮姑娘,老公是夫差,男朋友是范蠡。');
insert into T_GIRL(id,name,yz,birthday,sc,weight,height,memo)
values('0102','貂禪','漂亮',to_date('1997-08-02 12:20:38','yyyy-mm-dd hh24:mi:ss'),
'苗條',45.2,168,'王允真不是男人,干不過董卓就把美人往火坑里推,千古罪人啊。');
insert into T_GIRL(id,name,yz,birthday,sc,weight,height,memo)
values('0103','妲已','漂亮',to_date('1998-03-03 10:50:33','yyyy-mm-dd hh24:mi:ss'),
'火辣',53.6,172,'如果商真的因我而亡,你們男人做什么去了?');
insert into T_GIRL(id,name,yz,birthday,sc,weight,height,memo)
values('0104','芙蓉姐姐','豬扒',to_date('1980-05-05 10:11:55','yyyy-mm-dd hh24:mi:ss'),
'膘肥體壯',85.8,166,'如果不努力學習技術,將來就會娶個芙蓉姐姐,哼哼。');
insert into T_GIRL(id,name,yz,birthday,sc,weight,height,memo)
values('0105','神密貓女',null,to_date('1989-12-08 12:10:35','yyyy-mm-dd hh24:mi:ss'),
null,48.5,171,'不知道是什么人,她臉上有一個%符號,很神密。');
二、where子句的語法
select 字段名1,字段名2,......字段名n from 表名 where 字段名 比較運算符 值;
select * from 表名 where 字段名 比較運算符 值;
示例:
select id,name,yz,sc,height from T_GIRL where id='0101';
select id,name,yz,sc,height from T_GIRL where height=172;
以上的示例展示了where子句最簡單的用法,接下來我再介紹Oracle的邏輯運算符和比較運算符,以增強where子句的功能。
三、邏輯運算符
運算符 | 備注 |
---|---|
and | 雙值運算符,如果左右兩個條件都為真,則得到的值就為真。 |
or | 雙值運算符,只要左右兩個條件有一個為真,則得到的值就為真。 |
not | 單指運算符,如果原條件為真,則得到真,如果元條件為假,反之如果原條件為假,則結果為真。not一般比較運算符中的in、like、null一起使用。 |
邏輯運算符有優先級,但我不想介紹它,在實際應用中,用括號解決全部的優先級問題。
示例:
select name,yz,sc,height from T_GIRL where yz='漂亮' and sc='火辣';
select name,yz,sc,height from T_GIRL where yz='漂亮' and (sc='火辣' or sc='苗條');
看看not的效果,但是很少這么用。
四、比較運算符
注意幾個問題:
1)比較運算符都可以和not一起使用,但是在實際應用中,in、like和is null與not結合很常用,其它的比較運算符很少與not結合使用,感覺別扭。
2)使用like的時候,用百分號%匹配多個字符,下划線_匹配一個字符,但是如果我們希望把%和_當成普通字符,可以采用轉義字符的方法,轉義字符的用法如下:
在C語言中,采用反斜線\轉義,在Oracle中,用escape關鍵字定義轉義符。
escape 'chr'定義轉義字符,當轉義符置於通配符之前時,該通配符就解釋為普通字符,例如:
select * from T_GIRL where memo like '%人%/%%' escape '/';
第一、第二和第四個%作為通配符,第三個%是普通字符。
五、where子句的高級用法
where子句條件的值可以是常量(固定的值)或表達式,也可以是函數的返回值或select語句的結果集。
如果是in比較運算符,條件的值可以是多行的結果集,其它的比較運算符必須是單行記錄的結果集。
1)條件的值是表達式。
select name,yz,sc,height from T_GIRL where height>100+68;
2)條件的值是函數和表達式。
select name,yz,sc,height from T_GIRL where birthday>sysdate-(30*365);
3)條件的值是單行的結果集
select empno,ename,job,sal from EMP
where deptno=(select deptno from DEPT where dname='ACCOUNTING');
如果條件的值是多行,在邏輯上存在問題,將提示錯誤。
4)比較運算符in后面條件的值支持多行的結果集。
六、對where子句的列使用運算和函數
在where子句中,對列可以進行運算和使用函數。
1、對列進行運算
select id,name,height from T_GIRL where height-170>0;
2、對列使用函數
select id,name,to_char(birthday,'yyyy-mm-dd hh24:mi:ss') from T_GIRL
where to_char(birthday,'yyyy-mm-dd hh24:mi:ss')='1998-03-03 10:50:33';
3、存在的問題
以上第一個SQL對height列進行了運算,第二個SQL是對birthday列使用了to_char函數,這兩種寫法得零分。因為在where子句中,如果對列使用函數或運算,SQL語句的無法利用索引(函數索引除外),性能很低(采用了table scan),程序員一定不能犯這種低級錯誤。
正確的寫法是對條件的值進行運算或使用函數,如下:
select id,name,height from T_GIRL where height>170;
select id,name,to_char(birthday,'yyyy-mm-dd hh24:mi:ss') from T_GIRL
where birthday=to_date('1998-03-03 10:50:33','yyyy-mm-dd hh24:mi:ss');
補充說明一下,對select關鍵字后的列名進行運算和使用函數對SQL語句的性能沒有任何影響。
七、版權聲明
C語言技術網原創文章,轉載請說明文章的來源、作者和原文的鏈接。
來源:C語言技術網(www.freecplus.net)
作者:碼農有道
如果文章有錯別字,或者內容有錯誤,或其他的建議和意見,請您留言指正,非常感謝!!!