mysql学习笔记(4):多表查询,内链接,外链接

以示例方式展现经常使用的多表查询方式web

数据准备

准备user表和product表 为后续的查询练习作准备sql

-- 用户表(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);

在这里插入图片描述
在这里插入图片描述

1.内链接

1.1笛卡尔积(了解)

多张表无条件联合查询,开发中通常不会使用,可是经常使用的查询都是在此基础上添加条件获得的。svg

select a.*,b.* form a,b;

1.2显示的内链接

select a.*,b.* from a [inner] join b on ab的链接条件

1.3隐式的内链接

select a.*,b.* from a,b where ab的链接条件;

1.4练习:查询用户的订单,没有订单的用户不显示

1.4.1显示内链接查询

select user.*,orders.* from user join orders on user.id=orders.user_id;

在这里插入图片描述

1.4.2隐式的内链接查询

select user.*,orders.* from user,orders where user.id = orders.user_id;

在这里插入图片描述

2.外链接

2.1左外链接

select a.*,b.* from a left [outer] join b on 链接条件;
  • 意义:
    • 先展现join左边的表a,根据条件关联查询join右边的表b,符合条件则展现出来,不符合以null显示

2.2.1练习:查询全部用户的订单详情

--user在左
select user.*,orders.* from user left join orders on user.id = orders.user_id;

在这里插入图片描述

2.2右外链接

select a.*,b.* from b right [outer] join a on 链接条件;
  • 意思
    • 先展现join右边的表的全部数据根据条件关联查询join左边的表符合条件则展现出来,不符合以null显示。

2.2.2练习:查询全部订单的用户详情

-- orders在右
select orders.*,user.* from user right join orders on user.id = orders.user_id;

在这里插入图片描述

2.3互相转换

  • 用左外链接完成练习2.2.2
select orders.*,user.* from orders left join user on user.id = orders.user_id;

在这里插入图片描述

3.子查询

  • 一种嵌套关系,一个查询语句中的条件依赖于另外一个查询的结果

3.1练习:查看用户张三的订单详情

3.1.1分步作法

  • 1.首先查询出user表中,用户名为张三的id
  • 2.而后在orders表中根据user_id查询订单
select id from user where name = '张三';
select * from orders where user_id = ?;

在这里插入图片描述

3.1.1合二为一

select * from orders where user_id = (select id from user where name = '张三');

在这里插入图片描述

3.2练习:查看订单价格大于300的全部用户信息

3.2.1分步

  • 1.首先查询出orders表中价格大于300的user_id
  • 2.根据user_id在user表中查询用户
select user_id from orders where totalprice>300;
select * from user where id in(?,?);--由于这样的id显然比不止一个

在这里插入图片描述

3.2.2合二为一

select * from user where id in(select user_id from orders where totalprice>300);

在这里插入图片描述

3.3练习:查询订单价格大于300的订单信息及用户信息

3.3.1内链接

select orders.*,user.* from orders,user where user.id = orders.user_id and orders.totalprice>300;

在这里插入图片描述

3.2.2子查询-给表起别名

  • 1.先从orders表中查询价格大于300的订单
  • 2.而后把这个查询结果 做为一个临时表,而后再和user进行一次内链接的查询
select * from orders where totalprice>300;
select tmp.*,user.* from tmp,user where user.id = tmp.user_id;
  • 合二为一
select tmp.*,user.* from user, (select * from orders where totalprice>300) as tmp where user.id = tmp.user_id;

在这里插入图片描述