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