这是对自己学习燕十八老师mysql教程的总结,非常感谢燕十八老师。
依赖软件:mysql5.6
系统环境:win
连接查询
在谈连接查询之前我们需要对数学上的笛卡尔积有一定的了解
现在有两个集合m和n
m = (m1,m2,.....mx)
n =(n1,n2,.....ny)
m*n得到的笛卡尔积有多少个元素?
答:m*n有x*y个元素
连接查询有以下类型
1、左连接
2、右连接
3、内连接
连接查询的作用
从2张或多张表中取出有关联的数据
3种连接查询的详细说明
1、左连接
A left join B on 条件;
这样形成了一个结果集,可以看成一张表 设为C
C表有A,B中的所有列;可以做所有表的操作
考虑到兼容问题和理解上的容易程度都推荐用左连接
# 语法 Select 查询项 from 表名 left join 表名 on 表名.列名 = 表名.列名 # 我是这样理解左连接的:左表不动,右表来匹配 # 示例 # 用左连接取出两表cat_id 对应的cat_name select goods_id,goods.cat_id,category.cat_id,cat_name,goods_name from goods left join category on goods.cat_id=category.cat_id;
2、右连接
左右连接可以互换
A left join B <==> B right join A
A right join B on 条件;
这样形成了一个结果集,可以看成一张表 设为C
C表有A,B中的所有列;可以做所有表的操作
# 语法 Select 查询项 from 表名 right join 表名 on 表名.列名 = 表名.列名 # 我是这样理解右连接的:右表不动,左表来匹配 # 示例 # 用右连接取出两表cat_id 对应的cat_name select goods_id,goods.cat_id,category.cat_id,cat_name,goods_name from category right join goods on category.cat_id=goods.cat_id;
3、内连接
B inner join A on 条件;
这样形成了一个结果集,可以看成一张表 设为C
C表有A,B中的所有列;可以做所有表的操作
# 语法 Select 查询项 from 表名 inner join 表名 on 表名.列名 = 表名.列名 # 我是这样理解内连接的:右左连接的交集 # 示例 # 用内连接取出两表cat_id 对应的cat_name select goods_id,goods.cat_id,category.cat_id,cat_name,goods_name from goods inner join category on category.cat_id=goods.cat_id;
小练习
要求:
Match的hostTeamID与guestTeamID都与Team中的teamID关联
查出 2006-6-1 到2006-7-1之间举行的所有比赛,并且用以下形式列出:
拜仁 2:0 不来梅 2006-6-21
建表时特别主要match是mysql的关键字
select t1.teamName,match_Result,t2.teamName,match_Time from match1 left join Team as t1 on match1.hostTeamID=t1.teamID left join Team as t2 on match1.guestTeamID =t2.teamID where match_Time between '2006-06-01 and '2006-07-01';
联合查询
union查询
使用条件:只要列数一样即可合并(唯一要求)
语法:
sql1 union sql2 表操作
union对重复行的处理:union会去重,union all 不去重复
# 示例1 # 用union取出第4个栏目的商品,第5个栏目的商品,并按价格升序排列 select cat_id,shop_price,goods_name from goods where cat_id=4 union select cat_id,shop_price,goods_name from goods where cat_id=5 order by shop_price asc;
内层的order by 如果没有影响结果集的结果则将被优化过滤掉
# 示例2 # 用union查出第三个栏目下价格前三高的商品,和第四个栏目下价格前2高的商品 (select cat_id,shop_price,goods_name from goods where cat_id=3 order by shop_price desc limit 3) union (select cat_id,shop_price,goods_name from goods where cat_id=4 order by shop_price desc limit 2);
小练习
要求:
将两张结构一样的表相同id的值相加,返回所有id和值
# 第一步 将两表合并成一张表,即表c select id,num from a union all select id,num from b # 第二步对表c from型子查询操作, select id,sum(num) as num from (select id,num from a union all select id,num from b) as c group by id;