MySQL基礎全面解析

MySQL作為最流行的關系型數據庫管理系統之一,是每一位開發者必備的核心技能。本文將系統性地解析MySQL的基礎知識,結合關鍵概念與實戰應用,幫助您構建扎實的數據庫基礎。

1. SQL與NoSQL的本質區別

SQL(結構化查詢語言)數據庫與NoSQL(非僅SQL)數據庫代表了兩種不同的數據管理哲學。

??SQL數據庫??(如MySQL、PostgreSQL):

  • 基于表格結構,數據以行和列的形式存儲
  • 遵循預定義的模式(schema),結構嚴謹
  • 支持ACID事務(原子性、一致性、隔離性、持久性)
  • 使用SQL進行數據操作和查詢
  • 適合復雜查詢和高數據一致性的場景

??NoSQL數據庫??(如MongoDB、Redis):

  • 無固定模式,數據結構靈活
  • 可存儲文檔、鍵值對、寬列或圖形數據
  • 通常遵循BASE原則(基本可用、軟狀態、最終一致性)
  • 橫向擴展能力強,適合大規模數據存儲
  • 適合非結構化數據和快速迭代的場景

選擇依據:需要強一致性和復雜查詢選SQL;需要靈活性和大規模擴展選NoSQL。

2. 數據庫三大范式詳解

數據庫范式是設計關系型數據庫的指導原則,旨在減少數據冗余和提高數據一致性。

??第一范式(1NF)??:確保每列保持原子性,即每列都是不可再分的最小數據單元

-- 不符合1NF的設計(存儲多個電話號碼)
CREATE TABLE students (id INT PRIMARY KEY,name VARCHAR(50),phones VARCHAR(100) -- 存儲"13800138000,13900139000"
);-- 符合1NF的設計
CREATE TABLE students (id INT PRIMARY KEY,name VARCHAR(50)
);CREATE TABLE student_phones (id INT PRIMARY KEY,student_id INT,phone VARCHAR(15),FOREIGN KEY (student_id) REFERENCES students(id)
);

??第二范式(2NF)??:在滿足1NF基礎上,消除非主鍵列對主鍵的部分函數依賴

-- 不符合2NF的設計(訂單詳情表中產品價格依賴于產品ID而非訂單ID)
CREATE TABLE order_details (order_id INT,product_id INT,product_price DECIMAL(10,2), -- 依賴于product_id而非主鍵quantity INT,PRIMARY KEY (order_id, product_id)
);-- 符合2NF的設計
CREATE TABLE order_details (order_id INT,product_id INT,quantity INT,PRIMARY KEY (order_id, product_id)
);CREATE TABLE products (product_id INT PRIMARY KEY,price DECIMAL(10,2)
);

??第三范式(3NF)??:在滿足2NF基礎上,消除傳遞依賴,即非主鍵列之間不能有函數依賴

-- 不符合3NF的設計(學院電話依賴于學院,而學院依賴于學生ID)
CREATE TABLE students (student_id INT PRIMARY KEY,name VARCHAR(50),department VARCHAR(50),department_phone VARCHAR(15) -- 依賴于department,傳遞依賴于student_id
);-- 符合3NF的設計
CREATE TABLE students (student_id INT PRIMARY KEY,name VARCHAR(50),department_id INT,FOREIGN KEY (department_id) REFERENCES departments(department_id)
);CREATE TABLE departments (department_id INT PRIMARY KEY,name VARCHAR(50),phone VARCHAR(15)
);

實際應用中,有時為了性能會故意違反范式(反規范化),但需謹慎權衡。

3. MySQL連表查詢深度解析

連表查詢是SQL最強大的功能之一,允許從多個表中提取和組合數據。

3.1 INNER JOIN(內連接)

返回兩個表中匹配條件的行

SELECT orders.order_id, customers.name, orders.order_date
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;

3.2 LEFT JOIN(左連接)

返回左表所有行,即使右表中沒有匹配

SELECT customers.name, orders.order_id
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
WHERE orders.order_id IS NULL; -- 查找從未下過單的客戶

3.3 RIGHT JOIN(右連接)

返回右表所有行,即使左表中沒有匹配

SELECT products.name, order_details.quantity
FROM order_details
RIGHT JOIN products ON order_details.product_id = products.product_id;

3.4 FULL OUTER JOIN(全外連接)

MySQL不直接支持FULL OUTER JOIN,但可通過UNION實現

SELECT customers.name, orders.order_id
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
UNION
SELECT customers.name, orders.order_id
FROM customers
RIGHT JOIN orders ON customers.customer_id = orders.customer_id;

3.5 CROSS JOIN(交叉連接)

返回兩個表的笛卡爾積

SELECT sizes.size, colors.color
FROM sizes
CROSS JOIN colors;

4. 避免重復插入數據的多種策略

4.1 使用PRIMARY KEY或UNIQUE約束

CREATE TABLE users (email VARCHAR(100) PRIMARY KEY, -- 主鍵自動具有唯一性name VARCHAR(50) NOT NULL
);-- 或者使用UNIQUE約束
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,email VARCHAR(100) UNIQUE, -- 添加唯一約束name VARCHAR(50) NOT NULL
);

4.2 INSERT IGNORE

忽略重復鍵錯誤,但會忽略所有錯誤,需謹慎使用

INSERT IGNORE INTO users (email, name) VALUES ('test@example.com', 'Test User');

4.3 ON DUPLICATE KEY UPDATE

遇到重復時執行更新操作

INSERT INTO users (email, name) 
VALUES ('test@example.com', 'Test User')
ON DUPLICATE KEY UPDATE name = VALUES(name);

4.4 REPLACE INTO

先刪除重復行再插入新行(注意:這會刪除整行而不僅僅是更新指定字段)

REPLACE INTO users (email, name) VALUES ('test@example.com', 'New Test User');

5. 數據類型深度解析

5.1 CHAR與VARCHAR的區別

  • ??CHAR??:固定長度字符串,長度范圍為0-255字符

    • 適合存儲長度相對固定的數據(如MD5哈希、國家代碼)
    • 存儲時總會占用指定長度的空間,短字符串會用空格填充
    • 檢索速度通常比VARCHAR快
  • ??VARCHAR??:可變長度字符串,長度范圍為0-65,535字符

    • 適合存儲長度變化較大的數據
    • 僅占用實際數據長度+1或+2字節(長度前綴)的空間
    • 更新可能引起頁分裂,影響性能

選擇建議:長度基本固定的字段用CHAR,變化較大的用VARCHAR。

5.2 VARCHAR后面的數字代表什么?

VARCHAR(50)中的50表示??最大字符數??,而非字節數。在utf8mb4字符集下:

  • 每個字符最多占用4字節
  • 實際存儲空間 = 字符數 × 每個字符的字節數 + 長度前綴(1-2字節)

5.3 INT(1)和INT(10)的區別

括號中的數字是??顯示寬度??,僅影響某些客戶端顯示格式,不影響存儲大小或范圍。

  • 所有INT類型都占用4字節存儲空間
  • 范圍都是-2147483648到2147483647(有符號)或0到4294967295(無符號)
  • 使用ZEROFILL時,顯示寬度才有實際意義
CREATE TABLE test_int (num1 INT(1) ZEROFILL, -- 顯示為0001num2 INT(10) ZEROFILL -- 顯示為0000000001
);

5.4 TEXT數據類型的容量限制

TEXT類型不能"無限大",但有多種變體滿足不同需求:

  • TINYTEXT: 最大255字節(約255個字符)
  • TEXT: 最大65,535字節(約64KB)
  • MEDIUMTEXT: 最大16,777,215字節(約16MB)
  • LONGTEXT: 最大4,294,967,295字節(約4GB)

5.5 IP地址的存儲最佳實踐

??推薦方案??:使用INT UNSIGNED存儲IPv4地址

-- 存儲時轉換
INSERT INTO logs (ip_address) VALUES (INET_ATON('192.168.1.1'));-- 查詢時轉換回可讀格式
SELECT id, INET_NTOA(ip_address) as ip FROM logs;-- 對于IPv6,使用VARBINARY(16)
ALTER TABLE logs ADD ipv6_address VARBINARY(16);

6. 外鍵約束全面解析

外鍵用于維護表間引用完整性,確保數據一致性。

6.1 創建外鍵約束

CREATE TABLE orders (order_id INT PRIMARY KEY,customer_id INT,order_date DATE,FOREIGN KEY (customer_id) REFERENCES customers(customer_id)ON DELETE CASCADEON UPDATE CASCADE
);

6.2 外鍵操作選項

  • ??RESTRICT??(默認):阻止刪除或更新被引用的行
  • ??CASCADE??:級聯操作,主表刪除/更新時,從表相關行也刪除/更新
  • ??SET NULL??:主表刪除/更新時,從表外鍵字段設為NULL
  • ??NO ACTION??:與RESTRICT類似,但檢查時機略有不同

6.3 外鍵的優缺點

??優點??:

  • 保證數據完整性和一致性
  • 防止誤刪重要數據
  • 明確表間關系,提高可讀性

??缺點??:

  • 增加性能開銷(每次修改都需要檢查外鍵約束)
  • 可能導致死鎖問題
  • 使分庫分表更復雜

7. IN與EXISTS關鍵字的深度對比

7.1 IN運算符

SELECT * FROM employees 
WHERE department_id IN (SELECT department_id FROM departments WHERE location = 'NY');
  • 先執行子查詢,將結果集物化
  • 然后執行主查詢,檢查值是否在物化結果集中
  • 適合子查詢結果集較小的情況

7.2 EXISTS運算符

SELECT * FROM employees e
WHERE EXISTS (SELECT 1 FROM departments d WHERE d.department_id = e.department_id AND d.location = 'NY'
);
  • 對外部查詢的每一行執行子查詢
  • 子查詢使用關聯條件,通常可利用索引
  • 適合外部查詢結果集較小或子查詢能夠有效利用索引的情況

7.3 性能對比建議

  • 當子查詢結果集小且外部查詢大時,使用IN
  • 當外部查詢結果集小且子查詢可有效利用索引時,使用EXISTS
  • 在可能的情況下,盡量使用JOIN代替IN或EXISTS

8. MySQL常用函數大全

8.1 字符串函數

-- 連接字符串
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;-- 字符串截取
SELECT SUBSTRING('MySQL', 3, 3); -- 結果: 'SQL'-- 字符串替換
SELECT REPLACE('Hello World', 'World', 'MySQL'); -- 結果: 'Hello MySQL'-- 大小寫轉換
SELECT LOWER('MySQL'), UPPER('mysql');-- 去除空格
SELECT TRIM('  MySQL  '), LTRIM('  MySQL'), RTRIM('MySQL  ');

8.2 數值函數

-- 四舍五入
SELECT ROUND(123.4567, 2); -- 結果: 123.46-- 向上取整/向下取整
SELECT CEIL(123.4), FLOOR(123.8); -- 結果: 124, 123-- 絕對值
SELECT ABS(-123); -- 結果: 123-- 隨機數
SELECT RAND(); -- 生成0-1之間的隨機浮點數

8.3 日期時間函數

-- 當前日期時間
SELECT NOW(), CURDATE(), CURTIME();-- 日期加減
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY); -- 7天后
SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH); -- 1個月前-- 日期格式化
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); -- 2023-01-01 12:34:56-- 日期提取
SELECT YEAR(NOW()), MONTH(NOW()), DAY(NOW());

8.4 聚合函數

SELECT COUNT(*) AS total_rows,AVG(salary) AS average_salary,MAX(salary) AS max_salary,MIN(salary) AS min_salary,SUM(salary) AS total_salary
FROM employees;

9. SQL查詢語句執行順序詳解

理解SQL執行順序是編寫高效查詢的關鍵:

  1. ??FROM?? 和 JOIN:確定數據來源,執行表連接
  2. ??WHERE??:過濾不符合條件的行
  3. ??GROUP BY??:按指定列分組
  4. ??HAVING??:過濾分組后的結果
  5. ??SELECT??:選擇要返回的列
  6. ??DISTINCT??:去除重復行
  7. ??ORDER BY??:排序結果集
  8. ??LIMIT??/OFFSET:限制返回行數
-- 示例查詢及其執行順序
SELECT DISTINCT department, AVG(salary) as avg_salary
FROM employees
WHERE hire_date > '2020-01-01'
GROUP BY department
HAVING AVG(salary) > 50000
ORDER BY avg_salary DESC
LIMIT 10;

10. 實戰SQL題目解析

10.1 題目一:不存在01課程但存在02課程的學生的成績

SELECT sc.stuid, sc.subject_id, sc.score
FROM studentscore sc
WHERE sc.stuid IN (SELECT stuid FROM studentscore WHERE subject_id = '02'
) AND sc.stuid NOT IN (SELECT stuid FROM studentscore WHERE subject_id = '01'
);

10.2 題目二:查詢總分排名5-10名的學生

SELECT stuid, SUM(score) as total_score
FROM studentscore
GROUP BY stuid
ORDER BY total_score DESC
LIMIT 4, 6; -- 從第5名開始,取6條記錄(5-10名)

10.3 題目三:查詢班級選課情況

SELECT s.student_id, s.name, GROUP_CONCAT(DISTINCT c.course_name ORDER BY c.course_name SEPARATOR ', ') as courses
FROM students s
LEFT JOIN student_courses sc ON s.student_id = sc.student_id
LEFT JOIN courses c ON sc.course_id = c.course_id
WHERE s.class_id = '特定班級ID'
GROUP BY s.student_id, s.name;

11. 用MySQL實現可重入鎖

11.1 創建鎖表

CREATE TABLE system_locks (lock_name VARCHAR(100) PRIMARY KEY,lock_owner VARCHAR(100) NOT NULL,lock_count INT DEFAULT 0,acquired_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB;

11.2 獲取鎖存儲過程

DELIMITER $$CREATE PROCEDURE acquire_lock(IN p_lock_name VARCHAR(100),IN p_owner VARCHAR(100),IN p_timeout INT
)
BEGINDECLARE v_start_time INT DEFAULT UNIX_TIMESTAMP();DECLARE v_acquired BOOLEAN DEFAULT FALSE;DECLARE v_lock_count INT;WHILE NOT v_acquired AND UNIX_TIMESTAMP() - v_start_time < p_timeout DO-- 檢查鎖是否已被當前所有者持有SELECT lock_count INTO v_lock_count FROM system_locks WHERE lock_name = p_lock_name AND lock_owner = p_owner;IF v_lock_count IS NOT NULL THEN-- 重入鎖:增加計數UPDATE system_locks SET lock_count = lock_count + 1, updated_at = CURRENT_TIMESTAMPWHERE lock_name = p_lock_name AND lock_owner = p_owner;SET v_acquired = TRUE;ELSE-- 嘗試獲取新鎖BEGININSERT INTO system_locks (lock_name, lock_owner, lock_count)VALUES (p_lock_name, p_owner, 1);SET v_acquired = TRUE;EXCEPTIONWHEN 1062 THEN -- 唯一鍵沖突,鎖已被其他進程持有DO SLEEP(0.1); -- 短暫等待后重試END;END IF;END WHILE;SELECT v_acquired as lock_acquired;
END
$$DELIMITER ;

11.3 釋放鎖存儲過程

DELIMITER $$CREATE PROCEDURE release_lock(IN p_lock_name VARCHAR(100),IN p_owner VARCHAR(100)
)
BEGINDECLARE v_lock_count INT;START TRANSACTION;SELECT lock_count INTO v_lock_count FROM system_locks WHERE lock_name = p_lock_name AND lock_owner = p_ownerFOR UPDATE;IF v_lock_count IS NOT NULL THENIF v_lock_count > 1 THEN-- 減少重入計數UPDATE system_locks SET lock_count = lock_count - 1, updated_at = CURRENT_TIMESTAMPWHERE lock_name = p_lock_name AND lock_owner = p_owner;ELSE-- 完全釋放鎖DELETE FROM system_locks WHERE lock_name = p_lock_name AND lock_owner = p_owner;END IF;END IF;COMMIT;
END
$$DELIMITER ;

11.4 使用示例

-- 獲取鎖
CALL acquire_lock('order_processing', 'service_1', 10);-- 執行需要加鎖的操作...-- 釋放鎖
CALL release_lock('order_processing', 'service_1');

總結

MySQL基礎知識涵蓋了從數據類型選擇到復雜查詢優化的各個方面。掌握這些核心概念對于構建高效、可靠的數據庫應用至關重要。在實際開發中,應該:

  1. 根據業務需求合理選擇數據類型和表結構設計
  2. 理解SQL執行順序,編寫高效的查詢語句
  3. 合理使用索引和約束保證數據完整性和查詢性能
  4. 在復雜場景下考慮使用事務和鎖機制保證數據一致性

持續學習和實踐是掌握MySQL的關鍵,建議通過實際項目不斷深化對這些概念的理解和應用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98766.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98766.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98766.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

4、幽絡源微服務項目實戰:后端公共模塊創建與引入多租戶模塊

前言 上節我們將電網巡檢系統的前端vue2項目創建、配置&#xff0c;并構建了最基礎的多租戶界面&#xff0c;本節來繼續構建后端的公共模塊、多租戶模塊&#xff0c;并將公共模塊引入到多租戶模塊中。 創建公共模塊和多租戶模塊 在back父工程下創建兩個Module&#xff0c;和…

STM32學習路線開啟篇:芯片簡介與課程簡介

編寫不易,請多多指教,覺得不錯可以關注一下,相互學習 前言 一、課程配套資源 1、面包板 2、面包板專用的跳線 3、面包板的飛線 4、杜邦線 5、STM32F103C8T6最小系統板 6、0.96寸的OLED顯示屏模塊 7、電位器 8、按鈕 9、LED燈 10、STLINK 11、USB轉串口(TTL)模塊 12、源蜂鳴器模…

圖像直方圖

圖像直方圖就是用來統計圖像像素值分布的。灰度圖分布讀取灰度圖phone cv2.imread(phone.png, cv2.IMREAD_GRAYSCALE) a phone.ravel() plt.hist(a, bins256) plt.show()如何可以獲得當前像素值分布讀取各通道的像素值分布img cv2.imread(phone.png) colors (b, g, r) for …

分類別柱狀圖(Vue3)

效果圖&#xff1a;需求&#xff1a;男女年齡段占比<template><div class"go-ClassifyBar01"><v-chartref"vChartRef":option"option"style"width: 100%; height: 800px"></v-chart></div> </templa…

Apache Dubbo學習筆記-使用Dubbo發布、調用服務

Apache Dubbo經常作為一個RPC框架來使用&#xff0c;這篇文章主要介紹使用Dubbo配合注冊中心來發布和調用服務。 Apache Dubbo和Spring Boot、JDK的版本對應關系。 Dubbo 分支最新版本JDKSpring Boot組件版本詳細說明3.3.x (當前文檔)3.3.08, 17, 212.x、3.x詳情- 版本變更記錄…

Python學習——字典和文件

前面python的學習中我們已經學習了python的函數和列表元組相關的內容&#xff0c;接下來我們來學習剩下的python語法&#xff1a;字典和文件 相關代碼已經上傳到作者的個人gitee&#xff1a;樓田莉子/Python 學習喜歡請點個贊謝謝 目錄 字典 創建字典 查找key 新增/修改元素 …

swiper插件的使用

官方網址&#xff1a;https://www.swiper.com.cn/ 1、點擊導航欄&#xff0c;獲取Swiper里邊的下載Swiper 2、選擇要下載的版本【本次案例版本5.4.5】&#xff0c;然后解壓縮文件夾&#xff0c;拿到swiper.min.js和swiper.min.css文件&#xff0c;放到項目對應的css文件和js文…

Vue3+JS 組合式 API 實戰:從項目痛點到通用 Hook 封裝

Vue3 組合式 API 的實戰技巧 —— 組合式 API 幫我解決了不少 Options API 難以應對的問題&#xff0c;尤其是在代碼復用和復雜組件維護上。一、為什么放棄 Options API&#xff1f;聊聊三年項目里的真實痛點?剛接觸 Vue3 時&#xff0c;我曾因 “慣性” 繼續用 Options API 寫…

把 AI 塞進「電梯按鈕」——基于 64 kB 零樣本聲紋的離線故障預測按鈕

標簽&#xff1a;零樣本聲紋、電梯按鈕、離線 AI、TinyML、RISC-V、低功耗、GD32V303、故障預警 ---- 1. 背景&#xff1a;為什么按鈕要「聽聲音」&#xff1f; 全國 700 萬臺電梯&#xff0c;按鈕故障率 0.3 %/年&#xff0c;卻常出現&#xff1a; ? 機械卡滯、觸點氧化&…

清華大學聯合項目 論文解讀 | MoTo賦能雙臂機器人:實現零樣本移動操作

研究背景 移動操作是機器人領域的核心挑戰&#xff0c;它使機器人能夠在各種任務和動態日常環境中為人類提供幫助。傳統的移動操作方法由于缺乏大規模訓練&#xff0c;往往難以在不同任務和環境中實現泛化。而現有操作基礎模型雖在固定基座任務中表現出強泛化性&#xff0c;卻無…

go webrtc - 2 webrtc重要概念

webrtc是一套音視頻傳輸技術生態&#xff0c;不是一個協議或一個什么東西。3種模式本文基于 SFU 形式闡述&#xff01;重要概念&#xff1a;sfu 服務負責&#xff1a;信令 服務負責&#xff1a;peerConnection&#xff1a;track&#xff1a;房間&#xff1a;虛擬分組概念用戶&a…

“下游任務”概念詳解:從定義到應用場景

“下游任務”概念詳解&#xff1a;從定義到應用場景 一、什么是“下游任務”&#xff1f; 在機器學習&#xff08;尤其是深度學習&#xff09;中&#xff0c;“下游任務”&#xff08;Downstream Task&#xff09;是相對“上游過程”而言的目標任務——可以理解為&#xff1a;我…

視頻怎么做成 GIF?用 oCam 一鍵錄制 GIF 動畫超簡單

GIF 動圖因其生動直觀、無需點擊播放的特點&#xff0c;越來越受歡迎。你是否也曾看到一段有趣的視頻&#xff0c;想把它做成 GIF 發給朋友或用在PPT里&#xff1f;其實&#xff0c;將視頻片段轉換為 GIF 并不需要復雜的視頻剪輯技術&#xff0c;使用一款支持直接錄制為 GIF 的…

Vue.config.js中的Webpack配置、優化及多頁面應用開發

Vue.config.js中的Webpack配置、優化及多頁面應用開發 在Vue CLI 3項目中&#xff0c;vue.config.js文件是工程化配置的核心入口&#xff0c;它通過集成Webpack配置、優化策略和多頁面開發支持&#xff0c;為項目構建提供高度可定制化的解決方案。本文將從基礎配置、性能優化、…

行業學習【電商】:直播電商的去頭部化、矩陣號?

聲明&#xff1a;以下部分內容含AI生成這兩個詞是當前直播電商和MCN領域的核心戰略&#xff0c;理解了它們就理解了行業正在發生的深刻變化。一、如何理解“去頭部化”&#xff1f;“去頭部化” 指的是平臺或MCN機構有意識地減少對超頭部主播&#xff08;如曾經的李佳琦、薇婭&…

【MFC視圖和窗口基礎:文檔/視圖的“雙胞胎”魔法 + 單文檔程序】

大家好&#xff0c;我是你的MFC編程小伙伴&#xff01;學MFC就像探險古墓&#xff1a;到處是神秘的“房間”&#xff08;窗口&#xff09;和“寶藏”&#xff08;數據&#xff09;。今天咱們聊聊核心概念 – 視圖、窗口和文檔。這些是MFC的“骨架”&#xff0c;懂了它們&#x…

深度學習(六):代價函數的意義

在深度學習的浩瀚世界中&#xff0c;代價函數&#xff08;Cost Function&#xff09;&#xff0c;又稱損失函數&#xff08;Loss Function&#xff09;或目標函數&#xff08;Objective Function&#xff09;&#xff0c;扮演著至關重要的角色&#xff0c;它就像一個導航員&…

Kable使用指南:Android BLE開發的現代化解決方案

概述 Kable&#xff08;com.juul.kable:core&#xff09;是一個專為Android藍牙低功耗&#xff08;BLE&#xff09;開發設計的Kotlin協程友好庫。它通過提供簡潔的API和響應式編程模式&#xff0c;極大地簡化了BLE設備交互的復雜性。本文將詳細介紹Kable的使用方法&#xff0c;…

Android圖案解鎖繪制

使用到的庫是Pattern Locker,根據示例進行了修改,把默認樣式和自定義樣式進行了合并調整。 設置密碼 布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xm…

Kotlin 協程之 Flow 的理解使用及源碼解析

前言 在前面的文章中&#xff0c;我們已經討論了 Channel 的概念和基本使用以及 Channel 的高階應用。這篇我們來看日常開發中更常用的Flow。 “冷流” 和 “熱流” 的本質 先來梳理一下所謂的 “冷流” 和 “熱流”。 核心概念 我們已經知道 Channel 是 “熱流”&#xff…