本來是應該在第一周內做完內沉御,無奈上周狀態(tài)不佳,年底報告很多昭灵,現在補上吠裆。
內容概括:
第一周主要是復習數據庫的基本內容伐谈,包括:
數據庫的概念、基本邏輯結構试疙、類型等诵棵;
數據庫服務器連接,數據庫的建立祝旷,增刪改 等DML(定義)履澳、(DDL)操作? 的基本操作;
查詢數據庫的基本語法怀跛,包括基礎查詢select距贷、排序order、分組group by等吻谋;
子查詢 in 忠蝗、分頁查詢 limit、連接 join 等? 以及
視圖view 漓拾、事務? 和 索引什湘。
學習內容:
Day 01 【數據庫基礎】
數據庫 -- 現代化的存儲手段,以文件為基礎晦攒,以合理的數據結構和算法實現,可以實現高速讀寫得哆,有效性脯颜,容易擴展
數據庫應具有:字段column、記錄item贩据、主鍵:能夠唯一表示一行記錄
RDBMS:關系型數據庫管理系統(tǒng)(Relational Database Management System)
表與表之間有關聯(lián)栋操,叫關系型數據庫
oracle:收費數據庫,能處理極大量數據
mysql:web時代使用最廣泛的關系型數據庫
ms sql server:在微軟的項目中使用
sqlite:輕量級數據庫饱亮,主要應用在移動平臺
mangoDB:非關系型數據庫
數據庫組成模型:客戶端矾芙、服務端、數據庫
客戶端通過SQL語句連接服務端
SQL語言
SQL是一門專用于訪問關系型數據庫的語言近上,可以用于當前所有RDB
SQL語言主要分為:
DQL:數據查詢語言剔宪,用于對數據進行查詢,如select
DML:數據操作語言壹无,對數據進行增加葱绒、修改、刪除斗锭,如insert地淀、udpate、delete
TPL:事務處理語言岖是,對事務進行處理帮毁,包括begin transaction实苞、commit、rollback
DCL:數據控制語言烈疚,進行授權與權限回收黔牵,如grant、revoke
DDL:數據定義語言胞得,進行數據庫荧止、表的管理等,如create阶剑、drop
CCL:指針控制語言跃巡,通過控制指針完成表的操作,如declare cursor
注:SQL語言不區(qū)分大小寫
數據完整性
1.數據類型:(使用正確的牧愁、大小合適的數據類型素邪,保證數據庫是可用的)
常用:
整數: int ,有很多子類猪半,tinynit兔朦、int、磨确;bit 沽甥,0/1;
浮點數:decimal? -- decimal(m,n)表示該浮點數一共m位乏奥,小數點后面有n位
字符串:varchar,char? -- char(n)會通過補空格使字符串長度保持n
日期: date 摆舟、time、datetime
enum 枚舉類 enum(a,b,c)只允許返回a邓了、b恨诱、c三種值
注:int()括號中可以加位數,不加默認是int(11),即長度11骗炉,可以配合zerofill照宝,即int zerofill,不足位數的自動補前0句葵,超過位數的按真實位數存儲厕鹃,不會截斷,且使用zerofill會自動添加unsigned屬性乍丈,無符號整數
數據類型全介紹:https://blog.csdn.net/anxpp/article/details/51284106
2.約束:(通過約束規(guī)范具體字段(即column)的值)
主鍵primary key:物理上存儲的順序
非空not null:此字段不允許填寫空值
惟一unique:此字段的值不允許重復
默認default:當不填寫此值時會使用默認值熊响,如果填寫時以填寫為準
外鍵foreign key:對關系字段進行約束,當為關系字段填寫值時诗赌,會到關聯(lián)的表中查詢此值是否存在汗茄,如果存在則填寫成功,如果不存在則填寫失敗并拋出異常
說明:雖然外鍵約束可以保證數據的有效性铭若,但是在進行數據的crud(增加洪碳、修改递览、刪除、查詢)時瞳腌,都會降低數據庫的性能绞铃,所以不推薦使用,那么數據的有效性怎么保證呢嫂侍?答:可以在邏輯層進行控制
數據庫設計3范式(Normal Form)
1.原子性:列不可再分
2.主鍵:必須包含一個主鍵列儿捧,其他列均應依賴主鍵。主鍵可以由多個列組成挑宠。
3.直接依賴:非主鍵列必須直接與主鍵存在聯(lián)系菲盾,而非互相之間存在直接依賴,間接依賴于主鍵
E-R模型:
E(Entry)各淀,R(Relation)
關系情況:一對一懒鉴、一對多、多對多碎浇。表A临谱、B存在多對多情況時,應使用另外的表C奴璃,存儲A悉默、B的關系。表C內存儲A的主鍵和B的主鍵苟穆。
邏輯刪除:
對于非常重要的數據抄课,如果不希望在刪除(物理刪除)后再也找不到,可通過邏輯刪除鞭缭,即使用標識列(如isDelete)表明該數據是處于“刪除”狀態(tài)。
【Day2 數據庫操作】
連接數據庫
1.MySQL Command Line Client
2.IED連接
3.在MySQL的bin目錄下魏颓,cmd命令行中岭辣,輸入bin目錄下輸入? D:\MYSQL\bin> mysql -utest -p
命令格式為:-u+用戶名,-p+密碼
(此處因在bin目錄下能找到mysql.exe文件甸饱,所以只能在這個目錄下運行沦童,在其他目錄下,cmd找不到叹话,就運行不了偷遗。)
port:3306是mysql自己的端口,其他數據庫也有自己的端口號
對數據庫database的基本操作 DDL
數據庫:
創(chuàng)建數據庫:create database 數據庫名 charset = utf8 (因中國人驼壶,常會用到漢字氏豌,所以用utf8);
刪除數據庫:drop database 數據庫名;
查看數據庫創(chuàng)建信息: show create datazbase 數據庫名;
選擇數據庫:use database;
查看當前數據庫 select databse();
數據庫中的表進行管理:
查看當前所有的表 show tables
創(chuàng)建表 create table stud(字段名 數據類型 約束,字段名2 數據類型 約束热凹,...? )
查看表的信息 desc 表名
查看表的創(chuàng)建 show create table
對表修改 (一般以alter起頭)
添加字段 alter table 表名 add 字段名? 字段數據類型 約束
修改字段 alter table 表明 modify 字段名 新字段數據類型 新約束? (不重命名泵喘,保持舊字段名)
添加字段2 alter table 表名 change 舊字段名 新字段名 類型 約束
刪除字段 alter table 表名 drop 字段名
對表table(此處指表格本身泪电,不是表中數據)的基本操作 DML
對數據data操作(增、刪纪铺、改):
insert into 表名 values(值):
自增序列可以填寫0相速,null,default 鲜锚;
枚舉類型可以寫1突诬,2,3芜繁,4...對應enum()中依次列舉的選項 旺隙,枚舉類型的默認值可以采用default選取
部分插入 insert into 表名(字段名1,字段名2) values (值1浆洗,值2)
多值插入 insert into 表名 values(值)(值2)(值3)...
修改:
1.全部修改
update 表名 set 字段 = 新值
2.按條件修改
update 表名 set 字段 = 新值 where 條件表達式
刪除:
物理刪除 delete? from 表名 where? 條件 -- 一般不會這樣刪除催束,數據寶貴,邏輯刪除
PS 有數據就有價值伏社,商業(yè)價值抠刺,分析價值
邏輯刪除 給數據加一個標識位 如is_delete
數據庫備份和操作
備份:mysqldump -u用戶名 -p >python.sql
#按提示輸入密碼
恢復:連接mysql,創(chuàng)建新的數據庫
退出連接摘昌,執(zhí)行下列命令
mysql -u用戶名 -p 新數據庫名 < python.sql
#按提示輸入密碼
【Day3 數據查詢】
查詢:
查所有 select * from:
字段用as 起別名速妖,方便引用
字段的順序,根據select 后面排列順序決定
消除重復行: select distinct 列1聪黎,... from 表名
條件查詢:
“使用where子句對表中的數據篩選罕容,結果為true的行會出現在結果集中”
select * from 表名 where 條件;
常用條件:
1.比較運算符:等于=稿饰、大于>锦秒、小于<、大于等于>=喉镰、小于等于<=旅择、不等于<> 或 !=侣姆;
注:sql是非常嚴謹的語言,該有的部分,參數,即便是可以默認或者省略,也都要寫上生真;
2.邏輯運算符:and 、or捺宗、 not柱蟀;
注:邏輯運算符not會和最近的判斷結合
3.模糊查詢: like + %(表示任意多個字符)、_ 表示一個任意字符
4.范圍查詢:in 蚜厉、between ... and ...
5.空判斷: is null(注:null 和 ‘ ’是不同的)
排序:
order by 字段1 asc/desc 长已,字段2 asc/desc...
分組查詢:(統(tǒng)計、去重):
利用group by,可將表格按某列的值進行分組痰哨,可對某一個字段進行分組胶果,或對多個字段進行多層分組。
select * from 表名 group by 字段名1斤斧,字段名2...
分組后的幾個處理方法:
1)group + group_concat(目標字段)
分組后將某個目標字段中所有值用‘早抠,’連接起來,全部顯示
2)group+ having
3)聚合函數:對一組值執(zhí)行計算并返回單一的值撬讽,又叫組函數蕊连。除 COUNT 以外,聚合函數忽略空值游昼。(plus:count(1)和count(*)不會過濾null值甘苍,但count(字段名col)會過濾掉null)
可以應用于查詢語句的SELECT中,或者HAVING子句中烘豌,但不可用于WHERE語句中载庭,因為WHERE是對逐條的行記錄進行篩選。
常用聚合函數:max()廊佩、min()囚聚、avg()、count()
4)with rollup:總計标锄,用于對比
# TODO: 窗口函數排序
【DAY4 子查詢】
limit函數:
分頁查詢? limit 多次查詢顽铸,遞進顯示
select * from 表名 limit 【起始行數】【顯示行數】
連接 join:
內連接inner join
注:inner join 有時候和where 效果相同,但是where 可讀性不好料皇!
左連接 left? join
右連接 right
與左連接類似
子查詢:
在一個 select 語句中,嵌入了另外一個 select 語句, 那么被嵌入的 select 語句稱之為子查詢語句谓松。
主查詢和子查詢的關系:
子查詢是嵌入到主查詢中
子查詢是輔助主查詢的,要么充當條件,要么充當數據源
子查詢是可以獨立存在的語句,是一條完整的 select 語句
子查詢形式:
1.標量子查詢
子查詢返回的結果是一個數據(一行一列)
2.行級子查詢
行級子查詢意味著子查詢貢獻的約束條件是約束行的,返回值是一行多列
3.列級子查詢
列級子查詢践剂。鬼譬。。約束列的逊脯,返回值是一列多行
【day5 mysql高級】
視圖
作用:以軟件訪問數據庫? 优质,若數據庫表結構和定義發(fā)生變化,比如字段名字更新男窟,那舊的查詢語句就會失效盆赤。用視圖可以解決此問題
視圖不是真實的表贾富,沒有存儲空間歉眷。創(chuàng)建視圖后,視圖就可以像表一樣查詢使用了颤枪。
創(chuàng)建:
create view 視圖名稱 as select 語句
事務:
一系列相關操作汗捡,要么全部完成,要么都不完成,中途中斷會回滾
表引擎必須是innodb扇住,才可使用事務
使用事務的過程:
1)開啟事務
用“begin” 或 “start transaction”啟動命令
2)執(zhí)行事務操作:
3)中斷 or 完成:
中斷后采用roll back (會自動進行春缕,也可手動進行) /? 或用commit 結束事務;
事務4個特性:
原子性 Atomicity :從begin 到 commit 所有動作要么全部完成艘蹋,要么全都不執(zhí)行锄贼;
一致性 Consistency :事務要么處于沒有執(zhí)行過的狀態(tài),要么是全部執(zhí)行的裝態(tài)女阀,沒有中間狀態(tài)宅荤;
隔離性 Isolation : 一個事物在操作完成,并用commit提交前浸策,是不對任何其他事務可見的冯键;
持久性 Durability : 一個事物操作被完成后,變會永久造成數據庫的改變庸汗;
修改數據的操作惫确,insert 、update 蚯舱、delete等改化,都會觸發(fā)事務,如果有一系列復雜程序組成一個整體功能晓淀,有必要手動使用事務
索引:
性質為目錄所袁,其實是一個特殊文件,其內存儲所有數據的指針凶掰。
索引是為了應對大量數據查詢緩慢的情況燥爷。如果數據量小,沒有必要懦窘,會導致更新和插入變慢前翎,索引也會占用磁盤空間。
創(chuàng)建索引:
create index 索引名稱 on 表名(字段名)
查看索引:
show index from 表名:
刪除索引:
drop index 索引名 on 表名
# TODO:關于數據庫用戶授權
函數學習:
MYSQL 獲取時間函數: DATE_FORMAT(date,format) 畅涂,其中date是日期港华,format是輸出格式。