Oracle第六課
阿新 • • 發佈:2021-01-20
Oracle第六課
一、第五課課後作業講解
-
SQL優化時,對於索引的資料型別是有要求的,比如列的型別是char型,查詢條件就必須是char型,如果是數字型,則索引失效
age列建了索引,它是char型,where age>18,此處18是數字,索引失效
Java中的age必然是int型,number
-
表結構不合理
-
建立班級表
CREATE TABLE t_clazz(ID NUMBER(10) PRIMARY KEY,
NAME VARCHAR(20) NOT NULL); -
建立學生表
CREATE TABLE t_student(ID NUMBER(12) PRIMARY KEY,
sex NUMBER(1) CHECK(sex=1 OR sex = 0) NOT NULL,
age NUMBER(2) NOT NULL,
clazz NUMBER(10) REFERENCES t_clazz(ID)); -
兩表連線的方式
-- 內連線
SELECT s.*,c.* FROM t_student s INNER JOIN t_clazz c ON s.clazz=c.id;
SELECT s.id SID,s.name sname,sex,age,clazz,c.name cname FROM t_student s,t_clazz c WHERE s.clazz=c.id;
SELECT s.id SID,s.name sname,sex,age,clazz,c.name cname FROM t_student s LEFT OUTER JOIN t_clazz c ON s.clazz=c.id;
-- 右外連線
SELECT s.id SID,s.name sname,sex,age,clazz,c.name cname FROM t_student s RIGHT OUTER JOIN t_clazz c ON s.clazz=c.id;
-- 全連線
SELECT s.id SID,s.name sname,sex,age,clazz,c.name cname FROM t_student s FULL JOIN t_clazz c ON s.clazz=c.id; -
在oracle中特有的通俗的寫法
-- 內連線
select xx from a,b where a.id=b.id;
-- 右連線,主表是不帶加號的表
-- 右連線
select xx from a,b where a.id(+)=b.id
-- 左連線
select xx from a,b where a.id =b.id(+);
二、函式
-
虛表:dual,做測試用的表
-
函式
-
單行函式
-
字元函式:ascii(x)
SELECT ASCII('a') FROM dual;
-
拼接字串:concat('a','b')
SELECT CONCAT('a','b'),'a'||'b' FROM dual;
-
找字串中某個字元的位置,位置從1開始
-- 找字元c的位置
SELECT INSTR('abcdefg','c') FROM dual;
-- 從第4個字元開始找
SELECT INSTR('abcdefgc','c',4) FROM dual;
-- 從第一個開始找,找第一個出現的c
SELECT INSTR('abcdefgc','c',1,2) FROM dual; -
返回字串的長度:length
SELECT LENGTH('aaaa') FROM dual;
-
將字元全轉換成小寫或大寫
-- 將字元全轉換成小寫,或大寫
SELECT LENGTH('aaaa'),LOWER('aBcD'),UPPER('aBcD') FROM dual; -
替換:replace
-- 替換
SELECT REPLACE('abc123','1','a') FROM dual; -
擷取字串:replace
-- 擷取字串
-- 從1開始擷取3個
SELECT SUBSTR('abcdef',1,3) FROM dual; -
去掉左邊的字元(預設是空格):LTRIM,去掉右邊的RTRIM,去掉兩邊的TRIM
SELECT LTRIM(' abc '),rTRIM(' abc ')
,TRIM(' abc '),TRIM('1' FROM '1111a1b1c11') FROM dual; -
數字函式
-- 取絕對值
SELECT ABS(-1) FROM dual;
-- 取大於或等於x的最小值
SELECT CEIL(-1.1),CEIL(1.9) FROM dual;
-- 取小於或等於x的最大值
SELECT FLOOR(-1.1),FLOOR(1.2) FROM dual;
-- 四捨五入,第二個值用來指定保留幾位小數
SELECT ROUND(3.45),ROUND(3.45,1) FROM dual;
-- 直接截斷,沒有y的話取整,不會四捨五入
SELECT TRUNC(7.25),TRUNC(7.25,1) FROM dual;
-- 取餘
SELECT MOD(5,2) FROM dual; -
日期函式
-- 當前日期
SELECT SYSDATE FROM dual;
-- 增加一月
SELECT add_months(SYSDATE,1) FROM dual;
-- 返回data所在月的最後一天的日期
SELECT last_day(SYSDATE) FROM dual;
-- 四捨五入日期
SELECT ROUND(SYSDATE),ROUND(SYSDATE,'month'),ROUND(SYSDATE,'year') FROM dual;
-- 月份差
SELECT e.*,months_between(SYSDATE,hiredate),trunc(months_between(SYSDATE,hiredate)) FROM emp e WHERE empno IN(7369,7499);
-- 當前日期的下個星期一是幾號
SELECT next_day(SYSDATE,'星期一') FROM dual;
-- 從員工表中提取員工的入職月份
SELECT EXTRACT(MONTH FROM hiredate) FROM emp;
-- 截斷:trunc
SELECT TRUNC(SYSDATE,'day') FROM dual; -
應用
-- 工作年限
SELECT trunc(months_between(SYSDATE,hiredate)) FROM emp;
-- 找到工作年限最長的員工
SELECT t.empno,t.maxs_date FROM (SELECT e.*,TRUNC(months_between(SYSDATE,hiredate)) maxs_date FROM emp e) t WHERE t.maxs_date IS NOT NULL AND ROWNUM = 1;
-- 給工作年限超過兩年的員工sal增加100元
SELECT t.*,t.sal+100 sal2 FROM (SELECT e.*,trunc(months_between(SYSDATE,hiredate)/12) work_YEAR FROM emp e WHERE hiredate IS NOT NULL) t WHERE t.work_YEAR>2;
-- sql語句執行:先from,再where,再select -
轉換函式
-- 索引型別如果不一致會失效,age列是number,age=to_number('1')
-- 日期到字元
SELECT to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss') FROM dual;
-- 字元到日期
SELECT to_date('2021-01-20 12:08:28','yyyy-mm-dd hh24:mi:ss') FROM dual;
-- 字元到數字
SELECT to_number('142') FROM dual;
-- 數字到字元
SELECT 1,to_char(1) FROM dual;
-
-