1. 程式人生 > 其它 >sql第二天

sql第二天

技術標籤:sql資料庫oracle

條件查詢

條件查詢

語法:

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

語法1SELECT COLUMN1,COLUMN2,COLUMN3 FROM TABLE_NAME WHERE COLUMN1 IN(VALUE1);
語法2SELECT COLUMN1,COLUMN2,COLUMN3 FROM TABLE_NAME WHERE COLUMN1 NOT IN(VALUE1);
語法3SELECT 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:指所有的

語法1SELECT COLUMN1,COLUMN2,COLUMN3 FROM TABLE_NAME WHERE COLUMN1 > ANY(VALUE1,VALUE2)
語法2SELECT 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:
邏輯運算子 :

>  <   >=   <=  =   <>/!=