SQLite 数据库 EXCEPT 案例

SQLite 数据库阿木 发布于 2025-07-10 10 次阅读


摘要:

本文将围绕SQLite数据库中的EXCEPT操作进行深入探讨,通过实际案例分析和代码实现,帮助读者理解EXCEPT操作在数据库查询中的应用。我们将从基本概念入手,逐步深入到复杂案例,最后通过实际代码展示如何使用EXCEPT操作。

一、

在数据库查询中,EXCEPT操作是一种常用的集合操作,用于从两个或多个结果集中排除那些在另一个结果集中也存在的记录。在SQLite中,EXCEPT操作可以用来找出在第一个查询结果中存在,但在第二个查询结果中不存在的记录。本文将通过对几个案例的分析,展示如何使用EXCEPT操作进行数据库查询。

二、基本概念

1. SELECT语句

SELECT语句是SQL语言中最基本的查询语句,用于从数据库中检索数据。

2. EXCEPT操作

EXCEPT操作用于从两个查询结果集中排除那些在另一个结果集中也存在的记录。

三、案例一:查找不同部门员工

假设我们有两个表:employees和departments,其中employees表包含员工信息,departments表包含部门信息。我们需要找出在sales部门工作的员工,但不包括在IT部门工作的员工。

sql

SELECT e.


FROM employees e


JOIN departments d ON e.department_id = d.id


WHERE d.name = 'sales'


EXCEPT


SELECT e.


FROM employees e


JOIN departments d ON e.department_id = d.id


WHERE d.name = 'IT';


在这个案例中,我们首先通过JOIN操作连接了两个表,然后分别筛选出sales部门和IT部门的员工。EXCEPT操作用于排除IT部门的员工,只留下sales部门的员工。

四、案例二:查找未完成的任务

假设我们有一个tasks表,其中包含任务信息,包括任务ID、任务描述和完成状态。我们需要找出所有未完成的任务,但不包括那些在特定日期之前已经完成的任务。

sql

SELECT t.


FROM tasks t


WHERE t.status = 'Incomplete'


EXCEPT


SELECT t.


FROM tasks t


WHERE t.status = 'Incomplete' AND t.completed_date < '2023-01-01';


在这个案例中,我们首先筛选出所有未完成的任务,然后通过EXCEPT操作排除那些在2023年1月1日之前已经完成的任务。

五、案例三:比较两个数据集的差异

假设我们有两个数据集,data1和data2,我们需要找出data1中存在但data2中不存在的记录。

sql

SELECT


FROM data1


EXCEPT


SELECT


FROM data2;


在这个案例中,EXCEPT操作直接用于比较两个数据集的差异,找出data1中独有的记录。

六、代码实现

以下是一个使用Python和SQLite的示例代码,展示如何实现上述案例中的EXCEPT操作。

python

import sqlite3

连接到SQLite数据库


conn = sqlite3.connect('example.db')


cursor = conn.cursor()

创建表


cursor.execute('''


CREATE TABLE IF NOT EXISTS employees (


id INTEGER PRIMARY KEY,


name TEXT,


department_id INTEGER


)


''')


cursor.execute('''


CREATE TABLE IF NOT EXISTS departments (


id INTEGER PRIMARY KEY,


name TEXT


)


''')


cursor.execute('''


CREATE TABLE IF NOT EXISTS tasks (


id INTEGER PRIMARY KEY,


description TEXT,


status TEXT,


completed_date DATE


)


''')

插入数据


cursor.execute("INSERT INTO employees (name, department_id) VALUES ('Alice', 1)")


cursor.execute("INSERT INTO employees (name, department_id) VALUES ('Bob', 2)")


cursor.execute("INSERT INTO employees (name, department_id) VALUES ('Charlie', 1)")


cursor.execute("INSERT INTO departments (name) VALUES ('sales')")


cursor.execute("INSERT INTO departments (name) VALUES ('IT')")


cursor.execute("INSERT INTO tasks (description, status, completed_date) VALUES ('Task 1', 'Incomplete', '2023-01-01')")


cursor.execute("INSERT INTO tasks (description, status, completed_date) VALUES ('Task 2', 'Incomplete', '2023-01-02')")

执行查询


cursor.execute("""


SELECT e.


FROM employees e


JOIN departments d ON e.department_id = d.id


WHERE d.name = 'sales'


EXCEPT


SELECT e.


FROM employees e


JOIN departments d ON e.department_id = d.id


WHERE d.name = 'IT'


""")


sales_not_it_employees = cursor.fetchall()

cursor.execute("""


SELECT t.


FROM tasks t


WHERE t.status = 'Incomplete'


EXCEPT


SELECT t.


FROM tasks t


WHERE t.status = 'Incomplete' AND t.completed_date < '2023-01-01'


""")


incomplete_tasks = cursor.fetchall()

cursor.execute("""


SELECT


FROM data1


EXCEPT


SELECT


FROM data2


""")


data1_not_data2 = cursor.fetchall()

输出结果


print("Sales employees not in IT:")


for employee in sales_not_it_employees:


print(employee)

print("Incomplete tasks not completed before 2023-01-01:")


for task in incomplete_tasks:


print(task)

print("Records in data1 not in data2:")


for record in data1_not_data2:


print(record)

关闭连接


conn.close()


七、总结

本文通过几个实际案例,展示了SQLite数据库中EXCEPT操作的应用。通过理解EXCEPT操作的基本概念和代码实现,我们可以更有效地进行数据库查询,找出所需的数据。在实际应用中,EXCEPT操作可以帮助我们解决各种数据对比和差异分析的问题。