使用连接实现多表检索

SELECT 语句的基本语法

内连接(INNER JOIN)

-- 将 t1 里的每一行与 t2 里的每一行进行组合
SELECT * FROM t1 INNER JOIN t2;

-- 连接类型 CROSS JOIN 和 JOIN 都等同于 INNER JOIN
SELECT t1.*,t2.* FROM t1 INNER JOIN t2 WHERE t1.i1 = t2.i2;
SELECT t1.*,t2.* FROM t1 CROSS JOIN t2 WHERE t1.i1 = t2.i2;
SELECT t1.*,t2.* FROM t1 JOIN t2 WHERE t1.i1 = t2.i2;
-- 连接运算符","也与之类似。尽量避免使用逗号运算符,因为可能会导致语法错误。
SELECT t1.*,t2.* FROM t1,t2 WHERE t1.i1 = t2.i2;
-- 用 ON 子句代替 WHERE 子句
SELECT t1.*,t2.* FROM t1 INNER JOIN t2 ON t1.i1 = t2.i2;
-- 使用 USING() 子句:要求被连接的列必须同名
SELECT tbl_name1.*,tbl_name2.* FROM tbl_name1 INNER JOIN tbl_name2 USING(id);

对被连接表里的列引用进行限定
尽量使用别名进行限定。

左(外)连接和右(外)连接
外连接:除了显示同样的匹配结果,还显示其中一个表在另一个表里没有匹配的行也显示出来。分为左连接右连接

左连接(LEFT JOIN)
对于左表查询出的每一行,不管它在右表中是否有匹配,LEFT JOIN 都会强制结果集包含这一行记录,只不过来自右表的所有列都为 NULL
右连接相反。

-- 左连接
SELECT t1.*,t2.* FROM t1 LEFT JOIN t2 ON t1.i1 = t2.i2;
-- 将左表中的那些在右表中无匹配的行找出来
SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.i1 = t2.i2
WHERE t2.i2 IS NULL ;

-- 查询哪些学生在给定考试事件中没有成绩
SELECT st.name,st.student_id,g.data,g.event_id,g.category
FROM student st
INNER JOIN grade_event g
LEFT JOIN score s
ON st.student_id =  s.student_id
AND g.event_id = s.event_id
WHERE s.score IS NULL
ORDER BY st.student_id,g.event_id;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值