2018-09-01


sequence 序列、synonym同義詞滥嘴、DBLink連接木蹬、索引index、view視圖、數(shù)據(jù)建模镊叁、PL/SQL 語言

接著前天的多表連接尘颓、子查詢、分組查詢等知識點晦譬,今天繼續(xù)分享心得知識點疤苹。

sequence 序列

--序列可以讓主鍵自動增長

--使用的時候,要先創(chuàng)建

create sequence stu_seq;

create table tb_class(

? ? ? id int primary key,

? ? ? code varchar(20)

);

insert into tb_class values(stu_seq.nextval,'java091');

select * from tb_class;

insert into tb_class values(stu_seq.nextval,'java09');

--synonym同義詞

--先創(chuàng)建敛腌,后使用

create synonym myclass for tb_class;

select * from? myclass;--用myclass代替了tb_class表卧土,也就是別名。

select * from tb_class;

---- DBLink連接

--找到oracle的安裝路徑

--C:\oracle\product\11.1.0\db_1\NETWORK\ADMIN

--1像樊、listener.ora監(jiān)聽器

--2尤莺、sqlnet.ora網(wǎng)絡

--3、tnsnames.ora tns配置文件

--創(chuàng)建連接

create database link hello

? ? ? connect to system identified by "1234"

? ? ? using '(DESCRIPTION=

? ? ? (ADDRESS_LIST=(

? ? ? ADDRESS=(PROTOCOL=TCP)(HOST=10.25.161.113)(PORT=1521))

? ? ? )

? ? ? (CONNECT_DATA=(SERVER=DEDICATED)

? ? ? (SERVICE_NAME=Oracle)

? ? ? )

? ? ? )';

? ? ? select * from scott.emp@hello;


如何優(yōu)化你的數(shù)據(jù)庫查詢生棍?


這是面試官最喜歡問的問題哦颤霎。

1、數(shù)據(jù)庫的查詢方式涂滴,三種:

--全表掃描友酱,最慢,select * from tb_stu;

--利用索引掃描柔纵,快缔杉,推薦使用。方式是key-value

--共享語句:必須建立在全表掃描的基礎上首量,已經(jīng)查詢過的數(shù)據(jù)留在緩存中壮吩,直接去緩存中查找。

index索引

作用:在數(shù)據(jù)庫中用來加速對于表的查詢加缘。(也就是優(yōu)化數(shù)據(jù)庫)

原理:通過使用快速路徑訪問方法快速定位數(shù)據(jù)鸭叙,減少磁盤的I/O.

特點2個:與表獨立存放,但不能獨立存在拣宏,必須屬于某個表沈贝。

由數(shù)據(jù)庫自動維護,當表被刪除時勋乾,該表上的索引自動被刪除宋下。

--索引的建立

自動:當建立一個表的時候,定義主鍵primary key或者unique約束條件時辑莫,數(shù)據(jù)庫自動創(chuàng)建索引学歧。

手動:用戶可以創(chuàng)建索引加速查詢(最好是指定經(jīng)常要查詢的字段)

--怎么工作的:當創(chuàng)建索引的時候,oracle 會默認建立一張與當前表相關的索引頁各吨,里面保存了索引字段和對應的真實的磁盤地址枝笨,當用戶發(fā)送sql

語句帶來索引的時候,oracle會到索引頁中查詢索引字段,直接定位磁盤的IO,提取數(shù)據(jù)横浑。

select * from tb_stu;

insert into tb_stu values(1,'jss',1);

--創(chuàng)建索引index

create index 索引名 on 表名(需要索引的字段);

create index 索引名 on 表名(索引字段)剔桨;

eg:

create index stu_index on tb_stu(name);

select * from tb_stu where name="翠花";

--多使用共享語句,可以到達sql語句的優(yōu)化徙融。

--特殊的:當sql語句中包含not in ,<>不等于洒缀,is not null,like '%%'的時候不會建立索引。

in:會堆成一堆or欺冀,可以使用表的索引树绩。

not in :強烈推薦不使用。因為它不能應用表中的索引脚猾。

<>操作符 不等于:是永遠不會有用到索引的葱峡,因此它只會建立全表查詢。(優(yōu)化的方案:用其他相同功能的代替龙助,比如:a<>0,改成a<0 or a>0,a<>’’ 改為 a>’’)

is null或者is not null (判斷字段是否為空):判斷字段是否為空一般也是不應用索引的,優(yōu)化方法跟<>一樣蛛芥。

like :like操作符可以應用通配符查詢提鸟,但是用的不好則會產(chǎn)生性能上的問題。

優(yōu)化方案:如LIKE ‘%001%’ 這種查詢不會引用索引仅淑,會產(chǎn)生全表掃描称勋,

而LIKE ‘001%’則會引用范圍索引。進行范圍的查詢涯竟,性能肯定大大提高赡鲜。

create table aaa (

? ? ? comm int default 0,

? ? ? status varchar(20) default '已發(fā)'

);

create table bbb (

? ? ? email varchar(50) default 'zsfz053@126.com'

);

select * from aaa where comm is null; -- 不會用到 index

select * from bbb where email = 'zsfz053@126.com';? -- 會用到 index

--視圖:

- 創(chuàng)建表空間

create tablespace Jss

datafile 'F:\dataspace\jss.dbf'

size 20M

autoextend on; -- 自動擴展,如果容量不夠的話庐船,則自動加

-- 千萬記得:不能手動到路徑下把生成的 xxx.dbf 文件刪掉银酬。

-- 如果需要刪除表空間

drop tablespace jss including contents and datafiles;

-- 查詢所有的表空間

select * from DBA_tablespaces;

-- 查詢所有的數(shù)據(jù)文件

select * from Dba_Data_Files;

-- 創(chuàng)建用戶

create user lin? ? -- 用戶名

identified by 1234 -- 密碼

default tablespace jss? -- 對應的表空間

temporary tablespace temp? -- 臨時表空間

-- 刪除用戶

drop user jss;

-- 查詢所有的用戶

select * from Dba_Users;

-- 給用戶加鎖和解鎖

alter user jss account lock;

alter user jss account unlock;

-- 操作權限

-- 連接權限

grant connect to jss;

-- 如果 jss 有連接權限,可以指定給 admin 賬戶

grant connect to jss with admin option;

-- 如果想要放大權限的話筐钟,可以指定 DBA 權限給它

grant dba to jss with admin option;

grant dba to jss with admin option;

-- 收回權限

revoke connect from jss;

revoke dba from jss;

創(chuàng)建用戶的時候通過dba賦予的權限揩瞪,創(chuàng)建視圖的時候會報:沒有權限。

--解決方案:使用system登錄篓冲,再給用戶賦予權限李破。

grant create any table to jss with admin option;

grant create any view to jss with admin option;

graant select? any table to jss with admin option;

--看看視圖是怎么樣讓查詢變的簡單的:

select deptno 部門, sum(sal) 總薪資, max(sal) 最大值--注意要給別名,不然會出錯

from scott.emp

group by deptno;

create view aaa

as

select deptno 部門, sum(sal) 總薪資, max(sal) 最大值--注意要給別名壹将,不然會出錯

from scott.emp

group by deptno;

接著:

select * from aaa;

--復雜視圖(多個表)

create view bbb

as

select d.dname 部門, d.loc 地址, e.*

from scott.dept d, scott.emp e

where d.deptno = e.deptno

select * from bbb;

--刪除視圖

drop view aaa;

--注意:可以通過視圖操作表嗤攻,但是不建議。


軟件開發(fā)過程:

1. 需求調(diào)研,與客戶進行溝通

2. 需求分析诽俯,將現(xiàn)實工作中的動作模擬到計算機

? 數(shù)據(jù)建模

3. 開發(fā)

4. 測試

5. 上線部署

從關系數(shù)據(jù)庫的表中刪除冗余信息的過程稱為規(guī)范化妇菱,

是得到高效的關系型數(shù)據(jù)庫表的邏輯結構最好和最容易的方法。

獲得數(shù)據(jù)規(guī)范化的方法: 三范式

第一范式:必須要有主鍵,并且每個屬性值,都是不可再分的最小數(shù)據(jù)單位,

? ? ? ? ? 則稱R是第一范式的關系恶耽。

第二范式:所有非主關鍵字都完全依賴于主關鍵字(通常用于聯(lián)合主鍵)

第三范式:非主關鍵字不能依賴于其他非主關鍵字(通常用于一個主鍵)

-- 有 N 個班級密任,有 N 個學生,有 N 門課程

-- 一個班可以有多個學生偷俭,一個學生只能屬于一個班浪讳,

-- 一個學生可以選修多門課程,一門課程可以被多個學生選修

數(shù)據(jù)建模

1. 根據(jù)三個范式

2. 分析實體之間的關系, ER 圖 Entity-Reference(畫出來看涌萤,會明顯很多)

一對一:一個人只有一個身份證淹遵,唯一外鍵關聯(lián)或者主鍵關聯(lián)扼仲。

一對多:一個班級可以有多個學生审葬。一個學生只屬于一個班級(clazz - student)

? ? ? ? 關聯(lián):一對多使用主外鍵關聯(lián)宙帝,通常在多方(student)建立外鍵

多對多:一個學生可以選擇多門課程洛巢,一門課程可以被多個學生選修 (student - course)

? ? ? ? 關聯(lián):多對多通常使用中間表(再多建一張表存儲)關聯(lián)數(shù)據(jù)

? ? ? ? ? ? ? 通常中間表會有兩張表的id作為聯(lián)合主鍵庇麦,并且作為外鍵指向關聯(lián)表

下面有個實例:

網(wǎng)上購書

圖書表: id禾怠、書名糕珊、出版社哄尔、出版時間崖堤、價格侍咱、作者、描述

用戶表:id密幔、姓名楔脯、地址、電話胯甩、email

訂單表: id昧廷、編號code

-- 用戶表

create table tb_user (

? ? ? id int primary key,

? ? ? name varchar(20) not null,

? ? ? address varchar(50) default '廣州天河',

? ? ? phone varchar(20) unique,

? ? ? email varchar(20) unique

);

insert into tb_user

values (1, '翠花', '中國香港', '13800138000', 'cuihua@163.com');

insert into tb_user

values (2, '春花', '中國臺灣', '13800138001', 'chunhua@163.com');

-- 圖書表

create table tb_book (

? ? ? id int primary key,

? ? ? title varchar(50) not null,

? ? ? publication varchar(20) not null,

? ? ? publictime date,

? ? ? price number,

? ? ? author varchar(20),

? ? ? note varchar(100)

)

insert into tb_book

values (1, 'Java 從入門到放棄', '電子工業(yè)出版社', sysdate, 100, 'Jss', '很好的書');

insert into tb_book

values (2, 'Python 從入門到放棄', '電子工業(yè)出版社', sysdate, 120, 'Jss', '很好的書');

insert into tb_book

values (3, 'C++ 從入門到放棄', '電子工業(yè)出版社', sysdate, 99, 'Jss', '很好的書');

-- 訂單表

create table tb_order (

? ? ? id int primary key,

? ? ? orderno varchar(30) not null,


? ? ? user_id int,

? ? ? foreign key (user_id) references tb_user(id)

);

insert into tb_order

values (1, '001', 1);

insert into tb_order

values (2, '002', 1);

insert into tb_order

values (3, '003', 2);

-- 訂單和書籍是多對多的關系,創(chuàng)建中間表維護關聯(lián)關系?

create table tb_order_book (

? ? ? order_id int,

? ? ? book_id int,

? ? ? count int,

? ? ? primary key(order_id, book_id),


? ? ? foreign key(order_id) references tb_order(id),

? ? ? foreign key(book_id) references tb_book(id)

);

insert into tb_order_book

values (1, 1, 2);

insert into tb_order_book

values (2, 1, 5);

insert into tb_order_book

values (3, 3, 10);

select * from tb_user;

select * from tb_book;

select * from tb_order;

3. 查詢“翠花”的詳細信息偎箫,包括:

? 用戶信息木柬、訂單信息、購買書籍名稱镜廉、購買的數(shù)量

select u.name 名字, o.orderno 訂單號, b.title 圖書名稱, ob.count 數(shù)量

from tb_user u, tb_order o, tb_book b, tb_order_book ob

where u.id = o.user_id

and b.id = ob.book_id

and o.id = ob.order_id

and u.name = '翠花';

- PL/SQL 也是一種程序語言弄诲,叫做過程化SQL語言(Procedural Language/SQL),是 Oracle 數(shù)據(jù)庫對 SQL 語句的擴展娇唯。 PL/SQL 只有 Oracle 數(shù)據(jù)庫有齐遵。

-- MySQL 目前不支持 PL/SQL 的,但支持 Navicat Premium塔插。

-- 實際開發(fā)中梗摇,我們一般都是通過 Java 代碼來處理數(shù)據(jù)

-- 將處理好的結果,再交給 SQL 去執(zhí)行即可想许。

-- 語法格式

declare? -- 聲明部分

? ? -- 定義變量

begin? -- 開始

? ? -- 主要內(nèi)容

exception? -- 處理異常

end;? -- 結束

declare --聲明

begin--開始伶授,主要內(nèi)容

end;結束

--打印語句

begin

--包.方法(存儲過程)

dbms_output.put_line('jss打游戲打不過人家断序。。糜烹。');

end;

--定義變量

declare

? vid int;

vname varchar(20):='jss';--:=是賦值

begin

? dbms_output.put_line('jss打游戲打不過人家违诗。。疮蹦。');

end;

--復雜類型

declare

? vid int;

vname varchar(20);

type car is record(--復雜類型的聲明:type car is record

id int,

name varchar(20),

price number

);

--如果要給復雜類型數(shù)據(jù)賦值诸迟,需要給它一個變量才可以。

vcar car;

begin

--declare處聲明愕乎,begin處賦值

vname:='jss';

vcar.name:='BMW X6';

dbms_output.put_line(vname||'就算有'||vcar.name||'jss打游戲打不過人家阵苇。。感论。');--連接字符用||

end;

PL/SQL的使用:插入數(shù)據(jù)绅项、查詢數(shù)據(jù)、for循環(huán)比肄,if else邏輯語句

--插入數(shù)據(jù)

declare

vid int:=1;

vname varchar(20):='花花';

begin

insert into tb_stu(id,name) values (vid,vname);

end;

--查詢數(shù)據(jù)(查詢在聲明變量中有的字段)

declare

vid int:=1;

vname varchar(20);

begin

select name into vname from tb_stu where id=vid;

dbms_output.put_line(vname);

end;

--if else邏輯語句

--if

declare

i number:=10;

begin

if(i=10) then

dbms_output.put_line('此處打印出10...');

end if;--要給if 結束語句end if;

end;--每句后面都加個;來去隔開快耿。

--if else

declare

i number:=20;

begin

if(i=10) then

dbms_output.put_line('此處打印出10...');

else

dbms_output.put_line('此處打印的不是10...');

end if;--要給if 結束語句end if;

end;

--if...else if

declare

i number:=20;

begin

if(i=10) then

dbms_output.put_line('此處打印出10...');

else if(i=20)

dbms_output.put_line('此處打印的是20...');

else

dbms_output.put_line('此處打印出不是10,也不是20...');

end if;--要給if 結束語句end if;

end;

--loop循環(huán)

declare

i number:=0;

begin

loop

i:=i+1;

dbms_output.put_line('jss...');

exit when i=5;

end loop;

end;

--for循環(huán)

declare

i number:=0;

begin

for i in 1..6--for用來指定條件

loop

dbms_output.put_line('jss...');

end loop;

end;

--while循環(huán)

declare

i number:=0;

begin

while i<6

loop

dbms_output.put_line('cuihua..');

i:=i+1;

end loop;

end;


小編很喜歡廣州的夜景薪前。
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末润努,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子示括,更是在濱河造成了極大的恐慌,老刑警劉巖痢畜,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垛膝,死亡現(xiàn)場離奇詭異,居然都是意外死亡丁稀,警方通過查閱死者的電腦和手機吼拥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來线衫,“玉大人凿可,你說我怎么就攤上這事∈谡耍” “怎么了枯跑?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長白热。 經(jīng)常有香客問我敛助,道長,這世上最難降的妖魔是什么屋确? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任纳击,我火速辦了婚禮续扔,結果婚禮上,老公的妹妹穿的比我還像新娘焕数。我一直安慰自己纱昧,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布堡赔。 她就那樣靜靜地躺著识脆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪加匈。 梳的紋絲不亂的頭發(fā)上存璃,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音雕拼,去河邊找鬼纵东。 笑死,一個胖子當著我的面吹牛啥寇,可吹牛的內(nèi)容都是我干的偎球。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辑甜,長吁一口氣:“原來是場噩夢啊……” “哼衰絮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起磷醋,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤猫牡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后邓线,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淌友,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年骇陈,在試婚紗的時候發(fā)現(xiàn)自己被綠了震庭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡你雌,死狀恐怖器联,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情婿崭,我是刑警寧澤拨拓,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站逛球,受9級特大地震影響千元,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜颤绕,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一幸海、第九天 我趴在偏房一處隱蔽的房頂上張望祟身。 院中可真熱鬧,春花似錦物独、人聲如沸袜硫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽婉陷。三九已至,卻和暖如春官研,著一層夾襖步出監(jiān)牢的瞬間秽澳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工戏羽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留担神,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓始花,卻偏偏與公主長得像妄讯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子酷宵,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容