-- 多表查询:语法如下SELECT<字段名列表>FROM<表名或视图>[innerjoin<表名或视图>on 条件][WHERE<查询条件>][GROUPBY<分组的字段名][ORDERBY<排序的列名>[ASC或DEsC]][LMIT[位置偏移量,]行数];-- 连接查询1.交叉连接查询(基本不会使用-得到的是两个表的笛卡尔积)[了解]2.内连接查询(使用的关键字 innerjoin-- inner可以省略)
内连接原理 : 内连接根据我们连接条件大大的缩小的笛卡尔积的范围;在内连接中只有主外键能够关联上的数据才能被查询出来!
隐式内连接:select*from A,B where 条件;
显示内连接:select*from A innerjoin B on 条件;(推荐写法)3.外连接查询(使用的关键字 outerjoin-- outer可以省略)
外连接可以把关联查询的两张表的一张表作为主表,另外一张作为从表,而外链接使用保证主表的数据完整;
查询原理 : 左外连接查询是以left关键字左边的表为基准表,保证左表数据完整,如果右表没有与左表数据匹配的记录,那么右表将以一条null数据填充查询结果,保证左表的完整
左外连接:select*from A leftouterjoin B on 条件;
右外语法: select*from A rightouterjoin B on 条件;(了解)-- 案例-- 1.查询价格在一万以内名字中包含 '想' 的商品
隐式内连接:select*from category c,product p where c.cid = p.c_id and p.price <=10000and p.pname like'%想%';
显式内连接:分工明确 不容易写乱套
select*from category c
innerjoin product p on c.cid = p.c_id -- 此处设置管理where p.price <10000and p.pname like'%想%';-- 此处设置条件-- 2.查询所有分类商品的个数
左外连接:
select c.cname,count(p.c_id) gs from category c
leftjoin product p on c.cid = p.c_id
groupby c.cname;-- 子查询
定义:一条select语句结果作为另一条select语法一部分(查询条件,查询结果,表等)。
语法:select*from 表名 where 查询字段 >|<|=(查询条件,查询结果,表等);-- 案例 : 查询和海尔洗衣机同样价格的商品
连接查询: 没法连接呀,发生在一张表的查询,关联字段也找不到,你叫我怎么连接?啊?怎么连接?
单行单列子查询:select*from product p where p.price =(select p.price from product p where p.pname like'%海尔%洗衣机%');-- 案例 : 查询所有商品的商品类别名称
单行多列子查询:select*from category where cid in(selectDISTINCT c_id from product);-- 下面这条语句就是把一个查询结果直接封装为一个虚拟表a表 然后在封装的虚拟表a表的基础上又做查询 这种子查询叫做 多行多列子查询
多行多列子查询:select*from(select p.*,c.cname from product p innerjoin category c on p.c_id = c.cid) a where a.price >10000