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

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*FROMWebsitesWHEREcountryCN;这条语句在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条件将会把表中所有行的指定列全部更新为新值这往往会造成灾难性的后果。养成在UPDATE和DELETE语句中先写好WHERE条件的习惯是每一位SQL使用者的基本素养。假设Google的全球排名从第1名变更为第2名我们需要更新对应的记录。UPDATEWebsitesSETalexa2WHEREid1;这条语句首先通过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的相关记录从表中删除可以使用如下语句。DELETEFROMWebsitesWHEREid5;DELETE FROM Websites声明了要从哪张表中删除数据WHERE id 5则锁定了要删除的目标行。由于id为5恰好对应Facebook这条记录执行后该行数据将从Websites表中永久移除。在实际工作中更常见的做法是采用软删除的方式也就是给表增加一个状态字段将记录标记为已删除而不是物理删除。这样既保留了数据用于审计追溯又能在需要时轻松恢复。十、理解数据库层级结构从服务到字段的完整脉络通过前面的操作我们已经接触了数据库、表、字段和行数据这些概念。现在有必要系统地梳理一下MySQL的层级架构。MySQL服务的层级结构从上到下依次为MySQL服务实例是最高层级代表着整个数据库管理系统的运行进程。服务之下是数据库多个数据库在服务中处于平级地位它们之间不能嵌套每个数据库是一个独立的逻辑存储空间。数据库之下是数据表表是实际存储数据的基本单元。表内部由列和行构成列定义了数据的结构行存储了具体的数据值。理解这个层级关系对于后续学习跨库查询、权限管理、数据备份等内容至关重要。当我们想知道当前MySQL实例中到底存在哪些数据库时可以通过以下命令来查看。SHOWDATABASES;SHOW DATABASES是一条MySQL特有的命令用于列出当前登录用户有权限查看的所有数据库。执行后我们会看到一行一行的数据库名称其中包括系统自带的mysql库、我们创建的RUNOOB库以及其他已存在的库。每个数据库在列表中都是平级出现的这直观地印证了数据库之间无法嵌套的事实。左侧导航栏中如果没有立即出现新创建的数据库通常不是数据库创建失败而是客户端工具需要手动刷新才能同步显示最新的数据库列表。