sql第二天
條件查詢
條件查詢
語法:
SELECT COLUMN1,COLUMN2,COLUMN3 FROM TABLE_NAME WHERE CONDITION;
應用:查詢工資大於500的員工資訊
SELECT * FROM EMP WHERE SAL>500;
→
返回了14條資料
SELECT EMPNO,ENAME,SAL S,JOB FROM EMP WHERE S=800--報錯,識別符號S無效
→條件裡不要用別名
思考:
字串可不可以比較?
可以比較
比如:
SELECT EMPNO,ENAME,SAL,JOB FROM EMP WHERE ENAME>'SMITH';--可執行且有結果
比較的依據是ASCII碼
ASCII(N)--求字元N的ASCII碼值
含有多個字元時,返回首個字元的ASCII碼值
CHR(76)--求ASCII碼值76對應的字元
日期可不可以比較?
可以
SELECT * FROM EMP WHERE HIREDATE='1980/12/17';--報錯:型別不匹配
正解↓
SELECT * FROM EMP WHERE HIREDATE=TO_DATE('1980/12/17','YYYY/MM/DD' );
注意:字串要記得加單引號
日期的比較需要用到幾個函式:
TO_DATE(日期字串,日期格式):將輸入的字串形式的日期轉換成日期格式的日期
日期格式:
年YYYY月MM日DD
應用:
SELECT TO_DATE('1980/12/17','YYYY/MM/DD') FROM DUAL;
←
將1980/12/17這個字串轉化為一個YYYY/MM/DD格式的日期
SELECT * FROM EMP WHERE HIREDATE=TO_DATE('1980/12/17','YYYY/MM/DD');
←
找到僱用日期為1980年12月17日的員工
TO_CHAR(日期字串,日期格式)
應用:
尋找僱用日期早於當前系統時間的員工→
SELECT * FROM EMP WHERE HIREDATE<TO_DATE(TO_CHAR(SYSDATE,'YYYY/MM/DD'),'YYYY/MM/DD');
SELECT * FROM EMP WHERE TO_CHAR(HIREDATE,'YYYY/MM/DD')='1980/12/17';
←
找到僱用日期為1980年12月17日的員工
SYSDATE:當前電腦的系統時間
日期格式按照系統格式去顯示,系統設定在首選項裡設定
包含查詢
語法:
SELECT COLUMN1,COLUMN2,COLUMN3 FROM TABLE_NAME WHERE COLUMN1 BETWEEN VALUE1 AND VALUE2;
VALUE1<VALUE2
BETWEEN A AND B:在A和B之間的資料(包含A 和B),多用於資料比較,[A,B]
應用:
查詢工資在800到1500之間的員工資訊
→
SELECT * FROM EMP WHERE SAL BETWEEN 800 AND 1500 ;
SELECT * FROM EMP WHERE ENAME BETWEEN 'S' AND 'W';--這樣情況下也可以查詢
→
空值判斷
語法:
SELECT COLUMN1,COLUMN2.COLUMN3 FROM TABLE_NAME WHERE COLUMN1 IS NULL;
SELECT COLUMN1,COLUMN2.COLUMN3 FROM TABLE_NAME WHERE COLUMN1 IS NOT NULL;
如何判斷一個列的值是不是空的?
SELECT EMPNO,ENAME,SAL,JOB FROM EMP WHERE SAL<>NULL;
↑這個方法可以嗎?
注意:
- 空值判斷比較恆不成立
- 空值參與運算恆為空
- 空值參與比較,條件恆不成立
SELECT * FROM EMP WHERE COMM IS NULL;
去空查詢:
去空值函式
NVL(COLUMN1,VALUE1):判斷COLUMN1一列是否為空,如果為空,將其值設為VALUE1,否則不動
NVL2(COLUMN1,VALUE1,VALUE2):判斷COLUMN1一列是否為空,如果為空,將其值設為VALUE2,否則將其設定為VALUE1
去空查詢:
SELECT COMM,NVL(COMM,0) FROM EMP;
SELECT COMM,NVL2(COMM,0,100) FROM EMP;
應用:
定義一個員工一年的全部所得叫做年薪,查詢所有人的員工編號,工資,職位,員工姓名和年薪
→
SELECT EMPNO,ENAME,JOB,SAL,12*SAL+NVL(COMM,0) AS "年薪" FROM EMP;
↑此處要去空
布林連線(and、or)
AND OR
AND:用來連線多個條件的,當且僅當全部條件都滿足時返回資料
語法:
SELECT COLUMN1,COLUMN2...
FROM TANLE_NAME
AND CONDITION1...
AND CONDITION2
;
應用:
查詢20號部門SMITH的其他資訊
→
SELECT EMPNO,JOB,SAL,COMM,HIREDATE,MGR FROM EMP WHERE ENAME='SMITH' AND DEPTNO=20
應用:查詢SAL>800且是30號員工部門的員工資訊
→
SELECT * FROM EMP WHERE SAL>800 AND DEPTNO=30;
應用:查詢年收入大於5000且工種是MANAGER 的員工姓名,月收入和部門編號,並以其中文顯示
→
SELECT ENAME "員工姓名",SAL "工資",DEPTNO "部門編號" FROM EMP WHERE 12*SAL+NVL(COMM,0)>5000 AND JOB='MANAGER';
OR:用來連線多個條件的,當任一條件滿足時返回資料
語法:
SELECT COLUMN1,COLUMN2...
FROM TANLE_NAME
OR CONDITION1...
OR CONDITION2
;
應用:查詢工資大於2000或者等於1500的員工的資訊
→
SELECT * FROM EMP WHERE SAL>2000 OR SAL=1500;
查詢工資大於2000或者部門編號等於20的員工資訊
→
SELECT * FROM EMP WHERE SAL>2000 OR DEPTNO=20;
查詢工種為MANAGER和CLERK的員工的姓名,工資,工作列資訊
→
SELECT ENAME,SAL,JOB FROM EMP WHERE JOB='MANAGER' OR JOB='CLERK';
查詢有獎金且薪金大於1250,或者無獎金且薪金小於200的員工員工編號,姓名,工資,工作列資訊
→
SELECT EMPNO,ENAME,SAL,JOB FROM EMP WHERE SAL>1250 AND COMM IS NOT NULL OR SAL<2000 AND COMM IS NULL;
AND優先順序高於OR
查詢20號部門或者30號部門薪金大於1500且有獎金 或者 10或20號部門薪金小於2000且無獎金的員工員工編號,姓名,工資,工作列資訊
→
SELECT EMPNO,ENAME,SAL,JOB FROM EMP WHERE (DEPTNO=20 OR DEPTNO=30) AND SAL>1500 AND COMM IS NOT NULL OR (DEPTNO=10 OR DEPTNO=20) AND SAL<2000 AND COMM IS NULL;
IN查詢
IN /NOT IN
語法1:SELECT COLUMN1,COLUMN2,COLUMN3 FROM TABLE_NAME WHERE COLUMN1 IN(VALUE1);
語法2:SELECT COLUMN1,COLUMN2,COLUMN3 FROM TABLE_NAME WHERE COLUMN1 NOT IN(VALUE1);
語法3:SELECT COLUMN1,COLUMN2,COLUMN3 FROM TABLE_NAME WHERE (COLUMN1,COLUMN2) NOT IN((VALUE1,VALUE2),(VALUE3,VALUE4)...);
VALUE 只能是數字嗎?
應用:查詢工資為800、1250、1600的員工的員工編號、員工姓名、薪資、職業
→
SELECT EMPNO,ENAME,SAL,JOB FROM EMP WHERE SAL IN (800,1250,1600);
應用:查詢職業為CLERK和MANAGER的員工的員工編號、員工姓名、薪資、職業
→
SELECT EMPNO,ENAME,SAL,JOB FROM EMP WHERE JOB IN ('CLERK','MANAGER');
注意:
用IN 查詢時,要注意VALUE的資料型別一致
應用:查詢20號部門的經理,30號部門的職員,10號部門的售貨員的員工編號,員工姓名,薪資和職業
→
SELECT EMPNO,ENAME,SAL,JOB FROM EMP WHERE (DEPTNO,JOB) IN ((20,'MANAGER'),(30,'CLERK'),(10,'SALESMAN'));
注意:
多列IN 查詢時,要和比較的列名一一對應並且資料型別要保持一致
ANY ALL查詢
ANY:指任一個
ALL:指所有的
語法1:SELECT COLUMN1,COLUMN2,COLUMN3 FROM TABLE_NAME WHERE COLUMN1 > ANY(VALUE1,VALUE2)
語法2:SELECT COLUMN1,COLUMN2,COLUMN3 FROM TABLE_NAME WHERE COLUMN1 > ALL(VALUE1,VALUE2)
應用:
SELECT EMPNO,ENAME,SAL,JOB FROM EMP WHERE SAL= ANY(800,1250,1600,3000);
SELECT EMPNO,ENAME,SAL,JOB FROM EMP WHERE SAL IN(800,1250,1600,3000);
SELECT EMPNO,ENAME,SAL,JOB FROM EMP WHERE SAL=800 OR SAL=1250 OR SAL=1600 OR SAL=1600 OR SAL=3000;
←
查詢工資為800或者1250或者1600或者3000的員工的員工編號,員工姓名,薪資,職業
查詢員工工資大於800,5000,10000中任意一個數字的員工資訊
→
SELECT * FROM EMP WHERE SAL>ANY(800,5000,10000);
查詢員工工資全部都大於 800,5000,10000的員工資訊
→
SELECT * FROM EMP WHERE SAL>ALL(800,5000,10000);
模糊查詢
語法:
SELECT COLUMN1,COLUMN2 FROM TABLE_NAME WHERE COLUMN1 LIKE CONDITION;
萬用字元_:代表當前位置有1個任意字元
萬用字元%:代表當前位置有任意個任意字元
應用:查詢所有員工中姓名以S為開頭的員工的員工資訊
→
SELECT * FROM EMP WHERE ENAME LIKE 'S%';
應用:查詢姓名是以A和S開頭的員工的 EMPNO, ENAME,JOB, HIREDATE列資訊
→
SELECT EMPNO,ENAME,JOB,HIREDATE FROM EMP WHERE ENAME LIKE 'A%' OR ENAME LIKE 'S%';
有且僅有這一種表達,並且列名作比較時,一個列名匹配一個LIKE/一個條件匹配一個LIKE
應用:查詢姓名包含 T H 的員工資訊
→
SELECT * FROM EMP WHERE ENAME LIKE '%T%H%' OR ENAME LIKE '%H%T%';
應用:查詢姓名包含TH且TH相鄰的員工資訊
→
SELECT * FROM EMP WHERE ENAME LIKE '%TH%' OR ENAME LIKE '%HT%';
應用:查詢姓名包含AD且AD不相鄰的員工資訊
→
SELECT * FROM EMP WHERE (ENAME LIKE '%A%D%' OR ENAME LIKE '%D%A%') AND ENAME NOT LIKE '%AD%' AND ENAME NOT LIKE '%DA%';
應用:查詢姓名長度為5,且倒數第二位為T的員工資訊
→
SELECT * FROM EMP WHERE ENAME LIKE '___T_';
查詢姓名長度為5,且倒數第二位不為T的員工資訊
→
SELECT * FROM EMP WHERE ENAME LIKE '_____' AND ENAME NOT LIKE '___T_';
應用:查詢姓名長度不為5,且倒數第二位不為T的員工資訊
→
SELECT * FROM EMP WHERE ENAME NOT LIKE '_____' AND ENAME NOT LIKE '%T_';
應用:查詢姓名第二三位為LA但是長度不為6或者倒數第二三位為LA但是長度為6的員工資訊
→
SELECT * FROM EMP WHERE ENAME NOT LIKE '______' AND ENAME LIKE '_LA%' OR ENAME LIKE '______' AND ENAME LIKE '&LA_';
應用:查詢姓名第二五位為MH但是長度為5或者倒數第一三位為NL但是長度不為6的員工資訊
→
SELECT * FROM EMP WHERE ENAME LIKE '_____' AND ENAME LIKE '_M__H%' OR ENAME NOT LIKE '______' AND ENAME LIKE '%L_N';
注意:
漢完可不可以用模糊查詢?
可以
應用;查詢姓張的學生資訊
→
SELECT * FROM EMP WHERE ENAME LIKE '張%';
漢字使用規則和字元有區別嗎?
沒有
如果比較的列有特殊字元怎麼辦?
轉義字元/
語法:
SELECT COLUMN1,COLUMN2 FROM TABLE_NAME LIKE 'xx/%%' ESCAPE '/';
ESCAPE '/':宣告反斜槓後面的一個字元為普通字元,去除其本身特定的含義
應用:查詢姓名中含有%的員工資訊
→
SELECT * FROM EMP WHERE ENAME LIKE '%/%%' ESCAPE '/';
應用:查詢姓名中含有%且含有S,T的員工資訊
→
SELECT * FROM EMP WHERE ENAME LIKE '%S%' AND ENAME LIKE '%T%' AND ENAME LIKE '%/%%' ESCAPE '/';
轉義字元可以是其他的字元但是不建議使用
應用:查詢姓名中既含有%又含有_的員工資訊
→
SELECT * FROM EMP WHERE ENAME LIKE '%/%%' ESCAPE '/' AND ENAME LIKE '%/_%' ESCAPE '/';
注意:
1、如果要轉義,就要一個條件搭配一個ESCAPE,否則報錯
2、轉義字元,只在當前條件中有效
應用:查詢emp2表中 ename列同時有%和_,且不挨在一起的資料;
→
SELECT * FROM EMP2
WHERE ENAME LIKE '%/%%' ESCAPE '/'
AND ENAME LIKE '%/_%' ESCAPE '/'
AND NOT LIKE '%/%/_%' ESCAPE '/'
AND NOT LIKE '%/_/%%' ESCAPE '/';
PS:
邏輯運算子 :
> < >= <= = <>/!=