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 = '广东';