当前位置:   article > 正文

mysql多表查询_mysql多表查询的通用格式

mysql多表查询的通用格式

一、交叉连接查询

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

select * from category, produce
  • 1

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

二、内连接查询

1、隐式内连接

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

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

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

三、外连接查询

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;
  • 1

在这里插入图片描述
左外连接查询是以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;
  • 1

在这里插入图片描述
右外连接查询是以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;
  • 1
  • 2
  • 3
  • 4
  • 5

四、子查询

一条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;
  • 1
  • 2
  • 3
  • 4
-- 方法二:子查询在作为条件在where条件部分
select * from product where price in (select price from product where pname like '%海尔%洗衣机%');
  • 1
  • 2

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

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/690849
推荐阅读
相关标签
  

闽ICP备14008679号