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;