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)的基础。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/82900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP 请求协议简单介绍

目录 常见的 HTTP 响应头字段 Java 示例代码:发送 HTTP 请求并处理响应 代码解释: 运行结果: 文件名: 总结: HTTP(HyperText Transfer Protocol)是用于客户端与服务器之间通信的协议。它定…

《100天精通Python——基础篇 2025 第5天:巩固核心知识,选择题实战演练基础语法》

目录 一、踏上Python之旅二、Python输入与输出三、变量与基本数据类型四、运算符五、流程控制 一、踏上Python之旅 1.想要输出 I Love Python,应该使用()函数。 A.printf() B.print() C.println() D.Print() 在Python中想要在屏幕中输出内容,应该使用print()函数…

求解一次最佳平方逼近多项式

例 设 f ( x ) 1 x 2 f(x)\sqrt{1x^2} f(x)1x2 ​,求 [ 0 , 1 ] [0,1] [0,1]上的一个一次最佳平方逼近多项式。 解 : d 0 ∫ 0 1 1 x 2 d x 1 2 ln ⁡ ( 1 2 ) 2 2 ≈ 1.147 d_0\int_{0}^{1}\sqrt{1x^2}dx\frac{1}{2}\ln(1\sqrt{2})\frac{\sqrt…

在Ubuntu上使用 dd 工具制作U盘启动盘

在Ubuntu上使用 dd 工具制作U盘启动盘 在Linux系统中,dd 是一个功能强大且原生支持的命令行工具,常用于复制文件和转换数据。它也可以用来将ISO镜像写入U盘,从而创建一个可启动的操作系统安装盘。虽然图形化工具(如 Startup Disk…

如何理解OSI七层模型和TCP/IP四层模型?HTTP作为如何保存用户状态?多服务器节点下 Session方案怎么做

本篇概览: OSI 七层模型是什么?每一层的作用是什么?TCP/IP四层模型和OSI七层模型的区别是什么? HTTP 本身是无状态协议,HTTP如何保存用户状态? 能不能具体说一下Cookie的工作原理、生命周期、作用域?使用…

深入剖析 RocketMQ 中的 DefaultMQPushConsumerImpl:消息推送消费的核心实现

前言 在 Apache RocketMQ 的消息消费体系中,RocketMQ 提供了DefaultMQPushConsumer(推送消费)和DefaultMQPullConsumer(拉取消费)两种主要消费方式。DefaultMQPushConsumer与DefaultMQPullConsumer在消息获取方式&…

Linux编程:2、进程基础知识

一、进程基本概念 1、进程与程序的区别 程序:静态的可执行文件(如电脑中的vs2022安装程序)。进程:程序的动态执行过程(如启动后的vs2022实例),是操作系统分配资源的单位(如 CPU 时…

React Router 中 navigate 后浏览器返回按钮不起作用的问题记录

React Router 中 navigate 后浏览器返回按钮不起作用的问题记录 在使用 React Router(v6)开发项目时,我遇到了一个让人困惑的问题: 当我从 /article 页面使用 navigate("/article/next") 进行跳转后,点击浏…

[面试精选] 0094. 二叉树的中序遍历

文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 94. 二叉树的中序遍历 - 力扣(LeetCode) 2. 题目描述 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 3. 题目示例 示例 1 : 输入&…

Addressable-配置相关

1、Profile 概述窗口配置 主要用于配置Addressable打包(构建)加载AB包时使用的一些变量,这些变量定义了 在哪里保存打包(构建)的AB包运行时在哪里加载AB包 可以添加自定义变量,以便在打包加载时使用,之后在设置 组中…

aws(学习笔记第四十三课) s3_sns_sqs_lambda_chain

文章目录 aws(学习笔记第四十三课) s3_sns_sqs_lambda_chain学习内容:1. 整体架构1.1 代码链接1.2 整体架构1.3 测试代码需要的修改1.3.1 unit test代码中引入stack的修改1.3.2 test_outputs_created代码中把错误的去掉 2. 代码解析2.1 生成dead_letter_queue死信队…

Python训练营打卡Day43

kaggle找到一个图像数据集,用cnn网络进行训练并且用grad-cam做可视化 进阶:并拆分成多个文件 config.py import os# 基础配置类 class Config:def __init__(self):# Kaggle配置self.kaggle_username "" # Kaggle用户名self.kaggle_key &quo…

hive 3集成Iceberg 1.7中的Java版本问题

hive 3.1.3 集成iceberg 1.7.2创建Iceberg表报错如下: Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/iceberg/mr/hive/HiveIcebergStorageHandler has been compiled by a more recent version of the Java Runtime …

文本切块技术(Splitter)

为什么要分块? 将长文本分解成适当大小的片段,以便于嵌入、索引和存储,并提高检索的精确度。 用ChunkViz工具可视化分块 在线使用 ChunkViz github https://github.com/gkamradt/ChunkViz 如何确定大模型所能接受的最长上下文 可以从…

C++:用 libcurl 发送一封带有附件的邮件

编写mingw C 程序&#xff0c;用 libcurl 发送一封带有附件的邮件 下面是一个使用 MinGW 编译的 C 程序&#xff0c;使用 libcurl 发送带附件的邮件。这个程序完全通过代码实现 SMTP 邮件发送&#xff0c;不依赖外部邮件客户端&#xff1a; // send_email.cpp #include <i…

tensorflow image_dataset_from_directory 训练数据集构建

以数据集 https://www.kaggle.com/datasets/vipoooool/new-plant-diseases-dataset 为例 目录结构 训练图像数据集要求&#xff1a; 主目录下包含多个子目录&#xff0c;每个子目录代表一个类别。每个子目录中存储属于该类别的图像文件。 例如 main_directory/ ...cat/ ...…

遨游Spring AI:第一盘菜Hello World

Spring AI的正式版已经发布了&#xff0c;很显然&#xff0c;接下来我们要做的事情就是写一个Hello World。 总体思路就是在本地搭建一个简单的大模型&#xff0c;然后编写Spring AI代码与模型进行交互。 分五步&#xff1a; 1. 安装Ollama&#xff1b; 2. 安装DeepSeek&…

华为云Flexus+DeepSeek征文|基于华为云Flexus X和DeepSeek-R1打造个人知识库问答系统

目录 前言 1 快速部署&#xff1a;一键搭建Dify平台 1.1 部署流程详解 1.2 初始配置与登录 2 构建专属知识库 2.1 进入知识库模块并创建新库 2.2 选择数据源导入内容 2.3 上传并识别多种文档格式 2.4 文本处理与索引构建 2.5 保存并完成知识库创建 3接入ModelArts S…

Java优化:双重for循环

在工作中&#xff0c;经常性的会出现在两张表中查找相同ID的数据&#xff0c;许多开发者会使用两层for循环嵌套&#xff0c;虽然实现功能没有问题&#xff0c;但是效率极低&#xff0c;一下是一个简单的优化过程&#xff0c;代码耗时凑从26856ms优化到了748ms。 功能场景 有两…

Prompt Tuning:生成的模型文件有什么构成

一、为什么Prompt Tuning会生成模型文件? 1. Prompt Tuning的本质:优化可训练的「提示参数」 核心逻辑:Prompt Tuning(提示调优)是一种轻量级的微调技术,仅优化模型输入层的提示向量(Prompt Embedding)或少量额外参数,而非更新整个预训练模型的权重。生成模型文件的原…