重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
設定dept表deptno列為主鍵。
站在用戶的角度思考問題,與客戶深入溝通,找到松山網站設計與松山網站推廣的解決方案,憑借多年的經驗,讓設計與互聯網技術結合,創造個性化、用戶體驗好的作品,建站類型包括:做網站、網站設計、企業官網、英文網站、手機端網站、網站推廣、空間域名、虛擬主機、企業郵箱。業務覆蓋松山地區。
alter table dept add constraint pk_deptno primary key (deptno);
在emp表deptno列上建立外鍵引用dept表deptno,指定外鍵類型為級聯刪除。
alter table emp add constraint fk_deptno foreign key (deptno) references dept(deptno) on delete cascade;
這樣刪除dept表 只需:delete from dept where city='shanghai'; 就可以自動刪除對應emp表內容。
添加約束語句格式:
alter table 表名 add constraint 主鍵約束名 primary key(主鍵列名表序列);
如:
alter table 修課表 add constraint pk_xh_kc primary key(學號,課程號);
刪除約束語句格式:
alter table 表名 drop CONSTRAINT 主鍵約束名;
如:
alter table 修課表 drop CONSTRAINT pk_xh_kc;
1 付鍵 也就是FK formary key
程序交流中心,這是專門為新手學習設立的論壇
二、SQL
Structur query language
結構化查詢語言,是操作關系型數據庫中的對象。
DDL(Data definition language 數據定義語言),用于建表或刪表操作,以及對表約束進行修改
create table , alter table , drop table 對表結構的增刪操作。
DML(Data manipulation language 數據操作語言),向表中插入紀錄,修改紀錄
insert , update , delete , merge
transaction ,事務控制語言,由DML語句組成的,commit; ,rollback;
select 查詢語句
dcl 授權語句 grant
三、Oracle
DBMS 數據庫管理系統
有Oracle提供,還提供AS,應用服務器
DBA 數據庫管理員
四、相關操作
1、sqlplus 訪問數據庫命令(本地訪問/遠程訪問),和數據庫建立連接的命令,是數據庫操作的環境
sqlplus 用戶名/密碼
2、show user 顯示當前用戶的用戶名
改變身份可以直接connect 用戶名/密碼 --- 這個是sqlplus命令
在sqlplus中可以使用 ! 可以在shell和sqlplus間切換,!shell命令 可以在sqlplus中使用shell命令。
實際上是sqlplus開了子進程來執行shell命令。
3、Oracle數據庫中的表分兩類:用戶表(用戶使用操作的表),系統表(數據庫系統維護的表,也叫數據字典)
對用戶表的DDL操作出發了對系統表的DML操作!
五、基本語法
1、select查詢語句
select table_name from user_tables;(查詢系統表)
以上的查詢語句就是查詢本用戶下所擁有的所有表的表名。
投影操作,只查看選擇的字段的信息。
選擇操作,查看字段中的特定某些信息。
聯接操作,多表查詢,通過表間連接,查尋出多表中的信息
(1)select table_name from user_tables;(查詢系統表)
以上的查詢語句就是查詢本用戶下所擁有的所有表的表名。
(2)sqlplus的buffer中會緩存最后一條sql語句,可以使用"/"來執行這最后一條sql語句,也可以使用
edit命令來編輯最后一條sql語句。
l命令(list)(sqlplus命令)可以顯示buffer中最后一條命令。
sqlplus命令可以縮寫
(3)desc [表名]
這是一條sqlplus命令,注意他不是sql語句,這條命令用于查看表的結構。descript的縮寫
[字段名] [字段的類型],這是使用完desc命令后顯示的表結構。
(4)select [表的字段名1],[表的字段名2], ... from 表名;
select * from 表名; 查尋表中所有字段的信息
(5)關鍵字不等拆分,sql語句,以及表名,字段名是大小寫不敏感的。
sql語句要以";"結尾,來表示sql語句結束,如果不加";"系統不會執行此條sql語句,并提示。
在Oracle中字符顯示是左對齊,數值右對齊。
(6)在select 語句中可以使用數學表達式。
select [表達式(必須包含本表字段名)],[...],.... from 表名;
運算的優先級的先乘除后加減,同級自左向右運算,括號改變優先級。
(7)別名
select [字段名或表達式] ["別名"],[...] ["..."],.... from 表名;
可以通過在字段名或表達式后加空格"別名",可以給列,或者表達式結果其別名。
表達別名必須加雙引號。
(8)字符串拼接使用||符號
select 目標字段名||" "||目標字段名 from 表名;
注意:在Oracle中的字符串要用'..'包含
別名中需要使用空格,或是大小寫敏感時需要用".."包含。
練習:
自己寫一條SQL語句,執行的結果是select * from ...;
其中...是每張系統表的表名
即在每張系統表的表名前加“select * from” ,后加“;”
select 'select * from '||table_name||';' from user_tables;
2、處理錯誤
(1)!oerr ora [錯誤號] ,系統可以顯示錯誤的原因和如何修改。如果命令錯誤輸入可以使用edit或ed來修改輸入錯誤。
實際上是在編輯緩存文件中的最后一條sql語句。
也可以使用 (change) c /錯誤字段/正確字段,來進行替換操作進行修改。
只有在Linux平臺使用
! 相當于 host ,沒有斷連接,只是切換了一下,執行shell命令
(2)edit命令來編輯最后一條sql語句。
3、sqlplus設置
set pause on 回車響應,分屏顯示,只在本會話中有效
set pause off 關閉分屏顯示。
set pause "..." 設置分屏顯示的提示信息。
set pause on 先輸出提示信息,回車響應,分屏顯示
set head off 提頭輸出關閉
set feed off 結尾輸出關閉
set echo off 回寫關閉
spool 文件名.sql 寫入指定文件
spool off 關閉寫入。
4、sql腳本
也就是在文件中寫有sql語句的文件,可以在sqlplus中運行。
引入sql腳本
sqlplus 用戶名/密碼 @sql腳本 (注意:在用戶名密碼輸入結束后一定要加空格然后再寫@sql腳本)
在腳本中最后一行寫上“exit”,則運行完腳本以后,回到shell上
5、
Oracle中的空值 空值會當無窮大處理,其實空值根本就不會存儲,只是看作是無窮大。
Oracle中控制處理函數 NVL(字段名,值),這個字段中的空值替換為指定值,如果不為空,則會返回其原值。
例:select (salary*12)*(NVL(commission_pct,0)/100+1) salary,first_name from s_emp;
distinct關鍵字,去掉重復行(這個關鍵字會觸發排序操作)
例: select distinct dept_id,title from s_emp;
dept_id與title的聯合不唯一
注意:distinct,關鍵字之后會對from之前的字段進行排重操作。
6、column命令 --- sqlplus命令
column命令 列格式的定義
column 目標列名 查看這個類是否定義了格式
column 目標列名 format a.. 設置列寬。
column last_name heading 'Employee|Name' FORMAT A15
設置題頭
這其中的'|'是換行符
column salary justify left format $99,990.00
定義數字顯示格式
注意:如果不滿足顯示的格式,就會把數據顯示為"#"
column salary justify left format $00,000.00
會出現$00,928.00 ,用0補齊
column 列名 clear (清除列格式定義)
注意:只有sqlplus命令才有簡寫,并且在使用sqlplus命令時結尾也不能加分號。
六、選擇操作
1、order by
排序子句 ASC(默認,升序) DESC(降序)
order by 目標列名(別名) 排序順序(不寫排序順序,會默認為升序排序)
例:select first_name from s_emp order by first_name;
select first_name from s_emp order by first_name desc;
注意:升序空值在結果的末尾,降序空值在結果的最前面。
2、where子句
where子句使用在 select ... from ... 后面,用來選擇所需(符合條件的)的記錄
where后面跟的是表達式 也就是 XXX=XXX, XXX between X and X ,XXX in(X,X,X)
like '...' 通配查詢
between ... and ... ,表示結果在這之間,between and是一個閉區間,
也就相當于... = ... and ... = ... 。
!=,,^=,這三個都標識不等于,=,=,=,這些運算符都可以使用。
... in (va1,val2,...) 判斷結果是否在這個枚舉中存在
like '...' 字符串通配查詢,'%'表示多個字符,'_',表示一個字符。
注意:轉義的用法:like ‘S\_%’ escape ‘\’
... and ... 表示只有兩個條件同時滿足
... or ... 表示條件只要滿足其中只一就可以
all ... 是要求都滿足條件。
not .....,則是可以與以上的條件產生反效果。
空值會對not in造成影響,也就是不等于任何值,但是空值例外。
... is null 使用來判斷值是否為空。
注意:Oracle中的字符串是嚴格區分大小寫的。
(1)注意數據類型,數字類型直接寫,字符用'......' ,缺省格式的Date可以用'......',只有別名
才用" "包含。
(2)選擇合適的運算符
七、單行函數
1.字符函數
字符是大小寫敏感的
轉小寫 lower(字段名) --- 其中的參數可以是一個字符串常量或是一個字段名
轉大寫 upper(字段名)
首字母大寫 initcap(字段名)
字符串拼接 concat(字段1, 字段2)
截取子串 substr(字段名, 起始位置,取字符個數)
dual表,是專門用于函數測試和運算的,他只有一條記錄
字符串拼接 concat(...,....)
求指定子串 substr(...,起始位置,取字符個數)
可以使用"-"表示從右向左取,取的時候可以從左往友取。
例:select substr(first_name,-2,2) sub from s_emp;(取后兩個)
select substr(first_name,2,2) sub from s_emp;(取前兩個)
2,數值函數
四舍五入 round(數據,保留小數點后幾位)
可以用負數表示小數點前,0,表示小數點后第一位,也就是保留個位,-1表示個位(保留到十 位)。
例:select round(15.36,1) from dual;
截取數字函數 trunc(數據,保留的位數(小數點后位數)) 截取個位之后補0
例:select trunc(123.456,1) from dual;
3,日期函數
日期格式,
全日期格式 世紀信息,年月日,時分秒。
缺省日期格式,日-月-年 dd-mon-rr
修改當前會話的日期格式,會按照指定的格式輸出日期
alter session set nls_date_format='yyyy mm dd hh24:mi:ss';
返回當前日期 sysdate
例:select sysdate from dual;
select sysdate+1 from dual; 獲得明天的日期,加1,單位是天
日期是格式敏感的
求兩個日期間相隔了多少個月 months_between(date1,date2)
加減指定數量的月份 add_months(date,月數),月數可以為負,負值就是減去相應的月數。
從date日期開始的第一個星期五 next_day(date,FriDay)
返回月末的日期 last_day(date)
截取日期 trunc(date,'年或月或日或時分秒')
例:select next_day(sysdate,2) from dual;
例:select trunc(add_months(sysdate,1),'month') from dual;
ROUND('25-MAY-95','MONTH') 01-JUN-95
ROUND('25-MAY-95 ','YEAR') 01-JAN-95
TRUNC('25-MAY-95 ','MONTH') 01-MAY-95
TRUNC('25-MAY-95 ','YEAR') 01-JAN-95
練習:
返回下個月的第一天的日期
select round(last_day(sysdate),'MONTH') from dual;
select add_months(trunc(sysdate,'MONTH'),1);
4,不同數據類型間轉換函數
將日期轉成字符 tochar(date,'日期格式')
日期格式要用有效格式,格式大小寫敏感 'yyyy mm dd hh24:mi:ss',
'year'(全拼的年),'mm'(數字表示的月) 'month'(全拼的月),'day'(星期的全拼),'ddspth' (日期的全拼) 'yy mm dd'
例:select to_char(sysdate,'yyyy mm dd hh24:mi:ss')from dual;
將字符轉換成數字 to_number('...')
將數字轉字符to_char(number,'fmt') fmt是數字格式
將字符串轉成日期 to_date('...','日期格式')
例:select to_char(to_date('2006 11 03','yyyy mm dd'),'dd-month-yy') from dual;
1、等值連接
select [表別名1.字段名1],[表別名2.字段名2],...
from 表1 表別名1 ,表2 表別名2
where 表別名1.字段名3=表別名2.字段名4;
表連接時,當表與表之間有同名字段時,可以加上表名或表的別名,加以區分,使用時要用
表名.字段名或表別名.字段名(列名)。當表的字段名是唯一時,可以不用加上表名或表的別名。
注意:當為表起了別名,就不能再使用表名.字段名。
例:select a.first_name,a.last_name,b.name
from s_emp a,s_dept b
where a.dept_id=b.id;
2、非等值連接
select [表別名1.字段名1],[表別名2.字段名2],...
from 表1 表別名1 ,表2 表別名2
where 表別名1.字段名3 ..... 表別名2.字段名4
....可以使比較運算符,也可以使其他的除了'='的運算符
例:select e.ename, d.grade,e.sal
from emp e,salgrade d
where e.sal between d.losal and d.hisal;
3、自連接
用別名把一張表中的數據分成兩部分,然后在使用條件過濾。
select [表別名1.字段名1],[表別名2.字段名2],...
from 表1 表別名1 ,表1 表別名2
where 表別名1.字段名3=表別名2.字段名4;
例:select a.first_name ename,b.first_name cname
from s_emp a,s_emp b
where a.manager_id=b.id;
以上所提到的表連接,都叫做內連接,嚴格匹配兩表的記錄。
4、外連接
會使用一方表中的所有記錄去和另一格表中的記錄按條件匹配,空值也會匹配,這個表中的所有記錄都會顯示,數據庫會模擬出記錄去和那些不匹配的記錄匹配。
例:select a.first_name enamei,a.id,b.first_name cname,b.id
from s_emp a,s_emp b
where a.manager_id=b.id(+);
即用a表中的數據去匹配b表的,若b表中有null,系統模擬紀錄與其匹配
注意:要把那一方的記錄全部都顯示出來,還有注意條件(+)跟在要全部選出的對端。
外連接的應用:
列出哪個部門沒有員工
select e.deptno,d.deptno
from emp e,dept d
where e.deptno(+)=d.deptno
and e.deptno is null;
三、組函數
group 組
group by 分組子句,按指定的分組規則分組 ,這個group by 子句可以跟在 select 語句后或是 having后面。
group by子句也會出發排序操作,會按分組字段排序。
select [組函數或分組的字段名] ,... from 表名 group by [字段名1],[字段名2],.....;
例:select avg(salary) from s_emp group by dept_id;
注意:組函數可以處理一組數據,返回一個值。
組函數會忽略空值。
avg(..),求平均值,sum(..),求和 這兩個函數的參數只能是number型的。
以下所提到的函數可以使用任意類型做參數。
count(..),用來統計記錄數,可以使用排重命令。count(...)默認使用的是all。
max(..),min(..)求最大值和最小值,
count(*),統計表中記錄數。
例:select max(b.name),avg(a.salary), max(c.name)
from s_emp a,s_dept b,s_region c
where a.dept_id=b.id and b.region_id=c.id
group by b.dept_id;
注意:只要寫了group by子句,
*** select后就只能用group by后的字段或者是組函數。 ***
where子句只能夠過濾記錄,放單行函數。
having子句可以過濾組函數結果或是分組的信息,且寫在group by子句后。
例:
select max(b.name),avg(a.salary), max(c.name)
from s_emp a,s_dept b,s_region c
where a.dept_id=b.id and b.region_id=c.id
group by b.id
having sum(a.salary)4000;
column 也可以定義有別名的列的格式。
column "別名" 格式定義
注意:要先過濾掉不需要的記錄,然后再進行分組操作,提高效率。
四、子查詢
子查詢,就是可以嵌在任何的sql語句中的select語句。
在select語句中嵌套子查詢時,會先執行子查詢。一般的會將子查詢放在運算符的右邊。
注意:在使用子查詢時,要注意這個運算符是單行的(也就是只能是單值),還是多行運算符(范圍,多值,in)。
配合使用子查詢返回的結果必須符合運算符的用法。
例:
select first_name,title
from s_emp
where title=any(select title from s_emp
where last_name='Smith')
and upper(last_name)!='SMITH';
select first_name,title
from s_emp
where title in (select title from s_emp
where last_name='Smith')
and upper(last_name)!='SMITH';
五、將業務需求轉換成可操作的表
一: 需求分析
二: 畫E-R圖
三: 轉換成表關系
四: 割接(新老系統交接)
五:
E-R圖屬性:
* 為強制且非空屬性
o 可選屬性(可以有值也可以沒有)
#* 表示此屬性唯一且非空
實體關系:
mastbean maybean
數量關系: 多對一關系
一對多關系
一對一關系
多對多關系
第一范式,所有的屬性都必須是單值,也就是屬性只表示單一的意義。(記錄可以重復,沒有任何限制)
第二范式,屬性要求唯一且非空,(記錄不可重復,但是數據可能會出現冗余)。
第三范式,非主屬性只能依賴于主屬性,不能依賴于其他非主屬性。(解決數據冗余問題)
六、約束
約束是針對表中的字段進行定義的。
primary key (主鍵約束 PK)保證實體的完整性,保證記錄的唯一
主鍵約束,唯一且非空,并且每一個表中只能有一個主鍵,有兩個字段聯合作為主鍵,只有兩個字段放在一起唯一標識記錄,叫做聯合主鍵。
foreign key (外建約束 FK)保證引用的完整性,
外鍵約束,外鍵的取值是受另外一張表中的主鍵或唯一值得約束,不能夠取其他值,只能夠引用主鍵會唯一鍵的值,被引用的表,叫做parent table(父表),引用方的表叫做child table(子表),要想創建子表,就要先創建父表,后創建子表,記錄的插入也是如此,先父表后子表,刪除記錄,要先刪除子表記錄,后刪除父表記錄,要修改記錄,如果要修改父表的記錄要保證沒有被子表引用。要刪表時,要先刪子表,后刪除父表。
unuque key(唯一鍵),值為唯一
index(索引)是數據庫特有的一類對象,view(示圖)
典型的一對多 class 對應多個學生。
student table class table
______________________________ _________________________
| id | name | address| class_id| | id |class_desc|class_num|
|(PK)|______|________|___(FK)__| |(pk)|__________|_________|
| | | | | | | | |
一對一
student tabel shenfenzheng table
____________________ _________________________________
| id | name | address| | s_id |shenfen_desc|shenfen_num|
|(PK)|______|________| |(PK,FK)|____________|___________|
| | | | | | | |
多對多
student tabel zhongjian table kecheng table
____________________ _________________________________ __________________
| id | name | address| | s_id |shenfen_desc|shenfen_num| | kid | kechengname|
|(PK)|______|________| |(FK,FK)|____________|___________| | (PK)|____________|
| | | | |聯合主鍵| | | | | |
引用對方表的主鍵,當作本身的主鍵,所以這個表的主鍵,既是主鍵又是外建
建表和其他相關操作
DDL語句
創建表:
create table 表名 ( 字段名1 類型(數據長度)(default ...) 約束條件, 字段名2 類型(數據長度) 約束條件 );
Oracle數據庫中的數據類型
varchar(長度),可變長字符串,char(長度) 定長
number(..,..),number 表示浮點數,或者是整數
long 大對象,clog 字符的大對象,相當于文本文件在表中只存放一個相當于只針對值
blog 二進制的大對象,也是以相當于指針的形式存放的。
primary key約束:
主鍵約束的定義:
第一種定義形式:
create table test(c number primary key ); 列級約束
第二種定義形式:
create table test(c number , primary key(c) ) ; 表級約束
create table test( c1 number constraints pkc1 primary key ); 此約束有名字: pkc1
create table test(c number , c2 number , primary key (c ,c1) ) ; 用表級約束可以實現聯合主鍵
foregin key (fk) 外鍵約束:
(先定義父表,再定義子表)
carete table parent(c1 number primary key );
create table child (c number primary key , c2 number references parent(c1));
或表級約束定義:
create table child( c number primary key , c2 number , foreign key(c2) references parent(c1));
如果兩個字段都為唯一且非空,這時可以定義成UK+NOT NULL
(PK或UK)一對多(FK)
(PK+UK)一對一(FK) 或 (PK)一對一(PK)
多對對多關系,一般都通過一張中間表來分解成兩個一對多的表
建立表
create table[schema]table
schema: 一個用戶對應一個schema 不同用戶下的表不能互相查看
select count(*) from s_dept; === select count(*) from sd0611.s_dept;
一個表中只能存儲一個LONG類型
CLOB 存儲大的文本對象
BLOB 存儲大的二進制對象
create table test(c1 number primary key); 設置主鍵
create table test(c1 number constraints test_c1 primary key); 定義約束名,默認約束名為SYS_ 在列后面定義約束稱為列級約束
create table test(c1 number primary key(c1)); 所有列定義完后再定義約束稱為表級約束(能定義聯合主鍵)
cretae table test(c1 number,c2 number,priary key(c1,c2)); 定義聯合主鍵
create table child(c1 number primary key); 先要定義父表
create table child(c1 number primary key, c2 number references parent(c1)); 然后定義子表 references parent定義外鍵
create table child(c1 number primary key, c2 number references parent(c1) on delete cascate); on delete cascate為級聯刪除
create table child(c1 number primary key, c2 number references parent(c1) on delete set null); on delete set null刪除后將外鍵置空
create table child (c1 number primary key, c2 number,foreignkey(c2) references parent(c1));
二、約束
1、非空約束(not null)
這是一個列級約束
在建表時,在數據類型的后面加上 not null ,也就是在插入時不允許插入空值。
例:create table student(id number primary key,name varchar2(32) not null,address varchar2(32));
2、unique 唯一約束
唯一約束,是會忽略空值的,唯一約束,要求插入的記錄中的值是為一的。
例:create table student(id number,name varchar2(32),address varchar2(32),primary key (id),unique (address));
如果創建一個uk,系統自動建一個唯一索引
3、pk、uk
Oralce支持級聯刪除,不支持級聯更新
4、check約束
檢查約束,可以按照指定條件,檢查記錄的插入。check中不能使用尾列,不能使用函數,不能引用其他字段。
例:create table sal (a1 number , check(a11000));
你可以把表刪了,在創建沒主鍵約束的表就可以了;或者是你創建約束時指定約束名
例:create table t_stu(stuid integer not null,stuname varchar(50))
添加主鍵alter table t_stu add constraint p_pk priary key stuid;p_pk是約束名字
刪除主鍵:alter table t_stu drop constraint p_pk,從你的錯務信息可以看出你沒有給約束起名字吧。
SQL和 Oracle外鍵的相關約束中的級聯刪除 我們在相關的系統中如果你要刪除相關記錄 我們就要關聯一起刪除N多張表 同時它們之間還存在著相互約束的關系 所以考慮到在創建表時加上約束關系
詳細內容如下:
SQL的Oracle外鍵約束可以實現級聯刪除與級聯更新;Oracle 則只充許級聯刪除
SQL級聯刪除與級聯更新使用格式
CREATE TABLE A (ID INT PRIMARY KEY NAME VARCHAR( ))
CREATE TABLE A (ID INT REFERENCES A (ID)ON DELETE CASCADE ON UPDATE CASCADE AGE TINYINT)
Oracle 級聯刪除使用格式
CREATE TABLE A (ID INT PRIMAY KEY NAME VARCHAR ( ))
CREATE TABLE A (ID INT REFERENCES A (ID)ON DELETE CASCADE AGE NUMBER( ))
CREATE TABLE groups
(
id VARCHAR ( ) CONSTRAINT pk_groupid PRIMARY KEY
name VARCHAR ( )
description VARCHAR ( )
)
TABLESPACE userspace;
CREATE TABLE usringrp
(
group_id VARCHAR ( ) CONSTRAINT fk_uing_grpid
REFERENCES groups(id)
ON DELETE CASCADE
user_id VARCHAR ( )
)
TABLESPACE userspace;
PowerDesigner
參照完整性約束
限制(Restrict) 不允許進行修改或刪除操作 若修改或刪除主表的主鍵時 如果子表中存在子記錄 系統將產生一個錯誤提示 這是缺省的參照完整性設置
置空(Set Null) 如果Oracle外鍵列允許為空 若修改或刪除主表的主鍵時 把子表中參照的外鍵列設置為空值(NULL)
置為缺省(Set Default) 如果指定了缺省值 若修改或刪除主表的主鍵時 把子表中參照的Oracle外鍵設置為缺省值(Default)
級聯(Cascade) 把主表中主鍵修改為一個新的值時 相應修改子表中Oracle外鍵的值 或者刪除主表中主鍵的記錄時 要相應刪除子表中外鍵的記錄
lishixinzhi/Article/program/Oracle/201311/17613
我的回答假設表的主鍵為 PK1,PK2
大概的語句如下
delete from table1 where PK1 in (select PK2 from table2)
刪除掉所用 PK1 的列,其中 PK1 的值在 table2 的PK2 列出現,即重復的值
具體的語句可以根據實際的修改