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
留言
張貼留言