在MySQL数据库中,当需要从多个表获取相关数据时,可以使用JOIN语句将表按某些字段关联起来。以下示例展示在Python中使用 mysql-connector
模块执行各种JOIN语句(INNER JOIN、LEFT JOIN、RIGHT JOIN)的方式。
1. 两张示例表
users
表:包含用户id、名称name及最爱产品fav。products
表:包含产品id与产品名称name。
它们可通过users.fav
和products.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)
如果用户没有设置fav
或fav
在产品表里没有对应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
,也会在结果中显示,而产品项为None
或NULL
。
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类型可根据需求决定想展示多少信息,从而灵活组合多个表的数据。