半栈工程师

使用连接实现多表检索

2018-01-05  本文已影响0人  TinyDolphin

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;
上一篇下一篇

猜你喜欢

热点阅读