当前位置: 首页 > article >正文

SQL 基础入门

SQL 基础入门

SQL(全称 Structured Query Language,结构化查询语言)是用于操作关系型数据库的标准语言,主要用于数据的查询、新增、修改和删除。本文面向初学者,介绍 SQL 的基础概念和核心操作。

1. 常见的 SQL 数据库

  • MySQL
  • PostgreSQL
  • Oracle
  • Microsoft SQL Server
  • SQLite

2. SQL 的基本组成

SQL 以语句为执行单位,每条语句以分号(;)结尾。按功能可分为以下几类:

  • DDL(数据定义语言):用于定义数据库结构,包括 CREATE(创建)、ALTER(修改)、DROP(删除)等操作。
  • DML(数据操作语言):用于操作数据,包括 SELECT(查询)、INSERT(插入)、UPDATE(更新)、DELETE(删除)等。
  • DCL(数据控制语言):用于控制数据权限,包括 GRANT(授权)、REVOKE(回收权限)等。

3. 基本操作

创建表(CREATE TABLE

CREATE TABLE students (  id INT PRIMARY KEY,          -- 主键(唯一标识)  name VARCHAR(100),          -- 字符串(最长 100 字符)  age INT,                    -- 整数  major VARCHAR(50)           -- 专业(最长 50 字符)  
);  

插入数据(INSERT

INSERT INTO students (id, name, age, major)  
VALUES (1, 'Alice', 20, 'Computer Science');  

查询数据(SELECT

-- 查询所有学生信息  
SELECT * FROM students;  -- 查询特定列  
SELECT name, age FROM students;  

修改数据(UPDATE

UPDATE students  
SET age = 21          -- 设置新值  
WHERE id = 1;         -- 条件:仅修改 id=1 的记录  

删除数据(DELETE

DELETE FROM students  
WHERE id = 1;         -- 条件:删除 id=1 的记录  

4. 基本概念

数据类型

定义数据表时常用的数据类型:

  • INT:整数(如年龄、ID)。
  • VARCHAR(n):可变长度字符串,最多存储 n 个字符(如姓名、地址)。
  • DATE:日期类型(如 2023-10-01)。

WHERE 条件

用于过滤查询结果,示例:

SELECT name FROM students  
WHERE age > 18;        -- 查询年龄大于 18 岁的学生姓名  

排序(ORDER BY

按指定列排序,默认升序(ASC),降序用 DESC

SELECT name, age FROM students  
ORDER BY age DESC;     -- 按年龄降序排列  

聚合与分组(GROUP BY + 聚合函数)

对数据分组后进行统计,示例:

SELECT major, COUNT(*) AS student_count  
FROM students  
GROUP BY major;        -- 按专业分组,统计每组人数  

常用聚合函数:COUNT()(计数)、SUM()(求和)、AVG()(平均值)、MAX()(最大值)、MIN()(最小值)。

5. 实践提示

  • 使用表别名:简化查询语句,提高可读性。
    SELECT s.name FROM students AS s;  
    
  • 避免 SELECT *:指定需要的列,减少数据传输量。
  • 添加索引:对高频查询的列添加索引(如 CREATE INDEX idx_name ON students(name);),提升查询性能。
  • 规范字段设计:合理使用枚举值、外键等,避免数据冗余。

6. 总结

SQL 是操作关系型数据库的核心技能,掌握基础的 DDL、DML 语句和查询逻辑是数据管理与开发的基石。


SQL 基础之主键和外键

在关系型数据库的表结构设计中,**主键(Primary Key)外键(Foreign Key)**是构建数据关联关系、确保数据完整性的核心概念。本文将详细解析两者的定义、功能及实践应用。

1. 主键(Primary Key)

概念

主键是表中用于唯一标识每条记录的字段或字段组合,需满足以下约束:

  • 唯一性:表中任意两条记录的主键值不能重复。
  • 非空性:主键字段不允许为 NULL

创建主键的方式

(1)创建表时直接指定
CREATE TABLE students (  id INT PRIMARY KEY,          -- 单字段主键  name VARCHAR(100),  age INT  
);  
(2)为已有表添加主键
ALTER TABLE students  
ADD CONSTRAINT pk_students_id PRIMARY KEY (id);  
-- CONSTRAINT 用于指定约束名称(可选,建议命名以明确含义)  
(3)复合主键(多个字段联合唯一)
CREATE TABLE enrollments (  student_id INT,  course_id INT,  enrollment_date DATE,  PRIMARY KEY (student_id, course_id)  -- 复合主键:两个字段组合唯一  
);  

2. 外键(Foreign Key)

概念

外键是表中的一个字段(或字段组合),其值引用另一表的主键,用于建立表间的关联关系。外键的核心作用:

  • 数据完整性:确保表间引用的有效性(如选课记录中的学生 ID 必须存在于学生表中)。
  • 表间关联:实现多表数据的联动查询(如查询学生及其选课记录)。

创建外键的方式

(1)创建表时指定外键
CREATE TABLE enrollments (  id INT PRIMARY KEY,  student_id INT,  course_id INT,  score INT,  -- 外键约束:student_id 引用 students 表的 id 字段  FOREIGN KEY (student_id) REFERENCES students(id),  -- 可同时指定多个外键  FOREIGN KEY (course_id) REFERENCES courses(id)  
);  
(2)为已有表添加外键
ALTER TABLE enrollments  
ADD CONSTRAINT fk_enrollments_student  -- 外键约束名称  
FOREIGN KEY (student_id)  
REFERENCES students(id);  -- 引用目标表的主键  
(3)外键的完整性约束

通过 ON DELETE CASCADEON UPDATE CASCADE 实现级联操作,确保数据一致性:

CREATE TABLE enrollments (  id INT PRIMARY KEY,  student_id INT,  course_id INT,  -- 级联删除:当删除学生时,自动删除其选课记录  -- 级联更新:当学生 ID 变更时,自动更新选课记录中的对应值  FOREIGN KEY (student_id) REFERENCES students(id)  ON DELETE CASCADE  ON UPDATE CASCADE  
);  

3. 主外键经典案例:学校管理系统

表结构设计

表名主键外键说明
studentsid(INT)学生信息表
coursesid(INT)课程信息表
enrollments(student_id, course_id)student_id REFERENCES students(id)
course_id REFERENCES courses(id)
选课关系表,关联学生与课程

数据完整性保障

  • 插入选课记录时:数据库会检查 student_idcourse_id 是否存在于对应表中,若不存在则拒绝插入。
  • 删除学生记录时:若启用 ON DELETE CASCADE,则自动删除该学生的所有选课记录,避免孤立数据。

4. 总结

  • 主键是表的“唯一标识”,确保记录唯一性和非空性,是关系型数据库的基础约束。
  • 外键是表间关联的“桥梁”,通过引用主键建立关系,保障数据完整性和一致性。
  • 合理设计主外键是数据库建模(如 ER 模型)的核心环节,也是后续复杂查询(如 JOIN)的基础。

掌握主外键的原理与实践,是深入学习数据库设计、优化和管理的必经之路。

相关文章:

SQL 基础入门

SQL 基础入门 SQL(全称 Structured Query Language,结构化查询语言)是用于操作关系型数据库的标准语言,主要用于数据的查询、新增、修改和删除。本文面向初学者,介绍 SQL 的基础概念和核心操作。 1. 常见的 SQL 数据…...

GitHub 趋势日报 (2025年06月05日)

📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 1472 onlook 991 HowToCook 752 ChinaTextbook 649 quarkdown 451 scrapy 324 age…...

基于Flask框架的前后端分离项目开发流程是怎样的?

基于Flask框架的前后端分离项目开发流程可分为需求分析、架构设计、并行开发、集成测试和部署上线五个阶段。以下是详细步骤和技术要点: 一、需求分析与规划 1. 明确项目边界 功能范围:确定核心功能(如用户认证、数据管理、支付流程&#…...

Delphi SetFileSecurity 设置安全描述符

在Delphi中,使用Windows API函数SetFileSecurity来设置文件或目录的安全描述符时,你需要正确地构建一个安全描述符(SECURITY_DESCRIPTOR结构)。这个过程涉及到几个步骤,包括创建或修改安全描述符、设置访问控制列表&am…...

rec_pphgnetv2完整代码学习(二)

六、TheseusLayer PaddleOCRv5 中的 TheseusLayer 深度解析 TheseusLayer 是 PaddleOCRv5 中 rec_pphgnetv2 模型的核心网络抽象层,提供了强大的网络结构调整和特征提取能力。以下是对其代码的详细解读: 1. 整体设计思想 核心概念: 网络…...

【计算机网络】Linux下简单的TCP服务器(超详细)

服务端 创建套接字 💻我们将TCP服务器封装成一个类,当我们定义出一个服务器对象后需要马上对服务器进行初始化,而初始化TCP服务器要做的第一件事就是创建套接字。 TCP服务器在调用socket函数创建套接字时,参数设置如下&#xff1…...

go中的接口返回设计思想

go中的接口返回设计思想 前言 在学习AI编码过程中,产生了类似以下结构的代码 : type MQClient interface {PublishMessage(queue string, message interface{}) error...... } ... type RabbitMQClient struct {conn *amqp.Connectionchannel *amqp.C…...

最新Spring Security实战教程(十七)企业级安全方案设计 - 多因素认证(MFA)实现

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Micro麦可乐的博客 🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战 🌺《RabbitMQ》…...

html+css+js趣味小游戏~Cookie Clicker放置休闲(附源码)

下面是一个简单的记忆卡片配对游戏的完整代码&#xff0c;使用HTML、CSS和JavaScript实现&#xff1a; html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"wid…...

宝塔面板安装nodejs后,通过node -v获取不到版本号,报错node: command not found

如果在 宝塔面板 安装了 Node.js&#xff0c;但运行 node -v 或 npm -v 时提示 command not found&#xff0c;通常是因为 Node.js 的路径未正确添加到系统环境变量。以下是解决方法&#xff1a; 1. 确认 Node.js 是否安装成功 &#xff08;1&#xff09;检查宝塔面板的 Node.…...

SDC命令详解:使用set_propagated_clock命令进行约束

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 目录 指定端口列表/集合 简单使用 注意事项 传播时钟是在进行了时钟树综合后&#xff0c;使用set_propagated_clock命令可以将一个理想时钟转换为传播时钟&#x…...

win32相关(消息Hook)

消息Hook 要想实现消息Hook需要使用到三个相关的Api SetWindowsHookEx // 设置钩子CallNextHookEx // 将钩子信息传递到当前钩子链中的下一个子程序UnhookWindowsHookEx // 卸载钩子 我们编写的消息钩子需要将设置钩子的函数写到dll里面&#xff0c;当钩住一个线程后&#xff…...

vue3单独封装表单校验函数

1.在页面中建一个.ts文件 import { useI18n } from /hooks/web/useI18n import { FormItemRule } from element-plusconst { t } useI18n()interface LengthRange {min: numbermax: numbermessage?: string } //必输项校验 export const useValidator () > {const requi…...

mysql 页的理解和实际分析

目录 页&#xff08;Page&#xff09;是 Innodb 存储引擎用于管理数据的最小磁盘单位B树的一般高度记录在页中的存储 innodb ibd文件innodb 页类型分析ibd文件查看数据表的行格式查看ibd文件 分析 ibd的第4个页&#xff1a;B-tree Node类型先分析File Header(38字节-描述页信息…...

分享一道力扣

刚刚笔试遇到的。好像很简单&#xff0c;但又不容易写的 611 有效三角形 def triangleNumber(self, nums):count 0nums.sort()for i in range(len(nums) - 2):k i 2for j in range(i 1, len(nums) - 1):if nums[i] 0:breakwhile k < len(nums) and nums[i] nums[j] &g…...

青少年编程与数学 01-011 系统软件简介 06 Android操作系统

青少年编程与数学 01-011 系统软件简介 06 Android操作系统 一、历史发展二、核心架构1. Linux 内核层 (Linux Kernel)2. 硬件抽象层 (Hardware Abstraction Layer - HAL)3. Native 层 (Native Libraries & Android Runtime)4. Java API 框架层 (Java Framework Layer)5. 应…...

构建 MCP 服务器:第 2 部分 — 使用资源模板扩展资源

该图像是使用 AI 图像创建程序创建的。 这个故事是在多位人工智能助手的帮助下写成的。 这是构建MCP 服务器教程&#xff08;共四部分&#xff09;的第二部分。在第一部分中&#xff0c;我们使用基本资源创建了第一个 MCP 服务器。现在&#xff0c;我们将使用资源模板扩展服务…...

【算法设计与分析】实验——汽车加油问题, 删数问题(算法实现:代码,测试用例,结果分析,算法思路分析,总结)

说明&#xff1a;博主是大学生&#xff0c;有一门课是算法设计与分析&#xff0c;这是博主记录课程实验报告的内容&#xff0c;题目是老师给的&#xff0c;其他内容和代码均为原创&#xff0c;可以参考学习&#xff0c;转载和搬运需评论吱声并注明出处哦。 4-1算法实现题 汽车…...

Ubuntu2404 下搭建 Zephyr 开发环境

1. 系统要求 操作系统&#xff1a;Ubuntu2404&#xff08;64位&#xff09;磁盘空间&#xff1a;至少 8GB 可用空间&#xff08;Zephyr 及其工具链较大&#xff09; 2. 安装必要工具 Tool Min. Version CMake 3.20.5 Python 3.10 Devicetree compiler 1.4.6 2.1 安装系…...

现代C++特性(一):基本数据类型扩展

文章目录 基础数据类型long long (C 11)numeric_limits()获取当前数据类型的最值warning C4309: “”: 截断常量值新字符类型char16_t和char32_tWindows编程常用字符类型wchar_tchar8_t (C 20) 基础数据类型 C中的基本类型是构建其他数据类型的基础&#xff0c;常见的基础类型…...

【C++进阶篇】C++11新特性(下篇)

C函数式编程黑魔法&#xff1a;Lambda与包装器实战全解析 一. lambda表达式1.1 仿函数使用1.2 lambda表达式的语法1.3 lambda表达式使用1.3.1 传值和传引用捕捉1.3.2 隐式捕捉1.3.3 混合捕捉 1.4 lambda表达式原理1.5 lambda优点及建议 二. 包装器2.1 function2.2 bind绑定 三.…...

全生命周期的智慧城市管理

前言 全生命周期的智慧城市管理。未来&#xff0c;城市将在 实现从基础设施建设、日常运营到数据管理的 全生命周期统筹。这将避免过去智慧城市建设 中出现的“碎片化”问题&#xff0c;实现资源的高效配 置和项目的协调发展。城市管理者将运用先进 的信息技术&#xff0c;如物…...

echarts柱状图实现动态展示时报错

echarts柱状图实现动态展示时报错 1、问题&#xff1a; 在使用Echarts柱状图时&#xff0c;当数据量过多&#xff0c;x轴展示不下的时候&#xff0c;可以使用dataZoom实现动态展示。如下图所示&#xff1a; 但是当鼠标放在图上面滚动滚轮时或拖动滚动条时会报错&#xff0c;…...

Redis故障转移

概述 本文主要讲述了Redis故障转移的原理及过程&#xff0c;可与「Redis高可用架构」文章一同阅读&#xff0c;可更好理解相关内容&#xff0c;及整个Redis高可用架构的实现原理。 Leader 选举 哨兵首先进入 WATI_START 状态进行准备&#xff0c;等待哨兵成为哨兵集群的 Leade…...

STM32学习笔记:定时器(TIM)原理与应用(详解篇)

前言 定时器是STM32微控制器中最重要且最常用的外设之一&#xff0c;它不仅能提供精确的定时功能&#xff0c;还能实现PWM输出、输入捕获、编码器接口等多种功能。本文将全面介绍STM32的通用定时器&#xff0c;包括其工作原理、配置方法和典型应用。 一、STM32定时器概述 定…...

JAVA获取ES连接并查询所有数据

我们的项目要获取es连接&#xff0c;新版本和旧版本有不小的区别&#xff0c;在8.17.0版本使用的是 ElasticsearchClient <dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.17…...

408第一季 - 数据结构 - 线性表

只能用C/C&#xff01; 顺序表 闲聊 线性表的逻辑顺序和物理顺序相同 都是1234 顺序表的优点&#xff1a; 随机访问&#xff0c;随机访问的意思是访问的时间 和位置没有关系&#xff0c;访问下标1和100一样的&#xff0c;更深层就是直接计算 a100 * 数组大小&#xff0c;随便…...

第23讲、Odoo18 邮件系统整体架构

目录 Odoo 邮件系统整体架构邮件发送方式邮件模板配置SMTP 邮件服务器配置邮件发送过程开发中常见邮件发送需求常见问题排查提示与最佳实践完整示例&#xff1a;审批通过自动发邮件门户表单自动邮件通知案例邮件队列与异步发送邮件添加附件邮件日志与调试多语言邮件模板邮件安…...

【QT面试题】(三)

文章目录 Qt信号槽的优点及缺点Qt中的文件流和数据流区别&#xff1f;Qt中show和exec区别QT多线程使用的方法 (4种)QString与基本数据类型如何转换&#xff1f;QT保证多线程安全事件与信号的区别connect函数的连接方式&#xff1f;信号与槽的多种用法Qt的事件过滤器有哪些同步和…...

DeepSeek09-open-webui使用

Open WebUI 完全指南&#xff1a;从安装到知识库搭建与异常处理 最后更新&#xff1a;2025年6月7日 | 适用版本&#xff1a;Open WebUI v0.6.x 一、安装部署 1.1 系统要求 **Python 3.12 **&#xff08;严格版本要求&#xff0c;更高版本3.13不兼容&#xff09;Node.js 20.x内…...