如何用Python在MySQL中进行表关联查询

在MySQL数据库中,当需要从多个表获取相关数据时,可以使用JOIN语句将表按某些字段关联起来。以下示例展示在Python中使用 mysql-connector 模块执行各种JOIN语句(INNER JOIN、LEFT JOIN、RIGHT JOIN)的方式。

1. 两张示例表

  • users表:包含用户id、名称name及最爱产品fav。
  • products表:包含产品id与产品名称name。

它们可通过users.favproducts.id字段建立关联。

2. INNER JOIN:只返回匹配的记录

当我们只想获取匹配到的记录(也就是users.fav能在products.id找到对应值)时,用INNER JOIN:

import mysql.connector

mydb = mysql.connector.connect(
    host="localhost",
    user="yourusername",     # 替换成你的MySQL用户名
    password="yourpassword", # 替换成你的MySQL密码
    database="mydatabase"    # 替换为你自己的数据库
)

mycursor = mydb.cursor()

sql = """
SELECT
  users.name AS user,
  products.name AS favorite
FROM users
INNER JOIN products ON users.fav = products.id
"""

mycursor.execute(sql)
myresult = mycursor.fetchall()

for row in myresult:
    print(row)

如果用户没有设置favfav在产品表里没有对应id,这些用户将不出现在结果中。

3. LEFT JOIN:优先显示左表全部记录

假设我们想返回所有用户,即使他们没有对应的产品,也要显示,只是产品信息为空,这时使用LEFT JOIN:

sql = """
SELECT
  users.name AS user,
  products.name AS favorite
FROM users
LEFT JOIN products ON users.fav = products.id
"""
mycursor.execute(sql)

这样即便用户没有设置fav,也会在结果中显示,而产品项为NoneNULL

4. RIGHT JOIN:优先显示右表全部记录

与LEFT JOIN相反,RIGHT JOIN会返回产品表里的所有产品,即使没有用户将其设置为收藏。

sql = """
SELECT
  users.name AS user,
  products.name AS favorite
FROM users
RIGHT JOIN products ON users.fav = products.id
"""
mycursor.execute(sql)

若某产品尚无用户喜欢,该产品也会在结果中出现,只是user部分显示None

小结

  • INNER JOIN:只返回两个表都满足匹配条件的行。
  • LEFT JOIN:优先左表所有行,若右表无匹配则为空。
  • RIGHT JOIN:优先右表所有行,若左表无匹配则为空。

选择合适的JOIN类型可根据需求决定想展示多少信息,从而灵活组合多个表的数据。