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

sql第三天

技術標籤:sql資料庫oracle

資料補充

資料型別

備份一張表:

CREATE TABLE TABLE_NAME AS SELECT * FROM TABLE_NAME;

檢視自己備份的表格:

SELECT * FROM EMP2;

修改表格中的資料:

SELECT * FROM EMP2 FOR UPDATE;

然後手動修改資料最後提交

COMMIT:提交你對錶中資料所做的修改
ROLLBACK:回滾,回退到前一步

刪除一個表:

DROP TABLE TABLE_NAME;

字串型別:

VARCHAR2 (N):N是指字元長度,剩餘空間可釋放,N一般為4000
CHAR(N):N是指字元長度,剩餘空間不可釋放,N一般為1~2000

數值型別:

NUMBER(總長度,小數長度)

日期型別:

DATE YYYY年 MM月 DD日

聚合函式(分組函式)

SUM(COLUMN1)
AVG(COLUMN1)
MIN(COLUMN1)——可以處理字元型
MAX(COLUMN1)——可以處理字元型

應用:

COUNT():統計資料條數 
COUNT(1):掃描第1列,統計包含NULL的值的所有符合條件的欄位的條數
COUNT(*):掃描所有的列,統計包含NULL的值的所有符合條件的欄位的條數
COUNT
(列名):統計表格中除去NULL以外的所有符合條件的行的總數

練習:

查詢EMP表中工資的最大值、最小值、平均值和總和,和部門編號

SELECT DEPTNO,MAX(SAL),MIN(SAL),AVG(SAL),SUM(SAL) FROM EMP;--報錯,因為DEPTNO不是單組分組

↑錯誤示範

注意: 單純的列不能和分組函式 聯合使用

資料處理函式

ROUND(引數一,精度):將引數一四捨五入
TRUNC(引數一,精度):將引數一擷取

精度預設為0

應用:

SELECT ROUND(123.456,1) FROM DUAL;


在這裡插入圖片描述

SELECT ROUND(123.456,2)
FROM DUAL;


在這裡插入圖片描述

SELECT ROUND(123.456,-1) FROM DUAL;


在這裡插入圖片描述

去重函式

DISTINCT

應用:
單列去重:

SELECT DISTINCT JOB FROM EMP;

多列去重:

SELECT DISTINCT JOB,SAL FROM EMP;

.

判斷函式

語法:

CASE WHEN COMDITION1 THEN VALUE1 
WHEN COMDITION2 THEN VALUE2
WHEN COMDITION3 THEN VALUE3
ELSE VALUE4
END;

滿足條件1,賦值VALUE1,不滿足條件1卻滿足條件2的話,賦值VALUE 2,不滿足條件2卻滿足條件3的話,賦值VALUE3,否則賦值VALUE4
——另起一列,並不是在原有的欄位上做修改,一般寫在SELECT後面作為一個欄位(=列)展示

應用:

SELECT DEPTNO,CASE WHEN DEPTNO=10 THEN '10號部門'
WHEN DEPTNO=20 THEN '20號部門'
ELSE '30號部門' END "部門名稱"
FROM EMP;

↓以下語句的效果同上↑

SELECT DEPTNO,CASE DEPTNO WHEN 10 THEN '10號部門'	
WHEN 20 THEN '20號部門'
ELSE '30號部門' END "部門名稱" FROM EMP;

應用:給經理加薪其工資的20%,給董事長分紅為其工資兩倍,給銷售加薪10%,給普通僱員降薪30%查詢各個工位的員工的薪資以及員工編號,姓名

SELECT EMPNO,ENAME,CASE WHEN JOB='MANAGER' THEN 1.2*SAL
WHEN JOB='PRESIDENT' THEN 3*SAL
WHEN JOB='SALESMAN' THEN 1.1*SAL
WHEN JOB='CLERK' THEN 0.7*SAL
END
FROM EMP;

注意: 這裡有一個邏輯上的易錯點,給董事長分紅為工資的兩倍,所以這個地方SAL3而不是SAL2

應用:將1981入職的員工標註為老員工,1981年以前的員工標註為資深員工,其他標註為新員工查詢員工 EMPNO, ENAME,SAL,新老員工情況

SELECT EMPNO,ENAME,SAL,CASE WHEN HIREDATE<TO_DATE('1981/01/01','YYYY/MM/DD') THEN '資深員工' 
WHEN HIREDATE>TO_DATE('1981/12/31','YYYY/MM/DD') THEN '新員工'
ELSE '老員工' END AS "新老員工情況"
FROM EMP;

↓以下語句的效果同上↑

SELECT EMPNO,ENAME,SAL,CASE WHEN TO_CHAR(HIREDATE,'YYYY')=1981 THEN '老員工' 
WHEN TO_CHAR(HIREDATE,'YYYY')>1981 THEN '新員工'
ELSE '資深員工' END AS "新老員工情況"
FROM EMP;

練習:
1.分別將10號部門中員工工資在1000以下的標註為低薪,1000-2000的標註為中等薪資,2000以上標註為高薪

SELECT ENAME,CASE WHEN SAL<1000 THEN '低薪'
WHEN SAL<=2000 THEN '中等薪資'
WHEN 2000<SAL THEN '高薪'
END FROM EMP WHERE DEPTNO=10;

↓以下語句的效果同上↑

SELECT ENAME,CASE WHEN SAL<1000 THEN '低薪'
WHEN SAL BETWEEN 1000 AND 2000 THEN '中等薪資'
WHEN 2000<=SAL THEN '高薪'
END FROM EMP WHERE DEPTNO=10;

2.將10號部門的員工標註為1,20號部門的員工標註為2,30號部門的員工標註為3

SELECT ENAME,CASE WHEN DEPTNO=10 THEN '1' 
WHEN DEPTNO=20 THEN '2' 
WHEN DEPTNO=30 THEN '3' 
END FROM EMP;

3.統計10,20,30號部門的員工人數

SELECT SUM(CASE WHEN DEPTNO=10 THEN 1 ELSE 0 END) "10號部門員工人數",SUM(CASE WHEN DEPTNO=20 THEN 1 ELSE 0 END) "20號部門員工人數",SUM(CASE WHEN DEPTNO=30 THEN 1 ELSE 0 END) "30號部門員工人數" FROM EMP;

字元函式

UPPER(字串):將括號內的字元大寫
LOWER(字串):將括號內的字元小寫

應用:將EMP表中S開頭的員工姓名小寫,並查詢EMPNO, ENAME(小寫以後的名字),SAL,JOB列資訊

SELECT EMPNO,LOWER(ENAME),SAL,JOB FROM EMP WHERE ENAME LIKE 'S%';

練習:

1.分別查詢emp表的工資列的最大最小平均值和工資和,dept表的最大最小部門編號以及 SALGRADE表的最高等級和最低等級

SELECT MAX(SAL),MIN(SAL),AVG(SAL),SUM(SAL) FROM EMP;
SELECT MAX(DEPTNO),MIN(DEPTNO) FROM DEPT;
SELECT MAX(GRADE),MIN(GRADE) FROM SALGRADE;

2.查詢姓名以A開頭的員工的工資和,以及最高最低工資,員工人數

SELECT SUM(SAL),MAX(SAL),MIN(SAL),COUNT(ENAME) FROM EMP WHERE ENAME LIKE 'A%';

3.統計姓名以S開頭的員工的員工人數,工資和,以及最高最低平均工資

SELECT COUNT(ENAME),SUM(SAL),MAX(SAL),MIN(SAL),AVG(SAL) FROM EMP WHERE ENAME LIKE 'S%';

4.統計姓名以K開頭的員工的員工人數,工資和,以及最高最低平均工資

SELECT COUNT(ENAME),SUM(SAL),MAX(SAL),MIN(SAL),AVG(SAL) FROM EMP WHERE ENAME LIKE 'K%';

5.查詢姓名以A開頭並且不包含%和_等特殊字元的員工的工資和,以及最高最低工資,員工人數

SELECT SUM(SAL),MAX(SAL),MIN(SAL),COUNT(ENAME) FROM EMP WHERE ENAME LIKE 'A%' AND ENAME NOT LIKE '%/%%' ESCAPE '/' AND ENAME NOT LIKE '%/_%' ESCAPE '/';

6.統計姓名以S開頭的並且包含%和_或者工資高於1000的員工的員工人數,工資和,以及最高最低平均工資

SELECT COUNT(ENAME),SUM(SAL),MAX(SAL),MIN(SAL),AVG(SAL) FROM EMP WHERE (ENAME LIKE 'S%' AND ENAME LIKE  '%/%%' ESCAPE '/' AND ENAME LIKE '%/_%' ESCAPE '/') OR SAL>1000;

7.統計姓名以K開頭不以A結尾且是10或者20號部門的員工的員工人數,工資和,以及最高最低平均工資

SELECT COUNT(ENAME),SUM(SAL),MAX(SAL),MIN(SAL),AVG(SAL) FROM EMP WHERE ENAME LIKE 'K%' AND ENAME NOT LIKE '%A' AND (DEPTNO=10 OR DEPTNO=20);