首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >在 Swift 中使用 SQL 组合人员和地址数据

在 Swift 中使用 SQL 组合人员和地址数据

原创
作者头像
Swift社区
发布于 2025-01-27 11:15:58
发布于 2025-01-27 11:15:58
3730
举报
文章被收录于专栏:Swift社区Swift社区

摘要

在本篇文章中,我们将讨论如何结合两个表——PersonAddress,以便生成包含每个人的姓名和地址信息的结果表。如果某人的地址信息不存在,则对应的城市和州返回为 null。我们将用 SwiftSQLite 数据库实现这一功能,并详细分析其逻辑。

描述

问题描述

我们有两张表:

Person 表:

列名

类型

PersonId

int

FirstName

varchar

LastName

varchar

PersonId 是主键,用于存储每个人的基本信息,包括姓和名。

Address 表:

列名

类型

AddressId

int

PersonId

int

City

varchar

State

varchar

AddressId 是主键,存储每个人的城市和州信息,PersonId 是外键关联到 Person 表。

目标: 报告 Person 表中每个人的 FirstNameLastNameCityState。如果某人的地址信息在 Address 表中缺失,则其 CityState 返回 null

示例输入与输出

输入

Person 表:

PersonId

LastName

FirstName

1

Wang

Allen

2

Alice

Bob

Address 表:

AddressId

PersonId

City

State

1

2

New York City

New York

2

3

Leetcode

California

输出

FirstName

LastName

City

State

Allen

Wang

Null

Null

Bob

Alice

New York City

New York

解释

  • PersonId = 1Address 表中没有对应的地址信息,返回 null
  • PersonId = 2Address 表中找到其地址信息。

Swift 代码解决方案

以下是用 Swift 和 SQLite 数据库实现的代码:

代码语言:swift
AI代码解释
复制
import SQLite3

def fetchPersonWithAddress() {
    // Database setup
    var db: OpaquePointer?
    let databasePath = ":memory:" // Use in-memory database for demo
    if sqlite3_open(databasePath, &db) != SQLITE_OK {
        print("Failed to open database")
        return
    }

    // Create tables
    let createPersonTable = """
    CREATE TABLE Person (
        PersonId INTEGER PRIMARY KEY,
        FirstName TEXT,
        LastName TEXT
    );
    """

    let createAddressTable = """
    CREATE TABLE Address (
        AddressId INTEGER PRIMARY KEY,
        PersonId INTEGER,
        City TEXT,
        State TEXT
    );
    """

    if sqlite3_exec(db, createPersonTable, nil, nil, nil) != SQLITE_OK ||
       sqlite3_exec(db, createAddressTable, nil, nil, nil) != SQLITE_OK {
        print("Failed to create tables")
        sqlite3_close(db)
        return
    }

    // Insert sample data
    let insertPersonData = """
    INSERT INTO Person (PersonId, FirstName, LastName) VALUES
    (1, 'Allen', 'Wang'),
    (2, 'Bob', 'Alice');
    """

    let insertAddressData = """
    INSERT INTO Address (AddressId, PersonId, City, State) VALUES
    (1, 2, 'New York City', 'New York'),
    (2, 3, 'Leetcode', 'California');
    """

    if sqlite3_exec(db, insertPersonData, nil, nil, nil) != SQLITE_OK ||
       sqlite3_exec(db, insertAddressData, nil, nil, nil) != SQLITE_OK {
        print("Failed to insert data")
        sqlite3_close(db)
        return
    }

    // Query data with LEFT JOIN
    let query = """
    SELECT Person.FirstName, Person.LastName, Address.City, Address.State
    FROM Person
    LEFT JOIN Address ON Person.PersonId = Address.PersonId;
    """

    var statement: OpaquePointer?
    if sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK {
        print("FirstName | LastName | City          | State")
        while sqlite3_step(statement) == SQLITE_ROW {
            let firstName = String(cString: sqlite3_column_text(statement, 0))
            let lastName = String(cString: sqlite3_column_text(statement, 1))
            let city = sqlite3_column_text(statement, 2).flatMap { String(cString: $0) } ?? "Null"
            let state = sqlite3_column_text(statement, 3).flatMap { String(cString: $0) } ?? "Null"
            print("\(firstName) | \(lastName) | \(city) | \(state)")
        }
    } else {
        print("Failed to execute query")
    }

    sqlite3_finalize(statement)
    sqlite3_close(db)
}

fetchPersonWithAddress()

代码分析

  1. 表创建与数据插入
    • 使用 SQL 创建 PersonAddress 表,并插入示例数据。
  2. 数据查询
    • 通过 LEFT JOIN 查询数据。左连接确保即使 Address 表中没有对应的 PersonIdPerson 表的记录也会出现在结果中。
  3. 结果展示
    • 使用 sqlite3_step 遍历查询结果,并处理可能的 null 值。

示例测试及结果

输出结果

代码语言:txt
AI代码解释
复制
FirstName | LastName | City          | State
Allen     | Wang     | Null          | Null
Bob       | Alice    | New York City | New York

时间复杂度

  • 查询操作: LEFT JOIN 的时间复杂度为 O(n + m),其中 nm 分别是 PersonAddress 表的大小。

空间复杂度

  • 额外空间: 用于存储查询结果,复杂度为 O(k),其中 k 是结果行数。

总结

本文通过 Swift 和 SQLite 实现了对两个表的合并查询,并处理了地址缺失的情况。代码逻辑清晰,适合实际应用场景如用户数据整合或报告生成。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
组合两个表(C++)
编写一个SQL查询来报告 Person 表中每个人的姓、名、城市和州。如果 personId 的地址不在 Address 表中,则报告为空 null 。
GeekLiHua
2025/01/21
3340
☆打卡算法☆LeetCode 175. 组合两个表 算法解析
“编写一个SQL查询来报告包中每个人的信息,如果id不在表中,则报告显示为空,返回结果表。”
恬静的小魔龙
2022/08/07
4200
☆打卡算法☆LeetCode 175. 组合两个表 算法解析
leet-code两表求合查询
编写一个SQL查询来报告Person表中每个人的姓、名、城市和州。如果personId的地址不在Address表中,则报告为空null 。以 任意顺序 返回结果表。
兔云小新LM
2022/11/21
6720
LeetCode数据库篇|175组合两个表
大家好,从今天起我们将对Leetcode中数据库相关题目进行讲解,如果对SQL相关操作还不是很了解的读者可以点击万字Mysql学习笔记复习。
刘早起
2020/05/12
6620
LeetCode #180:Swift 实现连续数字查询,秒懂高效解法!
本文将解决如何从日志数据中找出连续出现至少三次的数字。通过 SQL 查询语句结合 Swift 数据库操作,我们将完成这一任务。文章提供问题描述、Swift 题解答案、代码分析、测试案例和复杂度分析,并附带完整的可运行代码模块。
Swift社区
2025/03/28
2700
LeetCode #180:Swift 实现连续数字查询,秒懂高效解法!
LeetCode - #181 Swift 实现找出收入比经理高的员工
在企业管理中,员工工资信息是非常重要的分析数据。本文将基于一个Employee表,通过 SQL 查询找到收入比其经理高的员工。我们提供了 Swift 的完整实现代码,并详细分析了解决方案,测试其正确性及效率。
Swift社区
2025/04/02
2410
LeetCode - #181 Swift 实现找出收入比经理高的员工
【IOS开发基础系列】数据持久化专题
iOS中可以有四种持久化数据的方式: 属性列表、对象归档、SQLite3和Core Data。
江中散人_Jun
2023/10/16
6360
【IOS开发基础系列】数据持久化专题
MySQL 多表查询、连接查询(内连接、外连接)
查询的结果是一个二维表,它是students表和classes表的“乘积”,即students表的每一行与classes表的每一行都两两拼在一起返回
Michael阿明
2020/07/13
4.7K0
MySQL 多表查询、连接查询(内连接、外连接)
ios在SQLite3基本操作
首先是设置项目文件。在项目中加入iPhone版的sqlite3的数据库的开发包。在项目下的Frameworks点击右键。然后选择libsqlite3.0.dylib文件。
全栈程序员站长
2022/07/05
9600
Swift实现从数据库查询第二高的薪水
本篇文章将讨论如何在数据库中找到第二高的工资(如果存在),并用 Swift 实现这一功能。我们将从问题描述、代码实现到复杂度分析详细展开,并提供可运行的 Demo 代码模块,帮助开发者掌握这一常见的 SQL 问题解决思路。
Swift社区
2025/03/17
3070
Swift实现从数据库查询第二高的薪水
iOS---iOS中SQLite的使用
一.SQLite的使用 采用SQLite数据库来存储数据。SQLite作为一中小型数据库,应用ios中,跟前三种保存方式相比,相对比较复杂一些。还是一步步来吧! 第一步:导入头文件 需要添加SQLite相关的库以及头文件:在项目文件的Build Phases下,找到Link Binary Library(ies),添加libsqlite3.0.dylib(libsqlite3.dylib与前者的区别暂时不知,两者应该差不多);在项目文件中头文件或者源文件中添加头文件#import "/usr/include
用户1941540
2018/05/11
1.9K0
使用iOS原生sqlite3框架对sqlite数据库进行操作
      sqlite数据库是一种小型数据库,由于其小巧与简洁,在移动开发领域应用深广,sqlite数据库有一套完备的sqlite语句进行管理操作,一些常用的语句和可视化的开发工具在上篇博客中有介绍,地址如下:
珲少
2018/08/15
2.5K0
使用iOS原生sqlite3框架对sqlite数据库进行操作
SQLite3使用笔记(1)——查询
SQLite是一个嵌入式SQL数据库引擎。与大多数其他 SQL 数据库不同,SQLite 没有单独的服务器进程。SQLite 直接读写普通磁盘文件。具有多个表、索引、触发器和视图的完整SQL数据库包含在单个磁盘文件中。
charlee44
2022/05/23
1.7K0
LeetCode-175. 组合两个表
编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:
悠扬前奏
2019/05/28
5730
Swift高效实现分数排名查询,提升性能的最佳方案!
本篇文章将讲解如何在数据库中为比赛分数表设计排名系统。通过 SQL 查询语句和 Swift 数据库接口的结合,我们能够根据特定规则为分数生成排名。文章包括问题描述、题解答案、代码分析、测试案例及结果分析,并附带复杂度分析。
Swift社区
2025/03/21
3880
Swift高效实现分数排名查询,提升性能的最佳方案!
sqlite3的C语言使用(一)
前一天我讲了如何在VC中连接sqlite的库,从今天开始就分几个专题详细学习一下sqlite的一些API。当然我也是才接触sqlite3,这些题也都是我的作业题,如果有什么错误大家可以联系我,共同进步。
phith0n
2020/10/15
3.5K0
iOS原生sqlite3框架操作数据库
iOS开发的基本上都知道fmdb,自从用了fmdb之后都忘记了原生的sqlite3操作了(fmdb太好用了)。 SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库一样,您不需要在系统中配置。 SQLite是一个轻量级的关系数据库。SQLite最初的设计目标是用于嵌入式系统,TA占用资源非常少,在嵌入式设备中,只需要几百K的内存就够了,目前应用于Android、iOS、Windows Phone等智能手机。 需要注
傅_hc
2018/07/04
1.4K0
C++编程库与框架实战——SQLite3数据库引擎
SQLite是可以实现类似于关系型数据库中各种操作的事务性SQL数据库引擎,可以为应用程序提供存储于本地的嵌入式数据库,帮助应用程序实现轻量级的数据存储。
Coder-ZZ
2024/06/06
1.7K0
C++编程库与框架实战——SQLite3数据库引擎
iOS使用sqlite可以实现简单的收藏夹功能
在这个类里首先导入一个头文件和你建好的model类 (实现收藏本质是存model类)
好派笔记
2021/10/31
4730
swift 简易操作sqlite3 之 通用查询
上篇文章我们写了关于SQLite的简单操作和一些基本常识,对此陌生的童鞋可以参考之前的文章(swift简易操作sqlite3),今天我们在此基础上进一步加工处理,写出通用查询操作方法
大话swift
2019/07/03
1.6K0
swift 简易操作sqlite3 之 通用查询
相关推荐
组合两个表(C++)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档