MySQL主键与外键使用困惑:如何获取目标关联查询结果
关联查询获取用户及对应成绩信息
看起来你是想把users表和grades表的数据结合起来,拿到包含用户ID、用户名以及对应作业成绩的完整结果对吧?咱们利用两个表之间的外键关联(username字段),用JOIN语句就能轻松实现。
基础关联查询(仅返回有成绩的用户)
如果只需要获取那些有作业成绩的用户信息,可以用INNER JOIN,它只会返回两个表中匹配关联条件的记录:
SELECT u.id, u.username, g.assignmentName, g.mark FROM users u INNER JOIN grades g ON u.username = g.username;
执行这个语句后,你会得到以下结果:
| id | username | assignmentName | mark |
|---|---|---|---|
| NULL | a | a1 | 10 |
| NULL | a | a2 | 20 |
| NULL | c | a1 | 30 |
包含所有用户的查询(含无成绩的用户)
要是想展示所有用户,哪怕是没有提交作业的用户(比如你的数据里的用户b),就用LEFT JOIN,它会返回左表(users)的所有记录,右表(grades)没有匹配的字段会显示NULL:
SELECT u.id, u.username, g.assignmentName, g.mark FROM users u LEFT JOIN grades g ON u.username = g.username;
这个语句的结果会包含用户b:
| id | username | assignmentName | mark |
|---|---|---|---|
| NULL | a | a1 | 10 |
| NULL | a | a2 | 20 |
| NULL | b | NULL | NULL |
| NULL | c | a1 | 30 |
小建议:优化users表的主键设计
另外注意到你的users表把username设为主键,而id字段允许为NULL,其实更规范的做法是用自增ID作为主键(用户名可能存在修改的需求,而自增ID是固定不变的),可以通过以下SQL调整:
-- 先移除原有的主键(username) ALTER TABLE users DROP PRIMARY KEY; -- 修改id字段为非空自增 ALTER TABLE users MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT; -- 设置id为主键 ALTER TABLE users ADD PRIMARY KEY (id);
调整后,记得把grades表的外键关联也改成关联users.id,这样表结构会更健壮。
内容的提问来源于stack exchange,提问作者user9314692
相关产品推荐
相关产品推荐

