在日常数据库操作中,主键(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单片…