各类资料学习下载合集
https://pan.quark.cn/s/8c91ccb5a474
内连接(Inner Join)是关系型数据库中常用的连接操作,它用于根据两个或多个表之间的共享列生成一个结果集。内连接只返回在连接条件中匹配的行,因此,它对精确的数据挖掘和分析非常有用。在本文中,我们将深入探讨内连接的概念、用法,并通过Python和SQLite进行示例演示。
1. 内连接的基本概念
1.1 定义
内连接是从两个表中返回匹配的行。只有当满足连接条件时,结果集才会包含行。如果某一表的行在连接条件中没有匹配,则该行不会出现在结果中。
1.2 语法
内连接的基本语法如下:
SELECT columns
FROM table1
INNER JOIN table2 ON table1.common_column = table2.common_column;
1.3 特点
- 匹配行:只有在两个表中都存在的行才会出现在结果集中。
- 多种连接:可以在多个表之间执行内连接。
2. 使用SQLite进行内连接
我们将通过Python的sqlite3
模块创建一个数据库,展示如何使用内连接。
2.1 创建数据库和表
首先,我们创建一个SQLite数据库和两个表:students
和 courses
,并插入一些示例数据。
import sqlite3
def create_database():
connection = sqlite3.connect('school.db')
cursor = connection.cursor()
# 创建学生表
cursor.execute('''
CREATE TABLE IF NOT EXISTS students (
student_id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
course_id INTEGER NOT NULL
)
''')
# 创建课程表
cursor.execute('''
CREATE TABLE IF NOT EXISTS courses (
course_id INTEGER PRIMARY KEY,
course_name TEXT NOT NULL
)
''')
connection.commit()
cursor.close()
connection.close()
if __name__ == "__main__":
create_database()
2.2 插入数据
接下来,我们向这两个表中插入一些数据。
def insert_student(student_id, name, course_id):
connection = sqlite3.connect('school.db')
cursor = connection.cursor()
cursor.execute('INSERT INTO students (student_id, name, course_id) VALUES (?, ?, ?)', (student_id, name, course_id))
connection.commit()
cursor.close()
connection.close()
def insert_course(course_id, course_name):
connection = sqlite3.connect('school.db')
cursor = connection.cursor()
cursor.execute('INSERT INTO courses (course_id, course_name) VALUES (?, ?)', (course_id, course_name))
connection.commit()
cursor.close()
connection.close()
if __name__ == "__main__":
# 插入学生数据
students_data = [
(1, 'Alice', 101),
(2, 'Bob', 102),
(3, 'Charlie', 101),
(4, 'David', 103),
(5, 'Eve', 104) # 该学生的课程ID没有对应的课程
]
for student in students_data:
insert_student(*student)
# 插入课程数据
courses_data = [
(101, 'Mathematics'),
(102, 'Physics'),
(103, 'Chemistry')
]
for course in courses_data:
insert_course(*course)
2.3 内连接查询
现在我们将展示如何使用内连接来查询学生及其所选课程的信息。
def fetch_students_with_courses():
connection = sqlite3.connect('school.db')
cursor = connection.cursor()
cursor.execute('''
SELECT students.name, courses.course_name
FROM students
INNER JOIN courses ON students.course_id = courses.course_id
''')
rows = cursor.fetchall()
cursor.close()
connection.close()
return rows
if __name__ == "__main__":
print("学生及其课程信息:", fetch_students_with_courses())
3. 代码整合
下面是将上面所有代码整合到一个完整的程序中。
import sqlite3
def create_database():
connection = sqlite3.connect('school.db')
cursor = connection.cursor()
# 创建学生表
cursor.execute('''
CREATE TABLE IF NOT EXISTS students (
student_id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
course_id INTEGER NOT NULL
)
''')
# 创建课程表
cursor.execute('''
CREATE TABLE IF NOT EXISTS courses (
course_id INTEGER PRIMARY KEY,
course_name TEXT NOT NULL
)
''')
connection.commit()
cursor.close()
connection.close()
def insert_student(student_id, name, course_id):
connection = sqlite3.connect('school.db')
cursor = connection.cursor()
cursor.execute('INSERT INTO students (student_id, name, course_id) VALUES (?, ?, ?)', (student_id, name, course_id))
connection.commit()
cursor.close()
connection.close()
def insert_course(course_id, course_name):
connection = sqlite3.connect('school.db')
cursor = connection.cursor()
cursor.execute('INSERT INTO courses (course_id, course_name) VALUES (?, ?)', (course_id, course_name))
connection.commit()
cursor.close()
connection.close()
def fetch_students_with_courses():
connection = sqlite3.connect('school.db')
cursor = connection.cursor()
cursor.execute('''
SELECT students.name, courses.course_name
FROM students
INNER JOIN courses ON students.course_id = courses.course_id
''')
rows = cursor.fetchall()
cursor.close()
connection.close()
return rows
if __name__ == "__main__":
# 创建数据库和表
create_database()
# 插入数据
students_data = [
(1, 'Alice', 101),
(2, 'Bob', 102),
(3, 'Charlie', 101),
(4, 'David', 103),
(5, 'Eve', 104) # 该学生的课程ID没有对应的课程
]
for student in students_data:
insert_student(*student)
courses_data = [
(101, 'Mathematics'),
(102, 'Physics'),
(103, 'Chemistry')
]
for course in courses_data:
insert_course(*course)
# 查询学生及其课程信息
print("学生及其课程信息:", fetch_students_with_courses())
4. 运行结果
运行此完整的程序将产生如下输出:
学生及其课程信息: [('Alice', 'Mathematics'), ('Bob', 'Physics'), ('Charlie', 'Mathematics'), ('David', 'Chemistry')]
解释
在输出结果中,每一行代表一个学生及其对应的课程信息。注意到学生 "Eve" 没有出现在结果中,因为她的 course_id
为 104
,在 courses
表中没有对应的课程。因此,内连接只返回有匹配的学生和课程。