一、交叉连接查询
语法: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表的基础上又做查询,这种子查询叫做 多行多列子查询