交叉查询(笛卡尔积)

  • 语法:select * from A,B;


开发中没有实际意义,是所有查询的最大集,会出现数据的冗余,影响查询性能和结果的可读性,需要避免。
image.png

连接查询

好处:查询效率高,同时可以解决数据的冗余(避免笛卡尔积)
缺点:语法的理解比较困难。
在实际使用中,推荐使用关联查询。
**

内连接查询

作用:可以很好的避免笛卡尔积。

  • 隐式内连接 - select * from A,B where 条件;
  • 显式内连接 - select * from A inner join B on 条件;
    1. # 隐式
    2. select * from category,products where cid=category_id and flag=1;
    3. # 显式
    4. select * from category inner join products on cid=category_id where flag=1;

    外连接查询

    左外连接

    左外连接:查询左表所有的数据,关联的右表数据是否显示,取决于条件是否成立,如果成立显示数据,如果不成立显示null。
    格式:
    select * from A left outter join B on 连接条件; ```sql select * from category c left outer join products p on c.cid=p.category_id;

select c.cname,count(category_id) as num from category c left outer join products p on c.cid=p.category_id group by cname;

<a name="A40iO"></a>
### 右外连接
**右外连接:查询右表所有的数据,关联的左表数据是否显示,取决于条件是否成立,如果成立显示数据,如果不成立显示null。**<br />**格式:**<br />**`select * from A right outer join B on 连接条件;`**
```sql
select * from category c right outer join products p on c.cid=p.category_id;

子查询

子查询:一条select语句结果作为另一条select语句的一部分。

#查询条件
select cid from category where cname='化妆品';
select * from products p where p.category_id='c003';
#子查询
select * from products p where p.category_id=(select cid from category where cname='化妆品');