【MySQL自學】SQL主鍵使用誤區:你必須知道的關鍵細節

在日常數據庫操作中,主鍵(Primary Key)是我們最常打交道的概念之一。然而,許多開發者,尤其是初學者,常常對其存在一些誤解。一個非常經典的問題是:“在SQL中,只要用到主鍵,是不是就必須關聯兩個表?”

今天,我們就來徹底厘清這個問題,并盤點幾個關于主鍵和其他SQL關鍵字的易錯點,助你寫出更高效、更準確的SQL語句。

核心誤區:主鍵 ≠ 必須聯表
主鍵的核心作用是唯一地標識表中的每一行記錄。正是這種唯一性,使得它在各種單表操作中不可或缺。

單表操作:主鍵的主戰場

想象一下Users表,它的主鍵是UserID。以下所有操作都只用了這一個表:

  1. 精準查詢(SELECT)
    -- 查找ID為1001的用戶信息,僅涉及Users一個表
    SELECT * FROM Users WHERE UserID = 1001;
    
    這里UserID作為主鍵確保了查詢結果最多只有一條記錄,速度極快。
  2. 精準更新(UPDATE)
    -- 更新指定用戶的信息,目標明確,不會誤傷其他數據
    UPDATE Users SET Email = 'new@email.com' WHERE UserID = 1001;
    
    易錯點: 忘記加WHERE UserID = …會導致全表更新,這是災難性的。任何時候進行UPDATE或DELETE操作,都要先確認WHERE條件是否準確。
  3. 精準刪除(DELETE)
    -- 刪除指定用戶
    DELETE FROM Users WHERE UserID = 1001;
    
    同樣的,忘記WHERE子句會清空整個表。
  4. 插入數據(INSERT)
    -- 插入新數據,主鍵值必須唯一或不提供(依賴自增)
    INSERT INTO Users (UserID, Name) VALUES (1002, 'Alice');
    

可以看到,主鍵在單表操作中扮演著“精確坐標”的角色,保證了操作的準確性和效率。

多表操作:主鍵的另一個舞臺

只有當主鍵扮演外鍵(Foreign Key) 的引用目標時,才需要聯表操作。這是為了查詢分散在不同表中的關聯數據。

· 場景: 查詢用戶及其所有訂單。
· 表結構:
· Users表 (主鍵: UserID)
· Orders表 (包含外鍵: UserID, 引用了Users.UserID)

-- 通過JOIN關聯兩個表
SELECT u.Name, o.OrderID, o.Amount
FROM Users u
INNER JOIN Orders o ON u.UserID = o.UserID -- 核心:主鍵連接外鍵
WHERE u.UserID = 1001;-- 或通過子查詢實現
SELECT * FROM Orders
WHERE UserID IN (SELECT UserID FROM Users WHERE Name = 'Alice');

在這種情況下,主鍵Users.UserID是連接兩個表的“橋梁”,但查詢的起點和終點仍然是單個表的需求。


其他SQL易錯點盤點

除了主鍵的使用,下面這些坑也值得你警惕:

  1. JOIN 與 WHERE 的混淆

在過濾關聯表的條件時,初學者容易把條件全都寫在WHERE子句中。

錯誤示范:

SELECT u.Name, o.OrderDate
FROM Users u, Orders o
WHERE u.UserID = o.UserID -- 這是連接條件
AND o.Amount > 1000      -- 這是過濾條件
AND u.Country = 'US';    -- 這也是過濾條件

這種古老的隱式連接語法將連接條件和過濾條件混在一起,可讀性差且容易出錯。

正確做法(顯式連接):

SELECT u.Name, o.OrderDate
FROM Users u
INNER JOIN Orders o ON u.UserID = o.UserID -- 連接條件清晰寫在ON里
WHERE o.Amount > 1000 -- 過濾條件寫在WHERE里
AND u.Country = 'US';

結論: 始終使用JOIN … ON …進行顯式連接,讓代碼更清晰。

  1. NULL值判斷

這是一個極其常見的陷阱!在SQL中,NULL表示“未知”或“不存在”,它不能通過普通的比較運算符(如=、<>)來判斷。

錯誤示范:

SELECT * FROM Users WHERE PhoneNumber = NULL; -- 這永遠不會返回結果!
SELECT * FROM Users WHERE PhoneNumber <> NULL; -- 這也永遠不會返回結果!

正確做法: 必須使用IS NULL或IS NOT NULL。

SELECT * FROM Users WHERE PhoneNumber IS NULL;
SELECT * FROM Users WHERE PhoneNumber IS NOT NULL;
  1. GROUP BY 的陷阱

當你使用GROUP BY時,SELECT子句中只能出現兩種字段:

  1. 被分組的字段。
  2. 聚合函數(如SUM(), COUNT(), AVG())包裹的字段。

錯誤示范:

-- 假設一個用戶有多條訂單記錄
SELECT UserID, Name, SUM(Amount) -- Name 既不在GROUP BY里,也不是聚合函數
FROM Orders
GROUP BY UserID;                 -- 只按UserID分組

在某些寬松模式的數據庫(如MySQL)中,這可能會執行,但返回的Name值是隨機的,并非你想要的結果。

正確做法:

SELECT UserID, MAX(Name) AS Name, -- 使用聚合函數,但邏輯上可能不對SUM(Amount) AS TotalAmount
FROM Orders
GROUP BY UserID;-- 更合理的做法是先關聯用戶表,或者根據需要查詢
SELECT o.UserID, u.Name,           -- 因為UserID分組后對應唯一的Name,所以可以查詢SUM(o.Amount) AS TotalAmount
FROM Orders o
INNER JOIN Users u ON o.UserID = u.UserID
GROUP BY o.UserID, u.Name; -- 將Name也加入到GROUP BY中
  1. COUNT(*) 與 COUNT(column) 的區別

· COUNT(*):統計所有行的數量,包括所有NULL行。
· COUNT(column_name):統計指定列中非NULL值的數量。

SELECTCOUNT(*) AS TotalRows,      -- 返回表的總行數COUNT(PhoneNumber) AS PhoneCount -- 返回有手機號的用戶數量
FROM Users;

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

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

相關文章

Electron 執行python腳本

1 需求背景 有個需求需要Electron執行在本地執行python腳本。希望通過Electron調用python服務并且實現雙向通信。 2 解決思路 使用Electon 的{ exec, spawn, execFile, fork } from "child_process"; 能力來執行python腳本&#xff0c;使用spawn可以實現持續交互&…

Leetcode高頻 SQL 50 題(基礎版)題目記錄

Leetcode sql題目記錄 文章目錄Leetcode sql題目記錄570. 至少有5名直接下屬的經理1934. 確認率1193. 每月交易I1174. 即時食物配送II176. 第二高的薪水&#xff08;1&#xff09; 子查詢為空但外層用了聚合函數&#xff08;2&#xff09;子查詢為空而外層沒有聚合函數550. 游戲…

RAGFlow切分方法詳解

RAGFlow 各切分方法的含義如下,結合文檔結構、場景特點等設計,以適配不同類型的知識源: 1. General(通用分塊) 邏輯:結合文本排版、格式、語義關聯等因素確定分割點,再根據“建議文本塊大小(Token 數)”,將文本切分為合適的塊。 支持格式:DOCX、EXCEL、PPT、IMAGE、…

支付域——支付與交易概念

摘要本文詳細闡述了支付域中支付與交易的核心概念及其相互關系。交易是商品或服務交換的過程&#xff0c;包含多個要素并產生訂單或合同。支付則是資金流轉的過程&#xff0c;是交易的資金結算環節。支付交易結合了兩者&#xff0c;根據不同場景提供多樣化的支付產品和服務。文…

(自用)cmd常用命令自查文檔

&#xff08;自用&#xff09;cmd常用命令自查文檔 Windows CMD 常用命令自查1. 文件與目錄操作命令說明示例?cd?顯示或切換目錄?cd?&#xff1b;cd C:\Windows??dir?列出目錄內容?dir?&#xff1b;dir /a?(含隱藏文件)?md?或mkdir?創建目錄?md test?&#xff1…

劇本殺APP系統開發:引領娛樂行業新潮流的科技力量

在當今數字化時代&#xff0c;科技的力量正深刻地改變著人們的生活方式和娛樂習慣。娛樂行業也不例外&#xff0c;各種新興的娛樂形式和平臺如雨后春筍般涌現。劇本殺APP系統開發作為科技與娛樂融合的產物&#xff0c;正以其獨特的魅力和創新的模式&#xff0c;引領著娛樂行業的…

LangChain框架深度解析:定位、架構、設計邏輯與優化方向

LangChain框架深度解析&#xff1a;定位、架構、設計邏輯與優化方向 引言 在大語言模型&#xff08;LLM&#xff09;應用開發的浪潮中&#xff0c;LangChain作為最具影響力的開發框架之一&#xff0c;為開發者提供了構建復雜AI應用的完整工具鏈。本文將從框架定位、實現邏輯、設…

面試常備與開發必知:一文掌握MySQL字符串拼接的所有核心技巧

? 在 MySQL 中拼接字符串是一個非常常見的操作&#xff0c;主要用于查詢時動態組合多個字段或值。以下是幾種最核心和常用的方法。一、核心拼接函數1. CONCAT(str1, str2, ...)這是最通用、最常用的字符串拼接函數。它接受兩個或多個字符串參數&#xff0c;并將它們按順…

數據可視化大屏精選開源項目

為您精心挑選和整理了一系列在 GitHub 上廣受好評的數據可視化大屏開源項目。這些項目覆蓋了不同的技術棧&#xff08;Vue、React、ECharts、D3.js等&#xff09;&#xff0c;適合從初學者到資深開發者不同層次的需求。 我將它們分為以下幾類&#xff0c;方便您選擇&#xff1…

LeetCode 3516.找到最近的人:計算絕對值大小

【LetMeFly】3516.找到最近的人&#xff1a;計算絕對值大小 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/find-closest-person/ 給你三個整數 x、y 和 z&#xff0c;表示數軸上三個人的位置&#xff1a; x 是第 1 個人的位置。y 是第 2 個人的位置。z 是第 3 個人…

【面試】MySQL 面試常見優化問題

1. 為什么要建索引&#xff1f;索引一定能提高性能嗎&#xff1f;場景&#xff1a;一個表有上千萬數據&#xff0c;查詢 SELECT * FROM user WHERE age25;。問題&#xff1a;沒有索引時會全表掃描&#xff0c;性能差。解決方案&#xff1a;給 age 建立普通索引&#xff0c;加快…

Access開發導出PDF的N種姿勢,你get了嗎?

目錄 基礎篇&#xff1a;一行代碼搞定 實戰篇&#xff1a;讓導出更智能 進階篇&#xff1a;用戶體驗升級 總結 hi&#xff0c;大家好呀&#xff01; 今天我們來聊聊一個非常實用的功能——如何用VBA將Access中的數據導出為PDF。 相信很多朋友在日常工作中都遇到過這樣的需…

JavaAI炫技賽:電商系統商品管理模塊的創新設計與實踐探索

一、引言電商行業的競爭日益激烈&#xff0c;電商系統商品管理模塊的高效性、智能化程度成為企業提升競爭力的關鍵因素。Java 作為企業級開發的主流語言&#xff0c;憑借其穩定性和強大的生態系統&#xff0c;在電商系統開發中占據重要地位。而 AI 技術的融入&#xff0c;為商品…

關于如何在PostgreSQL中調整數據庫參數和配置的綜合指南

關于如何在PostgreSQL中調整數據庫參數和配置的綜合指南 PostgreSQL是一個非常通用的數據庫系統,能夠在低資源環境和與各種其他應用程序共享的環境中高效運行。為了確保它將在許多不同的環境中正常運行,默認配置非常保守,不太適合高性能生產數據庫。加上地理空間數據庫具有…

wps的excel如何轉為谷歌在線表格

1.?打開 Google Sheets&#xff08;sheets.google.com&#xff09;。 2.?新建一個空白表格。3.?點擊菜單 文件 → 導入 (File → Import)。4.?選擇在 WPS 保存好的 .xlsx 文件上傳。5.?選擇 “新建表格” 或 “替換當前表格”&#xff0c;就能直接在 Google Sheets 使用注…

貓頭虎AI 薦研|騰訊開源長篇敘事音頻生成模型 AudioStory:統一模型,讓 AI 會講故事

&#x1f42f;貓頭虎薦研&#xff5c;騰訊開源長篇敘事音頻生成模型 AudioStory&#xff1a;統一模型&#xff0c;讓 AI 會講故事 大家好&#xff0c;我是貓頭虎 &#x1f42f;&#x1f989;&#xff0c;又來給大家推薦新鮮出爐的 AI 開源項目&#xff01; 這次要聊的是騰訊 A…

收藏!VSCode 開發者工具快捷鍵大全

一、文件操作快捷鍵1. 打開與關閉文件Ctrl O&#xff08;Windows/Linux&#xff09;或 Command O&#xff08;Mac&#xff09;&#xff1a;打開文件&#xff0c;可以通過輸入文件名快速查找并打開相應文件。Ctrl W&#xff08;Windows/Linux&#xff09;或 Command W&#…

Simulations RL 平臺學習筆記

1. 選擇標準 1.1 開源項目&#xff0c;&#x1f31f;star數量越多越好 2. 常見平臺 2.1 &#x1f31f;18.6k ML-Agents&#xff1a;基于Unity實現 2.2 &#x1f31f;1.2k Godot RL Agents

【國內電子數據取證廠商龍信科技】IOS 逆向脫殼

我們都知道&#xff0c;大多數的 APP 在開發的時候一般都會加上一層殼&#xff0c;例如 愛加密、梆梆、360、網易易盾等等。那 APK 的脫殼我們見得多了&#xff0c;那 IOS 逆向脫殼又是怎樣子的呢&#xff1f;首先咱們先了解一下為什么要砸殼&#xff0c;因為 IOS 開發者開發軟…

基于STM32單片機溫濕度PM2.5粉塵甲醛環境質量wifi手機APP監測系統

1 基于STM32單片機溫濕度PM2.5粉塵甲醛環境質量WiFi手機APP監測系統 本系統旨在實現對環境中溫度、濕度、PM2.5粉塵濃度以及甲醛濃度的實時監測&#xff0c;并通過WiFi技術將數據傳輸至手機APP端&#xff0c;實現移動化與可視化的環境質量檢測。系統在硬件上主要依賴STM32單片…