?數據庫定義
數據庫是一類軟件,用來管理數據,組織數據;
- 關系型數據庫MySQL(Oracle,SQL Server,SQLite)以表格形式組織數據,數據格式要求嚴格;
- 非關系型數據庫Redis(MongoDB,HBase)以鍵值對/文檔形式組織數據,數據格式較松散,性能高,運用在分布式場景中;
- 多維數據庫:essbase;
- 分布式數據庫:DB2是IBM開發的一種大型關系型數據庫平臺;
- (在軟件開發領域中,經典結論:沒有銀彈)
?MySQL基本結構
MySQL的基本結構:客服端-服務端?結構的程序
客戶端(client):發出請求的一方
服務端(server):被動接受請求一方
請求(request):客戶端主動給服務端發的數據
響應(response):服務端給客戶端返回數據
服務器的基本特點:
1:7*24小時運行(引用分布式系統,做高可用支持);
2:服務器是不知道客戶端什么時候給他發請求,服務器是被動的一方;
3:服務器(負責存儲和管理數據,是數據庫的本體)可以給多個客戶端(和用戶交互的界面)提供服務;
(服務器本質就是一臺電腦(計算機);
計算機怎么構成的:
CPU(中央處理器),
主板(一塊大的電路板,cup裝在上面),
內存,硬盤 ->負責存儲數據的,
電源,散熱器,機箱,
顯卡(GPU 專門負責圖形渲染相關的計算的,最貴的),
顯示器,鼠標,鍵盤;
存儲數據:
1:內存->存儲空間較小,訪問速度較快,成本高,數據易失(斷電數據丟失);
2:硬盤->存儲空間較大,訪問速度較慢(速度比內存慢速度慢好幾個數量級,一個數量級就是10倍),成本低,數據持久(斷電數據不會丟失,持久是相對的,并不是永久存在);
- 硬盤分類:機械硬盤,固態硬盤(固態硬盤比機械硬盤快一個數量級);
- 外存:外存是一個“統稱”,硬盤只是典型代表,還有U盤,軟盤,光盤;
- CPU:中央處理器,用于各種邏輯判斷和算術運算(CPU是人類當前科技領域的巔峰之作,能相提并論的就是氫彈)是通用運算芯片;
- 顯卡(GPU):是專用計算芯片,專門用來計算圖形圖像,GPU速度比CPU快;
- 顯存:顯存就是專門給顯卡使用的內存(平時內存是給CPU使用的,為了不沖突,會在顯卡上單獨焊上內存單元);
- AI:顯卡用于AI領域中;
MySQL數據庫存儲數據,數據存儲在硬盤(空間大,持久化存儲)上;
Redis是將數據存儲在內存上,很特殊*;
大數據:一個機器存不了的數據,使用多個機器來存儲,這個操作數據的一系列技術體系叫做大數據;
數據庫的基本操作
SQL是大小寫不明感的,寫成大寫或者小寫都可以;
各種命名名稱不能是SQL中的關鍵字-〉如果非要使用,可以使用反引號進行引起來;
一個漢字占幾個字節-〉這是不確定的,要根據字符集(GBK使用2個字節表示一個漢字,UTF8變長編碼,一般是3個字節表示一個漢字);
?誤刪數據庫
控制好權限,MySQL支持豐富的權限配置功能,根據賬號限制權限;
備份,重要的數據多備份幾份;
線上數據:表示真實的用戶數據;
線下數據:用來測試的數據,數據是假的;
直觀基本操作(簡單)
1:show databases; 查看現有的數據庫
2:create database 數據庫名;創建數據庫
3:create database 數據庫名 charset 字符集名;創建數據庫指定字符集
4:use 數據庫名;選中數據庫
5:drop database 數據庫名;刪除數據庫
額外補充知識點(實際工作)
2_26
線上環境/生產環境
一、線下環境
1:辦公環境-〉開會,做PPT,發郵件,寫日報周報,軟件聊天;
2:開發環境-〉
-
簡單項目,開發環境就是辦公環境;
-
項目對環境要求較高,公司會發單獨的服務器,通過辦公電腦連到服務器上開發;
3:測試環境-〉類似于開發環境
二、線上環境
1:生產環境-〉
-
程序會放到上面,就可以被外面用戶真實訪問到,如果用戶訪問量比較大,對于配置比較高;
-
在生產環境上的程序出現bug了,會被外面的用戶直接訪問到;
-
把寫好的程序發布到生產環境上,這個過程成為“上線”;
-
上線是一個非常重要的操作,“誤操作”引出的生產環境的問題;
編程語言體系-〉“武當”,“少林”
C(代碼好理解,代碼好寫,不保證代碼的正確性);Lisp(更好的能保證代碼的正確性,代碼不好理解,代碼不好寫,思考能力極強);
MySQL中的數據類型
1:數字
bit 1
tinyint 1
smallint 2
int 4
bigint 8
float(m,d) 4 (m表示長度,d表示小數位數)
double(m,d) 8
decimal(m,d) m/d最大值+2(要最大值)
numeric(m,d) m/d最大值+2
-
float和double不能精確存儲小數,所以避免在金錢,計算機科學前使用;
-
decimal和numeric是能夠精確存儲小數的,但是需要消耗的空間和時間更多;
慎重使用 浮點數 比較相等-〉0.1+0.2=0.3?false
2:字符串
varchar(自定義可存放最大值) 可變長的字符串類型,varchar的單位是“字符”,而不是字節,一個漢字就是一個字符;
text 長文本數據,長度靠自適應的,會自動擴容,但是實際開發中會明確數據存儲的上限;
mediumtext 更長文本數據,和text一樣,謹慎使用;
blob 存儲二進制數據,指的是(圖片,音頻,視頻,可執行程序,.class文件),謹慎使用;
3:時間
datetime 8 1000到9999年,不會進行時區的檢索及轉換;
timestamp 4 1970到2038,自動檢索當前時區并轉換;
4:null
null-〉數據庫中的null表示“這個單元格沒填”
MySQL核心操作(增、查、改、刪 -> 詳細)
🦠create table 表名(列名 類型,列名 類型,....);創建表
🦠desc 表名;查看表結構(desc-〉describe描述;在查詢有一個desc-〉descend下降)
🦠drop table 表名;刪除表(不僅刪除了表,還刪除了表中的數據)
MySQL中的注釋#和-- (兩橫杠加一空格)
額外補充知識點(類型)
強類型和弱類型-〉
-
越支持隱式類型轉換的是弱類型,越不支持的是強類型(隱式類型轉換就是不需要寫代碼就就能自動轉換類型的);
靜態類型和動態類型-〉
-
一個變量的類型,能否在程序運行過程中發生改變。允許發生改變,就是動態類型;不允許發生改變的就是靜態類型;
1:新增
insert into 表名 values (值,值,...);
insert into 表名 (列名,列名...) values (值,值...);
insert into 表名 values(值,值...),(值,值...);
insert into 表名 (列名,列名...) values (值,值...);
MySQL中有一個專門的函數now()來獲取當前系統時間;
sql作為一個編程函數,提供了一些庫函數;
時間加入的標準是:“2024-3-2 16:01:00”
2:查詢
select * from 表名;全列查詢(select*是一個危險操作,實際工作中,生產環境上要慎用)
select 列名,列名... from 表名;指定列的查詢(列名必須存在于要查的表中)
(select只是查詢,是讀操作,不會影響數據庫服務器硬盤上存儲的數據)
(decimal限制的是硬盤上的數據,而不是臨時表的數據,臨時表能夠盡可能保證最終計算結果是正確的)
1:select*from 表名;全列查詢
2:select 列名,列名 from 表名;指定列查詢
3:select destinct 列名 from 表名;去重查詢(destinct)
4:select 列名,列名+列名 as 重命名 from 表名;計算查詢
5:select * from 表名 order by 列名/表達式;排序查詢(order by)默認升序排序
select * from 表名 order by 列名/表達式 desc;降序排序(descend)
?在SQL中進行算術運算,如果其中某個操作數,結果是null,那么最后結果也是null。(我對這個定義還有一點疑問?)
6:select * from? 表名 order by 列名1,列名2...;order by指定多個列排序(先按照列名1排序,如果列名1有相同的就按列名2排序...)
7:select * from 表名 order by 列名1,列名2 desc...;按列名1升序排序,按列名2降序排序...
8:👍select 列名,列名...?from 表名 where 條件;
-
條件-〉邏輯運算符,關系運算符;
-
“=”,就表示“等于”的意思。null不安全,例如:null=null結果是null。null和其他的值進行關系運算還是null,相當于false;
-
“〈=〉”,表示“等于”的意思。使用null是安全的,例如:null〈=〉null結果是true(1);
-
between a1 and a2,范圍在[a1,a2]之間返回true(1);
-
in(值1,值2....)相當于是一個集合,判斷這個值是不是在這個集合里;
-
is null 是null;is not null 是不為null;
-
and就是(&&)
-
or就是(||)
-
not就是(!)
where和order by可以結合使用,where在前,order by在后;
and的優先級比or優先級高;
超詳細查詢
1:select * from 表名;全列查詢
2:select 列名,列名... from 表名;指定查詢
3:select 表達式 from 表名;帶有表達式的查詢
4:select 表達式 as 別名 from 表名;帶有別名的查詢(表達式查詢只影響臨時表)
5:select distinct 列名 from 表名;去重查詢
6:select 列名 from 表名 order by 列名/列名 desc;排序查詢
7:select 列名 from 表名 where 條件;條件查詢
8:select 列名 from 表名 列名 like “x%”;模糊查詢
-
慎用like(🔥)
-
“x%”以x開頭;“%x”以x結尾;“%x%”包含x;
-
“x_”x開頭,_表示一個字,“x__”x開頭,__表示兩個字;
9:針對空值的查詢,〈=〉(可以通過兩個列比較)、is null、is?not null;
10:分頁查詢(🌶?)
-
select * from 表名 limit 值;查詢的值小于等于值(此處是offset 0)
-
select * from 表名 limit 值1 offset 值2;查詢跳過值2的數據,查出小于等于值1的條數(offset表示的是偏移量)
-
select * from 表名 limit 值1,值2;值1是offset,值2是最大條數
3:修改
1:update 表名 set 列名 = 值,列名 = 值... where 條件;
update修改的是硬盤上存儲的數據,select修改的是臨時表上的數據;
4:刪除
1:delete from 表名 where 條件;刪除的都是以行為維度進行刪
2:delete from 表名;刪除表中所有數據
一個sql的執行順序
1:遍歷表
2:帶入條件
3:計算列名中的表達式(定義別名)
4:排序/聚合 等操作
編程中談到區間,區間都是前閉后開;
數據庫的約束
約束可以理解為,數據庫提供的一種針對數據的合法性,驗證的機制;
1:not null
-
設定not null,說明列里不能存儲空值,表里內容必填
2:unique
-
這定這一列的所有行的數據都得是唯一的(不能重復)
3:default
-
指定默認值,當不進行任何指定,默認值就是null
4:primary key
-
主鍵:一條記錄的身份標識(類似于 學號/身份證 = not null + unique)
5:foreign key
-
外鍵涉及到兩個表之間的關系
6:check
-
指定條件,插入/修改數據,數據符號才能插入/修改成功