SQL語句複習【專題九】程序員
視圖:View
視圖的概念:視圖是從若干基本表或其餘視圖構造出來的表。
在建立一個視圖時,只是存放的視圖的定義,也便是動態檢索數據的查詢語句,而並不存放視圖對應的數據
在用戶使用視圖時纔去求相對應的數據。因此視圖被稱做「虛表」。
--建立視圖 replace 是可選的。
--建立視圖須要比較高的權限,給scott 授予 dba 權限
grant dba to scott
--建立視圖,若是已經存在則替換
create or replace view view_emp as (
select empno,ename,job,sal,deptno from emp
)
--使用視圖
select * from view_emp
經過視圖去操做基本表--只能操做視圖能夠訪問的數據。
修改的是基本表,視圖本質上是一個sql語句。不會修改。
insert into view_emp values('7777','林徽因','ANALYST',10000,10)
select * from emp
delete from view_emp where empno='7777'sql
--設置視圖爲只讀視圖【read only】
--對基本表的保護,經過視圖設置爲只讀視圖,只能對基本表的某些字段的數據進行訪問,只能讀取,不能修改。
create or replace view view_emp as (
select empno,ename,job,sal,deptno from emp
) with read only數據庫
簡化比較複雜的查詢,,一般設置爲只讀視圖
---查詢20號部門的員工的編號,姓名、薪水,部門名稱 、薪水等級。
--sql 92
select e.deptno,e.ename,e.sal,d.dname,s.grade
from emp e, dept d, salgrade s
where d.deptno=20 and e.deptno=d.deptno and e.sal between s.losal and s.hisal
--sql 99
select e.deptno,e.ename,e.sal,d.dname,s.grade
from emp e join dept d
on e.deptno=d.deptno
join salgrade s
on e.sal between s.losal and s.hisal
where d.deptno=20oracle
--create
create or replace view view_emp_dept_salgrade as(
select e.deptno,e.ename,e.sal,d.dname,s.grade
from emp e join dept d
on e.deptno=d.deptno
join salgrade s
on e.sal between s.losal and s.hisal
where d.deptno=20
) with read only;
select * from view_emp_dept_salgrade
--刪除視圖
drop view view_emp性能
事務
概念:是一個操做序列。這些操做要麼都作,要麼都不作,是一個不可分割的工做單位,是數據庫環境中的邏輯工做單位。
做用:事務是爲了保證數據庫的完整性
--模擬轉帳
select * from t_account
insert into t_account values('000001','張三','123456',10000);
insert into t_account values('000002','張三媳婦','123456',0);
--張三給張三媳婦 轉帳1000
update t_account set money = money-1000 where aid='000001';
update t_account set money = money+1000 where aid='000002';
rollback
commitspa
在oracle中,沒有事務開始的語句。一個Transaction起始於一條DML(Insert、Update和Delete )語句,結束於如下的幾種狀況:
--用戶顯式執行Commit語句提交操做或Rollback語句回退。
--當執行DDL(Create、Alter、Drop)語句事務自動提交。
--用戶正常斷開鏈接時,Transaction自動提交。
--系統崩潰或斷電時事務自動回退。設計
--提交或回滾前數據的狀態
--之前的數據可恢復
--當前的用戶能夠看到DML操做的結果
--其餘用戶不能看到DML操做的結果
--被操做的數據被鎖住,其餘用戶不能修改這些數據
--提交後數據的狀態
--數據的修改被永久寫在數據庫中.
--數據之前的狀態永久性丟失.
--全部的用戶都能看到操做後的結果.
--記錄鎖被釋放,其餘用戶可操做這些記錄.
--回滾後數據的狀態
--語句將放棄全部的數據修改
--修改的數據被回退.
--恢復數據之前的狀態.
--行級鎖被釋放.orm
rowid rownum 分頁查詢
--rowid:每個rowid 都對應着 一條記錄。當一條記錄被插入數據庫的時候,數據庫會針對該條記錄生成對應的rowid
--全部對數據的訪問,最終都是經過 rowid 來完成的。rowid 數據庫本身維護,程序員不須要維護和控制。
一個rowid 對應着磁盤的一個位置。
select * from emp where rowid='AAAE9KAAEAAAAFlAAB'排序
rownum:針對查詢結果的每一條記錄的一個邏輯編號 順序的從 1開始。不是真實存在的。稱之爲 僞列。
select rownum,empno,ename,sal from emp
--顯式 emp 表中的前5條數據。
select rownum, e.* from emp e where rownum < = 5
--6-10--rownum 是在查詢到數據,而後添加的編號。
select rownum ,e.* from emp e where rownum between 6 and 10
--rownum 只能使用小於等於,小於,不能使用大於,大於等於事務
--rownum 是在 from 以後 where 以前添加
select rownum ,e.* from emp e order by e.sal
---排序以後的前5條數據
select rownum, T.*
from (
select e.*
from emp e
order by e.sal
)T
where rownum <= 10
--查詢6-10
select rownum, P.*
from (
select rownum row_num, T.*---必須給rownum 加別名才能使用。
from (
select e.*
from emp e
order by e.sal
)T
where rownum <= 10--page*count
) P
where P.row_num between 6 and 10---(page-1)*count + 1 ---- page*count
---page 查詢第幾頁 每頁顯式 count 個
什麼是範式(NF= NormalForm)
範式是符合某一種設計要求的總結。要想設計一個結構合理的關係型數據庫,必須知足必定的範式。
第一範式:簡單說就是要確保每列保持原子性
第二範式:須要確保數據庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。即在一個數據庫表中只能保存一種數據,不能夠把多種數據保存在同一張數據庫表中。
第三範式:確保數據表中的每一列數據都和主鍵直接相關,而不能間接相關
優勢
結構合理
冗餘較小
儘可能避免插入刪除修改異常
缺點
性能下降
多表查詢比單表查詢速度慢
數據庫的設計應該根據當前狀況和需求作出靈活的處理。
在實際設計中,要總體遵循範式理論。
若是在某些特定的狀況下還死死遵循範式也是不可取的,由於可能下降數據庫的效率,此時能夠適當增長冗餘而提升性能。
第一範式:字段不能再分
第二範式:不存在局部依賴
第三範式:不含傳遞依賴(間接依賴)
使用範式能夠減小冗餘,可是會下降性能
特定表的的設計能夠違反第三範式,增長冗餘提升性能