本文章通過oracle 10g 11g自帶的HR用戶下的7張表,來學習SQL基礎知識。
在
安裝數據庫時,勾選相應的選項,就會安裝HR用戶下練習使用的7張表。
如果你的oracle數據庫沒有HR用戶,可以下載本文附件中的工具包來
安裝。
-------------------------------------- 基本準備-------------------------------------------------------
使 用sqlplus連接數據庫:
1 本地主機連接遠端的oracle數據庫,本地主機要安裝oracle客戶端,輸入如下命令
sqlplus 用戶名/密碼@網絡服務名
網 絡服務名是什麼?其實就是本地主機安裝oracle客戶端時配置遠端數據庫的別名,在Oracle Net Manager中叫“網絡服務名”, 在sqlplusw中叫“主機字符串”。
2 本地主機連接遠端的oracle數據庫成功後,切換到其實用戶
SQL> conn scott/tigger@網絡服務名
SQL>
conn sys/sys的密碼@網絡服務名
as sysdba
3
連接本機的oracle數據庫,輸入如下命令
sqlplus
/nolog
conn / as sysdba
4 連接本機的oracle數據庫成功後,切換到其實用戶
SQL> conn scott/tigger;
常用SQL/PLUS命令
查看一行顯示字符數:SQL> show
linesize; (簡寫:show lines)
設置顯示寬度爲200字符:SQL> set linesize 200;
(簡寫:set lines 200)
查看目前的pagesize,默認是14:show pagesize;
將pagesize設
置好100:set pagesize 100;
常用PL/SQL命令
查看錶的結構(詳細): select dbms_metadata.get_ddl('TABLE','大寫表名') FROM dual;
查
看錶的結構(簡單): desc 表名
查看當前數據庫登錄操作的用戶 :show user
常 用字典、包
查看數據庫有哪些用戶從“用戶字典”(注意權限):select
username,account_status from dba_users;
查看當前用戶有哪些表:select table_name
from user_tables;
查看當前用戶的對象:select object_name,object_type from user_objects;
解鎖scott帳戶
alter user scott account unlock; //解鎖帳戶
grant
connect,resource,unlimited tablespace to scott; //分配權限
alter user
scott identified by tiger ; //設置密碼
Oracle sqlplus的清屏
如果是通過本身的sqlplus那麼方法有:
同時按SHIFT和DELETE鍵然後點OK、clear screen ;或 clea
scre;實現
如果是通過cmd模式進入的話:
可以通過host cls命令來實現清屏
----------------------------------------------------Schema-------------------------------------------------
HR用戶下的7張表 Schema
表的說明:
employees 員工表
departments 部門表(員工所在的部門)
locations 地址表(部門在哪個地址)
countries 國家表(地址在哪個國家)
regions 大區表(亞太區,北美區) (國家在哪個大區)
job 工作崗位表 (員工的工作崗位)
jbo_history 工作變動歷史表
----------------------------運算符部分------------------------------
=,>,<,>=,<=,<>,
between ... and ... (兩端包含)
in() , not in()
like '%磊_' , %配置多個字符 , _ 配置一個字符。 like '%磊/_' escape '/' ,說明/是轉義字符,可以查詢結果中包含_。
is null
邏輯運算符:and , or , not
----------------------------子句部分------------------------------
select子句
from子句
where子句
order by 子句, 結果有null值時,升序時null放在結果的最後面,降序null值放在結果的最前面。可以修改:order by id desc nulls last/first;
group by 子句
having 子句
for update子句
---------------------------函數部分-------------------------------
字符函數:
UPPER('String') 轉換成大寫字母
LOWER('String') 轉換成小寫字母
INITCAP('String')轉換爲首字母大寫,其它小字
SUBSTR('HelloWorld',1,5) 結果是:Hello。參數說明:('HelloWorld',1,5)意思是截取'HelloWorld'串從第1個開始,取5個。SQL中“第一”是從 1開始的。
INSTR('HelloWorld','W') 結果是:6
replace('JACK and JUE','J','BL') 替換,把'J' 替換成'BL'。
trim() 去空格
數學函數:
ROUND(45.926,2) 結果:45.93 保留兩位小數,四捨五入。
ROUND(45.926,-1) 結果:50
TRUNC(45.926,2) 結果:45.92 保留兩位小數,多餘部分直接截去,無四捨五入。
TRUNC(45.926,-1) 結果:40
MOD(1600,300) 結果:100 取餘數
日期函數:
SQL> select sysdate from dual; 結果是:23-7月 -10 sysdate是一個無參數的函數。
轉換函數: (隱式轉換,顯示轉換)
---- 日期轉字符
SQL> select to_char (sysdate,'YYYY-MM-DD') as date_ from dual; 結果:2010-07-23
SQL> select to_char (sysdate,'fm YYYY-MM-DD') as date_ from dual; 結果:2010-7-23 fm 作用:去掉前導0,07月顯示爲7月。
SQL> select to_char (sysdate,'YYYY-MM-DD HH24:MI:SS') as date_ from dual; 結果:2010-07-23 12:06:19
---- 數字轉字符
SQL> select to_char(100,'L99,999.00') from dual; 結果:¥100.00 以本地貨幣格式化成字符串。
---- 字符轉成數值
TO_NUMBER('100')
---- 字符轉成日期
TO_DATE('2009-11-01','YYYY-MM-DD')
null相關函數: 相當於if else
NVL(name,0) 如果name值是null,就返回0,否則返回name。
NVL2( name,1 ,0 ) 如果name值是null,就返回0,否則返回1。
NULLIF(1,1) 如果兩個參數相等,就返回null,否則返回第一個參數。
COALESCE(name,age,pwd) 可跟多個參數,參數中從前向後,返回第一個不爲null的參數。
聚合(組)函數:
MAX()
MIN()
AVG()
COUNT()
SUM()
STDDEV()
VARIANCE()
----------------------------select部分
------------------------------
去除重複的值, 例select distinct department_id,job_id from employees; distinct 關鍵字後跟多個列時,列的組合總體要維一。
查看錶的結構, DESCRIBE ,他是sql plus的命令,可以簡寫爲DESC,後面可以不寫分號。 例DESC employees
子查詢:
子查詢可以出現在where,having,from 子句中。子查詢中的語句要使用() 括起來。
當子查詢返回結果爲null時,整個SQL使用了非 "is null"運算符時,查詢結果就是0條記錄。
注意 **** not in ( 集合[111,222,null])時,整個SQL查詢結果就是0條記錄。
子查詢 -- 在where子句中:
= , < , > , <>是單行運算符,使用單行運算時,子查詢只能返回一條結果(一行一列)。
in ,not in ,any,all ,聚合函數, 是多行運算符,使用多行運算符時,子查詢可以返回多條結果(多行一列)。
- 子查詢 只返一條結果,並使用了單行運算符,SQL語句可以正常執行
- elect last_name ,salary from employees where salary > ( select salary from employees where last_name = 'Abel' );
子查詢只返一條結果,並使用了單行運算符,SQL語句可以正常執行
select last_name ,salary from employees where salary > (select salary from employees where last_name ='Abel');
- 子查詢 只返多條結果,並使用了單行運算符,SQL語句不可以正常執行
- select last_name ,salary from employees where salary > ( select salary from employees where last_name like 'K%' );
- 第 1 行 出現錯誤:
- ORA-01427: 單行子查詢返回多個行
子查詢只返多條結果,並使用了單行運算符,SQL語句不可以正常執行
select last_name ,salary from employees where salary > (select salary from employees where last_name like 'K%');
第 1 行出現錯誤:
ORA-01427: 單行子查詢返回多個行
子查詢 -- 在having子句中:
- SELECT department_id , MIN (salary)
- FROM employees
- GROUP BY department_id
- HAVING MIN (salary) >
- (SELECT MIN (salary)
- FROM employees
- WHERE department_id=50);
SELECT department_id ,MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) >
(SELECT MIN(salary)
FROM employees
WHERE department_id=50);
子查詢 -- 在from子句中:
略。。。
--------------------select多張表 join部分-------------------------
內連接
|
外連接
|
連接字段爲null值或不能實現“拉手”連接的行, 不會出現在連接結果集合中
|
連接字段爲null值或不能實現“拉手”連接的行, 會現在連接結果集合中
|
Inner Joins 內連接 Self join 自己連接自己 Nonequijoins 不等連接 |
left outer join 左外連接 right outer join 右外連接 full outer join 全連接 |
Inner Joins 內連接 (是內連接,連接字段爲null值或不能實現“拉手”連接的行,不會出現 在連接結果集合中)
--使用join on 方式(SQL標準),實現表的內連接:(經常用)
兩張表中可連接的字段名稱不相同
- select employee_id,last_name,location_id,e.department_id
- from employees e <strong> join </strong> departments d <strong> on </strong> e.department_id=d.department_id;
select employee_id,last_name,location_id,e.department_id
from employees e join
departments d on
e.department_id=d.department_id;
e.department_id 字段兩個表都有,要加前綴或表別名。
三張表以上時使用: t1 join t2 on t1.n=t2.n join t3 on t3.n=t2.n
--Natural join 自然連接(SQL標準),實現表的內連接: (很少用)
兩張表中可連接的字段名稱相同,類型相同 就可以使用這種簡寫的連接方法,
在departments表與locations表中都有location_id字段且類型相同。
如果兩張表中各有兩個字段符合上述要求,就用這兩個字段一起做join。
- SELECT department_id,department_name,location_id,city
- FROM departments
- <strong>NATURAL JOIN </strong> locations;
SELECT department_id,department_name,location_id,city
FROM departments
NATURAL JOIN
locations;
--USING 自然連接(SQL標準),實現表的內連接:(很少用)
兩張表中可連接的字段名稱相同,就可以進行連接,類型不相同oracle可以自動轉換
如果兩張表中各有兩個字段符合上述要求,但使用的是哪一個字段來連接呢,
我們可以通過using來指定,using與natural join 不可同時出現。
- select employee_id,last_name,location_id,department_id
- from employees <strong>join</strong> departments
- <strong>using</strong>(department_id);
select employee_id,last_name,location_id,department_id
from employees join
departments
using
(department_id);
department_id 字段兩個表都有,但不要加前綴或表別名
--使用Oracle專有的語法,實現表的內連 接:(經常用)
- SELECT table1. column ,table2. column
- FROM table1,table2
- <strong>WHERE table1. column =table2. column </strong> ;
SELECT table1.column,table2.column
FROM table1,table2
WHERE table1.column=table2.column
;
可以按多個字段來連接表
- SELECT employee_id,last_name,department_name
- FROM employees e,departments d
- <strong>WHERE e.department_id=d.department_id AND e.manager_id=d.manager_id</strong>;
SELECT employee_id,last_name,department_name
FROM employees e,departments d
WHERE e.department_id=d.department_id AND e.manager_id=d.manager_id
;
三張表連接
- SELECT employee_id,city,department_name
- FROM employees e,departments d,locations l
- <strong>WHERE e.department_id=d.department_id AND d.location_id = l.location_id</strong>;
SELECT employee_id,city,department_name
FROM employees e,departments d,locations l
WHERE e.department_id=d.department_id AND d.location_id = l.location_id
;
Self join 自己連接自己 (是內連接,連接字段爲null值或不能實現“拉手”連接的行,不會出 現在連接結果集合中)
同一張表起兩個不同的別名,實現連接自己
下面是SQL標準的語法:
- SELECT w.last_name emp,m.last_name mgr
- FROM <strong>employees w</strong> JOIN <strong>employees m</strong>
- ON w.manager_id=m.employee_id;
SELECT w.last_name emp,m.last_name mgr
FROM employees w
JOIN employees m
ON w.manager_id=m.employee_id;
下面是Oracle的語法:
- SELECT w.last_name emp,m.last_name mgr
- FROM employees w,employees m
- WHERE w.manager_id = m.employee_id;
SELECT w.last_name emp,m.last_name mgr
FROM employees w,employees m
WHERE w.manager_id = m.employee_id;
Nonequijoins 不等連接 (是內連接,連接字段爲null值或不能實現“拉手”連接的行,不會 出現在連接結果集合中)
連接的條件不是“等於”,是在一個範圍內。
t1員工表, t2是工資檔次表 , 求員工的工資在哪個檔次之間。
t1 join t2 on t1.工資 between t2.本檔最低工資 and t2.本檔最高工資
Outer jion 外連接 (是外連接,連接字段爲null值或不能實現“拉手”連接的行,會現在連接 結果集合中)
--left outer join 左外連接
SQL標準語法:
- SELECT e.last_name,d.department_name
- FROM employees e <strong> LEFT OUTER JOIN </strong> departments d
- ON e.department_id = d.department_id;
SELECT e.last_name,d.department_name
FROM employees e LEFT OUTER JOIN
departments d
ON e.department_id = d.department_id;
Oracle語法: 在右邊表加一個(+)
- SELECT e.last_name,d.department_name
- FROM employees e ,departments d
- WHERE e.department_id = d.department_id(+);
SELECT e.last_name,d.department_name
FROM employees e ,departments d
WHERE e.department_id = d.department_id(+);
--right outer join 右外連接
SQL標準語法:
- SELECT e.last_name,d.department_name
- FROM employees e <strong> RIGHT OUTER JOIN </strong> departments d
- ON e.department_id = d.department_id;
SELECT e.last_name,d.department_name
FROM employees e RIGHT OUTER JOIN
departments d
ON e.department_id = d.department_id;
Oracle語法:在左邊表加一個(+)
- SELECT e.last_name,d.department_name
- FROM employees e ,departments d
- WHERE e.department_id(+) = d.department_id;
SELECT e.last_name,d.department_name
FROM employees e ,departments d
WHERE e.department_id(+) = d.department_id;
--full outer join 全連接
SQL標準語法:
- SELECT e.last_name,d.department_name
- FROM employees e <strong> FULL OUTER JOIN </strong> departments d
- ON e.department_id = d.department_id;
SELECT e.last_name,d.department_name
FROM employees e FULL OUTER JOIN
departments d
ON e.department_id = d.department_id;
Oracle語法:
- 不 知
不知
Cartesian product 笛卡兒積
--Corss join
第一張表有n條記錄,第二張表有m條記錄, 連接後會生成 n*m條記錄的表。
當連接表時, 條件失效,會把所有的可能連接都連接一次,就會形成n*m條記錄的新表。
我們應避免笛卡兒積,只有想生成大量測試數據來填充表進才使用
SQL標準語法:
- SELECT last_name,department_name
- FROM employees
- CROSS JOIN departments;
SELECT last_name,department_name
FROM employees
CROSS JOIN departments;
Oracle語法:
就是不要where條件。
---------------------------insert部分-------------------------------
插入一條:
- INSERT INTO departments (department_id,department_name,manager_id,location_id)
- VALUES ( 71, 'Public Relaations' ,100,1700);
INSERT INTO departments (department_id,department_name,manager_id,location_id)
VALUES ( 71,'Public Relaations',100,1700);
批量插入:
INSERT INTO 表名 字段(一致) SELECT 字段(一致) FROM 表名
- INSERT INTO copy_departments
- SELECT * FROM departments;
- 由 於兩個表的 字段的數據類型,字段的順序都一樣,所以省略了字段名。
INSERT INTO copy_departments
SELECT * FROM departments;
由於兩個表的 字段的數據類型,字段的順序都一樣,所以省略了字段名。
---------------------------update部分
-------------------------------
UPDATE 表名 SET 列=值,列=值 WHERE 條件
UPDATE 表名 SET 列=(子查詢),列=(子查詢) WHERE 條件=(子查詢)
---------------------------detete部分
-------------------------------
DELETE [FROM] 表名 WHERE 條件
DELETE [FROM] 表名 WHERE 條件=(子查詢)
----------------------------
管理表-----------------------------------
複製表:
CREATE TABLE copy_departments AS SELECT * FROM departments;
清空表:
TRUNCATE TABLE copy_departments;
與delete的不同是,TRUNCATE 不可以容易的回滾。
創建表:
CREATE TABLE [schema.]表名 ( column 數據類型 [default expr ]);
創建:
- CREATE TABLE t3
- (id int ,
- dname varchar2(14),
- age number(5),
- hire_date DATE DEFAULT SYSDATE);
CREATE TABLE t3
(id int,
dname varchar2(14),
age number(5),
hire_date DATE DEFAULT SYSDATE);
查看錶結構:
- SQL> DESC t3
- 名 稱 是否爲空? 類型
- ----------------------------------------- -------- ----------------------------
- ID NUMBER(38)
- DNAME VARCHAR2(14)
- AGE NUMBER(5)
- HIRE_DATE DATE
SQL> DESC t3
名稱 是否爲空? 類型
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
DNAME VARCHAR2(14)
AGE NUMBER(5)
HIRE_DATE DATE
用子查詢創建表:
語法:CREATE TABLE tablename [(新列名,新列名...)] AS 子查詢
新列名可以省略,新列名的數量要與 子查詢的列數量一列。
如果子查詢某列是表達式無列名,要起別名。
原表的約束,只有not null約束會傳遞給新表,其它約束丟失不傳遞。
- CREATE TABLE t8 as select * from employees;
- 建 了一個t8表,與employees一樣, employees原有的約束只有not null 約束會傳遞給t8表,其實約束丟失不傳遞。
CREATE TABLE t8 as select * from employees;
創建了一個t8表,與employees一樣, employees原有的約束只有not null約束會傳遞給t8表,其實約束丟失不傳遞。
- CREATE TABLE t7 (new_id,new_name) as select employee_id,last_name from employees;
- 建 了t7表,有new_id,new_name兩個字段,數據來源於employees的employee_id,last_name 兩個字段
CREATE TABLE t7 (new_id,new_name) as select employee_id,last_name from employees;
創建了t7表,有new_id,new_name兩個字段,數據來源於employees的employee_id,last_name 兩個字段
- CREATE TABLE t9 AS
- SELECT employee_id,last_name,
- salary*12 ANNSAL, // 表達式無列名,同時又沒有指定新列名,這時要起別名。 或者在AS 前指定新列 名。
- HIRE_DATE
- FROM employees
- WHERE department_id=80;
CREATE TABLE t9 AS
SELECT employee_id,last_name,
salary*12 ANNSAL, //表達式無列名,同時又沒有指定新列名,這時要起別名。 或者在AS前指定新列名。
HIRE_DATE
FROM employees
WHERE department_id=80;
刪除表:
DROP TABLE table_name;
DROP TABLE table_name PURGE; 被刪除表不進回收站,直接刪除。(10G新加的功能)
修改表:
ALTER TABLE .... 略。。。
----------------------------
事務-----------------------------------------------
事務什麼時候會開始與結束--事務的邊界:
1 開始執行一條DML語句時,比如insert,會自動開啓一個新事務。
2 當COMMIT 或 ROLLBACK 時,事務會結束。
3 當開始一個DDL 或 DCL 語句時,前面的事務會提交,因爲DDL ,DCL語句要在一個單獨的事務中執行。
4 用戶正常退出SQLplus時會提交事務。
5 當ORACLE系統死掉掛掉,再重新啓動後,會回滾之前沒有提交的事務。
COMMIT 提交事務
ROLLBACK 回滾事務
SAVEPOINT a 定義保存點a
ROLLBACK TO a 回滾到保存點a
---------------------------- 常用的數據庫對象---------------------------------
table 表
view 視圖
sequence 序列
index 索引
synonym 同義詞
存儲過程
觸發器
查看用戶對象
- SELECT object_name,object_type FROM user_objects;
SELECT object_name,object_type FROM user_objects;
-------------------------------命名規則 ----------------------------------------
1 必須以字母開頭
2 最大長度爲30
3 A-Z,a-z,0-9,_,$,# 範圍內
4 不能包含Oracle保留關鍵字
-------------------------------數據類型 ----------------------------------------
VARCHAR2(size)
VARCHAR2(200 CHAR)
CHAR(size)
NUMBER(p,s)
DATE
CLOB
BLOB
BFILE一個大文件保存在操作系統上,Oracle保存一個指針
FOWID每個表都有一列叫rowid
TIMESTAMP
---------------------------------常用的約束 -----------------------------------
NOT NULL 非空
UNIQUE 唯一
PRIMARY KEY 主鍵
FOREIGN KEY 外鍵
CHECK 自定義
創建表時在字段後添加主鍵約束:
- CREATE TABLE t5 ( emp_id number(4) PRIMARY KEY , dname varchar2(14) NOT NULL , age number(5) NOT NULL , hire_date DATE DEFAULT SYSDATE);
CREATE TABLE t5 ( emp_id number(4) PRIMARY KEY , dname varchar2(14) NOT NULL, age number(5) NOT NULL, hire_date DATE DEFAULT SYSDATE);
員工表 (EMPLOYEES)的建表語句:
- CREATE TABLE "HR" . "EMPLOYEES"
- ( "EMPLOYEE_ID" NUMBER(6,0),
- "FIRST_NAME" VARCHAR2(20),
- "LAST_NAME" VARCHAR2(25) CONSTRAINT "EMP_LAST_NAME_NN" NOT NULL ENABLE,
- "EMAIL" VARCHAR2(25) CONSTRAINT "EMP_EMAIL_NN" NOT NULL ENABLE,
- "PHONE_NUMBER" VARCHAR2(20),
- "HIRE_DATE" DATE CONSTRAINT "EMP_HIRE_DATE_NN" NOT NULL ENABLE,
- "JOB_ID" VARCHAR2(10) CONSTRAINT "EMP_JOB_NN" NOT NULL ENABLE,
- "SALARY" NUMBER(8,2),
- "COMMISSION_PCT" NUMBER(2,2),
- "MANAGER_ID" NUMBER(6,0),
- "DEPARTMENT_ID" NUMBER(4,0),
- CONSTRAINT "EMP_SALARY_MIN" CHECK (salary > 0) ENABLE,
- CONSTRAINT "EMP_EMAIL_UK" UNIQUE ( "EMAIL" )
- USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
- STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
- PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT )
- TABLESPACE "USERS" ENABLE,
- CONSTRAINT "EMP_EMP_ID_PK" PRIMARY KEY ( "EMPLOYEE_ID" )
- USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
- STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
- PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT )
- TABLESPACE "USERS" ENABLE,
- CONSTRAINT "EMP_DEPT_FK" FOREIGN KEY ( "DEPARTMENT_ID" )
- REFERENCES "HR" . "DEPARTMENTS" ( "DEPARTMENT_ID" ) ENABLE,
- CONSTRAINT "EMP_JOB_FK" FOREIGN KEY ( "JOB_ID" )
- REFERENCES "HR" . "JOBS" ( "JOB_ID" ) ENABLE,
- CONSTRAINT "EMP_MANAGER_FK" FOREIGN KEY ( "MANAGER_ID" )
- REFERENCES "HR" . "EMPLOYEES" ( "EMPLOYEE_ID" ) ENABLE
- ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
- STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
- PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT )
- TABLESPACE "USERS"
CREATE TABLE "HR"."EMPLOYEES"
( "EMPLOYEE_ID" NUMBER(6,0),
"FIRST_NAME" VARCHAR2(20),
"LAST_NAME" VARCHAR2(25) CONSTRAINT "EMP_LAST_NAME_NN" NOT NULL ENABLE,
"EMAIL" VARCHAR2(25) CONSTRAINT "EMP_EMAIL_NN" NOT NULL ENABLE,
"PHONE_NUMBER" VARCHAR2(20),
"HIRE_DATE" DATE CONSTRAINT "EMP_HIRE_DATE_NN" NOT NULL ENABLE,
"JOB_ID" VARCHAR2(10) CONSTRAINT "EMP_JOB_NN" NOT NULL ENABLE,
"SALARY" NUMBER(8,2),
"COMMISSION_PCT" NUMBER(2,2),
"MANAGER_ID" NUMBER(6,0),
"DEPARTMENT_ID" NUMBER(4,0),
CONSTRAINT "EMP_SALARY_MIN" CHECK (salary > 0) ENABLE,
CONSTRAINT "EMP_EMAIL_UK" UNIQUE ("EMAIL")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ENABLE,
CONSTRAINT "EMP_EMP_ID_PK" PRIMARY KEY ("EMPLOYEE_ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ENABLE,
CONSTRAINT "EMP_DEPT_FK" FOREIGN KEY ("DEPARTMENT_ID")
REFERENCES "HR"."DEPARTMENTS" ("DEPARTMENT_ID") ENABLE,
CONSTRAINT "EMP_JOB_FK" FOREIGN KEY ("JOB_ID")
REFERENCES "HR"."JOBS" ("JOB_ID") ENABLE,
CONSTRAINT "EMP_MANAGER_FK" FOREIGN KEY ("MANAGER_ID")
REFERENCES "HR"."EMPLOYEES" ("EMPLOYEE_ID") ENABLE
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS"
修改約束:
primary key的語法:
alert table table_name add constraint key_name primary key(columns);
unique key的語法:
alert table table_name add contraint key_name unique(columns);
刪 除約束:
ALTER TABLE table_name DROP PRIMARY KEY
--------------------------------------------------視圖 View------------------------------------------------------------
創建視圖的語法:
UPDATE視圖:
視圖通常是用來讀的,不過也可以有條件的UPDATE視圖中的記錄,
比如經過avg()一類的聚合函數計算出來的平均值就不能修改,
group by 分組出來的數據就不能修改,DISTINCT過濾後的數據,ROWNUM列做爲視圖中的一列時,表達式計算出來的結果,都不能修改
而與基表一一對應的項目就可以修改。
修改時使用UPDATE語句,與修改一般表一樣的。
ALTER VIEW :
略,請查詢聯機文檔
http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_4004.htm#SQLRF01104
刪除視圖:
DROP VIEW view_name;
--------------------------------------------------序列 Sequence-----------------------------------------------------
創建序列:
CREATE SEQUENCE squence_name;
刪除序列:
DROP SEQUENCE squence_name;
查出序列值 - 下一個值 ,取出後,原值加1:
SELECT squence_name.NEXTVAL FROM dual;
查出序列值 - 當前值,取出後,原值不變:
SELECT squence_name.CURRVAL FROM dual;
使用序列:
INSERT INTO 表 (主鍵字段,其它字段... ) VALUES (squence_name.NEXTVAL , 其它值...);
--------------------------------------------------索引 Index----------------------------------------------------------
語法:
- CREATE [ UNIQUE ] [BITMAP] INDEX index_name
- N 表 名(列名 [,列名]... );
CREATE [UNIQUE] [BITMAP] INDEX index_name
ON 表名(列名 [,列名]... );
創建索引:
- CREATE INDEX emp_last_name_idx ON employees(last_name);
CREATE INDEX emp_last_name_idx ON employees(last_name);
刪除索引:
- DROP INDEX index_name;
DROP INDEX index_name;
--------------------------------------------------同義詞 Synonym----------------------------------------------------
同義詞就是爲一個對象起一個別名。
語法:
- CREATE [ PUBLIC ] SYNONYM synonym_name FOR object;
- 不 加PUBLIC ,這個同義詞就保存在當前用戶的對象,加了 PUBLIC ,這個同義詞就不只是當前用戶的,其它用戶也可以使用。
CREATE [PUBLIC] SYNONYM synonym_name FOR object;
不加PUBLIC,這個同義詞就保存在當前用戶的對象,加了PUBLIC,這個同義詞就不只是當前用戶的,其它用戶也可以使用。
創建同義詞:
- CREATE SYNONYM d_sum
- FOR 數據庫對象;
CREATE SYNONYM d_sum
FOR 數據庫對象;
刪除同義詞:
- DROP SYNONYM d_sum(同義詞的名稱)
DROP SYNONYM d_sum(同義詞的名稱)
說明:如果需要 HR用戶下所需的表,請留言我 我會提供給大家 謝謝!