mysql多表查询

一、交叉连接查询

语法:select 字段1 [,字段N] from 表1,表2 [,表N]

select * from category, produce

交叉查询会产生笛卡尔积,表与表之间的连接相当于是在做乘法运算,运算结果很多记录都是无意义的。(尽量少用)

二、内连接查询

1、隐式内连接

格式:select 字段1 [,字段N] from 表1,表2 [,表N] where 连接条件

select * from category c, produce p where c.cid = p.c_id;

2、显示内连接

格式:select 字段1 [,字段N] from 表1 [inner] join 表2 on 表1.字段 = 表2.字段

select * from category c join product p on c.cid = p.c_id;

三、外连接查询

1、左外连接

格式:select 字段1 [,字段N] from 表1 left [outer] join 表2 on 表1.字段 = 表2.字段

select * from category c left join product p on c.cid =p.c_id;

在这里插入图片描述
左外连接查询是以left outer join 语句左边的表为基准表,保证左表数据完整,如果右表没有与左表数据匹配的记录,那么右表将以一条null数据填充查询结果,保证左表的完整。

2、右外连接

格式:select 字段1 [,字段N] from 表1 right [outer] join 表2 on 表1.字段 = 表2.字段

select * from product p right join category c on p.c_id = c.cid;

在这里插入图片描述
右外连接查询是以right outer join语句右边的表为基准表,保证右表数据完整,如果左表没有与右表数据匹配的记录,那么左表将以一条null数据填充查询结果,保证右表的完整。

小练习:

-- 查询价格在一万以内名字中包含 '想' 的商品所有信息(包括分类信息)
select * from category c inner join product p on c.cid = p.c_id where p.price < 10000 and p.pname like '%想%';

-- 查询所有分类商品的个数
select c.cid, count(p.pid) from category c left outer join product p on c.cid = p.c_id group by c.cid;

四、子查询

一条select语句结果作为另一条select语法一部分(查询条件,查询结果,表等)

语法:
select 字段1 [, 字段N ] from 表1 [, 表N ]
where 字段1 OPERATOR操作符
    (select 字段1 [, 字段2] FROM 表1 [, 表2] [where 条件])

  • 小例子1:
    需求:查询和海尔洗衣机同样价格的商品
-- 1.先查询海尔洗衣机的价格 记录下28512
select price from product where pname like '%海尔%洗衣机%';
-- 2.查询价格为28512的商品
select * from product where price = 28512;
-- 方法二:子查询在作为条件在where条件部分
select * from product where price in (select price from product where pname like '%海尔%洗衣机%');

把一条SQL语句的查询结果当做条件值传入到另一条SQL语句中,此时海尔洗衣机这条SQL返回一个结果,这种叫单行单列子查询

-- 方法三:子查询作为临时表在from后
select p.* from product p join (select price from product where pname like '%海尔%洗衣机%') t on p.price = t.price;
  • 小例子2:
    需求:查询所有已有商品的商品类别名称
select * from category where cid in (select DISTINCT c_id from product);

查询部分返回了多条记录,这种子查询叫做单行多列子查询

  • 小例子3:
    需求:把查询结果当成临时表存储起来然后在查询结果基础上再进行查询
select * from (select c.cname, p.* from product p join category c on p.c_id=c.cid) a where a.price > 100;

把一个查询结果直接封装为一个虚拟表a表,然后在封装的虚拟表a表的基础上又做查询,这种子查询叫做 多行多列子查询

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值