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

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

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

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

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

sql 复制代码
CREATE DATABASE RUNOOB;

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

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

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

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

sql 复制代码
USE RUNOOB;
SET NAMES utf8;

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

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

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

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

sql 复制代码
CREATE TABLE Websites (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    url VARCHAR(200),
    alexa INT,
    country VARCHAR(20)
);

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

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

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

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

sql 复制代码
INSERT INTO Websites (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 表名则是查询操作中最简单的形式。星号在这里代表所有列,表示返回表中每一列的数据。这条语句通常用于快速查看数据、排查问题或者在开发阶段进行数据验证。

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

sql 复制代码
SELECT * FROM Websites;

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

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

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

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

sql 复制代码
SELECT * FROM Websites WHERE country = 'CN';

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

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

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

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

sql 复制代码
SELECT * FROM Websites ORDER BY alexa ASC;

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

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

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

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

sql 复制代码
UPDATE Websites SET alexa = 2 WHERE id = 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的相关记录从表中删除,可以使用如下语句。

sql 复制代码
DELETE FROM Websites WHERE id = 5;

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

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

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

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

sql 复制代码
SHOW DATABASES;

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

相关推荐
小小de风呀1 小时前
de风——【从零开始学C++】(二十)红黑树封装map和set
c++·学习
得物技术1 小时前
指标平台:从语义底座到智能消费的实践路径|得物技术
数据库·人工智能·ai编程
StarRocks_labs1 小时前
当大模型调用进入执行引擎:StarRocks AI Function 全新能力解析
数据库·starrocks·sql·ai·pipeline·数据处理·join
爱吃苹果的日记本1 小时前
数据结构第四课—线性表Linear List
数据结构·学习
TDengine (老段)1 小时前
TDengine 常见问题 TOP4
数据库·物联网·时序数据库·tdengine·涛思数据·升级·tdengine 问题
昌原的儿子LEO2 小时前
ARM 汇编核心知识点总结
嵌入式硬件·学习
Ray Wang2 小时前
Context上下文工程
python·学习·ai编程
百里香酚兰2 小时前
【Unity学习笔记】如何把粉色Prefab还原
笔记·学习·unity
小蒜学长2 小时前
基于RFID技术的仓储管理系统设计(代码+数据库+LW)
java·数据库·spring boot·后端·rfid技术·仓储管理
梦影_2 小时前
Langchain简单快速上手教程(五)——聊天模型之流式传输
java·数据库·人工智能·python·langchain