? ? ?由于最近要參加面試,不得不把雪藏很久的數(shù)據(jù)庫(kù)知識(shí)拿出來翻一翻,我想吧,數(shù)據(jù)庫(kù)作為一個(gè)基礎(chǔ)也是核心的技能是每一個(gè)程序員都要會(huì)使用的衣形,因?yàn)槲沂且粋€(gè)剛?cè)肟拥男〕绦蛟骋幻叮窒淼臇|西只是數(shù)據(jù)庫(kù)知識(shí)中的毛皮姿鸿,望大牛勿噴谆吴,
1) 數(shù)據(jù)庫(kù)的顯示、創(chuàng)建苛预、刪除
顯示數(shù)據(jù)庫(kù):show database;
創(chuàng)建數(shù)據(jù)庫(kù):CREATE DATABASE DBNAME ;
刪除數(shù)據(jù)庫(kù):DROP DATABASE DBNAME ;
選中數(shù)據(jù)庫(kù):USE DBNAME ;
DBNAME:數(shù)據(jù)庫(kù)名
TABLENAME:數(shù)據(jù)庫(kù)表名
2) 數(shù)據(jù)表的顯示句狼、創(chuàng)建、刪除
顯示數(shù)據(jù)表:SHOW TABLE TABLENAME ? ?(注明:操作此語(yǔ)句前首先必須得選擇數(shù)據(jù)庫(kù))
顯示表結(jié)構(gòu):DESC TABLENAME 或者 ?DESCRIBE TABLENAME ;
創(chuàng)建數(shù)據(jù)表:CREATE TABLE TABLENAME(字段設(shè)定表的列)
刪除數(shù)據(jù)表:DELETE FROM TABLENAME ;
清除數(shù)據(jù)表中的數(shù)據(jù):
DELETE FROM TABLENAME ?或者 ? ?TRUNCATE TABLE TABLENAME
注明:不帶WHERE參數(shù)的DELETE語(yǔ)句可以刪除表中所有內(nèi)容热某,使用TRUNCATA TABLE 也可以清除表中所有數(shù)據(jù)
從效率上來講 TRUNCATE 要比DELETE 快腻菇,但 TRUNCATE 刪除后不記錄日志并不可恢復(fù)數(shù)據(jù)。
添加數(shù)據(jù)表中的數(shù)據(jù):
INSERT INTO TABLENAME (列1,列2,列3) VALUES(值1,值2,值3);
添加數(shù)據(jù)表中的主鍵:
ALTER TABLE TABLENAME() ADD PRIMARY KEY (主鍵列名);
刪除數(shù)據(jù)表中的主鍵:
ALTER TABLE TABLENAME DROP PRIMARY KEY (主鍵列名);
創(chuàng)建索引:
CREATE [UNIQUE] INDEX IDXNAME ON TABLENAME(列名);
刪除索引:
DROP INDEX IDXNAME;
注明:索引是不可更改的昔馋,想更改必須刪除索引重新建筹吐。
索引:
索引是以表列為基礎(chǔ)的數(shù)據(jù)庫(kù)對(duì)象,保存著表中排序的索引列秘遏,并記錄了索引列在數(shù)據(jù)表中的物理存儲(chǔ)位置實(shí)現(xiàn)了表中數(shù)據(jù)的邏輯排序丘薛。
索引的作用:
1. 通過創(chuàng)建唯一性索引可以保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性。
2. 創(chuàng)建索引可以大大加快數(shù)據(jù)的索引速度邦危,這是創(chuàng)建索引的最重要的原因洋侨。
3. 可以加速表和表之間的連接,特別是在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面特別有意義倦蚪。
4. 在使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時(shí)凰兑,同樣可以減少查詢中分組和排序的時(shí)間。
5. 在查詢過程中使用優(yōu)化隱藏器审丘,提高系統(tǒng)的性能。
索引的缺點(diǎn):
1. 創(chuàng)建索引和維護(hù)索引需要耗費(fèi)時(shí)間勾给,并隨著數(shù)據(jù)量的增加而增加滩报。
2. 索引需要占用物理空間锅知,每一個(gè)索引需要占用一定的物理空間,如果建立聚簇索引那么需要的空間更大脓钾。
3. 當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增刪改查時(shí)售睹,索引也需要?jiǎng)討B(tài)維護(hù),那么就降低了數(shù)據(jù)的維護(hù)速度可训。
創(chuàng)建視圖:
CREATE VIEW VIEWNAME AS SELECT (SQL語(yǔ)句);
刪除視圖:
DROP VIEW VIEWNAME;
視圖:
視圖是一種數(shù)據(jù)庫(kù)對(duì)象昌妹,它是一個(gè)虛擬表,并不代表任何我物理數(shù)據(jù)握截,只是用來查看數(shù)據(jù)的窗口飞崖。
視圖的優(yōu)點(diǎn):
1. 數(shù)據(jù)的安全性,通過定義不同的視圖使用戶只能看到與自己有關(guān)的數(shù)據(jù)谨胞。
2. 查詢簡(jiǎn)單化固歪,將復(fù)雜的查詢語(yǔ)句建立成一個(gè)視圖,可以使用戶只針對(duì)視圖進(jìn)行查詢胯努。
3. 邏輯數(shù)據(jù)獨(dú)立性牢裳,當(dāng)構(gòu)成視圖的基本表需要修改時(shí),只需要修改視圖中的子查詢部分叶沛,而基于視圖的部分不需要改變蒲讯。
視圖的缺點(diǎn):
1. 性能,需要耗費(fèi)一定時(shí)間灰署。
2. 修改限制判帮,有 UNIQUE 等集合操作符的視圖、有 GROUP BY 子句的視圖氓侧、有 AVG/SUM/MAX等聚合函數(shù)時(shí)脊另、使用 DISTINCT 關(guān)鍵字的視圖、連接表的視圖都是不可修改的约巷。
3. 創(chuàng)建限制偎痛, 視圖查詢語(yǔ)句不能含有 ORDER BY 、 COMPURER 独郎、COMPURER BY 踩麦、INFO 關(guān)鍵字。
基本查詢語(yǔ)句:
選擇查詢:SELECT * FROM TABLE WHERE 值;
更新操作:UPDATA TABLENAME SET 原值 ?= 現(xiàn)值
排序操作:SELECT * FROM TABLENAME ORDER BY 列名 DESC;
分頁(yè)查詢操作:
oracle: SELECT * FROM(SELECT A.*, ROWNUM RN FROM(SELECT * FROM TABLENAME) A) WHERE RN BETWEEN 范圍1 AND 范圍2
MySQL : SELECT * FROM TABLE (查詢條件) ORDER BY ID LIMIT ?,?;
存儲(chǔ)過程:
存儲(chǔ)過程是一組為完整特定功能的SQL語(yǔ)句集氓癌,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)中谓谦,用戶通過指定存儲(chǔ)過程的名字給出參數(shù)來執(zhí)行它。
存儲(chǔ)過程優(yōu)點(diǎn):
1. 存儲(chǔ)過程只在創(chuàng)造時(shí)進(jìn)行編譯贪婉,并通過了語(yǔ)法檢查和性能優(yōu)化反粥,一次編譯多次執(zhí)行,使用存儲(chǔ)過程可以提高數(shù)據(jù)庫(kù)的執(zhí)行速度。
2. 允許組件式編程才顿,存儲(chǔ)過程可以設(shè)置參數(shù)莫湘,可以根據(jù)傳入?yún)?shù)的不同重復(fù)使用同一個(gè)存儲(chǔ)過程,從而提高代碼的優(yōu)化率和可讀性
3. 減少網(wǎng)絡(luò)流量
4. 提高系統(tǒng)安全性郑气,建立特定的存儲(chǔ)過程避免非授權(quán)用戶對(duì)數(shù)據(jù)的訪問幅垮,包中數(shù)據(jù)的安全。
存儲(chǔ)過程的缺點(diǎn):
1. 移植性差尾组,依賴數(shù)據(jù)庫(kù)廠商忙芒,難以移植。
2. 難以試調(diào)讳侨、維護(hù)呵萨,當(dāng)業(yè)務(wù)邏輯大的時(shí)候封裝性不夠,難以試調(diào)維護(hù)爷耀。
3. 服務(wù)器不能負(fù)載均衡甘桑,復(fù)雜的應(yīng)用程序在存儲(chǔ)過程中實(shí)現(xiàn)業(yè)務(wù)邏輯的負(fù)擔(dān)在數(shù)據(jù)庫(kù)服務(wù)器上,沒有增加負(fù)載歹叮、
存儲(chǔ)過程分類:
1. 系統(tǒng)存儲(chǔ)過程
2. 本地存儲(chǔ)過程
3. 臨時(shí)存儲(chǔ)過程
4. 遠(yuǎn)程存儲(chǔ)過程
5. 擴(kuò)展存儲(chǔ)過程
事物:
事物是單個(gè)的工作單元跑杭,
事物的屬性:
1. 原子性,事物必須是原子工作單元咆耿,對(duì)其數(shù)據(jù)修改德谅,要么全都執(zhí)行,要么全部不執(zhí)行萨螺。
2. 一致性窄做,事物在完成時(shí)必須使所有的數(shù)據(jù)都保持一致,在相關(guān)的數(shù)據(jù)庫(kù)中所有額規(guī)則必須應(yīng)用于事物的修改慰技,確保數(shù)據(jù) 完整性椭盏,事物結(jié)束時(shí)數(shù)據(jù)必須是爭(zhēng)取的。
3. 隔離性吻商,由并發(fā)是事物所做的修改必須與任何其他并發(fā)事物所做的修改隔離掏颊。
4. 持久性,事物完成之后對(duì)系統(tǒng)的影響是永久性的艾帐。
事物的分類:
1. 顯示事物乌叶,
2. 隱性事物,
3. 自動(dòng)提交事物
觸發(fā)器:觸發(fā)器是特定時(shí)間出現(xiàn)時(shí)自動(dòng)執(zhí)行的存儲(chǔ)過程
觸發(fā)器的功能
1.自動(dòng)生成數(shù)據(jù)
2.自定義復(fù)雜的安全權(quán)限
3.提供審計(jì)和日志記錄
4.啟用復(fù)雜的業(yè)務(wù)邏輯
SQL語(yǔ)句執(zhí)行的過程
1.客戶端把語(yǔ)句發(fā)送給服務(wù)器端執(zhí)行
2.服務(wù)器端對(duì)語(yǔ)句進(jìn)行語(yǔ)句解析柒爸,
查詢高速緩存准浴,服務(wù)器端先查找高速緩存區(qū),如果高速緩存區(qū)存在這個(gè)SQL語(yǔ)句則直接執(zhí)行這個(gè)SQL語(yǔ)句捎稚。
語(yǔ)句合法性檢查乐横,高速緩存區(qū)未能查到這個(gè)SQL語(yǔ)句則服務(wù)器進(jìn)程就會(huì)對(duì)這個(gè)SQL語(yǔ)句進(jìn)行合法性檢查求橄,如果不符合規(guī)則,則把錯(cuò)誤信息反饋給客戶端晰奖,在合法性檢查中谈撒,不會(huì)對(duì)SQL語(yǔ)句中包含的表名、列名進(jìn)行查詢匾南。
語(yǔ)義檢查,若SQL語(yǔ)句符合合法性蛔外,則服務(wù)器端進(jìn)程會(huì)對(duì)語(yǔ)句中的字段蛆楞、表內(nèi)容進(jìn)行檢查,
獲取對(duì)象解析鎖夹厌,當(dāng)語(yǔ)法語(yǔ)義都通過檢查后豹爹,系統(tǒng)會(huì)對(duì)查詢的對(duì)象加鎖,保證數(shù)據(jù)的一致性矛纹,防止在查詢過程中其他用戶對(duì)這個(gè)對(duì)象結(jié)構(gòu)發(fā)生改變
數(shù)據(jù)訪問權(quán)的核對(duì)臂聋,當(dāng)語(yǔ)法、語(yǔ)義都通過后服務(wù)器端進(jìn)程檢查所連接的用戶是否有訪問權(quán)或南。
確定最佳執(zhí)行計(jì)劃孩等,當(dāng)簽名條件都符合之后,服務(wù)器進(jìn)程會(huì)根據(jù)一定的規(guī)則對(duì)SQL語(yǔ)句進(jìn)行優(yōu)化采够,確定最佳執(zhí)行計(jì)劃之后將這條SQL語(yǔ)句存儲(chǔ)到數(shù)據(jù)高速緩存區(qū)肄方,如果下次遇到這個(gè)語(yǔ)句時(shí)就會(huì)忽略語(yǔ)法語(yǔ)義權(quán)限檢查的步驟,而直接執(zhí)行SQL語(yǔ)句蹬癌,提高SQL語(yǔ)句的處理效率
3 .語(yǔ)句的執(zhí)行
若數(shù)據(jù)不再緩沖區(qū)隅要,服務(wù)器進(jìn)程將從數(shù)據(jù)庫(kù)文件中查詢相關(guān)數(shù)據(jù),并吧這些數(shù)據(jù)放入數(shù)據(jù)緩存區(qū)中董济。
4.提取數(shù)據(jù)
SQL語(yǔ)句中函數(shù) 步清、 關(guān)鍵字 、 排序等執(zhí)行順序:
from子句返回處理結(jié)果集
where子句排除不滿足搜索條件的行
group by 子句將選定的行到group by 子句中各個(gè)唯一值的組中
選擇列表中指定的聚合函數(shù)可以計(jì)算各組的匯總值
having子句排除不滿足搜索條件的行
計(jì)算所有的表達(dá)式
使用order by 對(duì)結(jié)果集進(jìn)行排序
查找你搜索的字段
SQL優(yōu)化:
select中避免 *
減少訪問數(shù)據(jù)庫(kù)的次數(shù)
用where子句替換having子句
通過內(nèi)部函數(shù)提高SQL效率
使用表的別名
用exists 代替in 感局、 用not exists代替 not in
盡量多使用commit
刪除重復(fù)記錄
整合簡(jiǎn)單無(wú)關(guān)聯(lián)的數(shù)據(jù)庫(kù)
用truncate 替代delete