Oracle資料庫培訓課程_L6-2_SQL查詢(限制查詢)_關係運算符_邏輯運算符_範圍運算符_空判斷_IN操作符_LIKE操作符


SELECT [DISTINCT] * | 列[別名] , 列[別名] , ........   ------>    Step3.  選出所需資料列

FROM 表名稱 [別名]                ------>    Step1.  確定資料來源

[WHERE 限定條件(s)]    -----> 非必要語法 , 條件可多個 ------>    Step2.  限定查詢條件


關係運算:  > , = , < , <= , >= , != (<>);
範圍運算: BETWEEN ..... AND;
空判斷: IS NULL , IS NOT NULL;
IN 判斷: IN , NOT IN , exists()   (複雜查詢)
模糊查詢: LIKE , NOT LIKE


以上限定語法符號只能夠判斷一次,如果現在有若干個限定符號,

那必須進行若干個限定語法符號連接

使用邏輯運算(AND , OR , NOT )


1.關係運算符(比大小)

Ex : 查詢工資低於1200的僱員(不包含1200)

寫法一、 直接整串寫(非常熟)

select * from emp where sal <1200;



寫法二、分布寫



1
2
3
select *
from emp
where sal < 1200;




Ex: 查詢  工資是 3000 的 土豪



此外 = 也可在 字串上使用


Ex: 查詢 Smith 的 職員資訊


1
2
3
select *
from emp
where ename='SMITH'





在 Oracle 資料庫中  資料內容是區分大小寫的!!!!


對於不等於判斷   有兩種符號 :   !=  、 <> 。

Ex: 查詢 職位不是辦事員(職位是job字串、辦事員之職位名稱為CLERK)

!=

1
2
3
select *
from emp
where job!='CLERK'

<>


1
2
3
select *
from emp
where job<>'CLERK'




2.邏輯運算符(連接多個條件)

2-1 AND用法:

Ex:查詢出非辦事員且工資低於3000的僱員資訊

第一條件    非辦事員         :   job<>'CLERK'

第二條件    工資低於3000 :  sal<3000

皆滿足(AND)


1
2
3
select *
from emp
where job<>'CLERK' AND sal<3000;





Ex:查詢出職位非辦事員也非銷售員之資訊

第一條件    非辦事員         :   job<>'CLERK'

第二條件    非銷售員          :  job<>'SALESMAN'

皆滿足(AND)


1
2
3
select *
from emp
where job<>'CLERK' AND job<>'SALESMAN';



2-2 OR用法:

Ex: 查詢出職位是辦事員或者工資低於1200的所有雇員


第一條件    職位是辦事員     :   job='CLERK'

第二條件    工資低於1200     :  sal<1200

滿足一個即可(OR)



1
2
3
select *
from emp
where job = 'CLERK' OR sal<1200;




2-3 NOT 用法:



1
2
3
select *
from emp
where NOT sal > 2000;

意思變為  工資小於等於 2000



3.範圍運算符(BETWEEN...AND)


WHERE 字串|數值  BETWEEN  最小值  AND 最大值

Ex: 查詢 工資在 1500到3000之間的所有雇員

第一種方法 用 邏輯運算+關係運算
(效率低)

1
2
3
select *
from emp
where sal >= 1500 AND sal <= 3000;




第二種方法  用 BETWEEN...AND(只用一個運算符)  效率更高

1
2
3
select *
from emp
where sal BETWEEN 1500 AND 3000;




在Oracle中所有運算符皆不受資料類型控制

在之前使用的是數字進行判斷 ,除了用數字還可用字串or日期進行判斷!!

重點通常在  日期判斷


Ex: 查詢所有在  1981年  雇員的資訊

範圍在  1981  1/1  ~  1981  12/31

(此時可按照已有的數據結構透過字串來描述日期)--->和資料自動轉型有關!!!!

日  月    年
20-2月  -81
09-6月  -81

1981年  1月1號 表示方法

'01-1月-81'

'31-12月-81'

這是一種寫法

但是這到底是指1981還是2081????  傻傻分不清
這裡81預設是指1981 的 81

當然為了明確 我們也可改為下面寫法

'01-1月-1981'

'31-12月-1981'


千年蟲(2000年問題)
https://zh.wikipedia.org/wiki/2000%E5%B9%B4%E9%97%AE%E9%A2%98


套用剛剛的 範圍運算字符


1
2
3
select *
from emp
where hiredate BETWEEN '01-1月-1981'AND '31-12月-1981';



Ex:  員工姓名範圍(以第一個字元 'A' 到 'C')為範圍



1
2
3
select *
from emp
where ename BETWEEN 'ALLEN' AND 'CLERK';






4.空(NULL)判斷

NULL  --->  從資料庫定義上屬於一個未知數據

任何情況下如果任何一個數字與空進行計算結果還是空


在某些資料列上是允許存在有NULL值的,但是對於NULL不能夠使用關係運算判斷。

NULL 不是 空字串  也不是數字0

因此在SQL中   只能夠透過  IS  NULL 來判斷為空

以及 IS NOT NULL(NOT 字串 IS NULL) 判斷不為空

Ex: 查詢出所有領取傭金的僱員資訊

(comm字串代表傭金,若有領取傭金,意思就是 comm欄位內容非NULL)



1
2
3
select *
from emp
where comm IS NOT NULL;




0 是存在的    NULL  非指 0 的意思



5.IN操作符(核心 ---> 非常常用)

指的是根據一個指定範圍進行資料查詢。

Ex: 查詢一個雇員編號為 7369 、 7566 、 7788 、 9999 的僱員資訊

第一種方法 利用關係運算符進行操作(OR)


1
2
3
select *
from emp
where empno=7369 OR empno=7566 OR empno=7788 OR empno=9999;


沒有9999的僱員  因此最終指返回三列資料

以上方法執行了四次判斷 ,性能較差。

因此面對範圍可以使用IN操作

第二種方法  IN


1
2
3
select *
from emp
where empno IN(7369,7566,7788,9999);



寫法短 性能也好



---->但是此處必須特別注意

在使用IN操作時 ,實際上也可以用 NOT IN,

表示不在範圍之中。





問題從  NOT IN 開始了.....

在使用 NOT IN 時候  若查找之資料範圍包含有空值
那就不會有任何查詢結果返回,IN操作無此限制。

Ex: 觀察IN操作中出現NULL       ---> 沒問題
1
2
3
select *
from emp
where empno IN(7369,7566,7788,null);

      觀察NOT IN操作中出現NULL ---> 出問題了!!!!!

1
2
3
select *
from emp
where empno NOT IN(7369,7566,7788,null);

NOT IN 不能有空!!!!





6.LIKE操作符/模糊查詢(核心 ---> 非常常用)

LIKE 可實踐資料中的模糊查詢操作,如果要用LIKE則必須使用以下兩個匹配符

(1) "_" : 匹配任意一位符號

(2)"%" : 匹配任意的符號(包含匹配 0位、1位、多位)

Ex: 查詢所有雇員姓名中以字母A開頭之雇員資訊

(tips: 字串  用  單引號 表示)

第一個字母A固定,其餘內容隨意。


1
2
3
select *
from emp
where ename LIKE 'A%';







Ex: 查詢所有雇員姓名中第二個字母是M之雇員資訊

第一位可任意但必須占一位  --> 使用 "_"

後面位子隨意  --> 使用 "%"



1
2
3
select *
from emp
where ename LIKE '_M%';





Ex: 查詢所有雇員姓名中任意位置上存在有A之雇員資訊

開頭、結尾、中間都能有A

使用 "%A%"




(1).如果在使用LIKE 進行限定查詢 未設置任何關鍵字則代表查詢全部


1
2
3
select *
from emp
where ename LIKE '%%';


其結果和直接 select * from emp; 一樣

有where限定必會有效能問題


(2).LIKE可在任意資料類型上使用(原生支持)


雖然所有資料類型皆支持LIKE
但較常用於   字串!!!

所見到大部分系統搜索功能 會用 LIKE 語句

但不包含搜索引擎不用LIKE















留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header