SQL資料庫基礎入門知識

来源:http://www.cnblogs.com/wuwangqianxun/archive/2017/07/21/7216187.html
-Advertisement-
Play Games

因本人較懶,有些圖片缺失和東西寫的比較簡單,請多包涵 編碼規範: 命名的規範(入鄉隨俗) 編碼習慣: 團隊合作: 團隊配置管理軟體: (TFS SVN) 第一章 更改身份驗證模式:伺服器 屬性 安全性 Master: 記錄所有系統信息 Model: 模板 Msdb: 自動備份 Tempdb: 臨時資 ...


 因本人較懶,有些圖片缺失和東西寫的比較簡單,請多包涵

編碼規範: 命名的規範(入鄉隨俗)

編碼習慣:

團隊合作: 團隊配置管理軟體: (TFS SVN)

第一章

更改身份驗證模式:伺服器 屬性 安全性

Master: 記錄所有系統信息

Model: 模板

Msdb: 自動備份

Tempdb: 臨時資源

常用的資料庫對象: 表, 視圖, 存儲過程, 觸發器, 用戶自定義的函數, 索引等

文件構成:主數據文件(主數據文有且只有一個.mdf), 次要數據文件.ndf(0 ~ n個), 事務日誌文件(增刪(修改一條)改(修改兩條).ldf)(至少一個)

 

第二章

Catalog(資料庫)

資料庫就是數據的倉庫

由表, 關係, 操作對象組成

數據存儲在表中(數據以記錄的形式存在表中, 記錄是客觀存在的一個事物, 表的列)

定義表: 先定義表結構(列或欄位 數據類型 約束)(從對象來的)

定義類: 屬性(欄位), 方法(class 類名 { })(從對象來的)

行(record) 列(colum) 欄位(field)

常用數據類型

Unicode(用兩個位元組的長度 存儲一個字元)

Char比varchar效率高

數據完整性: 實體完整性(對象: 數據行 要求所有行都有唯一的標識符(主鍵))(實施手段: 主鍵約束, 唯一約束, 標識列和GUID列),

域完整性(列, 欄位)(數據類型, 格式, 值域範圍, 是否允許為空)(限制數據類型, 檢查約束, 外鍵約束, 預設值和非空約束),(字元, datatime加單引號)

參照完整性(引用完整性)(主外鍵關係)(不允許引用不存在的實體),

用戶自定義完整性(多用觸發器實現)(指數據的精確性和可靠性)

主鍵是數據行的唯一標識, 不重覆的列才能當主鍵

業務主鍵 邏輯主鍵

主鍵選取原則(量少性, 穩定性)

GUID數據類型(uniqueidentifier)(newid()函數調用)

在字表中創建主外鍵關聯(外鍵引用主表的主鍵)

(刪除數據truncate, 主表用不了)

外鍵在子表中建 (自引用是允許的(遞歸中可以出現))

第三章

SQL

T-SQL (微軟的), PL/SQL(Oracle的(甲骨文公司的))

數據查詢語言: DQL(query: 查詢)select(側重對數據的操作)

數據操作語言: DML(insert, update, delete)(對資料庫)

事物處理語言: TPL (begin transaction 開始事務, commit提交, rollback回滾)

數據控制語言: DCL (grant授權 revoke取消授權)

數據定義語言: DDL (create(創建) drop(刪除) alter(更新/修改)(定義資料庫及其對象(側重結構))

指針控制語言:CCL (declare cursor(聲名游標), fetch into(獲取游標中的數據到變數中))

 

 

sys.sysdatabases

DB_ID(判斷資料庫)

創建表

1. 確定表結構

2. 確定每列的數據類型

3. 添加約束

4. ...

OBJECCT_ID(判斷表)

ALTER TABLE

add constraint 添加約束

drop constraint

PK主鍵(primary key)

UQ唯一(unique)

CK檢查(check)

DF預設

FK外鍵(foreign key references(引用))

第四章

insert: 插入語句

批量插入

--創建資料庫

use master;

--select * from sys.sysdatabases;

go

if DB_ID('StuDB')is not null drop database StuDB;

go

create database StuDB;

go

--創建表

use StuDB;    --打開資料庫

go

--select * from sys.sysobjects;

if OBJECT_ID('t_classInfo') is not null drop table t_classInfo;   --t_bassic_classInfo   TBa_ClassInfo

go

create table t_classInfo

(

   ClassId char(3) not null primary key,

   ClassName varchar(30) not null,

   Comment varchar(150)

)

if OBJECT_ID('t_student') is not null drop table t_student;   

go

create table t_student

(

   StuId char(3) not null primary key,

   StuName varchar(30) not null,

   Birthday date,

   Gender varchar(4),

   ClassId char(3)

)

--添加約束

alter table t_student

   add constraint DF_t_student_Gender default('男') for Gender;

alter table t_student

   add constraint CK_t_student_Gender check(Gender in ('男', '女', '未知'));

alter table t_student

   add constraint FK_t_student_ClassId foreign key (ClassId) references t_classInfo(ClassId);

 

--科目表 t_course(CourseId, CourseName, Comment)

if OBJECT_ID('t_course') is not null drop table t_course;

go

create table t_course

(

   CourseId char(3) not null primary key,

   CourseName varchar(30),

   Comment varchar(150)

)

go

 

--成績表t_score(Id, StuId, CourseId, Score)成績大於等於0 小於等於100 相容一位小數

if OBJECT_ID('t_score') is not null drop table t_score;

go

create table t_score

(

   Id int identity primary key,

   StuId char(3), --references t_student(StuId),

   CourseId char(3), --references t_course(CourseId),

   Score numeric(4,1)

)

go

--添加約束

alter table t_score

   add constraint FK_t_score_StuId foreign key (StuId) references t_student(StuId);

alter table t_score

   add constraint FK_t_score_CourseId foreign key (CourseId) references t_course(CourseId);

alter table t_score

   add constraint CK_t_score_Score check(Score >= 0 and Score <= 100)

 

select * from t_classInfo

insert into dbo.t_classInfo(ClassId, ClassName) values('C01','Web班');

insert into dbo.t_classInfo(ClassId, ClassName) values('C02','.net班'),

                                               ('C03','java班'),

                                               ('C04','php班');

--把查詢結果插入到現有表中(insert select(表必須預先存在))

insert into dbo.t_classInfo(ClassId, ClassName)

   select '','' union

   select '','' union

   select '','';

--用查詢結果生成新表

 

--不使用create語句創建一個表結構和t_classInfo表結構相同的表,裡面不插入任何數據

select * from t_classInfo

select top 0 * into t_class from t_classInfo

drop table t_class

select * from t_class

--#表名(臨時表(保存在伺服器記憶體中 會話結束會自動銷毀))

--修改數據 不加where就是修改全表數據

update t_classInfo set ClassName = 'DotNet班',comment = '123' where ClassId = 'C02';

--刪除數據行

delete from t_classInfo where ClassId = 'C04';

--*代表所有欄位

第五章

is null

is not null(正規)(獲取非空數據)

not + 欄位 + is null (對條件取反)

規格:在sql語句中 如果字元串中有”’”,需要使用兩個”’”進行替代

distinct:去除重覆記錄

union: 將多個查詢結果合併成一個,自動去除重覆行(加all 保留重覆行)

使用union 進行數據排序要寫在最後一個select中 並且只能使用第一條語句中出現的欄位

表聯結

交叉連接(cross join)

內聯結(inner join) 執行原理:首先執行cross join(進行笛卡兒積產生笛卡爾集)使用on中的條件進行過濾(等值連接)

外聯結:

   左外聯結: (left join)

   右外聯結: (right join)

Left (right) join執行原理: 首先執行inner join,把表中都有的數據過濾出來,兩個表中沒有匹配到的數據看保留字 如果是left,則把左表中沒有匹配到的數據放入結果集中,否則相反(沒有匹配上的欄位的值以null值進行填充)

  

select * from t_student t0, t_class t1 where t0.ClassId = t1.ClassId;(等同於inner join)

等值連接丟數據

資料庫進階

資料庫設計(Database Design)

Designer: 設計者

資料庫設計,根據用戶需求 在某一具體的資料庫管理系統上,設計資料庫的結構和建立資料庫的過程

良好的設計可以(節省數據的存儲空間,能保證數據的完整性,方便進行資料庫應用系統的開發)

糟糕的資料庫設計(數據冗餘、存儲空間浪費, 記憶體空間的浪費, 數據更新和插入的異常)

設計基本步驟:

用戶需求已經明確

(建模 模型轉換 規範化(三大範式))(實體 Entity)

  1. 收集信息
  2. 標識對象
  3. 標識每個實體的屬性
  4. 標識對象之間的關係(Relationship)
  5. 繪製E-R圖(實體關係圖)
  6. 將E-R圖轉化成表(將各實體轉換為對應的表,各屬性轉化為各表的對應列, 標識每個表的主鍵列, 表之間建立主外鍵)
  7. 數據規範化(範式是具有最小冗餘的表結構)

範式(

第一範式: 確保每列的原子性(最小的原子單元)(行與列的交叉點不能存在一組值)

第二範式: 滿足第一範式並除主鍵列都依賴於主鍵(每個表只描述一件事)(複合主鍵: 不能存在部分依賴關係(與每個主鍵都有依賴關係))

第三範式:滿足第二範式並處主鍵以外的其他列都不傳遞依賴於主鍵列

)(計算列屬於冗餘列 但是查詢性能會提升的話允許保留性能比規範化更重要))

(溝通 語言表達(少說 多看 多聽) 邏輯 條理(停5秒 分點))

(工程實例)

 

 

第二章

批處理: 效率高(嚴格區分大小寫)(末尾加go(批處理的標誌))(業務相關的語句放在同一個批處理中)

變數:變數是可以在程式運行期間變化的程式元素; 變數在任何程式中充當存儲信息的存儲器,保存在記憶體中; 程式運行時,為了完成演算法,某些變數會發生變化; 變數都有自己所屬的數據類型

局部變數:用戶定義的(只能在同一批處理中使用(局部變數不能跨越批處理))

全局變數:只讀的(系統維護和控制賦值)

set 一次只能為一個變數賦值

select 一次可以為多個變數賦值, 可以通過查詢語句 批量賦值

convert 數據類型轉換函數(目標類型, 要轉換的變數)

局部變數需要初始化後使用, 否則值為null, 會導致後續結果為空

通過查詢語句為變數賦值,必須保證查詢結果返回一條記錄,否則獲取的是最後一條記錄

select @a = a, @b = b from Table_A

@@ERROR             最後一個T-SQL語句的錯誤號

@@IDENTITY             最後一次插入的標識值

@@ROWCOUNT        受上一個SQL語句影響的行數

@@FETCH_STATUS    返回針對連接當前打開的任何游標發出的上一條游標 FETCH 語句的狀態

標量:一對一

 

子查詢

法一:採用T-SQL變數實現

declare @avgMoney money;

select avg(TotalMoney) from dbo.Tme_OrderInfo;

select * from dob.Tme_OrderInfo where totalMoney > @avgMoney;

法二:採用子查詢

select * from dbo.Tme_OrderInfo where totalMoney > (select avg(TotalMoney) from dbo.Tme_OrderInfo)(子查詢與判斷符號一起用時必須保證查詢結果只能有一個)

in 表示在列表中存在

exists 存在檢測(檢測是否存在)(返回值為true 或 false)

相關子查詢:依賴於外部查詢,不能獨立調用;相關子查詢效率低

在邏輯上,獨立要先執行一次 只執行一次; 相關要在外部行執行的時候單獨計算一次

什麼時候用相關子查詢:和自己比較的時候

exists 子查詢

if exists (select * from sys.sysobjects where name = ‘test’) drop table test;

go

派生表

把子查詢當表來用

第五章

索引:常規的未作索引的表中的行不會以特定的順序存儲,無序狀態的表被稱為堆(不用查詢每行數據,有效的提高查詢性能)

索引包含從表或視圖中一個或多個列生成的鍵,映射到指定數據的存儲位置的指針

鍵存儲在一個 B樹 (balance tree)中 快速有效的查找鍵值關聯的行

只會對索引行加鎖, 提高併發檢索速度

聚集索引:表中各行的物理順序和鍵值的邏輯(索引)順序相同(每個表只能有一個)(不允許空值)(選用以範圍查詢的列)(頻繁更新的列和非唯一的列通常不選用聚集索引)(避免非常多或非常寬的鍵上創建聚集索引)(create table 和 alter table 創建主鍵會預設創建聚集索引)

非聚集索引:除聚集索引的索引 可以有多個 但要小於249個()(指針指向位於索引頁中指針對應的物理數據)(頁級別上不包含全部數據)

唯一索引:允許空值: 只能有一個(不允許兩行具有相同的索引值)(實施實體完整性)(在創建主鍵約束和唯一性約束時自動創建)

非聚集索引創建原則:索引不是越多越好 (當選擇用在非聚集索引的列時,要查找在where join order by 子句中頻繁引用的那些列)(一個索引最多可以使用16個列 所有索引鍵列組合起來不超過900位元組)

經常插入操作的表上, 使用Fillfactor(填充因數)建索引減少頁拆分

unique 唯一索引

clustered 聚集索引

nonclustered 非聚集索引

ix_ 代指索引

多列用 , 分隔 desc 降序 不加為升序

fillfactor = 填充因數 (百分比)

split(拆分)

視圖

(封裝)放在from子句中(可以當作表來用)

視圖的作用:

1,可以篩選表中的行

2,防止未經許可的用戶訪問敏感數據

3,降低資料庫的複雜度

4,將多個物理資料庫抽象為一個邏輯資料庫

create view (name) as (select語句) go

 

Exec sp_helptext ‘視圖名稱’;

encryption(加密)

可更新視圖

insert update delete 等操作只能引用一個表中的列, 不允許直接修改基礎表 只允許修改視圖

可更新視圖中不能包含聚合函數, select語句中不能使用group by 或 having子句, insert update delete 語句更新 發生變化的數據只能來自一個表, 必須包含基表的必填列, 視圖不滿足以上條件 可以只用 instead of觸發器更新

第七章 事務

--創建銀行信息表

if object_id('Account') is not null drop table Account;

go

 create table Account

(

   AccountId char(4) primary key,

Name varchar(20) not null,

   Balance decimal(18, 2) not null

);

go

alter table Account add constraint CK_Account_Balance check (Balance >= 2);

insert into Account values

 ('0001', 'zhangsan', 2),

('0002', 'zhangsi', 20000);

select * from Account;

begin transaction

   begin try

       update Account set Balance = Balance + 20000 where AccountId = '0001';

       update Account set Balance = Balance - 20000 where AccountId = '0002';

       commit transaction;

   end try

   begin catch

       rollback transaction

   end catch

每條查詢語句自成一個事務(transaction)

事務是作為單個邏輯工作單元執行的一系列操作, 是一個不可分割的工作邏輯單元

事務的屬性:

原子性(Atomicity)必須是原子工作單元 不可分

一致性(Consistency)事務完成時, 數據處於一致狀態

隔離性(Isolation)併發的事務時彼此隔離的 互不影響

永久性(Durability)事務完成就永久保存

begin transaction 開始事務

commit transaction 提交事務

rollback transaction 回滾事務

save tran 創建事務保存點(rollback把事務保存點之後的操作回滾 (回到事務保存點))

自動提交事務: 每條單獨的T-SQL語句作為一個事務成功自動提交 錯誤自動回滾

顯示事務: Begin transaction 指定事務的開始

隱性事務:set implicit transactions on 語句

事務的嵌套(父事務, 子事務)父事務回滾的時候以提交的子事務也會回滾

鎖 是事務獲取的一種控制資源 (保護數據資源, 防止其他食物對數據進行衝突或不相容的訪問)

數據併發訪問時怎麼保證數據的安全性

排它鎖:修改數據時 事務會為所依賴的數據資源請求排它鎖, 一旦授予, 事務將一直持有排它鎖, 直至事務完成

共用鎖:讀取數據時, 事務預設會為所依賴的數據資源請求共用鎖, 讀操作一完成,就立即釋放資源上的共用鎖(不是長期獨有占用)(表後邊加with (xlock))

存儲過程的概念和分類

存儲過程是一組預先編譯好的T-SQL代碼, 作為一個整體用於執行特定的操作, 存儲過程屬於資料庫對象,它們存放在資料庫中, 需要時用戶可以調用, 存儲過程首次執行的時候, Sql Server創建執行計劃並把它存儲在計劃記憶體緩存中,然後Sql Server就能對存儲過程的後續執行重用計劃, 合同沒有編譯且沒有準備好的等價即查詢相比,重用計劃使得存儲過程提供了更快速更可靠的性能

存儲過程是資料庫對象

存儲過程可以包含數據操作語句,變數,邏輯控制語句等

存儲過程的優點:執行速度快,允許模塊化程式設計,提高系統安全性,減少網路流通量

系統存儲過程 (常用的:sp_databases, sp_tables, sp_columns, sp_help, sp_helpconstraint, sp_helpindex, sp_helptext)

用戶自定義存儲過程

有預設值就必須都有預設值 沒有就都沒有

row_number 生成連續遞增行號

游標和觸發器

使用的五個步驟

聲明游標(declare cursor for),打開游標(open),提取數據(迴圈),關閉游標(colse),釋放游標(deallocate)

insensitive(使用游標時,對源表數據的更新不敏感,並且不允許通過游標修改源表數據)

scroll 設置fetch語句中參數first(上一條),last,prior,next,relative,absolute

read only 只讀

update 定義可通過游標更新的列

fetch into select列的數據和變數列表數據一致

@@fetch_status全局變數 等於 0 是表示成功讀取到數據行了

游標預設指向第一條記錄之前

游標是逐條處理的工具

 

動態SQL EXEC(‘語句’)

觸發器(跨表的check)(一種特殊的存儲過程)(強制的約束)

完成複雜的數據約束,檢查所做的sql操作是否允許,修改其它數據表裡的數據,調用更多的存儲過程,返回自定義的錯誤信息,更改原本要操作的sql語句,防止數據表結構被更改或數據表被刪除

優點:自動的,層疊更改,強制限制,可以用於跟蹤

dml觸發器, ddl觸發器, 登錄觸發器

dml觸發器:表或表的視圖上執行可以觸發,觸發器和觸發的語句在觸發器內單個事務對待,檢測到的錯誤,自動回滾

after觸發器:記錄已經更改完之後觸發,檢測到錯誤,可以回滾本次操作

instead of:取代原本要進行的操作

create trigger(創建觸發器)

許可權預設為資料庫所有者,不得轉讓,嚴重減慢數據修改操作的性能,不能對系統表和臨時表創建,不記錄日誌的更新不會引起dml觸發器的觸發

encryption 加密(for | after 都代表after觸發器)

inserted表(存儲著insert操作插入的行和update操作的新行) deleted表(村粗這update操作的舊行和delete操作刪除的行)(兩個邏輯表,有系統來維護,不允許用戶直接修改)

第十章 函數

函數是用於封裝頻繁執行的邏輯的常式

存儲過程只能用exec調用 不能放from後邊當表來用(可以有返回值,僅限於整形)

任何必須執行的代碼都可調用函數

函數是由一條或多條T-SQL語句組成的常式,可用於封裝代碼以便進行復用。函數接受零個或多個輸入參數,並返回標量值或表,函數不支持輸出參數

函數可以返回標量值,可以返回表

udf 用戶定義函數(標量函數((用於將當前的值轉換為新值,根據參數進行複雜的查找)返回單個數據值,類型在returns子句中定義),

內聯表值函數(返回一個表,單個select語句的結果),

多語句表值函數(由一條或多條T-SQL語句構建的表(和存儲過程不同,多語句表值函數可以在select語句的from子句中進行引用)))

create function (函數名) returns(返回值類型)(子句)begin return (函數體) end

內聯表值函數:通常使用視圖的任何地方使用內聯表值函數(內聯用戶定義函數)

create function ruturns + 變數名(未來返回的表) + table(類型) + (表結構 類型欄位的定義) + begin return(後邊什麼也不加) end

內聯表值函數 可以有邏輯結構

聚合函數一般出現在select子句或having子句中

Sql 知識點

1. 數據完整性的實現方式

2. 常用系統存儲過程和系統變數的作用

3. 區分批量插入數據的兩種語句

4. 掌握單條select語句的執行過程和書寫順序

5. 分組 分組後的篩選 排序的應用

6. 子查詢的應用

7. 事務的定義 特性,類型,事務相關操作所使用的語句

8. 存儲過程的概念 優點 將複雜操作封裝到存儲過程中

9. 觸發器工作原理

10  三大範式的規範定義

11. 視圖的概念 優點 視圖的應用

12. 游標的概念,利用游標解決實際問題

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如上代碼,想要在點擊button提交跳轉到updateproduct.do.php的同時,將本頁獲取的$p_id,通過url值傳到下個頁面里。可是每次點擊button後 地址欄里都只有 “ updateproduct.do.php?p_name=11&p_price=22&p_pic=33&p_da ...
  • 具體代碼如下: ...
  • 1、連字元字元串轉駝峰——方法1 var a = "first-second-third"; function test(str){ var arr = str.split('-'); for (var i = 1; i < arr.length; i++){ arr[i] = arr[i].cha ...
  • 一,base.css基礎樣式表的意義 我昨天,整理了一下代碼規範。 發現現在這個程度的頁面還原。有必要創建一個規範的base.css庫和framework.css庫 而且也要為日後的工作整理一些常用的基礎css,你們想象一下日後在公司里上班,如果每次都要逐一新增基礎樣式,那麼花費的時間就會滴水長流。 ...
  • 什麼是DOM? HTMLDOM將HTML文檔視作樹結構,被稱為"節點樹" 作用:可通過 JavaScript (以及其他編程語言)對 HTML DOM 進行訪問 ———————————————————————————————————————————— DOM對象方法 具體方法見手冊 getEleme ...
  • 我網上查了很多方法,說是用戶名或者密碼錯誤,但是我通過命令行和Navicat都能直接連接MySQL,但是通過nodejs就是連接不上,命令行中報了標題的那個錯誤,我也問了很多人,也都不是很清楚。 後來我想其他方法都能連接成功,僅僅是nodejs連接不上,是不是nodejs連接還需額外的配置,看了no ...
  • 本文章由尚學堂旗下雲數學院周老師做內容指導,薛同學編輯,如需轉載,請標明出處。 QQ技術交流群:299142667 前言 使用man grep查看grep的幫助文檔,有如下內容: 可以看出,正則表達式由三類,分別是 基本的正則表達式(Basic Regular Expression 又叫 Basic ...
  • 生成AWR報告需要dbms_workload_repository包的許可權。一、以oracle用戶登錄到資料庫伺服器二、進入SQLPLUS三、執行腳本@?/rdbms/admin/awrrpt.sql四、設定生成報告的格式說明:不用輸入,預設即可,直接按Enter五、設定報告時間段的天數說明:只導當... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...