前言:
前面我们了解了多表的设计及其创建,为了不和上一章的数据混合本章还是会建立新的数据库 进行数据的练习。
补充:笛卡尔积(了解)
多张表无条件联合查询,没什么意思。
例如:查询user orders表内所有字段。
语法:
select user.*,orders.* from user,orders;
一 多表查询
1 知识架构图:
2 详细介绍(假如有a,b表来举例子)
- 内连接
格式1:显式内连接(推荐使用)
语法:
(*代表查所有字段)
select a.*,b.* from a[inner] join b on ab链接条件
格式2:隐式内连接
语法:
select a.*,b.* from a,b where ab链接条件
- 外链接
格式1:左外连接(记住这个就行了)
select a.*,b.* from a left [outer] join b on 链接条件
意思:先展示join左边表的全部数据,根据条件关联查询join右边的表,符合条件展示出来,不符合
条件以null展示。
格式2:右外连接
select a.*,b.* from b right join orders on user.id=orders.id;
意思:先展示join右面边表的全部数据,根据条件关联查询join左边的表,符合条件展示出来,不符合
条件以null展示。
注意:格式1 格式2 可以等价转换 记住一个就行。
- 子查询 当一个查询是另一个查询的条件时,称之为子查询
3 准备数据(建库 建表 初始化数据)
首先创建个新数据库(day0602)
数据表的创建及其初始化(准备好了数据 如下)
初始化数据:
-- 用户表(user)
create table `user` (
`id` int auto_increment primary key,
`username` varchar(50) -- 用户姓名
);
-- 订单表(orders)
create table `orders` (
`id` int auto_increment primary key,
`price` double,
`user_id` int
);
-- 给订单表添加外键约束
alter table orders add constraint user_fk foreign key (user_id) references user(id);
-- 向user表中添加数据
insert into user values(3,'张三');
insert into user values(4,'李四');
insert into user values(5,'王五');
insert into user values(6,'赵六');
-- 向orders 表中插入数据
insert into orders values(1,1314,3);
insert into orders values(2,1314,3);
insert into orders values(3,15,4);
insert into orders values(4,315,5);
insert into orders values(5,1014,null);
这样表我们就建立完成了,也添加号数据了嘿嘿
如下表:我们发现用户赵六是没有下订单的(我们观察orders表 发现id 为5 的项是没有user_id的)
4 练习:
1内连接练习:
查询用户的订单,没有订单的用户不显示
分析没有下订单的用户不显示就行了
隐式内连接查询:
(此处查询全部字段,当然我们也可以查询一个或者多个字段)
select user.*,orders.* from user,orders where user.id=orders.id;
显式内连接查询:
select user.*,orders.* from user join orders on user.id=orders.id;
2外链接练习(左外连接)
查询所有用户的订单详情
select user.*,orders.* from user left join orders on user.id=orders.id;
3 子查询 练习
3.1查看用户为张三的订单详情
分析: 先查询张三的id 再根据他的id 查询订单
select id from user where username = '张三';
select * from orders where user_id = 3;--结果为3
以上执行两部太麻烦,两者和2 为1
select * from orders where user_id = ( select id from user where username = '张三');
3.2 查询出订单的价格大于300的所有用户信息。
分析 订单表中没有用户但是有用户id 先先查出用户id根据用户id用户表中查询用户
tip:你查询出来的用户id是一组数正好在结果查询中可以使用in关键字
3.3查询订单价格大于300的订单信息及相关用户的信息。
内连接方式:
分析:先查询所有的订单信息,用户信息我们可以。用笛卡尔积就行。
订单价格大于300 我们在笛卡尔积的语句中加where条件就行
还有有关联条件
select user.*,orders.* from user,orders where orders.price>300;
子查询方式:(将查询结果作为一张临时表)
select user.*,temp.* from user,(select * from orders where price>300 )as temp where user.id = temp.user_id;
(描述的不够明白这个例子 初学刚总结的 。。。)
ps:给表起别名
表 [as] 别名
小结 :
刚刚接触查询还是比较迷惑的特别是多表查询不知道该怎么挖掘信息,相信练习多了就熟练了!!!