MySql學習筆記(基礎)

學習筆記

數據庫基礎

1.什麼是數據庫?
數據庫:database,存儲數據的倉庫
數據庫:高效的存儲和處理數據的介質(介質主要是兩種:磁盤和內存)

2.數據庫的分類?
數據庫基於存儲介質的不同:進行了分類,分爲兩大類:關係型數據庫(SQL)和非關係型數據庫(NoSQL:Not Noly SQL,不是關係型的數據庫都叫做非關係型數據庫)

3.不同的數據庫陣營中的產品有哪些?
關係型數據庫:
大型:Oracle,DB2
中型:SQL-SERVER,MySql等
小型:access等

非關係型數據庫:
memcached,mongodb,redis(同步到磁盤)

4.兩種數據庫陣營的區別?
關係型數據庫:安全(保存磁盤基本不可能丟失)容易理解,比較浪費空間(二維表)

非關係型數據庫:效率高,不安全(斷電會丟失)

關係型數據庫
1.什麼是關係型數據庫?
關係型數據庫:是一種建立在關係模型(數學模型)上的數據庫。
關係模型:一種所謂建立在關係上的模型,關係模型包含三個方面。
數據結構:數據存儲的問題,二維表(有行和列)
操作指令集合:所有SQL語句
完整性約束:表內數據約束(字段與字段),表與表之間約束(外鍵)

2.關係型數據庫的設計?
關係型數據庫:從需要存儲的數據需求中分析2,如果是一類數據(實體)應該設計成一張二位表:表示由表頭(字段名:用來規定數據的名字)和數據部分組成(實際存儲的數據單元)

以實際案例來進行處理:分析一個教學系統,講師負責教學,教學生,在教室教學生
a.找出系統中所存在的實體:講師表,學生表,班級表
b.找出實體中應該存在的數據信息
講師:姓名,性別,年齡,工資
學生:姓名,性別,學號,學科
班級:班級名稱,教室編號

關係型數據庫:維護實體內部,實體與實體之間的關係

實體內部聯繫:每個學生都有姓名,性別,學號,學科信息

關係型數據庫的特點之一:如果表中對應的摸個字段沒有值
(數據),但是系統化依然要分配空間:關係型數據庫比較浪費空間

實體與實體之間的聯繫:每個學生肯定屬於某個班級,每個班級一定有多個學生(一對多)

關鍵字說明

數據庫:database
數據庫系統:DBS(Database System):是一種虛擬系統,將多種內容關聯起來的稱呼

DBS = DBMS + DB
DBMS:Database Management System,數據庫管理系統,專門管理數據庫
DBA:Databse Administrator,數據庫管理員

SQL
SQL:Structured Query Language,結構化查詢語言(數據以查詢爲主:99%是在進行查詢操作)

SQL分爲三個部分:
DDL:Data Definition Language,數據定義語言,用來維護存儲數據的結構(數據庫,表);
代表指令:create,drop,alter等。

DML:Data Manipulation Language,數據操作語言,用來對數據進行操作(數據表中的內容),代表指令:insert,delete,update等。其中DML內部又單獨進行了一個分類:DQL(Data Query Language:數據查詢語言,如select)

DCL:Data Control Language,數據控制語言,主要是負責全縣管理(用戶),代表指令:grant,revoke等

SQL是關係型數據庫的操作指令,SQL是一種約束,但不強制(類似W3C):不同的數據庫產品(如Oracle,mysql)可能內部會有一些細微的區別。

Mysql數據庫
Mysql數據庫是一種C/S結構的軟件:客戶端/服務端。若想訪問服務器必須通過客戶端(服務器一直運行,客戶端在需要使用的時候運行)。
在這裏插入圖片描述

SQL的基本操作

基本操作:CRUD(增刪改查)

將SQL的基本操作根據操作對象進行分類:分爲三類:庫操作,表操作(字段),數據操作。

庫操作
對數據庫的增刪改查

新增數據庫
基本語法
create database 數據庫名 [庫選項];
庫選項:用來約束數據庫,分爲兩個選項
字符集設定:charset/character set具體字符集(數據存儲的編碼格式):常用字符集:GBK 和 UTF8
校對集設定:collate具體校對集(數據比較的規則)

–雙中劃線+空格:註釋(單行註釋),也可以使用#號
create database mydatabase charset utf8;
在這裏插入圖片描述
其中:數據庫名字不能用關鍵字(已經被使用的字符)或者保留字(將來可能會用到)

如果非要使用關鍵字或者保留字,需要加`反引號

中文數據庫是可以的,但是有前提條件:保證服務器能夠識別。(建議不用)

1.查看所有數據庫
show databases;
2.查看指定部分的數據庫:模糊查詢
Show databases like ‘pattern’;-- pattern是匹配模式
%:表示匹配多個字符
_:表示匹配單個字符
在這裏插入圖片描述
3.查看數據庫的創建語句:
show creat database 數據庫名;
在這裏插入圖片描述

更新數據庫

數據庫名字不可以修改
數據庫修改僅限庫選項:字符集和校對集(校對集依賴字符集)
Alter database 數據庫名字 [庫選項];
Charset/characterset [=] 字符集
Collate 校對集

刪除數據庫

所有的操作中:刪除是最簡單的
Drop database 數據庫名子;

當刪除數據庫語句執行之後,發生了什麼?
1.在數據庫內部看不到對應的數據庫
2.在對應的數據庫存儲的文件夾內:數據庫名子對應的文件夾也被刪除(級聯刪除:裏面的表的數據也全部刪除)

注意:數據庫的刪除不是鬧着玩兒的,不要隨意刪除,應該先進行備份後操作(刪除不可逆)

表操作

表與字段是密不可分的。

新增數據表
Create table [if not exists] 表名(
字段名子 數據類型,
字段名字 數據類型
– 最後一行不需要逗號
)[表選項];

if not exists:如果表名不存在,那麼就創建,否則不執行創建代碼:檢查功能

表選項:控制表的表現
字符集:charset/character set 集體字符集;-- 保證表中數據存儲的字符集

校對集:collate 具體校對集;
存儲引擎:engine 具體的存儲引擎(innodb和myisam)

在這裏插入圖片描述
任何一個表的設計都必須指定數據庫。
方案1:顯示的指定表所屬的數據庫
Create table 數據庫名.表名();-- 將當前數據表創建到指定的數據庫下

方案2:隱式的指定表所屬數據庫:先進入到摸個數據庫環境,然後這樣創建的表自動歸屬到摸個指定的數據庫。
進入數據庫環境:use 數據庫名子;

查看數據表
1.數據庫能查看的方式,表都可以查看。
查看所有表
show tables;
2.查看部分表:
模糊匹配 show tables like ‘_%’;
3.查看錶的創建語句
show create table student\g – 等價於分號
\G – 將查到的結構旋轉90度變成縱向
4.查看錶結構:查看錶中的字段信息
Desc/describe/show columns form 表名;

在這裏插入圖片描述

修改數據表

表本身存在,還包含字段:表的修改分爲兩個部分:修改表本身和修改字段

修改表本身:
表本身可以修改:表名和表選項

修改表名(重命名錶名):
rename table 老表名 to 新表名;
strudent表 -> my_student(去數據庫名子前兩個字母)

修改表選項:
字符集 校對集 存儲引擎
Alter table 表名 表選項 [=] 值

修改字段
字段操作很多:新增,修改,重命名,刪除

新增字段
Alter table 表名 add [column] 字段名 數據類型 [列屬性] [位置];
位置:字段名可以存放在表中的任意位置
First:第一個位置
After:在哪個字段之後:after 字段名;默認的是在最後一個字段之後

給學生表增加id放到第一個位置
在這裏插入圖片描述
修改字段名:修改通常是修改屬性或者數據類型
Alter table 表名 modify 字段名 數據類型 [屬性] [位置];
將學生表中的number學號字段變成固定長度,切放到第二位(id之後)
在這裏插入圖片描述
重命名字段
Alter table 表名 change 舊字段 新字段名 數據類型 [屬性] [位置];

修改學生表中的gender字段爲sex
在這裏插入圖片描述
刪除字段
alter table 表名 drop 字段名;

刪除數據表
Drop table 表名1,… 可以一次性刪除多張表

數據操作

新增數據
有兩種方案:
方案1:給全表字段插入數據;不需要指定字段列表:要求數據的值出現的順序必須與表中設計的字段出現的順序一致;凡是非數值數據,都需要使用引號(建議使用丹壹號)包裹

Insert into 表名 values(值列表),[(值列表)];-- 可以一次性插入多條記錄
在這裏插入圖片描述
方案2:給部分字段插入數據,需要選定字段列表:字段列表出現的順序與字段的順序無關;但是值列表的順序必須與選定的字段的順序一致。
Insert into 表名 (字段列表) values(值列表),[(值列表)];
在這裏插入圖片描述

查看數據

Select */字段列表 form 表名 [where 條件]
在這裏插入圖片描述
查看指定字段指定條件的字段
在這裏插入圖片描述

更新數據

Update 表名 set 字段 = 值 [where條件] --建議都有where;要不是更新全部。

刪除數據

Delete from 表名 [where條件];

中文數據問題

中文數據問題本質是字符集問題。
計算機只識別二進制:人類更多是識別符號:需要有個二進制與字符的對應關係(字符集)

查看字符集
在這裏插入圖片描述
修改客戶端字符集
在這裏插入圖片描述
數據亂碼原因:
數據來源是服務器,解析數據是客戶端(客戶端只識別GBK;只會兩個字節一個漢字,但事實服務器給的數據缺失UTF8,三個字節一個漢字;亂碼)
解決方案:
修改服務器給客戶端的數據字符集爲GBK
Set character_set_results = gbk;
在這裏插入圖片描述
Set 變量 = 值;修改只是會話級別(當前客戶端,當次連接有效,關閉失敗)

校對集問題

校對集:數據比較的方式

校對集有三種格式
_bin;binary,二進制比較,取出二進制位,一位一位的比較;區分大小寫
_cs;case sensitive,大小寫敏感,區分大小寫
_ci case insensitice,不區分大小寫

查看數據庫所支持的校對集:
show collation;

校對集應用:只有當數據產生比較的時候,校對集纔會生效。

Web亂碼問題
動態網站由三部分構成:瀏覽器,apache服務器(JAVA),數據庫服務器,三個部分都有自己的字符集(中文),數據需要在三個部分之間來回傳遞;很容易產生亂碼

如何解決亂碼問題:同一編碼(三碼合一)

但事實上不可能:瀏覽器是用戶管理(根本不可能控制);
但是必須要解決這些問題:主要靠java來解決這些問題

數據類型(列類型)

所謂的數據類型:對數據進行統一的分類,從系統的角度出發爲了能夠使用統一的方式進行管理;更好的利用有限的空間

SQL中將數據類型分成了三大類:數值類型,字符串類型和時間日期類型
在這裏插入圖片描述
數值型
數值型數據:都是數值
系統將數值型分爲整數型和小數型

整數型
存放整型數據:在SQL中因爲更多要考慮如何節省磁盤空間,所以系統將整型又細分成了5類:
Tinyint:迷你整型,使用一個字節存儲,表示的狀態最多爲256種
Smallint:小整型,使用2個字節存儲,表示的狀態最多爲65536種
Mediumint:中整型,使用3個字節存儲
Int:標準整型,使用4個字節(常用)
Bigint:大整形,使用8個字節存儲

字段屬性

主鍵,唯一鍵和自增長

主鍵:
primary key,主要的鍵,一張表只能有一個字段可以使用對應的鍵,用來唯一的約束該字段裏面的數據,不能重複:這種稱之爲主鍵。

一張表只能有最多一個主鍵。

增加主鍵:
SQL操作中有很多方式可以給表增加主鍵:大體分爲三種。

方案1:在創建表的時候,直接在字段之後,跟primary key關鍵字(主鍵本身不允許爲空) not null 不能爲空 comment ‘備註’
在這裏插入圖片描述
優點:非常直接;
缺點:只能使用一個字段作爲主鍵

方案2:在創建表的時候,在所有的字段之後,使用primary key(主鍵字段列表)來創建主鍵(如果有多個字段作爲主鍵,可以是複合主鍵)
在這裏插入圖片描述
方案3:當表已經創建好之後,再次額外追加主鍵,可以修改表字段屬性,也可以直接追加。
Alter table 表名 add primary key(字段列表);
在這裏插入圖片描述
前提:表中字段對應的數據本身是獨立的(不重複)

主鍵約束:
主鍵對應的字段中的數據不允許重複:一旦重複,數據操作失敗(增和改)

刪除主鍵:
Alter table 表名 drop primary key;
在這裏插入圖片描述
表關係將實體與實體的關係,反應到最終數據庫表的設計上來:將關係分成三種:一對一,一對多(多對一),多對多。所有的關係都是指的表與表之間的關係一對一關係:一張表的一條記錄一定只能與另外一張表的一條記錄進行對應,反之亦然。學生表:姓名,性別,身高,體重,籍貫,家庭住址,緊急聯繫人這些數據屬於常用數據。如果每次都是查詢所有數據,不常用的數據就會影響效率,實際不用。解決方案:將常用和不常用的信息分離存儲,分成兩張表保證不常用信息和常用信息一定要對應上:找一個具有唯一性(確定記錄)的字段來共同連接兩張表一個常用表中的一條記錄:永遠只能在一張不常用表中匹配一條記錄,反過來,一張不常用的表中的一條記錄在常用表中也只能匹配一條記錄:一對一關係。 一對多關係:一對多:一張表中有一條記錄可以對應另外一張表中的多條記錄;但是反過來,另外一張表的一條記錄只能對應第一張表的一條記錄,這種關係就是一對多或者多對一。母親與孩子的關係應該在孩子表中添加一個字段指向母親表,因爲孩子表的記錄只能匹配到一條母親的記錄多對多關係一張表中的一條記錄能夠對應另外一張表中的多條記錄,同時另一個表中的一條記錄也能對應該表中的多條記錄:多對多的關係老師和學生表以上設計方案:實現了實體的設計,但是沒有維護實體的關係。一個老師教過多個學生;一個學生也被多個老師教過解決方案:增加中間表:專門維護兩張表之間的關係

範式:

No馬來Format,是一種離散數學中的知識,是爲了解決一種數據存儲於優化的的問題,保存數據存儲之後;範式能通過關係尋找出來的數據,堅決不再重複存儲;中級目標是爲了減少數據的冗餘。
是一種分層結構的規範,分爲六層:每一層都比上一層更加嚴格,若要滿足下一層範式,前提是滿足上一層範式。

六層範式:最高層最嚴格

Mysql屬於關係型數據庫,有空間浪費,也是致力於節省存儲空間:與範式所有的解決的問題不謀而合:再設計數據庫的時候,會利用範式來指導設計。

但是數據庫不但是解決空間問題,要保證效率問題:範式知識爲解決空間問題,所以數據庫的設計又不可能完全按照範式的要求實現:一般情況下,只有錢三種範式需要滿足。

範式在數據庫的涉及當中是有指導意義:但是不是強制規範

1NF(第一範式)
在設計表存儲數據的時候,如果表中設計的字段存儲的數據,在取出來使用之前還需要額外的處理(拆分),那麼說表的設計不滿足第一範式:第一範式要求字段的數據具有原子性:不可拆分

2NF(第二範式)
在數據表設計的過程中,如果有複合主鍵(多字段主鍵),且表中有字段並不是由整個主鍵來確定,而是依賴主鍵中的某個字段(主鍵的部分):存在字段依賴主鍵的部分問題,稱之爲部分依賴:第二範式就是要解決表設計不允許出現部分依賴
(複合主鍵:一個老師在一個班永遠只帶一個階段的課)

3NF(第三範式)
要滿足第三範式,必須滿足第二範式
第三範式:一張表中的所有字段都應該直接依賴主鍵(邏輯主鍵:代表的是業務主鍵),如果表設計中存在一個字段,並不是直接依賴主鍵,而是通過某個非主鍵字段依賴,最終實現依賴逐漸:把這種不是直接依賴主鍵,而是依賴非主鍵字段的依賴關係稱之爲傳遞依賴。

蠕蟲複製

從已有的數據中去獲取數據,然後將數據進行新增操作:數據成倍的增加

表創建的高級操作:從已有表創建表(複製表結構)
Create table 表名 like 數據庫.表名;

蠕蟲複製:先查出數據,然後將查出的數據新增一遍
Insert into 表名[(字段列表)] select 字段列表/* from 數據表名;

查詢數據

基本語法:
select 字段列表/* from 表名 [where 條件];

完整語法
select [select 選項] 字段列表[字段別名]/* from 數據源 [where 條件子句] [group by 子句] [having 子句] [order by 子句] [limit 子句];

select 選項:select對查出來的結果的處理方式
ALL:默認的,保留所有的結果
Distinct:去重,查出來的結果,將重複給去除(所有字段都相同)

數據源:
分爲多種:單表數據源,多表數據源,查詢語句

多表數據源
SELECT * FROM student,grade

查詢語句
SELECT StuName,(SELECT g.GradeName FROM grade g WHERE g.GradeNo=s.GradeId),s.GradeId FROM student s

Where子句返回結果:0或1,
like模糊 between and in/not in or

找學生id爲1,6,9
SELECT * from student WHERE StuNo in(1,6,9) --落在集合中
SELECT * from student where StuNo = 1 OR StuNo = 6 OR StuNo = 9 --邏輯判斷 或運算

Group By子句

Group By 分組的意思是,根據某個字段進行分組(相同的放一組,不相同的放一組)

根據班級分組
SELECT * from student GROUP BY GradeId

分組的意義:是爲了統計數據(按組統計:按分組字段進行數據統計)
SQL提供了一系列的統計函數
count():統計分組後的記錄數:每一組有多少記錄
Max():統計每組中最大值
Min():統計每組中最小值
Avg():統計平均值
Sum():統計和

SELECT StuSex,COUNT(*),MAX(StuAge),MIN(StuAge),AVG(StuAge) from student group BY StuSex

Count函數:裏面可以使用兩種參數:*代表統計記錄,字段名代表統計對應的字段(Null 不統計)

分組會自動排序:根據分組字段:默認排序
Group by 字段 [asc|desc] --對分組的結果然後合併之後的整個結果進行排序

多字段分組:先根據一個字段進行分組,然後對分組後的結果再次按照其他全字段進行分組
SELECT GradeId,StuSex,COUNT() FROM student GROUP BY GradeId,StuSex
在這裏插入圖片描述
有一個函數:可以對分組的結果中的某個字段進行字符串連接(保留該組所有的某個字段)group_concat(字段)
SELECT GradeId,StuSex,COUNT(
),GROUP_CONCAT(StuName) FROM student GROUP BY GradeId,StuSex
在這裏插入圖片描述
回溯統計:with rollup
任何一個分組後都會有一個小組,最後都需要向上級分組進行彙報統計:根據當前分組的字段,這就是回溯統計:回溯統計的時候會將分組字段置空
SELECT GradeId,COUNT(*) FROM student GROUP BY GradeId WITH ROLLUP

在這裏插入圖片描述
多字段分組回溯統計
SELECT GradeId,StuSex,COUNT(*),GROUP_CONCAT(StuName) FROM student GROUP BY GradeId,StuSex WITH ROLLUP
在這裏插入圖片描述
Having子句
與where子句一樣,進行條件判斷的。

where是針對磁盤數據進行判斷:進入到內存之後,會進行分組操作:分組結果就需要having來處理

having能做where能做的幾乎所有事情,但是where卻不能做having能做的很多事情
分組統計的結果或者說統計函數只有having能做

求出所有班級人數大於等於3的學生人數
SELECT GradeId,COUNT() FROM student GROUP BY GradeId HAVING COUNT()>=3
在這裏插入圖片描述
Order by子句
排序,根據某個字段進行升序或者降序排列,依賴校對集

使用基本語法:
order by 字段名 [asc|desc]

Limit子句
是一種限制結果的語句:限制數量

Limit有兩種使用方式
方案一:只用來限制長度(數據量) limit 數據量
方案二:限制起始位置,限制數量 limit起始位置,長度

SELECT (SELECT g.GradeName FROM grade g WHERE g.GradeNo=s.GradeId) ‘班級’,COUNT() ‘總人數’,GROUP_CONCAT(StuName) ‘學生姓名’,StuSex ‘性別’ FROM student s GROUP BY GradeId,StuSex ORDER BY COUNT() DESC LIMIT 0,4
在這裏插入圖片描述

連接查詢

將多張表(可以大於2張)進行記錄的連接(按照某個指定的條件進行數據拼接)
最終結果是:記錄數有可能變化,字段數一定會增加(至少兩張表的合併)

連接查詢的意義:在用戶查看數據的時候,需要顯示的數據來自多張表

連接查詢分類
Sql中將連接查詢分成四類:內連接,外鏈接,自然連接和交叉連接
連接查詢:join,使用方式:左表 join 右表
左表:在join關鍵字左邊的表
右表:在join關鍵字右邊的表

交叉連接:
cross join,從一張表中循環取出每一條記錄,每條記錄都去另外一張表進行匹配:匹配一定保留(沒有條件匹配),兒連接本身字段就會增加(保留),最終形成的結果叫做:笛卡爾積

基本語法:左表 cross join 右表
SELECT * FROM student s CROSS JOIN grade g WHERE s.GradeId = g.GradeNo
在這裏插入圖片描述
交叉連接存在的價值:保證連接這種結構的完整性,沒有實際意義

內連接
[inner] join,從左表中取出每一條記錄,去右表中與所有的記錄進行匹配:匹配必須是某個條件在左表中與右表中相同最終纔會保留結果,否則不保留

基本語法:
左表 [inner] join 右表 on 左表.字段 = 右表.字段
on 表示連接條件,條件字段就是代表相同的業務含義
SELECT * FROM student s INNER JOIN grade g ON s.GradeId=g.GradeNo
在這裏插入圖片描述
外連接
以某張表爲主,取出裏面的所有記錄,然後每條與另外一張表進行連接,不管能不能匹配上條件,最終都會保留,能匹配,正確保留,不能匹配,其他表的字段都置空

外連接分爲兩種:是以某張表爲主:有主表
left join:做外連接(左連接),以左表爲主
right join:右連接,以右表爲主

基本語法:左表 left/right join 右表 on 左表.字段=右表.字段
SELECT * FROM student s LEFT JOIN grade g ON s.GradeId=g.GradeNo
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章