jpa 外键 查询结果只有id_MySQL高级查询(一)

d40f87cc101ec11442fd134e691ac613.png

前言

本章我们将学习SQL查询中的高级部分,如内连接、外连接和子查询,通过这些查询技术我们将能够解决项目中复杂的查询问题。

外键约束

MySQL属于关系型的数据库,表之间可以建立关系,如:学生表和成绩表,在成绩表中添加学生编号引用学生表中的学生编号,这样在成绩表中就不用添加重复的学生信息了,这种关系也叫主外键关系,可以通过设置外键约束实现。

可以在创建表时,添加外键约束来保证表和表之间引用完整性,添加外键后:

在插入外键表数据前,必须先插入主表数据

在删除主表数据前,必须先删除外键表数据

语法:

create table 表名

(

字段名类型约束,

... ,

constraint 外键名称 foreign key (外键列) references 主表(主键)

);

代码示例:

use mysql_db;-- 创建成绩表drop table if exists tb_score;create table tb_score(  score_id int primary key auto_increment,  score_stu_id int,  score int,  score_course varchar(20),  constraint fk_score_stu_id foreign key(score_stu_id)   referencestb_student(stu_id)); 

内连接查询

在查询时我们经常要把相关的多张表的字段,一起查询出来,如查询学生成绩时,要显示分数和学生姓名。这个时候我们就需要连接查询了,连接查询分为内连接和外连接,我们先学习内连接查询。

内连接查询的特点是:会查询出相关表中都存在的数据。

语法有两种实现方法:

1)select 字段..... from 表1 inner join 表2

on 表1.主键 = 表2.外键;

注意:这里假设表1是主表,内连接表的前后顺序无关

2)select 字段..... from 表1 , 表2

where 表1.主键 = 表2.外键;

代码示例:

-- 查询学生姓名和成绩方式1  select s.stu_id ,s.stu_name,c.score_course,c.score from   tb_score c innerjoin tb_student s on s.stu_id = c.score_stu_id;-- 方式2   select s.stu_id ,s.stu_name,c.score_course,c.score from    tb_score c ,tb_student s where s.stu_id = c.score_stu_id;

效果相同:

a52078c66ff72d5c1299794ba60b34ac.png

外连接查询

外连接分为左外连接和右外连接:

1) 左外连接

连接查询多张表的数据,显示所有左表的数据,右表存在不相符的数据补null。

语法:

select 字段... from 左表 left join 右表

on 主表.主键 = 子表.外键;

代码示例:

-- 左外连接,查询学生姓名和成绩selects.stu_id,s.stu_name,c.score_course,c.score from tb_student s left join tb_scorec on s.stu_id = c.score_stu_id;

671428a3db34efd01302c9488938f491.png

-- 查询所有参加过考试的同学 selects.stu_id,s.stu_name,c.score_course,c.score from tb_student s left join tb_scorec on s.stu_id = c.score_stu_id where c.score is not null;

f6c18ca5c76de26185e4cd7b4bb1ead3.png

-- 查询所有没参加过考试的同学selects.stu_id,s.stu_name,c.score_course,c.score from tb_student s left join tb_scorec on s.stu_id = c.score_stu_id where c.score is null;

a8a776374370998100a76c2ca4c3e0b5.png

2)右外连接

与左连接相反,显示所有右表数据,左表中不相符的数据补null。

语法:

select 字段... from 左表 right join 右表

on 主表.主键 = 子表.外键;

代码示例:

selects.stu_id,s.stu_name,c.score_course,c.score from tb_score c right jointb_student son s.stu_id = c.score_stu_id;

671428a3db34efd01302c9488938f491.png

总结

在SQL查询中,常用的查询是连接查询,连接查询又分为内连接和外连接查询。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CREATE TABLE `advert` ( `id` int(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(100) COLLATE utf8mb4_bin NOT NULL COMMENT '广告名称', `position_id` int(20) NOT NULL COMMENT '广告位置ID', `media_id` int(20) NOT NULL COMMENT '广告图片ID', `link` varchar(500) COLLATE utf8mb4_bin NOT NULL COMMENT '广告链接', `status` int(1) unsigned zerofill NOT NULL COMMENT '状态,0:未启用,1:已启用,2:已结束', PRIMARY KEY (`id`) USING BTREE, KEY `FK_ad_image` (`media_id`), KEY `FK_ad_position` (`position_id`), CONSTRAINT `FK_ad_image` FOREIGN KEY (`media_id`) REFERENCES `media_file` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `FK_ad_position` FOREIGN KEY (`position_id`) REFERENCES `ad_position` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='广告表'; CREATE TABLE `ad_position` ( `id` int(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(50) COLLATE utf8mb4_bin NOT NULL COMMENT '位置名称', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='广告位置表'; CREATE TABLE `media_file` ( `id` int(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(30) COLLATE utf8mb4_bin NOT NULL COMMENT '媒体文件名称', `type` tinyint(1) NOT NULL COMMENT '媒体文件类型:0-图片,1-视频', `url` varchar(500) COLLATE utf8mb4_bin NOT NULL COMMENT '媒体文件URL地址', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='广告媒体文件表'; springboot项目用java写出三张表的orm对象(使用jpa外键依赖),并在有实现类public interface MyBaseMapper<T> extends Mapper<T>, MySqlMapper<T>,MyInsertListMapper<T> {} public interface AdvertMapper extends MyBaseMapper<Advert> {},如何往advert表添加数据
06-02

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值