一、表的加法
加法:UNION
语法:
SELECT
FROM
UNION ALL (ALL保留重复行)
SELECT
FROM
二、表的连接
语法:
SELECT 查询列表
FROM 表1 别名 【连接类型 内/外/交叉】
JOIN 表2 别名
ON 连接条件
【 WHERE 筛选条件】
【 GROUP BY 分组】
【 HAVING 筛选条件】
【 ORDER BY 排序列表】
内连接(★): INNER
外连接:
左外(★): LEFT 【 OUTER 】
右外(★): RIGHT 【 OUTER 】
全外: FULL 【 OUTER 】
交叉连接:cross
1.内连接
SELECT 查询列表
FROM 表1 别名
INNER JOIN 表2 别名
ON 连接条件;
分类:
等值、非等值、自连接
特点:
①添加排序、分组、筛选
②INNER可以省略
③筛选条件放在 WHERE后面,连接条件放在 ON后面,提高分离性,便于阅读
2.外连接
应用场景:用于查询一个表中有,另一个表中没有的记录
特点:
1、外连接的查询结果为主表中的所有记录
如果从表中有和主表匹配的,则显示匹配的值
如果从表中没有和主表匹配的,则显示 NULL
外连接查询结果=内连接查询结果+主表中有而从表中没有的记录
2、左外连接,left左边的是主表
右外连接,right join右边的是主表
3、左外和右外交换两个表的顺序,可以实现同样的效果
4、全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1中没有的
3.交叉连接
SELECT ,
FROM 表1
CROSS JOIN 表2;
三、CASE函数
使用一:
CASE 要判断的字段或表达式
WHEN 常量1 THEN 要显示的值1或语句1; (显示值的时候不加“;”,显示语句的时候需要加“;”)
WHEN 常量2 THEN 要显示的值2或语句2;
...
ELSE 要显示的值n或语句n;
END
使用二:类似于多重IF
CASE
WHEN 条件1 THEN 要显示的值1或语句1; (显示值的时候不加“;”,显示语句的时候需要加“;”)
WHEN 条件2 THEN 要显示的值2或语句2;
...
ELSE 要显示的值n或语句n;
END
四、练习
SELECT DISTINCT player
FROM game
INNER JOIN goal
ON id=matchid
WHERE (team1='GER' AND team2=teamid)
OR (team2='GER' AND team1=teamid);
查找出所有比赛的日期,每场比赛中对战双方各自的进球数(也就是team1进球数,team2进球数)
问题分析:
当比赛信息表game中的球队编号(team1)也出现在进球信息表(goal)中时,表示这个球队进球了,使用case语句来统计
SELECT mdate,team1,
SUM(CASE WHEN teamid=team1 THEN 1 ELSE 0 END) score1,
team2,
SUM(CASE WHEN teamid=team2 then 1 else 0 end) score2
FROM game JOIN goal ON matchid = id
GROUP BY id,mdate,team1,team2
ORDER BY mdate,team1,team2;