数据库内连接详解

各类资料学习下载合集

​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​​ 表中没有对应的课程。因此,内连接只返回有匹配的学生和课程。