ORACLE
SQL(Structured Query Language)結構化查詢語言
DML 數據操縱語言
SQL DCL 數據控制語言,控制權限
DDL 數據定義語言 例如:CREATE,DROP,ALTER,DELETE
ORACLE安裝
Sys 超級管理員
System system
Scott tiger
Oracle端口號:1521
Oracle只有一個database,通過不同的用戶給表分類。
sqlplus
Select * from tab;查詢當前用戶有哪些表。
set linesize 300;顯示一行顯示300個字符。
Set pagesize 50;顯示一頁50行
簡單查詢語句:
Select [distinct] <列名> [[as] 別名] from <表名> [[as] 別名]
[where <查詢條件>]
[order by <排序列名> [asc | desc]]
distinct 去掉查詢結果中重複列 字段名不能加’ ’(引號)
select ‘name:’ || ename form emp
字符串連接
Between 1500 and 3000 結果包含了1500和3000
Between ….and….也可用於日期
In:
Select empno,ename from emp where empno in(2011,2001,2300)
通配符:’ -’代表一個字符,‘%’代表0到多個字符。
在sqlplus 中,ed d:/a 表示打開或創建一個sql文件,
@ d:/a 表示執行此文件
單行函數
字符函數:接收字符輸入並輸出。
upper: 將小寫字符轉換成大寫
select upper(‘jack’) from dual;
oracle有一張特殊的表:dual,完成一項功能使用
initcap:將單詞第一個字母轉換成大寫
select initcap(lower(ename)) from emp; 嵌套使用函數。
Concat:字符串連接
Select concat(‘name:’,ename) from emp; 相當於使用‘ ||’
length: 求長度
select length(‘hello’) from dual;
substr: 截取字符串
substr(‘word’,3) 從第三個開始截取
substr(‘helloword’,1,3) :其中1 爲索引,3爲長度
索引可從0開始,也可從1開始
Substr(‘helloword’,-3) 從後向前數截取3個
Replace:替換
Select replace(ename,’s’,’9’) from emp;
數字函數:
round:四捨五入
select round(2473.125) from dual; 無小數保留
round(2736.3567,2) 保留兩位小數
round(2173.34,-2) 精確到兩小點前兩位
trunc(2649.34,2)保留兩位小數,其餘位截去
日期函數:
日期-數字=日期 日期+數字=日期 日期-日期=數字
round((sysdate-hiredate)/7) 求員工入職大約有幾個星期
month_betweed(sysdate,hiredate) 求員工入職有幾個月
add_months(sysdate,1) 加一個月
next_day(sysdate,’星期一’) 求出給定日期的下星期一是號
last_day(sysdate) 這個月的最後一天是幾號
轉換函數:
to_char(hiredate) 轉換成字符串
to_char(hiredate,’yy-mm-dd’) 轉換成日期形式
to_char(hiredate,’fmyyyy-mm-dd’) 其中fm:format去掉前導0
to_char(sal,’$99.999,99’)
to_number(‘34235’)
to_date(’12-28-2012’,’mm-dd-yyyy’) 轉換成日期
通用函數:
Oracle中空值參加四則運算,結果爲null
select ename,sal*12+nvl(comm,0) from emp;
多表查詢:
找關聯字段作關聯條件
(1) 找出幾張表 (2)消除迪卡爾積 (3)確定查詢內容
一張表當兩張表用時不是一回事
“什麼的什麼“用時需消除迪卡爾積
表連接:
(1) oracle特有的方式
“+“號在”=“號左邊是右連接,在“=”號右邊是右連接
以哪張表爲基準就是要求其表內容全部顯示出來。
select e.ename,m.ename from emp e,emp m where e.mgr = m.empno(+);
(2)通用表連接 sql1999
交叉連接,產生迪卡爾積。
select * from emp cross join dept;
自然連接:自動匹配關聯字段,有且只有一個字段名稱相同,且是關聯字段
select * from emp natural join dept;
select * from emp join dept using(deptno); 若有多個相同字段,用using明確指定哪個字段(字段名稱)
select * from emp join dept on(emp.deptno=dept.deptno);
明確指定要關聯的字段,字段名不一樣時
左連接:
select e.ename,m.ename from emp e left join emp m on(e.mgr=m.empno);
組函數和分組函數:
count():統計函數,查個數
select deptno from emp group by depno;
只有分組條件才能作爲查詢字段
Select deptno,count(ename) from emp group by deptno; 可以用分組函數
Select d.dname,avg(e.sal) from emp e right join dept d using(deptno) group by d.dname;
子查詢:在查詢結果當成一張表,再在這張表的基礎上查詢
例:要求顯示出平均工資大於2000的部門編號和平均工資
注意:分組條件不能出現在where條件中,只能用having
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
where條件必須放在group by前
select job,sum(sal) from emp where job <> ‘saleman’
group by job
having sum(sal) > 5000
order by sum(sal) desc;
組函數嵌套時,即便是分組條件也不能作爲查詢字段,不能查詢任何字段
分頁:
Sqlserver用’top’
Mysql用‘limit’
Oracle 用僞例(rownum,rowid)
“id”:惟一標識
Rownum一定要從1開始。
select * from (select rownum r,ename from emp where rownum<=10) where r>=5;
查詢emp表中第5至第10條記錄。
分頁必要的條件:
(1) 每一頁的起始位置 firstIndex
(2) 每一頁顯示幾條記錄 maxResult
創建表:
create table myemp as select * from emp; 表的複製
desc emp;查詢表結構
create table myemp as select * from emp where 1=2; 複製表結構
插入數據:
Insert into<表名> [(字段1,字段2,…)] values(<值1>,<值2>…)
更新數據:
Update <表名> set <更新字段的值> where <更新條件>
常用數據類型:
Char:表示字符類型,長度限制255字節,效率高,長度固定。 中文佔3個字節
varchar2 :表示字符類型,長度限制255字節,節約空間,長度可變。
Clob:大文本類型,可以存放在4G, mysql :text
number: number(n)表示整數,長度爲N,可以使用INTEGER
number(m,n)表示一個小數,小數長度爲n,整數長度爲m-n,可以使用float
date:表示日期類型,需要按照標準的日期格式。
blob :表示二進制類型,4G。
修改表結構:
Alter table t-user modify(username,varchar(12));只能修改成更大的
截斷表:
Truncate 用來刪除表中的數據,不能回退,delete 可以回退。
數據庫的完整性 = 惟一性+正確性
主鍵約束:primary key
(1)…(2)…(3)alter table t_user add constraint PK-USER-ID primary key(id);
惟一約束 :unique
區別:主鍵約束不允許插入案值,而惟一性約束允許插入空值上。
Oracle允許插入無數個空值。
Alter table t_user add constraint UQ_USER_USERNAME unique(username);
非空約束:not null
檢查性約束:(1)列後+check(age>0 and age<120)
(2) alter table t_user add constraint CK_USER_SEX check(email like ‘%@%’);
三大範式:
(1) 確保每一個字段都具有原子性,不能再分割的。
(2) 確保表的每一個字段都依賴於主鍵(每張表只描述一個實體)
(3) 確保表中的每一個字段都不傳遞依賴於主鍵
關係型數據庫(主外鍵關係)
一對一:1、在一對多的基礎上外鍵加惟一性約束
2、一張表的主鍵既是主鍵又是另外一張表的外鍵
3.在多對多的基礎上外鍵全部加惟一性約束(不會用)
一對多:
多對一:在多的一端加外鍵
多對多: 一定要有中間表,並且大部分情況下使用聯合主鍵。 Primary key(cid,tid)
先創建主表再創建從表。
先插入主表的數據再插入從表的數據。
先刪除從表的數據,再刪除主表的數據。
外鍵約束:
(1) create table t_student (id integer primary key,name varchar2(12),cid integer,foreign key(cid) references t_class(id))
(2) alter table t_student add constraint FK_STUDENT_CID foreign key(cid) reference t_class(id)
主鍵生成策略:
SQL SERVER : identify(自增長)
Mysql : increment uuid(三十二位的字符串)
Oracle : sequence(序列) 當成一張虛擬的表
Create sequence
(需要有create sequencea或create any sequence權限)
[increment by n]—每次加N
[start with n] ----從n開始計數
[NOMAXVALUE]----不設置最大值
[NOCYCLE]----一直累加,不循環
[maxvalue 999999999] ----最大值
[minvalue 1]----最小值
[cycle]-----循環
[cache]-----緩存
Create table t_user(id integer primary key,username varchar2(12));
Create sequence t_user;
Insert into t_user values(sq.nextVal,’admin’);
視圖:一張虛擬的表,用來查詢(oracle中做成一張直實的表)
Create view v_score as select ....
Sqlserver 的視圖只能查不能改
Oracle 的視圖默認允許修改,原始表數據跟着修改。
Oracle數據庫創建用戶
1用超級管理員登入
2 create user 用戶名 identified by 密碼
改密碼 alter user用戶名 identified by 密碼
權限管理:
Grant 權限 to 用戶名
類 用戶
權限
角色:權限的集合
兩個通常用的角色:connect,resource
加鎖與解鎖:
Alter user 用戶名 account lock/unlock;
Oracle備份文件的導出與導入:
在CMD中進入一個文件夾,輸入exp
導入數據;imp
Exp wangke/8888@orcl file=d:/abc/beifen.dmp fully=y(所有文件)/tables=(t_user);
Mysql區別:
端口號:3306
通過不同的database來管理表
text 大文本數據類型
分頁用limit: limit 0,3;
索引 幾條記錄 索引從0開始