day-19-数据库-MySQL-多表查询

01.多表查询_数据库表的设计原则:

1.要保证没咧只记录一件事情,如果记录了多个信息,需要分成多列存储:

      商品表            订单表 

id    商品名称  订单id  订单日期  总金额 商品id
1       奔驰        1   2017-10-10  5000  1,3,2
2       宝马        2   2017-10-11  6000  3,2,4
3       篮球
4       电视
上面的是不规范的!!!!

2.为每个表创建一个“主键”字段:以后查询方便,而且被其他表引用也方便。

3.要保证每个表只记录一个事情,如果记录多件事情,要分表存储。

02.多表查询_内连接查询【使用频率最高】

1.隐式内连接:select …from 表一 ,表二 where 两个表的等值条件(主外键的相等关系);

例如:
select * from city,province where city.pid = province.id;

2.显示内连接:select …from 表一 inner join 表二 on 两个表的等值关系(主外键相等关系);

例如:
select * from city inner join province on city.pid = province.id;

注意事项:

1.两个表的等值条件的前缀不是必须的,如果两个表的字段不同名称,可以不用前缀限定;
在“多表查询”时,建议:所需的字段前面都要使用“表名前缀”来说明是要那个表的那个字段。
2.为表起别名:
    如果定义了“别名”,那么不能在是用“原表名”。
3.关于两种连接的写法:

    1.隐式内连接:
        select..from 表一,表二 on 等值条件;//错误;
    2.显示内连接:
        select...from表一 inner join 表二 where 等值条件;//可以的【不建议】
4.这两种语句都可以再添加其他条件:

    1.隐式内连接:
        select..from 表1,表2 where 等值条件 and 其他条件;
    2.显示内连接:
        select...from 表1 inner join 表2 on 两个表的等值关系 where 查询条件;
03.多表查询_外连接查询

1.左外连接:查询出”左表“的所有记录,和”右表“的等值部分的记录;

    select..from 表1 left join 表2 on 两个表的等值条件 where  查询条件;

什么时候用:当想查询两个关联表中的某一个表的”所有记录“。(内连接查询是做不到的)

2.右外连接:查询出”右表“的所有记录,和”左表“的等值部分的记录;

04.多表查询_三表联查:

1.内连接查询:

1.隐式内连接: 表一  中间表  表二

    select...from 表一,中间表,表二 where 表一 和中间表的等值关系 and 中间表和表二的等值关系 and其他查询条件;

2.显示内连接:

    select...from 表一 inner join 中间表 on 表一和中间表等值关系  inner join 表二 on 中间表和表二的等值关系;

2.外连接查询:

1.左外连接:

    select...from 表一 left join 中间表 on 表一和中间表的等值关系 left join 表二 on 中间表和表二的等值关系;

2.右外连接 :

    select...from 表一 right join 中间表 on 表一和中间表的等值关系 right join 表二 on 中间表和表二的等值关系;
05.子查询:

1.例如:

select*from product where price >(select price from product where pname = ’劲霸‘);

2.子查询:可以在一个查询的内部再编写一个查询,这个内部的查询的结果可以作为外部查询的”条件“或者”虚拟表“使用,
这个内部的查询就是:子查询;

3.子查询的结果可以作为外部查询的”条件“;

1).查询价格高于"劲霸"的商品信息:
    select *from product where price > (select price from product where pname = '劲霸');
2).查询"广东省"的所有市:
    select * from city where pid = (select id  from province where proname = '广东');

4.子查询的结果可以作为外部查询的”虚拟表“;

1).查询"广东省"的所有市,同时要求显示"省名称"
    select * from city c,(select * from province where proname = '广东') p  where c.pid = p.id;

    使用其它方式的条件查询:
    select * from city c,province p where c.pid = p.id and p.proname = '广东';
学习目标总结:

1,能够使用内连接进行多表查询:查询结果:两个表中的”等值部分的记录”

a,  说出内连接的两种查询方式
        1).隐式内连接
        2).显示内连接
b,  写出显式内连接的SQL语句
        select ... from 表1 INNER JOIN 表2 ON 两个表的等值条件;
c,  写出隐式内连接的SQL语句
        select ... from 表1 , 表2 where 两个表的等值条件;

2,能够使用外连接进行多表查询

a,  说出外连接的两种查询方式
        1).左外连接:查询结果:左表的所有记录(等值的+不等值的) 和 右表的等值记录。
        2).右外连接:查询结果:右表的所有记录(等值的+不等值的) 和 左表的等值记录。
b,  写出左外连接的SQL语句
        select ... from 表1 LEFT JOIN 表2 ON 两个表的等值条件;
c,  写出右外连接的SQL语句
        select ... from 表1 RIGHT JOIN 表2 ON 两个表的等值条件;

3,能够使用子查询进行多表查询

1).查询价格高于"劲霸"的商品信息:
    select * from products where price > (select price from products where pname = '劲霸');
2).子查询的结果可以作为外部查询的"条件":
    1).查询价格高于"劲霸"的商品信息:
        select *from product where price > (select price from product where pname = '劲霸');
    2).查询"广东省"的所有市:
        select * from city where pid = (select id  from province where proname = '广东');

3).子查询的结果可以作为外部查询的"虚拟表":
    1).查询"广东省"的所有市,同时要求显示"省名称"
        select * from city c,(select * from province where proname = '广东') p  where c.pid = p.id;

        使用其它方式的条件查询:
        select * from city c,province p where c.pid = p.id and p.proname = '广东';
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值