⑴ 關於資料庫的知識
資料庫是「按照數據結構來組織、存儲和管理數據的倉庫.J.Martin給資料庫下了一個比較完整的定義:資料庫是存儲在一起的相關數據的集合,這些數據是結構化的,無有害的或不必要的冗餘,並為多種應用服務;數據的存儲獨立於使用它的程序;對資料庫插入新數據,修改和檢索原有數據均能按一種公用的和可控制的方式進行。當某個系統中存在結構上完全分開的若干個資料庫時,則該系統包含一個「資料庫集合」。
資料庫的基本結構分三個層次,反映了觀察資料庫的三種不同角度。
(1)物理數據層。
它是資料庫的最內層,是物理存貯設備上實際存儲的數據的集合。這些數據是原始數據,是用戶加工的對象,由內部模式描述的指令操作處理的位串、字元和字組成。
(2)概念數據層。
它是資料庫的中間一層,是資料庫的整體邏輯表示。指出了每個數據的邏輯定義及數據間的邏輯聯系,是存貯記錄的集合。它所涉及的是資料庫所有對象的邏輯關系,而不是它們的物理情況,是資料庫管理員概念下的資料庫。
(3)邏輯數據層。
它是用戶所看到和使用的資料庫,表示了一個或一些特定用戶使用的數據集合,即邏輯記錄的集合。
資料庫不同層次之間的聯系是通過映射進行轉換的。
資料庫的主要特點
(1)實現數據共享。
數據共享包含所有用戶可同時存取資料庫中的數據,也包括用戶可以用各種方式通過介面使用資料庫,並提供數據共享。
(2)減少數據的冗餘度。
同文件系統相比,由於資料庫實現了數據共享,從而避免了用戶各自建立應用文件。減少了大量重復數據,減少了數據冗餘,維護了數據的一致性。
(3)數據的獨立性。
數據的獨立性包括資料庫中資料庫的邏輯結構和應用程序相互獨立,也包括數據物理結構的變化不影響數據的邏輯結構。
(4)數據實現集中控制。
文件管理方式中,數據處於一種分散的狀態,不同的用戶或同一用戶在不同處理中其文件之間毫無關系。利用資料庫可對數據進行集中控制和管理,並通過數據模型表示各種數據的組織以及數據間的聯系。
(5)數據一致性和可維護性,以確保數據的安全性和可靠性。
主要包括:①安全性控制:以防止數據丟失、錯誤更新和越權使用;②完整性控制:保證數據的正確性、有效性和相容性;③並發控制:使在同一時間周期內,允許對數據實現多路存取,又能防止用戶之間的不正常交互作用;④故障的發現和恢復:由資料庫管理系統提供一套方法,可及時發現故障和修復故障,從而防止數據被破壞
(6)故障恢復。
由資料庫管理系統提供一套方法,可及時發現故障和修復故障,從而防止數據被破壞。資料庫系統能盡快恢復資料庫系統運行時出現的故障,可能是物理上或是邏輯上的錯誤。比如對系統的誤操作造成的數據錯誤等。
⑵ Oracle資料庫有哪些知識點,請講全面,不用詳細介紹每個知識點。
Oracle的體系
Oracle的體系很龐大,要學習它,首先要了解Oracle的框架。在這里,簡要的講一下Oracle的架構,讓初學者對Oracle有一個整體的認識。
1、物理結構(由控制文件、數據文件、重做日誌文件、參數文件、歸檔文件、密碼文件組成)
控制文件:包含維護和驗證資料庫完整性的必要信息、例如,控制文件用於識別數據文件和重做日誌文件,一個資料庫至少需要一個控制文件.
數據文件:存儲數據的文件.
重做日誌文件:含對資料庫所做的更改記錄,這樣萬一出現故障可以啟用數據恢復。一個資料庫至少需要兩個重做日誌文件.
參數文件:定義Oracle常式的特性,例如它包含調整SGA中一些內存結構大小的參數.
歸檔文件:是重做日誌文件的離線副本,這些副本可能對於從介質失敗中進行恢復很必要。
密碼文件:認證哪些用戶有許可權啟動和關閉Oracle常式.
2、邏輯結構(表空間、段、區、塊)
表空間:是資料庫中的基本邏輯結構,一系列數據文件的集合。
段:是對象在資料庫中佔用的空間.
區:是為數據一次性預留的一個較大的存儲空間.
塊:ORACLE最基本的存儲單位,在建立資料庫的時候指定.
3、內存分配(SGA和PGA)
SGA:是用於存儲資料庫信息的內存區,該信息為資料庫進程所共享。它包含Oracle 伺服器的數據和控制信息,它是在Oracle伺服器所駐留的計算機的實際內存中得以分配,如果實際內存不夠再往虛擬內存中寫。
PGA:包含單個伺服器進程或單個後台進程的數據和控制信息,與幾個進程共享的SGA 正相反PGA 是只被一個進程使用的區域,PGA 在創建進程時分配在終止進程時回收.
4、後台進程(數據寫進程、日誌寫進程、系統監控、進程監控、檢查點進程、歸檔進程、服務進程、用戶進程)
數據寫進程:負責將更改的數據從資料庫緩沖區高速緩存寫入數據文件
日誌寫進程:將重做日誌緩沖區中的更改寫入在線重做日誌文件
系統監控:檢查資料庫的一致性如有必要還會在資料庫打開時啟動資料庫的恢復
進程監控:負責在一個Oracle 進程失敗時清理資源
檢查點進程:負責在每當緩沖區高速緩存中的更改永久地記錄在資料庫中時,更新控制文件和數據文件中的資料庫狀態信息。
歸檔進程:在每次日誌切換時把已滿的日誌組進行備份或歸檔
服務進程:用戶進程服務。
用戶進程:在客戶端,負責將用戶的sql語句傳遞給服務進程,並從伺服器段拿回查詢數據。
5、Oracle常式:Oracle常式由SGA內存結構和用於管理資料庫的後台進程組成。常式一次只能打開和使用一個資料庫。
6、SCN(System ChangeNumber):系統改變號,一個由系統內部維護的序列號。當系統需要更新的時候自動增加,他是系統中維持數據的一致性和順序恢復的重要標志。
⑶ 資料庫知識
看看我以前做過的經典資料庫語法練習題
表結構:
student(sno,sname,sex,age.deptno)
department(dno,dname)
course(cno,cname,grade,teachno)
teacher(tno,tname)
stu_cors(id,stuno,corsno,score)
--一檢索學習jsp這門課程的學生,列出學生的名字
select student.sname
from student
where sno in(select stuno from stu_cors where corsno =(select cno from course where cname='jsp'))
go
select student.sno
from student inner join stu_cors on student.sno=stu_cors.stuno
inner join course on corsno=course.cno
where course.cname='jsp'
select sname
from student
where sno in(select stu_cors.stuno
from stu_cors inner join course on stu_cors.corsno=course.cno where course.cname='jsp')
--二檢索java課程有多少學生學習.
select COUNT(stuno) as 'JAVA學習人數'
from stu_cors
where corsno =(select cno from course where cname='java')
--三檢索各科課程各有多少學生學習,
select course.cname,COUNT(stu_cors.stuno) as '學習人數'
from stu_cors inner join course on stu_cors.corsno=course.cno
group by course.cname
--四檢索學習了jsp和servlet兩門課程的學生有多少
select COUNT(sno) as 'jsp和servlet課程的學生人數'
from student
where sno in(select stu_cors.stuno
from stu_cors inner join course on stu_cors.corsno=course.cno
where course.cname='jsp') and
sno in(select stu_cors.stuno
from stu_cors inner join course on stu_cors.corsno=course.cno
where course.cname='jsp')
--五檢索學習了超過兩門課程的學生有多少
select corsno,COUNT(stuno) as '學習超過兩門課程的學生人數'
from stu_cors
group by corsno having COUNT(stuno)>2 order by corsno
--六檢索重來沒有學生學習過的課程,課程的名字
select cname
from course
where cno not in(select corsno from stu_cors )
--七檢索老師A有多少學生
select COUNT(stuno) as '張老師的學生人數'
from stu_cors
where corsno in(select course.cno
from course inner join teacher on course.teachno=teacher.tno
where teacher.tname='張華' )
--九檢索一共有多少老師,每一個老師所授課程是什麼
select teacher.tno,course.cname
from course join teacher on course.teachno=teacher.tno
group by teacher.tno,course.cname
--十檢索每個老師有多少個學生
select teacher.tno,teacher.tname ,COUNT(stu_cors.stuno) as '學生人數'
from teacher inner join course on teacher.tno=course.cno
inner join stu_cors on course.cno=stu_cors.corsno
group by teacher.tno,teacher.tname order by teacher.tno
--十一檢索授課超過兩門的老師
select teacher.tno,COUNT(course.cno) as '授課超過兩門的老師'
from teacher inner join course on teacher.tno=course.teachno
group by teacher.tno having(COUNT(course.cno)>2) order by teacher.tno
--十三檢索A老師所授課程被學生全部學習的學生的名字.
select sname
from student
where sno (select stuno from stu_cors inner join )
--查詢選修人數超過人的課程的名字,以及每門課的選課總人數,並將結果按照人數的升序排序
select teacher.tno,COUNT(stu_cors.stuno) as '選課總人數'
from teacher inner join course on teacher.tno=course.teachno
inner join stu_cors on course.cno=stu_cors.corsno
group by teacher.tno having(COUNT(stu_cors.stuno)>350) order by count(stu_cors.stuno) asc
--查詢每門課的成績都比這門課的其他同學高的學生的學號
select stuno
from stu_cors
where
group by corsno
--查詢每個同學的學號和姓名以及這個同學成績為優秀的課程的門數。
select student.sno,student.sname,max(stu_cors.score)
from student inner join stu_cors on student.sno=stu_cors.stuno
group by student.sno,student.sname
--查詢其他系的同學的年齡比『軟體工程系』的某個學生的年齡小的學生的學號,姓名和系別
--查詢每個系中年齡高於這個系的平均年齡的學生的學號和姓名、年齡
select sno,sname,age
from student
group by deptno,sno,sname,age having(age>AVG(age))
--查詢沒有選課的學生的學號和姓名
select sno,sname
from student
where sno not in(select sno from stu_cors)
go
--查詢每個同學成績高於自己選修課程的平均分的學生的學號和選修課程的課號
select stuno,corsno
from stu_cors
group by stuno,corsno,score having(score>AVG(score))
--查詢每個學生以及選修課程的情況(要求使用做外連接)
select student.sno,student.sname,course.cname
from student inner join stu_cors on student.sno=stu_cors.stuno
left outer join course on stu_cors.corsno=course.cno
order by student.sno
go
--自己舉例實現帶有ANY和ALL謂詞的例子,各舉一個例子
--查詢其他系中比天文系所有學生年齡都小的學生姓名及年齡。
select sname,age,deptno
from student
where age<any(select student.age
from student inner join department on student.deptno=department.dno
where department.dname='天文系') and
deptno <>(select dno from department where dname='天文系')
go
--查詢全體學生的信息,查詢結果按所在系的系名升序排列,同一系的學生按年齡降序排列。
select student.sno,student.sname,department.dname,student.ssex,student.age
from student,department
where student.deptno = department.dno
order by department.dname ASC,student.age DESC
go
--查詢選修課門數等於或大於門的學生的平均成績和選課門數。
select stuno,convert(numeric(8,2),AVG(score)) as '平均成績',COUNT(corsno) as '選課門數'
from score
group by stuno having(COUNT(corsno)>2) order by stuno
go
--查詢計算機系修數據結構課程的學生的修課成績,要求列出學生姓名、課程名和成績。
select student.sname,course.cname,score.score
from student inner join score on student.sno=score.stuno
inner join course on score.corsno=course.cno
where course.cname='c199' order by student.sname
go
--查詢學生的選課狀況,包括選了課程的學生和沒有選課的學生。
select student.sname,count(score.corsno) as '選課狀況'
from student left join score on student.sno=score.stuno
group by student.sname
go
--查詢選修了「C06」課程,且成績高於此課程平均成績的學生學號和成績。
select stuno,corsno,score
from score
where corsno=(select cno from course where cname='c100') and
score >
--刪除計算機系所有不及格學生的選課記錄。
select id,stuno,corsno,score
from score
where score<10
go
--創建計算機系學生的選課視圖view001,包括學生號、姓名、性別、年齡、系、課程號、課程名及選課成績。
create view viewScore
as
select student.sno,student.sname,student.ssex,student.age,department.dname,course.cno,course.cname,score.score
from student,department,score,course
where student.deptno = department.dno and student.sno=score.stuno and score.corsno = course.cno order by student.sno
go
--在學生表的年齡列上建立一索引,索引名字為ix_age。
create index ix_age on student(age)
go
⑷ 如何學習資料庫知識
好像武俠小說里邊說的:「你的招式忘了沒有?」,回答:「差不多忘了」,「忘了就好」。
這與資料庫編程有什麼關系?關系可大了。同志們學過Pascal、BASIC、C(C++)沒有?如果沒有,FOXBASE、FOXPRO應該學過吧?按以上這些語言編程,都是過程化的,說白一點就是一個數據一個數據、一條記錄一條記錄去處理(FOXBASE、FOXPRO不完全這樣,但書上也經常是這樣介紹的),當初我接觸ACCESS
97時,一下子沒有了IF、FOR這些語句(指數據處理),都用SQL語句,真是找不到北了,好在我學SQL語言時,也盡量忘掉這個IF、FOR,到我忘得差不多時,功夫也進了一大步,原來要編一大段程序,現在一兩條SQL語句搞定,就算用多幾條SQL語句,由於是在圖形界面下做,可視化操作,拉拉扯扯,再修改一下生成的SQL語句,也就省事多了。
由於ACCESS具備完整的SQL語言(FOXBASE沒有、FOXPRO不完整),我從ACCESS
97開始用ACCESS編程,到現在為止,DAO、ADO很少用,加上最近從愛賽思上接觸的一些技術,基本上不用DAO、ADO都可以了,可以從我的「未完工的庫存管理」中看出,只是在特殊情況下才偶爾用一下。(少用,但不是不用,還得學,不要誤解)
如何學好資料庫編程?下面介紹一下本人的一些經驗,僅供參考:
1.首先要把原來一個數據一個數據、一條記錄一條記錄的數據處理方式忘掉,越徹底越好。
現在用成批處理了。少用記錄集一條記錄一條記錄地處理,盡量用SQL語句。
2.學好關系資料庫的理論,尤其是規范化理論,表的設計一定要規范化,最起碼要規范化到第三範式。集合運算(並、交、差)。關系運算(選擇、投影、連接)。其中連接與規范化是緊密結合的。
3.運用面向對象的技術:面向對象的分析OOA、面向對象的設計OOD、面向對象的編程OOP,根據表的關系,用窗體和子窗體、報表和子報表,模擬面向對象,這樣可以增加程序的可讀性和可維護性。(這是高級技術,同志們不要輕視,做大項目你就知道有用了)
4.用查詢時,通常一步做不出來,可以分幾步做,本人通常是這么做的,從我給網友回復的例子中也可以看得出。為什麼要這樣做?(1)有些是SQL語言的限制,沒辦法一步做出來,逼的;(2)可以檢查每一步查詢的結果,容易調試;(3)增加可讀性,便於日後維護。
5.查詢的結果用窗體顯示或用報表列印,兩者的技術差不多。通常改變打開窗體或報表的條件就可控制顯示或列印的記錄范圍。另外用查詢做數據源時,動態改變查詢中的SQL語句,比在查詢中引用窗體的控制項要方便,因為SQL語句生成是在VBA中,可以先存放在字元變數中,然後再更新查詢的SQL語句,這樣就可以用斷點來檢查變數值對不對,如果在查詢中引用窗體的控制項,尤其是包含IIF()函數時,調試是很困難的。
6.開發一個系統,首先要解決技術問題,即演算法,用簡單例子,把演算法弄懂了,再詳細設計,這一點從網友的提問中可以看出,有很多人問題表達不清楚,有的人其中夾了很多與演算法無關的東西,尤其是很專業的東西,別人不容易看得明白,由於演算法沒搞清楚,程序就無法編了。
7.不要使用過多的工具特性,使用過多的工具特性會使可讀性降低,可維護性差,要別人幫忙時難以得到幫助,更要命的是可移植性差,從MDB到ADP就可以體會到了,所以在編程時可讀性很重要,可移植性更重要,你甘心自己的程序就固定在一個環境下運行嗎?你甘心永遠用一個工具搞開發嗎?為了你的「錢途」,不要玩弄太多的技巧,當然技術研究是另外一碼事。
⑸ 怎樣學好資料庫知識 要用到哪些技術
具體要看你學習什麼資料庫了。按照最常用分類方法來分:小型資料庫:Excel、Access、Visual FoxPro等中型資料庫:SQlServer等大型資料庫:Oracel等學習資料庫類型不同涉及到的技術是大不一樣的。按照SQL-Server來說:無非就是查詢(包括常規查詢、模糊查詢、嵌套查詢)、修改(更新)、刪除記錄,創建、修改、刪除表和表結構和用戶的創建、修改、刪除以及許可權管理。如果還要深入學習的話,還有分布式資料庫的管理、數據挖掘、數據分析等技術。
⑹ 學習資料庫主要要掌握哪些知識
主要是資料庫維護方面的 你得會備份數據 還有資料庫的建立原理什麼的 一些基本的sql語句啥的
⑺ 資料庫的知識有哪些
基礎理論:進程、線程、纖程、死鎖、事務、日誌、範式理論,這些知識建議看看資料庫概論
實用技能裡面:T-SQL語法,PL-SQL語法(T-sql在mssqlserver的幫助文檔里就有,plsql在oracle的幫助文檔里就有)
主流資料庫的使用:MSSqlServer2000/2005/2008,Oracle9i/10g,mysql5等等,各資料庫的幫助文檔里都有使用方法,小技巧之類的也可以下載電子書或者書店裡隨便選,到處都是。
技能提升:資料庫運維、HA(高可用)、數據挖掘、數據倉庫,這些知識內容,除了耐心看書以外,還要耐心工作積累實戰經驗。