oracle數據庫(二)_基礎使用

1 語法基礎

1.1 創表
  • 創表
-- 創表
CREATE TABLE student(
	 sno VARCHAR2(8) PRIMARY KEY 
	,sname VARCHAR2(8) NOT NULL
	,ssex CHAR(1) CHECK(ssex in ('男','女'))
	,sbirthday DATE
);

CREATE TABLE sc(
	 sno VARCHAR2(8) NOT NULL REFERENCES student(sno)
	,cno VARCHAR2(8)
	,score NUMBER(8,2)
	,REFERENCES fk_sc_cno foreign key(sno) references course(cno) 
);

CREATE TABLE course(
	 cno VARCHAR2(8) PRIMARY KEY
	,cname VARCHAR2(8) NOT NULL UNIQUE
	,tno NUMBER(8,2)
);

-- 複製表結構
CREATE TABLE student2 as (select * from student where 1=2);

-- 複製表結構及數據
CREATE TABLE student2 as (select * from student);
  • 約束
    primary key
    foreign key
    default
    check
    not null
    unique
-- 主鍵約束
ALTER TABLE course ADD CONSTRAINT pk_cno PRIMARY KEY (cno));
ALTER TABLE student DROP CONSTRAINT pk_cno);

-- 外檢約束
ALTER TABLE sc ADD CONSTRSINT fk_sno FOREIGN KEY(sno) references student(sno);
ALTER TABLE sc ADD CONSTRSINT fk_cno FOREIGN KEY(cno) references course(cno);
ALTER TABLE sc DROP CONSTRAINT fk_sno);
ALTER TABLE sc DROP CONSTRAINT fk_cno);

-- 檢查約束
ALTER TABLE student ADD CONSTRAINT ck_ssex CHECK(ssex in ('男','女'));
ALTER TABLE student DROP CONSTRAINT ck_ssex);

-- 唯一值約束
ALTER TABLE course ADD CONSTRAINT un_cno UNIQUE(cno));
ALTER TABLE course DROP CONSTRAINT un_cno);

-- 空值約束
ALTER TABLE student MODIFY (sname NOT NULL);
ALTER TABLE student MODIFY (sname NULL);

-- 查看錶擁有的約束
select * from user_constraints where OWNER = 'SCOTT' AND TABLE_NAME='STUDENT';
  • 修改表結構
-- 加列
ALTER TABLE student ADD tmp_ssex VARCHAR2(1);

-- 修改列數據類型(有數據時不能改,添加臨時列操作)
ALTER TABLE student MODIFY (tmp_ssex char(1 BYTE) NOT NULL);

-- 改表名
ALTER TABLE student RENAME TO studnet2;

-- 修改列名
ALTER TABLE student RENAME COLUMN tmp_ssex to tmp2_ssex;

-- 刪列
ALTER TABLE student DROP COLUMN tmp2_ssex;

-- 刪表
DROP TABLE student
1.2 增刪改
-- 插入數據
INSERT INTO student VALUES('s001','zz','男',TO_DATE('19950920','YYYYMMDD');
INSERT INTO student(sno,sname,ssex) VALUES('s002','kk','女');
INSERT INTO student2 (SELECT * FROM student);

INSERT ALL 
  when ssex = '男' then
       INTO student2
  when ssex = '女' then
       INTO student3
SELECT * FROM student; -- select不能加括號,into 後沒有逗號

-- 刪除數據
TRUNCATE TABLE  student;
DELETE FROM student WHERE sno = 's001' ;

-- 修改數據
UPDATE student SET sname = 'zz',ssex = '男' WHERE sno='s001';
update emp1 e1 set (comm,deptno)=(select comm,deptno from emp e where e1.empno=e.empno) [where e1.col = value]; 
1.3 查
  • 連接查詢
# 笛卡爾積
SELECT * FROM student,sc;

# 內連接
SELECT * FROM student st,sc WHERE st.sno = sc.sno;
SELECT * FROM student st join sc on st.sno = sc.sno;

# 左外連接
SELECT * FROM student st left join sc on st.sno = sc.sno;

# 右外連接
SELECT * FROM student st right join sc on st.sno = sc.sno;

# 全外連接
SELECT * FROM student st full join sc on st.sno = sc.sno;
  • 集合查詢
    (兩邊表的列數及列類型需要一一對應,名字可以不同,根據列位置和列類型合併)
    INTERSECT 交集 兩者共有
    UNION 並集 去重
    UNION ALL 並集 不去重
    MINUS 前有後沒有
(SELECT * FROM sc) INTERSECT (SELECT * FROM sc);
  • 子查詢
    子查詢可以當作表或條件使用
# select的原理是基於表的每一行迭代出來的
# 此方式最終輸出行數會和外層行數一致
select  d.*
       ,(select count(1) from emp where deptno = d.deptno) cnt
from dept d;

select e.*
       ,(select count(1) from emp where deptno = e.deptno) cnt
from emp e;

# 當表用
SELECT * 
FROM 
student st,
(SELECT * FROM sc) sc
WHERE st.sno = sc.sno

# 當條件用
SELECT * 
FROM 
student
WHERE sno in (select sno from sc)

# 當having條件
select deptno
from emp
group by deptno 
having count(1) = (select count(1) from emp where deptno = 10);
  • 邏輯查詢(IN,EXISTS,ANY,ALL)
-- IN
select * from student st where st.sno in (select sno from sc);

-- EXISTS,每行反應一個true或false
select * from student st where exists(select * from sc where st.sno = sc.sno);

-- ANY(SOME)
select * from student st where st.sno = any(select sno from sc);

-- ALL 獲取最大年齡的學生
select * 
from student
where sage >= all(select sage from student);
  • 模糊查詢
-- 查詢名字包含A的信息
select * from emp where ename like '%A%';

-- 查詢名字第二個字母是A的信息
select * from emp where ename like '_A%';

2 函數基礎

2.1 數字數

ABS(x),絕對值
MOD(x,y),求餘
POWER(x,y),冪函數
CEIL(x),向上取整
FLOOR(x),向下取整
ROUND(x[,y]),四色五入,默認取整數
TRUNC(x[,y]),截斷,默認取整數

2.2 字符函數

ASCII(x)
CONCAT(x,y),鏈接連個字符
INSTR(x, str [,start] [,n]),找到字符存位置
LENGTH(x),長度
LOWER(x),小寫
UPPER(x),大寫
LTRIM(x[,trim_str]),左修剪
RTRIM(x[,trim_str]),右修剪
TRIM([trim_str FROM] x),左右修剪
REPLACE(x,old,new),替換
SUBSTR(x,start[,length]),截取字段
REVERSE(x),反轉字符串

2.3 日期函數

SYSDATE,系統當前時間
ADD_MONTHS(d,n),月的加減法
MONTHS_BETWEEN(d1,d2),返回d1-d2的相差月數
LAST_DAY(d),返回當月最後一天的相同時間
NEXT_DAY(d,'星期一') ,返回下一個星期一日期
ROUND(d[,fmt]),四色五入時間,默認取日
TRUNC(d[,fmt]),切斷時間,默認取日

-- 日期截斷
SELECT
	  SYSDATE
	 ,TRUNC(SYSDATE)
	 ,TRUNC(SYSDATE,'DDD')	-- 當天,默認格式
	 ,TRUNC(SYSDATE,'DD')	  -- 當天
	 ,TRUNC(SYSDATE,'D')    -- 當週第一天,週日 (DAY,DY)
	 ,TRUNC(SYSDATE,'MM')   -- 當月第一天,可以寫成'MONTH'
	 ,TRUNC(SYSDATE,'Q')    -- 當季第一天
	 ,TRUNC(SYSDATE,'Y')    -- 當年第一天,可以寫成'YEAR'
FROM DUAL
2.4 轉換函數

TO_NUMBER(x[,fmt]),轉換爲數值
TO_CHAR(d|n[,fmt]),轉換爲字符串
TO_DATE(x[,fmt]),轉換爲日期
EXTRACT,日期轉化爲數值

-- 數值2字符串
SELECT 
	 TO_CHAR(12345.6,'L999,999.99')  帶當地貨幣符號
	,TO_CHAR(12345.6,'$000,000.00')  帶美元貨幣符號
FROM DUAL;


-- 日期2字符串
SELECT
   TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') 時間字符串
  ,TO_CHAR(SYSDATE,'DAY','NLS_DATE_LANGUAGE=American') 星期	 
  ,TO_CHAR(SYSDATE,'DY','NLS_DATE_LANGUAGE=American') 星期縮寫
  ,TO_CHAR(SYSDATE,'D','NLS_DATE_LANGUAGE=American') 星期數值
  ,TO_CHAR(SYSDATE,'Q') 返回季度數字
FROM DUAL;


-- 日期2數值
SELECT
    EXTRACT(YEAR FROM SYSTIMESTAMP) YEAR       --SYSDATE
   ,EXTRACT(MONTH FROM SYSTIMESTAMP) MONTH    --SYSDATE
   ,EXTRACT(DAY FROM SYSTIMESTAMP) DAY        --SYSDATE
   ,EXTRACT(HOUR FROM SYSTIMESTAMP) HOUR
   ,EXTRACT(MINUTE FROM SYSTIMESTAMP) MINUTE
   ,EXTRACT(SECOND FROM SYSTIMESTAMP) SECOND
   
   ,EXTRACT(HOUR FROM (INTERVAL '2 16:16:16' DAY TO SECOND)) --取時間間隔的小時
FROM DUAL;


-- 字符串2日期
SELECT
  TO_DATE('1991-09-20 03:00:00','YYYY-MM-DD HH24:MI:SS') 日期
FROM DUAL;
2.5 聚合函數

AVG(col):平均
SUM(col):合計
COUNT(col):計量
MIN(col):最小
MAX(col):最大
WM_CONCAT(col):列值拼接,用逗號分隔
listagg(col,tip) within group (order by col):列值拼接,指定分隔符及排序

2.6 通用函數

NVL(col, nval):替換帶null返回
NVL2(col, val1, val2):非空返回v1,空返回v2
NULLIF(a,b): null if a==b else other
COALESCE(a,b,...):從左往右找到第一個部位null的值
DECODE(col|val, con1, val1, con2, val2, nval):字典匹配
CASE col WHEN cv1 THEN v1 WHEN cv2 THEN v2 [...] ELSE ov END: 條件
CASE WHEN con1 THEN v1 WHEN con2 THEN v2 [...] ELSE ov END: 條件

3 序列

  • 序列不會歸零
  • 序列可以多表共用,出現搶數現象
  • 沒有commit的行會出現裂縫
  • 修改序列只會對後面的調用有影響
  • 不能修改序列的初始值。
  • 修改時候最小值不能大於當前值,最大值不能小於當前值
CREATE SEQUENCE myseq
-- [START WITH num] 從某一個整數開始,升序默認值是1,降序默認值是-1
-- [INCREMENT BY increment] 步長
-- [MAXVALUE num|NOMAXVALUE] 最大值10的27次方,-1
-- [MINVALUE num|NOMINVALUE] 最小值1,-10的25次方
-- [CYCLE|NOCYCLE] 是否循環迭代
-- [CACHE num|NOCACHE] 預先在內存生成序列數,更快,默認20個值


--訪問下一個值
select myseq.nextval from dual;
--訪問當前值
select myseq.currval calue from dual;


--序列修改
ALTER SEQUENCE MYSEQ
MAXVALUE 10000
MINVALUE -300


--刪除序列
DROP SEQUENCE MYSEQ; 
  • 創建一個以自增字段爲主鍵的表
create sequence myseq;

create table increase
(
	increase number(8) primary key,
	ename varchar2(8)
);

insert into increase select myseq.nextval,ename from emp;

4 同義詞

  • 可以爲表、視圖、序列、過程、函數、程序包等指定一個別名
  • 私有同義詞,只能由當前用戶使用
  • 公有同義詞,可以被所有用戶訪問
-- 創建同義詞
CREATE [OR REPLACE] [PUBLIC] SYNONYM [schema.]synonym_name 
FOR [schema.]object_name

-- 刪除同義詞
DROP [PUBLIC] SYNONYM [schema.]sysnonym_name 

5 視圖

  • 使用視圖優點
    安全性,隱藏保護底層表
    簡化,屏蔽複雜的查詢邏輯
-- 創建視圖
CREATE [or replace][force|noforce] VIEW myview AS (SELECT * FROM student WHERE sno = 's001');
WITH CHECK OPTION -- 修改必須帶符合where條件
WITH READ ONLY -- 只讀不能修改

-- 刪除視圖
DROP VIEW myview

6 臨時表

  • 臨時表在不同的session中不能相互訪問
  • 會話臨時表(會話結束刪除)
create global temporary table tbl()on commit preserve rows;
  • 事務臨時表(事務結束刪除)
create global temporary table tbl()on commit delete rows;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章