動手敲~~~java
--建立一個表空間--beijing create tablespace beijing datafile 'c:\beijing.dbf' size 100m autoextend on next 10m; --刪除表空間 drop tablespace beijing; /* 建立用戶 */ create user dashao identified by dashao default tablespace beijing; /* 受權 grant 角色 | 權限 to 用戶 */ grant connect to dashao; --授予dba的角色 grant dba to dashao; /* 建立表 create table 表名( 列名 列的類型 [列的約束], 列名 列的類型 [列的約束] ); 列的類型: varchar ,在Oracle中,目前是支持的, 可是不保證之後還支持 varchar2(長度) 可變字符長度 varchar2(10) hello 佔5個字符 char(長度) 固定長度字符 char(10) hello 佔10個字符,用空格填充 number(總長度,小數長度) 數字類型 --小數長度不能大於等於總長度 date 年月日時分秒 2017/4/13 9:43:49 timestamp 時間戳, 比date類型更加精確 13-APR-17 09.44.08.272000 AM +08:00 LONG/CLOB : 存放一本小說 BLOB : 存放電影 java 存進去, 再讀取出來 使用子查詢的方式建立表 create table 表名 as 查詢語句; 注意: 只會複製表結構和表中的數據,不會複製列的約束 若是查詢語句有結果, 就是複製 表結構和數據 若是查詢語句沒有結果, 就是複製 表結構 */ select * from scott.emp; create table test1( name1 varchar2(10), name2 char(10), age number(2,3) ); insert into test1(name1,name2) values('hello','hello'); select * from test1 where name1 like 'hello'; --能夠查詢數據 select * from test1 where name2 like 'hello'; --查不出數據 insert into test1(age) values(2); select current_date from dual; select current_timestamp from dual; -- create table 表名 as 查詢語句; 複製表 create table emp as select * from scott.emp; select * from emp; --若是查詢語句是沒有任何的結果 select * from scott.emp where 1=2; create table emp1 as select * from scott.emp where 1=2; select * from emp1; /* 修改表: 添加列 修改列 刪除列 修改列名 重命名錶 sql分類: DDL : 數據定義語言, 修改的結構 alter create drop truncate DML : 數據操縱語言 , 操做表中數據 insert update delete DCL : 數據控制語言 , grant DQL : select */ create table stu( stuid number, sname varchar2(10) ); alter table stu add phone varchar2(11); alter table stu add ( mobile varchar2(11), sex varchar2(2) ); --修改列的類型 alter table stu modify sex varchar2(4); --修改列的名 sex --->gender alter table stu rename column sex to gender; --刪除列 alter table stu drop column gender; select * from stu; --修改表名 rename stu to Student; select * from student; --刪除表 drop table Student; /* 表的五大約束 列的約束:約束主要是用來約束表中的數據的規則 主鍵約束:primary key 不能爲空,必須惟一 非空約束 惟一約束 檢查約束 check(條件) 在mysql中是能夠寫的,可是mysql直接忽略了檢查約束 外鍵約束: 主要是用來約束從表a總的記錄,必須是存在於主表b中 */ --男,女,人妖 create table student( stuid number primary key, sname varchar2(10) unique, age varchar2(10) not null, gender varchar2(4) check( gender in ('男','女','人妖')) ); --主鍵約束違反 insert into student values(1,'張三','31','男'); insert into student values(1,'李四','31','男'); --惟一約束違反 insert into student values(1,'徐立','31','男'); insert into student values(2,'徐立','31','男'); --非空約束 insert into student values(1,'徐立',null,'男'); --檢查約束 insert into student values(1,'徐立','31','男'); insert into student values(1,'徐立','31','妖'); /* 商品分類,商品表 */ --商品分類表 create table category( cid number primary key, cname varchar2(20) ); --建立一個商品表 create table product( pid number primary key, pname varchar2(20), cno number ); insert into category values(1,'手機數碼'); insert into product values(10,'錘子',11); --添加外鍵約束 alter table Product add foreign key(cno) references Category(cid); delete from Product where pid=10; --1.首先主表中必須存在11號, 先往主表中插入數據,再往從表中插入數據 insert into Category values(2,'電腦辦公'); insert into Product values(11,'外星人',2); select * from Category; select * from Product; --刪除Category drop table Category;--被外鍵關聯,沒法刪除 --強制刪除(不建議),先刪除外鍵關聯的外鍵約束,在刪除本身, drop table Category cascade constraint; --級聯刪除 ----添加外鍵約束,使用級聯約束 ,在刪除的時候,使用級聯刪除 alter table product add foreign key(cno) references category(cid) on delete cascade; insert into category values(2,'電腦辦公'); insert into product values(11,'外星人',2); --級聯刪除 : 首先去從表中找有沒有 關聯數據, 若是在從表中找到關聯數據,先刪除從表中關聯數據,而後再刪除表中的數據 delete from category where cid = 2; select * from Category; select * from Product; /* 插入數據: insert into 表名 values(全部列的值都要對應寫上) insert into 表名(列1,列2) values(值1,值2); 使用子查詢插入數據 insert into 表名 查詢語句 */ select * from emp1; select * from emp; --將emp中10號部門的員工信息,插入到emp1中 insert into emp1 select * from emp where deptno=10 ; /* 更新數據 update 表名 set 列名 = 列的值 [where 條件] */ update emp1 set ename='HUAAN' where ename = 'KING'; select * from emp1; /* 刪除數據: delete from 表名 [where 條件] delete和truncate 區別 delete: truncate: DML DDL 逐條刪除 先刪除表再建立表 支持事務操做 不支持事務操做, 執行效率要高 */ /* 事務: 就是一系列的操做,要麼都成功,要麼都失敗 四大特性: 原子性,隔離性,持久性,一致性 若是不考慮隔離級別: 髒讀,虛讀,不可重複讀 MYSQL隔離級別: READ UNCOMMITTED , READ COMMITTED, REPEATABLE READ, SERIALIAZABLE ORACLE隔離級別: READ COMMITTED SERIALIZABLE READ ONLY 默認隔離級別: READ COMMITTED 提交 : commit 事務的保存點/回滾點: savepoint 保存點的名稱 回滾: rollback */ create table louti( lou number primary key ); insert into louti values(1); insert into louti values(2); insert into louti values(3); insert into louti values(4); insert into louti values(5); savepoint dangban; insert into louti values(5); --主鍵約束會發生異常 insert into louti values(6); rollback to dangban commit; declare begin insert into louti values(1); insert into louti values(2); insert into louti values(3); insert into louti values(4); insert into louti values(5); savepoint dangban; insert into louti values(5); --這行代碼會發生異常 insert into louti values(6); commit; exception --捕獲異常 when others then rollback to dangban; commit; end; select * from louti; /* 視圖: 是對查詢結果的一個封裝 視圖裏面全部的數據,都是來自於它查詢的那張表,視圖自己不存儲任何數據 1.可以封裝複雜的查詢結果 2.屏蔽表中的細節 語法: create [or replace] view 視圖的名稱 as 查詢語句 [ with read only] 注意: 一般不要經過視圖去修改,視圖建立的時候,一般要加上with read only */ select * from emp; --建立一個視圖 create or replace view view_test1 as select ename,job,mgr from emp; select * from view_test1; --經過視圖修改數據 update view_test1 set ename = 'SMITH2' where ename='SMITH' select * from emp; --建立一個只讀視圖 create or replace view view_test2 as select ename,job,mgr from emp with read only; update view_test2 set ename='SMITH3' where ename = 'SMITH2'; /* 序列: 生成相似於 auto_increment 這種ID自動增加 1,2,3,4,5.... auto_increment 這個是mysql 語法: create sequence 序列的名稱 start with 從幾開始 increment by 每次增加多少 maxvalue 最大值 | nomaxvalue minvalue 最小值 | nominvalue cycle | nocycle 是否循環 1,2,3,1,2,3 cache 緩存的數量3 | nocache 1,2,3,4,5,6 如何從序列獲取值 currval : 當前值 nextval : 下一個值 注意: currval 須要在調用nextval以後才能使用 永不回頭,往下取數據, 不管發生異常, 回滾 */ --建立一個 1,3,5,7,9......30 create sequence seq_test1 start with 1 increment by 2 maxvalue 20 cycle cache 10; select seq_test1.nextval from dual; select seq_test1.currval from dual; /* 索引:至關因而一本書的目錄,可以提升咱們的查詢效率 若是某一列,你常常用來做爲查詢條件,那麼就有必要建立索引,數據量比較的狀況 語法: create index 索引的名稱 on 表名(列) 注意:主鍵約束自帶主鍵索引, 惟一約束自帶惟一索引 索引原理: btree balance Tree 平衡二叉樹 若是某列做爲查詢條件的時候,能夠提升查詢效率,可是修改的時候,會變慢 索引建立好以後,過了一段,DBA都會去作重構索引 SQL調優: 1.查看執行計劃F5 2. 分析裏面的cost 和 影響行數, 想辦法下降 */ /* DDL表空間操做 建立表空間 建立用戶 受權 建立表 子查詢建立表 修改表 : 添加列,刪除列,修改列,修改列名, 修改表名 約束: 主鍵約束,惟一約束,非空約束,檢查約束,外鍵約束 外鍵約束: 強制刪除 級聯刪除 DML表中數據: 插入數據 子查詢插入數據 更新數據 刪除數據: delete 和 truncate 事務操做: savepoint 保存點 rollback to 保存點 ORACLE事務隔離級別 : READ COMMITTED 視圖: 就像窗戶同樣, 封裝查詢結果 , 一般視圖建立只讀視圖 序列: 主要是用來實現ID自增加 索引: 至關因而書的目錄,可以提升查詢效率, 原理 平衡二叉樹, 每隔一段時間DBA都須要去重建索引 同義詞: create synonym 名稱 for 對象的名稱 */ /* PLSQL編程 : procedure Language 過程語言 Oracle對SQL的一個擴展 讓咱們可以像在java中同樣寫 if else else if 條件, 還能夠編寫循環邏輯 for while declare --聲明變量 變量名 變量類型; 變量名 變量類型 := 初始值; vsal emp.sal%type; --引用型的變量 vrow emp%rowtype; --聲明記錄型變量 begin --業務邏輯 end; dbms_output.put_line()至關於java中 syso */ declare i varchar2(10) := '張三'; begin dbms_output.put_line(i); end; --查詢7369的工資,而且打印出來 declare vsal emp.sal%type; begin --將查詢出的結果賦值給vsal select sal into vsal from emp where empno = 7369; dbms_output.put_line(vsal); end; --查詢7369的員工信息,而且打印出來 select * from emp where empno = 7369; declare vrow emp%rowtype; begin select * into vrow from emp where empno = 7369; dbms_output.put_line('姓名:'||vrow.ename || '工資'|| vrow.sal); end; /* PL條件判斷 if then elsif then else end if; */ --根據不一樣年紀,輸出相關內容 declare age number := &aaa; begin if age < 18 then dbms_output.put_line('小屁孩'); elsif age>=18 and age <=24 then dbms_output.put_line('年輕人'); elsif age>24 and age < 40 then dbms_output.put_line('老司機'); else dbms_output.put_line('老年人'); end if; end; /* 循環操做 while 循環 while 條件 loop end loop; for循環 for 變量 in [reverse] 起始值..結束值 loop end loop; loop循環 loop exit when 條件 end loop; */ --輸出1~10 declare i number :=1; begin while i<=10 loop dbms_output.put_line(i); i := i+1; end loop; end; --輸出1~10 declare begin for i in reverse 1..10 loop dbms_output.put_line(i); end loop; end; --輸出1~10 declare i number :=1; begin loop exit when i>10; dbms_output.put_line(i); i := i+1; end loop; end; /* * *** ***** *** * 輸出 m x : [-m,m] y : [-m,m] 輸出全部知足條件的 : abs(y)+abs(x) <=m m取值 */ --使用PLSQL輸出菱形 declare m number := 10; begin for x in -m..m loop for y in -m..m loop if abs(y) + abs(x) <= m then dbms_output.put('*'); else dbms_output.put(' '); end if; end loop; dbms_output.new_line(); end loop; end; --使用PLSQL輸出三角形,只要是三個角 declare m number := 10; begin for x in reverse -m..m loop for y in -m..m loop if abs(y) + abs(x) <= m and x>=0 then dbms_output.put('*'); else dbms_output.put(' '); end if; end loop; dbms_output.new_line(); end loop; end;