Data-Science-For-Beginners 第 05 课实战:用 VS Code SQLite 扩展查询 airports.db 机场数据库
2026/9/14 12:21:30 网站建设 项目流程

Data-Science-For-Beginners 第 05 课实战:用 VS Code SQLite 扩展查询 airports.db 机场数据库

【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners

本篇指南基于 Data-Science-For-Beginners 课程第 05 课(Relational Databases,关系型数据库)的课后作业 assignment.md(法语版,对应英文版 assignment.md)展开:围绕仓库自带的示例数据库 airports.db,完整讲解从安装 Visual Studio Code 的 SQLite 扩展、打开数据库、查看表结构,到编写SELECTJOIN查询返回城市/机场信息的全部实操过程。读完并动手完成后,你将掌握在 VS Code 中操作 SQLite 单文件数据库的完整工作流,并能独立写出带WHERE过滤与内连接(INNER JOIN)的 SQL 查询。

为什么用“两张表 + 外键”来建模机场数据

在动手查询之前,先理解这份示例数据库的设计意图,这是理解后续所有查询的前提。关系型数据库的核心思想是把信息拆分散落在多张表中,再通过关系(外键)把它们拼回来看——第 05 课正文用“城市 + 多年份降雨量”的例子解释了为什么单表存储会导致数据冗余:要么每行重复城市名与国家名,要么每新增一年就要改表结构。拆表之后,子表只保存指向主表的编号即可。

airports数据库正是这一思想的落地:因为一座城市可能拥有多个机场(例如伦敦有 6 个),所以数据被拆成CitiesAirports两张表,机场表通过city_id外键指回城市表。从 airports.db 文件的真实建表语句(sqlite_master中的 DDL)可以看到其精确结构:

CREATE TABLE Cities ( id INTEGER PRIMARY KEY AUTOINCREMENT, city text NOT NULL, country text NOT NULL ); CREATE TABLE Airports ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, code TEXT, city_id INTEGER, FOREIGN KEY(city_id) REFERENCES Cities(id) );

可以看到:两张表都使用AUTOINCREMENT自增整数主键;Cities.cityCities.country带有NOT NULL约束,而Airports.city_id允许为NULL——这个细节会在后面讲解 JOIN 结果行数时用到。

环境准备:VS Code + SQLite 扩展

作业给出的工具链是Visual Studio Code + SQLite 扩展(Marketplace 上的 alexcvzz.vscode-sqlite 扩展),它允许你在编辑器里直接打开.db文件并执行 SQL。按原作业步骤配置系统:

  1. 到 Visual Studio Code 官网按指引安装 VS Code;
  2. 在扩展市场(Marketplace)中搜索并安装SQLite扩展。

关于该扩展的更多用法,可直接查看扩展自带的文档页面。

下载并打开 airports.db

作业要求先把示例数据库拿到本地。由于本仓库已经自带该文件,直接使用仓库内的 airports.db 即可,无需另行下载。后续步骤:

  1. airports.db文件所在目录用 Visual Studio Code 打开;
  2. Ctrl-Shift-P(macOS 为Cmd-Shift-P)打开命令面板,输入SQLite: Open database
  3. 选择Choose database from file,打开airports.db文件;
  4. 数据库打开后界面不会有明显变化(这是正常现象);再按Ctrl-Shift-P/Cmd-Shift-P,输入SQLite: New query新建一个查询窗口;
  5. 在新查询窗口中即可编写并执行 SQL,执行查询的快捷键是Ctrl-Shift-Q(macOS 为Cmd-Shift-Q)。

数据库模式(Schema)速览

作业文档给出的模式说明如下:

Cities
id (PK, integer)
city (text)
country (text)
Airports
id (PK, integer)
name (text)
code (text)
city_id (FK, 引用 Cities.id)

其中 PK 为主键(Primary Key),FK 为外键(Foreign Key)。对照上文的真实 DDL,文档描述与数据库文件完全一致。打开数据库后,你可以用下面两条语句自行验证模式(这也是排查“表叫什么、列叫什么”最可靠的方式):

-- 查看数据库中所有表 .tables -- 查看某张表的建表语句 .schema Cities .schema Airports

实际数据规模(可直接查询验证):

SELECT COUNT(*) FROM Cities; -- 170:其中英国(United Kingdom)154 个,爱尔兰(Ireland)16 个 SELECT COUNT(*) FROM Airports; -- 181

Cities表覆盖英国与爱尔兰的城市,例如 Belfast(id=2)、Manchester、Dublin 等;Airports表中的code为 ICAO 四字代码,如 EGAA(Belfast International Airport)、EGLL(London Heathrow Airport)。

作业任务:四条查询逐一实现

原作业要求“Create queries to return the following information”:

  1. Cities表中所有城市名;
  2. Cities表中所有爱尔兰城市;
  3. 所有机场名称及其所在城市与国家;
  4. 英国伦敦的所有机场。

下面给出每条任务的完整 SQL 与经数据库实际执行验证过的预期结果。

任务 1:所有城市名

最直接的单表查询——SELECT指定列、FROM指定表:

SELECT city FROM Cities;

执行后返回 170 行,例如 Belfast、Enniskillen、Londonderry、Birmingham、Manchester 等。注意 SQL 关键字不区分大小写,但表名、列名在 SQLite 中按定义区分大小写,建议表名保持Cities/Airports原样书写。

任务 2:所有爱尔兰城市

需要过滤条件,使用WHERE子句按country列精确匹配:

SELECT city, country FROM Cities WHERE country = 'Ireland';

返回 16 行:Cork、Galway、Dublin、Shannon、Sligo、Waterford 等。WHERE子句支持=><LIKE等谓词,这里用的是等值匹配,字符串字面量用单引号包裹。

任务 3:机场名称 + 城市 + 国家(两表内连接)

机场信息(namecode)在Airports表,而城市与国家在Cities表,必须用INNER JOIN把两张表在city_id这条“接缝”上拼起来:

SELECT Airports.name, Cities.city, Cities.country FROM Airports INNER JOIN Cities ON Airports.city_id = Cities.id;

结果共 180 行,示例:

namecitycountry
Belfast International AirportBelfastUnited Kingdom
George Best Belfast City AirportBelfastUnited Kingdom
Birmingham International AirportBirminghamUnited Kingdom
London Heathrow AirportLondonUnited Kingdom

有一个值得注意的“坑”:Airports表有 181 行,而本查询只返回 180 行。原因是存在一行Newcastle Aerodrome(代码 EINC)的city_idNULL,在 INNER JOIN 语义下,它无法与Cities表中任何id匹配,因此被排除——这正是内连接“只保留两表都能匹配上的行”的定义。若想确认这类“孤儿”记录,可以用:

-- 查找无法关联到任何城市的机场(结果:EINC Newcastle Aerodrome,1 行) SELECT a.name, a.code FROM Airports a LEFT JOIN Cities c ON a.city_id = c.id WHERE c.id IS NULL;

任务 4:英国伦敦的所有机场

在任务 3 的基础上追加WHERE过滤,同时限定城市名与国家,避免未来数据中出现同名城市时产生歧义:

SELECT Airports.name, Airports.code, Cities.city, Cities.country FROM Airports INNER JOIN Cities ON Airports.city_id = Cities.id WHERE Cities.city = 'London' AND Cities.country = 'United Kingdom';

执行后返回 6 行,伦敦的机场一览:

namecode
London City AirportEGLC
London Gatwick AirportEGKK
London Heathrow AirportEGLL
London HeliportEGLW
London Luton AirportEGGW
London Stansted AirportEGSS

这条查询也印证了作业文档中“因为一座城市可能有多个机场,所以拆成两张表”的设计动机——伦敦恰好是“一城多港”的典型。

评分标准(Rubric)

原作业采用三档评分框架(assignment.md 中的 Rubric 表头):

Exemplary(优秀)Adequate(合格)Needs Improvement(待改进)
四条查询均正确、语句简洁、JOIN/WHERE 使用规范查询能返回正确结果,但写法可简化结果不正确或语法不通

对照上文已验证的结果行数即可自检:任务 1 应为 170 行、任务 2 为 16 行、任务 3 为 180 行、任务 4 为 6 行。行数不符通常意味着过滤条件写错(例如任务 4 漏掉country条件、任务 3 误用了CITIES.id之外的关联列)。

小结与后续学习

本文完整覆盖了第 05 课作业的全部内容:从 VS Code + SQLite 扩展的环境配置、命令面板操作(SQLite: Open database/SQLite: New query/ Ctrl-Shift-Q 执行)、CitiesAirports的表结构与真实 DDL,到四条SELECT查询的可复制实现与经验证的预期结果,并顺带澄清了 INNER JOIN 对NULL外键行的过滤行为。

下一步建议:

  • 重读 第 05 课正文,巩固主键(PK)、外键(FK)与INNER JOIN的概念推导;
  • 在查询窗口中把INNER JOIN换成LEFT JOIN重跑任务 3,观察Newcastle Aerodrome一行以NULL城市出现,直观对比两种 JOIN 的差异;
  • 继续 第 06 课,学习 JSON、电子表格等非关系型数据形态,与本课的表结构模型形成对照。

【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询