【JavaWeb】数据库基础复习
1 MySQL
數(shù)據(jù)庫(kù)特點(diǎn):
啟動(dòng)MySQL服務(wù):
管理員cmd:net start mysql
停止MySQL服務(wù):
管理員cmd:net stop mysql
打開(kāi)服務(wù)窗口
win+R+services.msc
登錄mysql:
mysql退出登錄:exit / quit
mysql的目錄結(jié)構(gòu)
- bin【可執(zhí)行文件】
- data【日志文件、數(shù)據(jù)文件】
- include【頭信息】
- lib【jar包 庫(kù)文件】
- share【錯(cuò)誤信息】
- my.ini:配置文件
- 數(shù)據(jù)庫(kù):文件夾
- 表:文件
- 數(shù)據(jù):文件存儲(chǔ)的內(nèi)容
2 SQL
SQL:Structured Ouery Language:結(jié)構(gòu)化查詢語(yǔ)言
SQL分類:
- DDL:操作數(shù)據(jù)庫(kù)、表
- DML:增刪改表中數(shù)據(jù)
- DQL:查詢表中數(shù)據(jù)
- DCL:授權(quán)
2.1 DDL:CRUD —> 數(shù)據(jù)庫(kù)、表
操作數(shù)據(jù)庫(kù):CRUD —> 數(shù)據(jù)庫(kù)
- 創(chuàng)建數(shù)據(jù)庫(kù)并設(shè)置字符集
- 查詢所有數(shù)據(jù)庫(kù)名稱
- 查詢某個(gè)數(shù)據(jù)庫(kù)的字符集;查詢數(shù)據(jù)庫(kù)的創(chuàng)建語(yǔ)句
- 修改數(shù)據(jù)庫(kù)的字符集
- 刪除數(shù)據(jù)庫(kù)
- 查詢正在使用的數(shù)據(jù)庫(kù)
- 使用數(shù)據(jù)庫(kù)
操作表:CURD —> 表
- 創(chuàng)建表
常用數(shù)據(jù)類型int、double、date(yyyy-MM-dd)、datetime(yyyy-MM-dd HH:mm:ss)、timestamp(插入時(shí)間)、varchar(x[個(gè)字符])
- 復(fù)制表
- 查詢所有表名稱
- 查詢表結(jié)構(gòu)
- 修改表名
- 修改表的字符集
- 添加一列
- 修改列名和類型
- 刪除列
- 刪除表
2.2 DML:CUD —> 數(shù)據(jù)
- 插入語(yǔ)句
- where條件修改
- where條件刪除
- 刪除表中所有記錄
2.3 DQL:R —> 數(shù)據(jù)
基礎(chǔ)查詢
-select 字段 from 表 where 條件 group by分組 having 分組后的條件 order by排序 limit 分頁(yè)限定
IFNULL(需要判斷null的字段, null的替換值)
AS 起別名 【AS可省略】
條件查詢
- >、<、<=、>=、=、<>
-select [查詢字段] where [條件字段] [運(yùn)算符] [比較條件] - BETWEEN…AND
-select [查詢字段] where [條件字段] between [比較條件1] and [比較條件2] - IS NULL
-select [查詢字段] where [條件字段] is null - and 或 &&
- -select [查詢字段] where [條件字段] [比較條件1] and [比較條件2]
- or 或 ||
- -select [查詢字段] where [條件字段] [比較條件1] and [比較條件2]
- not 或 !
- -select [查詢字段] where [條件字段] is not null
- LIKE 【模糊查詢】:like的占位符 "_"單個(gè)字段 "%"多個(gè)字段
- mysql> select * from scores where name like "%張%"; 包含張
- mysql> select * from scores where name like "張%" ;第二個(gè)字是張
- mysql> select * from scores where name like "_張" ;第一個(gè)字是張
排序查詢
order by [排序字段] [排序方法]
ASC:升序 默認(rèn) DESC:降序
聚合函數(shù)
count:計(jì)算個(gè)數(shù)
max:最大值
min:最小值
sum:計(jì)算和
avg:計(jì)算平均值
將一列作為整體進(jìn)行縱向運(yùn)算,會(huì)排除null值
分組查詢
分組之后查詢的字段只能是【分組字段】或者【聚合函數(shù)】
分頁(yè)查詢
limit [開(kāi)始索引] [每頁(yè)條數(shù)] 只能用在mysql里
開(kāi)始索引 =(當(dāng)前頁(yè)碼 - 1)* 每頁(yè)顯示條數(shù)
2.4 DCL:管理用戶授權(quán)
如果忘記了root用戶密碼
解決方案:
用戶權(quán)限管理
- 授予權(quán)限
- 查看權(quán)限
- 撤銷(xiāo)權(quán)限
3 約束
對(duì)表中的數(shù)據(jù)進(jìn)行限定,保證數(shù)據(jù)的正確性、有效性、完整性
3.1 非空約束
3.2 唯一約束
可以有null值 但null值只能在一條里存在
mysql> create table stu(-> id int,-> phone varchar(20) unique);--刪除唯一約束alter+drop index mysql> alter table stu drop index phone; -- 建表后添加唯一約束 mysql> alter table stu modify phone int(20) unique;3.3 主鍵約束
非空且唯一
【補(bǔ)充】自動(dòng)增長(zhǎng)
如果某一列是數(shù)值類型,使用auto_increment可以完成值的自動(dòng)增長(zhǎng)
3.4 外鍵約束+級(jí)聯(lián)操作
減少數(shù)據(jù)冗余,進(jìn)行表的拆分
原表:員工表(工號(hào),姓名,年齡,部門(mén),部門(mén)地址)
部門(mén)和部門(mén)地址會(huì)出現(xiàn)冗余
拆分:
員工表員工表(工號(hào),姓名,年齡,部門(mén)號(hào))
【級(jí)聯(lián)操作謹(jǐn)慎使用】
部門(mén)表(部門(mén)號(hào),部門(mén),部門(mén)地址)
mysql> create table dep(-> dep_id int primary key auto_increment,-> name varchar(255) not null,-> address varchar(255));存在外鍵約束,刪除外鍵關(guān)聯(lián)表中的記錄會(huì)報(bào)錯(cuò):
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign
key constraint fails (db1.emp, CONSTRAINT emp_dep_fk FOREIGN KEY
(dep_id) REFERENCES dep (dep_id))
存在外鍵約束,在主表中插入關(guān)聯(lián)表中不存在的記錄會(huì)報(bào)錯(cuò)
ERROR 1452 (23000): Cannot add or update a child row: a foreign key
constraint fails (db1.emp, CONSTRAINT emp_dep_fk FOREIGN KEY
(dep_id) REFERENCES dep (dep_id))
4 數(shù)據(jù)庫(kù)的設(shè)計(jì)
4.1 多表之間的關(guān)系
身份證和人:一人只有一個(gè)身份證 一個(gè)身份證只屬于一個(gè)人
部門(mén)和員工:一個(gè)員工只屬于一個(gè)部門(mén) 一個(gè)部門(mén)有多個(gè)員工
一個(gè)學(xué)生可以選擇很多課程,一個(gè)課程可以被很多學(xué)生選擇
一對(duì)多關(guān)系的實(shí)現(xiàn)
在多的一方(員工)建立外鍵,指向一的一方(部門(mén))的主鍵
多對(duì)多關(guān)系的實(shí)現(xiàn)
需要建立中間表記錄兩張表的主鍵,這兩個(gè)字段作為外鍵指向兩張表
一對(duì)一關(guān)系的實(shí)現(xiàn):任意一方添加唯一外鍵,指向另一方的主鍵。或者讓兩表的主鍵相同,一般情況合成一張表。
4.2 范式
數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí)遵循的規(guī)范
- 函數(shù)依賴:A—>B:如果通過(guò)A屬性(屬性組)的值,可以唯一確定B屬性組中的值。
【學(xué)號(hào) —> 姓名】【學(xué)號(hào)+課程名稱 —> 分?jǐn)?shù)】 - 完全函數(shù)依賴:A—>B:如果A是一個(gè)屬性組,則B屬性值的確定需要依賴于A屬性的所有屬性值。【學(xué)號(hào)+課程名稱 —> 分?jǐn)?shù)】
- 部分屬性依賴:A—>B:如果A是一個(gè)屬性組,則B屬性值的確定只需要依賴于A屬性的部分屬性值。【學(xué)號(hào)+課程名稱 —> 姓名】
- 傳遞函數(shù)依賴:A—>B—>C:通過(guò)A可以確定B,通過(guò)B可以確定C,則稱C傳遞依賴于A。【學(xué)號(hào) —> 系名 系名 —> 系主任】
- 碼:如果表中一個(gè)屬性或?qū)傩越M,被其他屬性完全依賴則稱這個(gè)屬性為該表的碼。
- 主屬性:碼屬性組中的所有屬性
- 非主屬性:除了碼屬性組的屬性
5 數(shù)據(jù)庫(kù)的備份和還原
- 備份: mysqldump -u用戶名 -p密碼 數(shù)據(jù)庫(kù)名稱> 保存路徑
- 還原:
a.登錄數(shù)據(jù)庫(kù)
b.創(chuàng)建數(shù)據(jù)庫(kù)
c.使用數(shù)據(jù)庫(kù)
d.執(zhí)行文件 source 文件路徑
6 多表查詢
6.1 笛卡爾積
有兩個(gè)集合A和B,取兩個(gè)集合的所有組合情況,多表查詢需要消除無(wú)用數(shù)據(jù)
mysql> select * from emp,dep;6.2 內(nèi)連接查詢
從哪些表中查詢,條件是什么,查詢哪些字段
- 隱式內(nèi)連接:
- 顯式內(nèi)連接:
6.3 外連接查詢
- 左外連接:左表所有數(shù)據(jù) 以及 兩張表的交集部分
- 右外連接:右表所有數(shù)據(jù) 以及 兩張表的交集部分
6.4 子查詢
嵌套的select就是子查詢
子查詢的不同情況:
單行單列
多行單列
-- 單列dep_id 但是存在多個(gè) 即多行 可以用 【字段 in (子查詢)】 mysql> select * from emp where dep_id in (select dep_id from dep where name="財(cái)務(wù)部" or name="市場(chǎng)部");多行多列
-- 子查詢的結(jié)果是多行多列的情況下 ,子查詢可以作為一張?zhí)摂M表進(jìn)行表的查詢 mysql> select * from dep t1,(select * from emp where emp.join_date>"2018-01-01") t2-> where t1.dep_id = t2.dep_id; --相當(dāng)于普通的內(nèi)連接 mysql> select * from dep inner join emp on dep.dep_id=emp.dep_id where join_date>"2018-01-01";6.5 綜合練習(xí)
-- 練習(xí)1 SELECT emp.id,-- 員工號(hào)emp.ename,-- 員工名emp.salary,-- 員工工資job.jname,-- 職務(wù)名job.description -- 職務(wù)描述 FROM emp,-- 員工表job -- 職務(wù)表 WHERE emp.job_id=job.id;-- 練習(xí)2 SELECT emp.ename,-- 員工名emp.salary,-- 員工工資job.jname,-- 職務(wù)名job.description,-- 職務(wù)描述dept.dname,-- 部門(mén)名dept.loc -- 部門(mén)位置 FROM emp,-- 員工表job,-- 職務(wù)表dept -- 部門(mén)表 WHERE emp.job_id=job.id AND emp.dept_id=dept.id;-- 練習(xí)3 SELECTemp.ename,-- 員工名emp.salary,-- 員工薪資salarygrade.grade-- 員工薪資等級(jí) FROMemp,-- 員工表salarygrade-- 薪資登記表 WHEREemp.salary>=salarygrade.losalary AND emp.salary<=salarygrade.hisalary;-- 練習(xí)4 SELECTemp.ename,job.jname,job.description,dept.dname,dept.loc,salarygrade.grade FROMemp,job,dept,salarygrade WHEREemp.dept_id=dept.id ANDemp.job_id=job.id ANDemp.salary BETWEEN salarygrade.losalary AND salarygrade.hisalary;-- 練習(xí)5 重點(diǎn)! 分組查詢 + 子查詢多列多行 SELECTt1.id,t1.dname,t1.loc,t2.totalnum FROMdept t1,(SELECTemp.dept_id, COUNT(id) totalnumFROMempGROUP BY dept_id) t2WHERE t1.id=t2.dept_id;-- 練習(xí)6 一張表的自關(guān)聯(lián) 可以用重命名 用兩次 SELECTt1.ename employee,t2.ename manager FROMemp t1, emp t2 WHEREt1.mgr=t2.id-- 練習(xí)6的升級(jí)版 沒(méi)有管理者的也要在表中 -- 左表為員工 右邊用來(lái)找管理者 顯示所有員工的管理者 為空則null顯示 SELECTt1.ename employee,t2.ename manager FROMemp t1 LEFT JOIN emp t2 ONt1.mgr=t2.id;7 事務(wù)
7.1 事務(wù)的基本介紹
如果一個(gè)包含多個(gè)步驟的業(yè)務(wù)操作,被事務(wù)管理,那么這些操作要么同時(shí)成功,要么同時(shí)失敗。
操作:
MySQL數(shù)據(jù)庫(kù)中事務(wù)默認(rèn)自動(dòng)提交,一條DML提交一次
Oracle默認(rèn)手動(dòng)提交
開(kāi)啟事務(wù) 則為手動(dòng)提交
修改事務(wù)的默認(rèn)提交方式
SELECT @@autocommit -- 1代表自動(dòng)提交 -- 0代表手動(dòng)提交 SET @@autocommit=1;7.2 事務(wù)的四大特征
ACID
原子性:事務(wù)不可分割 要么同時(shí)成功 要么同時(shí)失敗
持久性:事務(wù)一旦提交或回滾 數(shù)據(jù)庫(kù)會(huì)持久化的保存數(shù)據(jù)
隔離性:多個(gè)事務(wù)之間相互獨(dú)立
一致性:事務(wù)操作前后數(shù)據(jù)總量不變
7.3 事務(wù)的隔離級(jí)別
多個(gè)事務(wù)之間是隔離的,相互獨(dú)立
如果多個(gè)事務(wù)操作同一批數(shù)據(jù)則會(huì)引發(fā)一些問(wèn)題
設(shè)置不同的隔離級(jí)別可以解決這些問(wèn)題
存在問(wèn)題
- 臟讀:一個(gè)事務(wù)讀到另一個(gè)事務(wù)中沒(méi)有提交的數(shù)據(jù)
- 不可重復(fù)讀:在同一個(gè)事務(wù)中,兩次讀取的數(shù)據(jù)不一樣
- 幻讀:一個(gè)事務(wù)操作(DML)數(shù)據(jù)表中的所有記錄,另一個(gè)事務(wù)添加了一條數(shù)據(jù),則第一個(gè)事務(wù)查詢不到自己的修改
隔離級(jí)別:級(jí)別越高 安全性越高 效率越低
- read uncommitted:讀未提交:臟讀、不可重復(fù)讀、幻讀
- read committed:讀已提交:不可重復(fù)讀、幻讀【Oracle默認(rèn)的】
- repeatable read:可重復(fù)度:幻讀【MySQL默認(rèn)的】
- serializable:串行化:可以解決所有問(wèn)題
選擇合適的隔離級(jí)別
設(shè)置隔離級(jí)別
臟讀和不可重復(fù)讀的演示
設(shè)置隔離級(jí)別為 讀未提交
set global transaction isolation level read uncommitted;
開(kāi)啟事務(wù)
start transaction;
轉(zhuǎn)賬:
update account set balance = balance - 500 where id = 1;
update account set balance = balance + 500 where id = 2;
窗口1 執(zhí)行事務(wù) 但未提交
窗口2 讀到臟數(shù)據(jù)
在窗口1 回滾后
窗口2 顯示 【同時(shí)出現(xiàn)了不可重復(fù)讀的問(wèn)題】
設(shè)置隔離級(jí)別為 讀已提交
set global transaction isolation level read committed;
在commit之后可以才在窗口2讀到更改
但是對(duì)于同一個(gè)事務(wù)兩次查詢結(jié)果不一致 出現(xiàn)不可重復(fù)讀的問(wèn)題
設(shè)置隔離級(jí)別為可重復(fù)讀
窗口1 開(kāi)啟事務(wù)
窗口2 開(kāi)啟事務(wù)
窗口1 轉(zhuǎn)賬 不提交
窗口2 查詢賬務(wù) 結(jié)果1
窗口1 提交
窗口2 查詢賬務(wù) 結(jié)果2
窗口2 提交
窗口2 查詢賬務(wù) 結(jié)果3
結(jié)果1 和 結(jié)果2 一致 在窗口2的一次事務(wù)中可重復(fù)度
結(jié)果3和結(jié)果1和不一致 因?yàn)榇翱?的事務(wù)已提交
設(shè)置隔離級(jí)別為串行化
類似于鎖機(jī)制
只有在窗口1提交之后 窗口2才可以查詢
總結(jié)
以上是生活随笔為你收集整理的【JavaWeb】数据库基础复习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何查看Activity任务栈以及dum
- 下一篇: 【Java】Junit、反射和注解的笔记