Oracle的where子句


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)
作者:碼農有道

如果文章有錯別字,或者內容有錯誤,或其他的建議和意見,請您留言指正,非常感謝!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM