SQL题目练习---三表联查

一、数据库中有三张如下所示的表(学生表,教师表,成绩表),查出橘右京老师的学生所有分数,按照成绩倒序排列;

分析:1)本质是一个三表联查问题,SQL语句为: 

select * from A inner join 表B on 表A.列1=表B.列2 inner join 表C on 表B.列1=表C.列1

2)降序问题语法为:order by  字段   desc;

-- 查询橘右京的学生所有分数按照倒序排列

use dali

select stuId,stuName,stuScore,teaName from score s inner join students st on  s.stuId=st.id 
inner join  teacher t on st.teaId=t.id where teaName="橘右京" order by s.stuScore desc;

结果:

附:创表过程

-- 创建数据库dali
create database dali;
use dali;
-- 创建学生表
CREATE TABLE `students` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `stuName` varchar(12) NOT NULL COMMENT '学生姓名',
  `teaId` int(11) NOT NULL COMMENT '教师id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='学生表';
-- 创建教师表
CREATE TABLE `teacher` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `teaName` varchar(12) NOT NULL COMMENT '老师姓名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='教师表';
-- 创建成绩表
CREATE TABLE `score` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `stuScore` int(12) NOT NULL COMMENT '学生成绩',
  `stuId` int(11) NOT NULL COMMENT '学生id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='成绩表';

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
假设我们有三张表:user、order、order_item,user表和order表是一对多关系,order表和order_item表是一对多关系。现在我们想要查询一个用户的所有订单及其订单详情,可以使用mybatis-plus的Wrapper类来完成三表联查。 1. 首先定义三个实体类:User、Order、OrderItem,分别对应user、order、order_item表。 2. 在mapper中定义三个方法,分别对应三个表的查询,例如: ``` public interface UserMapper extends BaseMapper<User> { List<User> selectUserWithOrders(Long userId); } public interface OrderMapper extends BaseMapper<Order> { List<Order> selectOrderWithOrderItems(Long orderId); } public interface OrderItemMapper extends BaseMapper<OrderItem> { // 略 } ``` 3. 使用Wrapper类进行三表联查,例如: ``` public List<User> selectUserWithOrders(Long userId) { QueryWrapper<User> userWrapper = new QueryWrapper<>(); userWrapper.eq("id", userId); List<User> userList = selectList(userWrapper); if (CollectionUtils.isEmpty(userList)) { return null; } QueryWrapper<Order> orderWrapper = new QueryWrapper<>(); orderWrapper.eq("user_id", userId); List<Order> orderList = orderMapper.selectList(orderWrapper); for (User user : userList) { user.setOrderList(orderList); for (Order order : orderList) { QueryWrapper<OrderItem> orderItemWrapper = new QueryWrapper<>(); orderItemWrapper.eq("order_id", order.getId()); List<OrderItem> orderItemList = orderItemMapper.selectList(orderItemWrapper); order.setOrderItemList(orderItemList); } } return userList; } ``` 以上代码中,我们先使用user_id查询订单,再使用order_id查询订单详情,最后将订单详情设置到订单中,订单设置到用户中,完成三表联查。 需要注意的是,这种方式可能存在N+1问题,即查询一个用户的所有订单及其订单详情时,需要执行N+1次SQL,其中N为订单数量。可以考虑使用join方式优化查询性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值