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

SQL学习日志_Day2_深入SQL语法与数据库层级结构

SQL学习日志 Day_2:深入SQL语法,理解数据库层级结构与数据操作

一、开篇回顾:SQL语法体系初探

在Day_1的学习中,我们建立了对SQL的基本认知,了解了它是什么、能做什么以及经历了怎样的发展历程。今天我们将继续深入,围绕SQL的语法规范展开系统学习。SQL作为一种声明式的结构化查询语言,其语法设计遵循着高度统一的模式。无论是数据查询、数据插入、数据更新还是数据删除,每一条SQL语句都遵循着固定的语法结构。掌握这些语法模板,并不意味着要逐字背诵,而是要理解每个关键字的作用、每个子句的执行顺序以及每个参数的含义。唯有如此,才能在面对实际业务需求时,灵活组合这些语法元素,写出高效且准确的SQL语句。

在开始具体的语法学习之前,我们需要先在本地环境中建立起可操作的数据库和示例表。正如Day_1中提到的,我们使用RUNOOB数据库中的Websites表作为练习对象。下面这条命令用于在MySQL中创建这个数据库。

CREATEDATABASERUNOOB;

这条语句是SQL中数据定义语言最基础的一环。CREATE DATABASE是固定的命令关键字,后面紧跟的是数据库的名称。在MySQL中,数据库是最高层级的逻辑容器,所有数据表、视图、存储过程等对象都必须隶属于某个数据库。执行这条语句后,MySQL服务会在其管理的数据目录下创建一个名为RUNOOB的存储空间,用于后续存放该库下的所有数据内容。这里需要注意,数据库名称在同一MySQL实例中必须唯一,且命名时建议使用英文字母、数字和下划线的组合,避免使用特殊字符。

二、数据库选择与字符集设置:操作前的必要准备

在实际操作中,仅仅创建数据库是不够的。当我们连接到MySQL服务时,服务端并不知道我们想要操作哪一个数据库。因此,在执行任何建表或查询操作之前,必须通过USE语句明确指定当前的工作数据库。此外,字符集的设置同样不可忽视。如果字符集设置不当,在处理中文数据时极有可能出现乱码问题。在MySQL中,SET NAMES utf8这条命令会同时设置客户端、连接和结果集的字符编码,确保数据在传输全过程中保持编码一致。

当我们完成建库后,接下来的操作就是选中这个数据库并设置好字符集,为后续的数据操作做好环境准备。

USERUNOOB;SETNAMES utf8;

USE RUNOOB这条语句的作用是切换当前会话的默认数据库。执行之后,后续所有的SQL操作如果未显式指定数据库名称,都将默认作用于RUNOOB这个库。这是一个会话级别的设置,意味着它只在当前连接窗口内有效,不会影响其他客户端的连接。SET NAMES utf8则是一次性设置三个字符集变量,确保中文数据能够正确地存入和读出。在日常开发中,这两条命令通常是一起出现的,作为连接数据库后的标准初始化操作。

三、数据表的创建:构建数据存储的基本单元

数据库本身只是一个空的容器,真正存储数据的是数据表。在关系型数据库中,数据表被设计成由行和列组成的二维结构。每一列代表一个数据属性,每一行代表一条完整的记录。在创建数据表时,我们需要为每一列指定数据类型和可选的约束条件。数据类型决定了这一列可以存储什么种类的值,约束条件则用来保证数据的完整性和一致性。

针对Websites表,我们需要定义五个字段,分别用于存储网站ID、名称、网址、Alexa排名和所属国家。

CREATETABLEWebsites(idINTPRIMARYKEY,nameVARCHAR(50),urlVARCHAR(200),alexaINT,countryVARCHAR(20));

这段建表语句中,CREATE TABLE Websites声明了表名,紧随其后的括号内定义了五列的详细信息。id列被定义为INT类型并通过PRIMARY KEY约束指定为主键,这意味着该列的值在整张表中必须是唯一的且不能为空,它是区分每一条记录的唯一标识。name列使用VARCHAR(50)类型,表示可变长度的字符串,最大长度为50个字符。url列使用VARCHAR(200),因为网址通常较长。alexa列是INT整数类型,用于存储排名数值。country列同样使用VARCHAR(20)来存储国家代码。合理定义每一列的数据类型和长度,是数据库设计中非常重要的一环,它直接影响着存储效率和查询性能。

四、插入数据:向表中写入初始记录

数据表建好之后,表中是没有任何数据的。我们需要使用INSERT INTO语句向表中添加记录。SQL支持两种插入方式,一种是一次插入单条记录,另一种是一次插入多条记录。当我们需要批量写入初始数据时,使用多条记录合并插入的方式效率更高。每条记录的值需要与建表时定义的列一一对应,值的顺序必须与列的顺序完全一致。

以下语句将教程中使用的五条示例数据一次性插入到Websites表中。

INSERTINTOWebsites(id,name,url,alexa,country)VALUES(1,'Google','https://www.google.cm/',1,'USA'),(2,'淘宝','https://www.taobao.com/',13,'CN'),(3,'菜鸟教程','http://www.runoob.com/',4689,'CN'),(4,'微博','http://weibo.com/',20,'CN'),(5,'Facebook','https://www.facebook.com/',3,'USA');

INSERT INTO Websites之后,括号内明确列出了要插入数据的列名,这样做的好处是即使表中列的顺序发生变化,这条语句依然能正确执行。VALUES关键字后面跟的是多个用逗号分隔的值组,每一组值用括号包裹,对应一行完整的数据记录。执行成功后,Websites表中将拥有五条记录。这里有一个细节需要注意,字符串类型和日期类型的值需要用单引号括起来,而整数类型的值则直接书写数字即可。这一条语句完整展示了SQL插入操作的规范写法。

五、查询全表数据:验证数据写入结果

当我们完成了建表和插入操作后,最直接的验证方式就是查询表中的所有数据。SELECT语句是SQL中使用频率最高的命令,而SELECT * FROM 表名则是查询操作中最简单的形式。星号在这里代表所有列,表示返回表中每一列的数据。这条语句通常用于快速查看数据、排查问题或者在开发阶段进行数据验证。

执行以下查询,我们就可以看到刚才插入的五条网站记录。

SELECT*FROMWebsites;

执行结果将以表格形式呈现,包含id、name、url、alexa和country五个列,以及对应的五行数据。这条查询语句虽然简单,但它背后体现了SQL声明式编程的核心理念:我们只需要告诉数据库我们要什么数据,而不需要关心数据库内部如何去检索这些数据。当我们看到查询结果与教程中给出的表格完全一致时,就说明从建库、建表到插入数据的整个流程已经成功跑通,这是SQL学习中一个非常重要的里程碑。

六、条件筛选:用WHERE子句精准定位数据

在实际业务中,我们很少需要查询整张表的所有数据,更多时候是希望从中筛选出符合特定条件的记录。WHERE子句正是为此而生,它允许我们设定一个或多个过滤条件,只有满足条件的行才会出现在结果集中。WHERE子句是SQL查询中最灵活也最常用的组成部分之一,配合不同的比较运算符,可以实现各种复杂的筛选逻辑。

如果我们想要查看所有来自中国的网站记录,就可以使用下面的查询语句。

SELECT*FROMWebsitesWHEREcountry='CN';

这条语句在SELECT * FROM Websites的基础上增加了一个WHERE country = 'CN'条件。数据库执行时会遍历Websites表中的每一行数据,检查其country列的值是否等于字符串’CN’,如果相等则将该行放入结果集,如果不相等则跳过。最终返回的就是淘宝、菜鸟教程和微博这三条中国网站的记录。这里需要注意,等值比较使用的是单个等号而不是双等号,字符串值必须用单引号包裹,这些细节在初学阶段容易被忽略。

七、结果排序:用ORDER BY组织数据输出

除了按条件筛选,我们还可以对查询结果进行排序。ORDER BY子句用于指定按照哪一列或多列对结果集进行升序或降序排列。ASC关键字表示升序,即从小到大排列;DESC关键字表示降序,即从大到小排列。如果不指定排序方向,默认采用升序排列。排序是数据展示和分析中的一项基本需求,无论是排行榜、时间线还是任何需要按顺序呈现的数据场景,都离不开ORDER BY的支持。

如果我们想按照Alexa排名从低到高查看所有网站的信息,可以使用如下语句。

SELECT*FROMWebsitesORDERBYalexaASC;

这条语句会返回Websites表中的所有记录,但输出顺序不再是默认的插入顺序,而是按照alexa列的值从小到大重新排列。ASC关键字可以省略,因为升序是默认行为,但显式写出有助于提高代码的可读性。如果有多个网站排名相同,它们之间的相对顺序是不确定的,此时可以在ORDER BY后面追加第二个排序列来明确规则。排序操作本身需要消耗一定的计算资源,在处理大数据量时,为排序列创建索引是常见的优化手段。

八、更新记录:用UPDATE修改已有数据

数据不是一成不变的。当数据库中的某些记录需要修改时,UPDATE语句就派上了用场。UPDATE语句的核心由三部分组成:指定要修改的表名、用SET子句声明要修改的列及其新值、用WHERE子句锁定目标行。这里必须强调,如果执行UPDATE语句时没有带上WHERE条件,将会把表中所有行的指定列全部更新为新值,这往往会造成灾难性的后果。养成在UPDATEDELETE语句中先写好WHERE条件的习惯,是每一位SQL使用者的基本素养。

假设Google的全球排名从第1名变更为第2名,我们需要更新对应的记录。

UPDATEWebsitesSETalexa=2WHEREid=1;

这条语句首先通过UPDATE Websites指定了要操作的表,然后SET alexa = 2将alexa列的值修改为2,最后WHERE id = 1精确地限定了只有id等于1的那一行会被更新。由于id是主键,这个条件能够保证有且仅有一行数据被修改。执行成功后,我们可以再次执行SELECT * FROM Websites WHERE id = 1来验证修改是否生效。精准的WHERE条件是安全操作数据的底线。

九、删除记录:用DELETE移除无用数据

数据也有其生命周期,当某些记录不再需要时,就需要从数据库中将其删除。DELETE语句用于从表中移除一行或多行数据。和UPDATE一样,DELETE也必须配合WHERE子句使用,否则会清空整张表的所有数据。DELETE操作通常是不可逆的,因此在生产环境中执行DELETE之前,务必再三确认WHERE条件是否正确,条件允许的情况下最好先在测试环境或事务中执行验证。

如果我们决定将Facebook的相关记录从表中删除,可以使用如下语句。

DELETEFROMWebsitesWHEREid=5;

DELETE FROM Websites声明了要从哪张表中删除数据,WHERE id = 5则锁定了要删除的目标行。由于id为5恰好对应Facebook这条记录,执行后该行数据将从Websites表中永久移除。在实际工作中,更常见的做法是采用软删除的方式,也就是给表增加一个状态字段,将记录标记为已删除而不是物理删除。这样既保留了数据用于审计追溯,又能在需要时轻松恢复。

十、理解数据库层级结构:从服务到字段的完整脉络

通过前面的操作,我们已经接触了数据库、表、字段和行数据这些概念。现在有必要系统地梳理一下MySQL的层级架构。MySQL服务的层级结构从上到下依次为:MySQL服务实例是最高层级,代表着整个数据库管理系统的运行进程。服务之下是数据库,多个数据库在服务中处于平级地位,它们之间不能嵌套,每个数据库是一个独立的逻辑存储空间。数据库之下是数据表,表是实际存储数据的基本单元。表内部由列和行构成,列定义了数据的结构,行存储了具体的数据值。理解这个层级关系,对于后续学习跨库查询、权限管理、数据备份等内容至关重要。

当我们想知道当前MySQL实例中到底存在哪些数据库时,可以通过以下命令来查看。

SHOWDATABASES;

SHOW DATABASES是一条MySQL特有的命令,用于列出当前登录用户有权限查看的所有数据库。执行后我们会看到一行一行的数据库名称,其中包括系统自带的mysql库、我们创建的RUNOOB库以及其他已存在的库。每个数据库在列表中都是平级出现的,这直观地印证了数据库之间无法嵌套的事实。左侧导航栏中如果没有立即出现新创建的数据库,通常不是数据库创建失败,而是客户端工具需要手动刷新才能同步显示最新的数据库列表。

http://www.rkmt.cn/news/1449765.html

相关文章:

  • 2026重庆除甲醛公司真实排名,选对不踩坑 - GrowthUME
  • 智能家居 Zigbee 与 WiFi 协议对比:穿墙性能深度测评
  • 图像转换新思路:BBDM如何用‘布朗桥’在潜在空间里‘搭桥’,比DDPM更直接?
  • 从语音识别到机器人控制:PicoTalk模块在远程呈现机器人中的应用
  • Keras设计哲学:从用户心智模型到深度学习框架的抽象艺术
  • 别再只问哪个 AI 模型更强了,2026 年真正拉开差距的是向量引擎
  • 手把手教你用MetaMask创建钱包并获取免费测试币(从安装到第一笔转账)
  • 用GD32F3x0单片机驱动TDC-GP22(SSP1922)做高精度测距:一份完整的SPI通信与寄存器配置指南
  • 基于ESP-01F与WebSocket的智能温度计:物联网开发实战指南
  • 量子门分解与校准技术详解
  • 华硕笔记本终极控制方案:5分钟掌握G-Helper轻量级优化工具
  • SAP生产计划员必看:如何利用组件与装配报废率,精准控制原材料采购数量?
  • 基于 Harmony 6.0 应用的同城活动组织平台首页实现
  • 基于树莓派的智能迷你冰箱:物联网全栈开发与硬件实践
  • 不到150元成本!基于STM32的智能手表项目复盘:从PCB布线到低功耗设计的避坑经验
  • 别再被`Uint8Array`坑了!Vue3 + WebSocket + protobufjs 实战避坑指南
  • DiskGenius实战:新买的SATA/NVMe固态硬盘,分区选MBR还是GPT?4K对齐怎么设置?
  • 告别重复劳动:用Tessy的Base工程模板,5分钟复用你的测试环境配置
  • 大语言模型本地部署与云端API的技术经济性对比
  • Arm Neoverse V1 RAS机制与缓存错误处理深度解析
  • 修武沙发翻新换皮换布哪家好、匠阁、御匠、锦修三大品牌哪个靠谱公司推荐、怎么选沙发翻新服务商 - 卓一科技
  • GPT还是MBR?给SATA/NVMe固态硬盘分区前,你必须搞懂的3个关键选择
  • Arm Mali-C55 ISP架构解析:从芯片设计到影像处理的诗意平衡
  • 基于Teensy与WS2812B的旋转动画转向灯制作全解析
  • 2026年电脑维修上门哪家靠谱 五家上门电脑维修平台综合评测口碑推荐 - 资讯焦点
  • Windows 11热键冲突终极解决方案:OpenArk内核级修复指南
  • OpenCV导向滤波实战:5分钟搞定图像去雾与背景虚化,让你的照片秒变大片
  • Video2X:如何用开源AI工具让老旧视频重获新生
  • 从一次软件安装失败说起:搞懂Windows 64位系统里的SysWOW64和Program Files (x86)
  • Windows本地实时语音转文字终极指南:TMSpeech让你的工作效率翻倍