一、外连接
2、格式
(1)左外连接
select column_name
from table_name1 left join table_name2
on 两个表中相同的列标题;
(2)右外连接
select column_name
from table_name1 right join table_name2
on 两个表中相同的列标题;
(3)完全外连接
select column_name
from table_name1 full join table_name2
on 两个表中相同的列标题;
3、实践
例如: 查询每个用户的订单金额,列出uid,uname,ototal
select users.uid,users.uname,orders.ototal
from users left join orders
on users.uid=orders.uid;
例如:查询每个用户的订单数,列出uid,uname,ordernum(订单数)
select users.uid,users.uname,count(orders.uid)
from orders right join users
on orders.uid=users.uid
group by users.uid;
select u.uid,u.uname,count(o.uid)
from orders o right join users u
on o.uid=u.uid
group by u.uid;
二、交叉连接
1、功能
又叫无条件连接,相当于做两个数据表的记录书的乘积。交叉连接是将左表的每一行记录与右表中的所有记录进行连接,返回的的记录行数是两个表的乘积。只有在软件压力测试的时候使用,除此之外尽量不要让交叉连接出现
2、格式
select column,column2...column
from table_name1 cross table_name2;
3、实践
例如:查询会员能购买的所有可能的商品情况
例如:uid、uname、gdid、gdname
我们需要匹配两张表中的所有记录
select users.uid,users.uname,goods.gdid,goods.gdname
from users cross join goods;
三、联合查询
1、功能
联合查询是将多个select语句返回的结果集合并为单个结果集,该结果集包含联合查询中的每一个查询结果集的全部行,参与查询的select语句中的列数和列的顺序必须相同,数据类型也必须兼容
2、格式
select语句一 union[all] select语句二 [union [all]<select语句三>][...n]
3、实践
例如:联合查询uid值为1和2的用户信息,列出uid,uname,usex,
第一组
select uid,uname,usex
from users
where uid=1;
第二组
select uid,uname,usex
from users
where uid=2;
合并查询
select uid,uname,usex
from users
where uid=1
union
select uid,uname,usex
from users
where uid=2;
例如:联合查询tid为1和2的商品信息,列出tid,gdname,gdprice,并gdprice从高到低排序,显示前三行记录。
select tid,gdname,gdprice
from goods
where tid=1;
select tid,gdname,gdprice
-> from goods
-> where tid=2;
select tid,gdname,gdprice
-> from goods
-> where tid=1
-> union
-> select tid,gdname,gdprice
-> from goods
->where tid=2
-> order by tid=2 desc;
四、内连接inner join
1、功能:查询结果集返回与连接条件相匹配的记录行,通常使用比较运算符比较被连接的列值
2、格式、
select [all |distinct] * 列名1[列名2,......列名n]
from 表1 [别名1] join 表2 [别名2]
[on 表1.关系列=表2.关系列]
[where 条件表达式];
说明:
join :泛指各类连接操作的关键字
on连接条件表达式:指定连接的条件。交叉连接无该子句。
where条件表达式:指定查询结果集的选择条件。交叉连接无该子句
3、实践
例如:查询goods表中商品类别为“服饰”的商品id,名称,价格及类型名称。
select goods.gdid,goods.gdname,goods.gdprice,goodstype.tname
from goods join goodstype
on goods.tid=goodstype.tid
where goodstype.tname='服饰';
修订:
select g.gdid,g.gdname,g.gdprice,t.tname
from goods g join goodstype t
on g.tid=t.tid
where t.tname='服饰';
例如;查询用户名为“段湘林”的购买商品的订单总金额
select uname,sum(ototal)
from users u join orders o
on u.uid=o.uid
where u.uname='段湘林';
例如;查询用户名为“段湘林”的购买车中的商品名称,价格,购买数量
select u.uname,g.gdname,g.gdprice,s.scnum
-> from users u join scar s join goods g
-> on u.uid=s.uid and s.gdid=g.gdid
-> where u.uname='段湘林';
例如:查询与用户“蔡准”在同一城市的用户uname和uphone
select u1.uname,u1.uphone,u1.ucity
from users u1 join users u2
on u1.ucity=u2.ucity
where u2.uname='蔡准';