多表查询-学生表,班级表,课程表,班级课程表

多表查询:
学生表、班级表、课程表、班级课程表

-- 多对多
-- 班级表
CREATE  TABLE  banji(
id  INT  PRIMARY  KEY  AUTO_INCREMENT,
` name VARCHAR (10)  NOT  NULL
);
INSERT  INTO  banji(` name `)  VALUES ( 'java1807' ),( 'java1812' );
SELECT  FROM  banji;
-- 学生表
CREATE  TABLE  student(
id  INT  PRIMARY  KEY  AUTO_INCREMENT,
` name VARCHAR (10)  NOT  NULL ,
age  INT ,
gender  CHAR (1),
banji_id  INT ,
FOREIGN  KEY (banji_id)  REFERENCES  banji(id)
);
INSERT  INTO  student(` name `,age,gender,banji_id) 
VALUES ( '张三' ,20, '男' ,1),( '李四' ,21, '男' ,2),( '王五' ,20, '女' ,1);
-- Cannot add or update a child row: a foreign key constraint fails (`java1812`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`banji_id`) REFERENCES `banji` (`id`))
INSERT  INTO  student(` name `,age,gender,banji_id) 
VALUES ( '张三' ,20, '男' ,3);
SELECT  FROM  student;
-- 课程表
CREATE  TABLE  course(
id  INT  PRIMARY  KEY  AUTO_INCREMENT,
` name VARCHAR (10)  NOT  NULL ,
credit  INT  COMMENT  '学分'
);
INSERT  INTO  course(` name `,credit)  VALUES ( 'Java' ,5),( 'UI' ,4),( 'H5' ,4);
SELECT  FROM  course;
-- 班级课程表
CREATE  TABLE  banji_course(
-- id int PRIMARY KEY AUTO_INCREMENT,
banji_id  INT ,
course_id  INT ,
PRIMARY  KEY (banji_id,course_id),  -- 联合主键
FOREIGN  KEY (banji_id)  REFERENCES  banji(id),  -- banji_id既是联合主键又是外键
FOREIGN  KEY (course_id)  REFERENCES  course(id)  -- course_id既是联合主键又是外键
);
INSERT  INTO  banji_course(banji_id,course_id)  VALUES (1,1),(1,3),(2,1),(2,2),(2,3);
SELECT  FROM  banji_course;

-- 子查询:嵌套查询,一个查询语句是另一个查询语句的条件
-- 查询班级是java1812班所有学生信息
SELECT  FROM  student  WHERE  banji_id=2;
SELECT  id  FROM  banji  WHERE  ` name `= 'java1812' ;
SELECT  FROM  student  WHERE  banji_id=( SELECT  id  FROM  banji  WHERE  ` name `= 'java1812' );
-- 班级是java1807班或者java1812班所有学生信息
SELECT  FROM  student  WHERE  banji_id=1  OR  banji_id=2;
SELECT  FROM  student  WHERE  banji_id  IN (1,2);
SELECT  id  FROM  banji  WHERE  ` name `= 'java1807'  OR  ` name `= 'java1812' -- 1,2
SELECT  FROM  student  WHERE  banji_id  IN ( SELECT  id  FROM  banji  WHERE  ` name `= 'java1807'  OR  ` name `= 'java1812' );
-- "=":要求子查询只有一个结果。 "in":子查询可以有多个结果

关联查询:inner join
多表查询:
学生表、班级表、课程表、班级课程表

-- 多对多
-- 班级表
CREATE  TABLE  banji(
id  INT  PRIMARY  KEY  AUTO_INCREMENT,
` name VARCHAR (10)  NOT  NULL
);
INSERT  INTO  banji(` name `)  VALUES ( 'java1807' ),( 'java1812' );
SELECT  FROM  banji;
-- 学生表
CREATE  TABLE  student(
id  INT  PRIMARY  KEY  AUTO_INCREMENT,
` name VARCHAR (10)  NOT  NULL ,
age  INT ,
gender  CHAR (1),
banji_id  INT ,
FOREIGN  KEY (banji_id)  REFERENCES  banji(id)
);
INSERT  INTO  student(` name `,age,gender,banji_id) 
VALUES ( '张三' ,20, '男' ,1),( '李四' ,21, '男' ,2),( '王五' ,20, '女' ,1);
-- Cannot add or update a child row: a foreign key constraint fails (`java1812`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`banji_id`) REFERENCES `banji` (`id`))
INSERT  INTO  student(` name `,age,gender,banji_id) 
VALUES ( '张三' ,20, '男' ,3);
SELECT  FROM  student;
-- 课程表
CREATE  TABLE  course(
id  INT  PRIMARY  KEY  AUTO_INCREMENT,
` name VARCHAR (10)  NOT  NULL ,
credit  INT  COMMENT  '学分'
);
INSERT  INTO  course(` name `,credit)  VALUES ( 'Java' ,5),( 'UI' ,4),( 'H5' ,4);
SELECT  FROM  course;
-- 班级课程表
CREATE  TABLE  banji_course(
-- id int PRIMARY KEY AUTO_INCREMENT,
banji_id  INT ,
course_id  INT ,
PRIMARY  KEY (banji_id,course_id),  -- 联合主键
FOREIGN  KEY (banji_id)  REFERENCES  banji(id),  -- banji_id既是联合主键又是外键
FOREIGN  KEY (course_id)  REFERENCES  course(id)  -- course_id既是联合主键又是外键
);
INSERT  INTO  banji_course(banji_id,course_id)  VALUES (1,1),(1,3),(2,1),(2,2),(2,3);
SELECT  FROM  banji_course;

-- 子查询:嵌套查询,一个查询语句是另一个查询语句的条件
-- 查询班级是java1812班所有学生信息
SELECT  FROM  student  WHERE  banji_id=2;
SELECT  id  FROM  banji  WHERE  ` name `= 'java1812' ;
SELECT  FROM  student  WHERE  banji_id=( SELECT  id  FROM  banji  WHERE  ` name `= 'java1812' );
-- 班级是java1807班或者java1812班所有学生信息
SELECT  FROM  student  WHERE  banji_id=1  OR  banji_id=2;
SELECT  FROM  student  WHERE  banji_id  IN (1,2);
SELECT  id  FROM  banji  WHERE  ` name `= 'java1807'  OR  ` name `= 'java1812' -- 1,2
SELECT  FROM  student  WHERE  banji_id  IN ( SELECT  id  FROM  banji  WHERE  ` name `= 'java1807'  OR  ` name `= 'java1812' );
-- "=":要求子查询只有一个结果。 "in":子查询可以有多个结果

关联查询:inner join
-- 列出所有学生学习的课程名称
-- 学生姓名   班级名称   课程名称    学分

-- inner join on 只有左右两个表有关联的才查询出来
-- left join on 左表中都显示出来,右表没有显示空
-- right join on 右表都显示,左表没有显示空
  SELECT 
FROM  student  as  INNER  JOIN  banji  as  b
on  s.banji_id=b.id;
SELECT 
FROM  student  as  LEFT  JOIN  banji  as  b
on  s.banji_id=b.id;
SELECT 
FROM student  as s  RIGHT  JOIN banji  as b
on  s.banji_id=b.id;
-- 没有分配课程也显示出来。
-- 班级名称   课程名称   学分
SELECT b.` nameAS  '班级名称',c.` nameas  '课程名称',c.credit  as  '学分'
FROM banji  AS b  LEFT  JOIN banji_course  AS bc
ON b.id=bc.banji_id
LEFT  JOIN course  as c
ON  bc.course_id=c.id;
总结:多表查询主要是注意下面两点
1、整个查询涉及到几张表,涉及到几张表就连接这几张表。
2、如果涉及到这几张表的关系搞不清楚,画一下ER图,弄清楚表和表之间的关系(就是根据外键建立的关系)
-- 统计每个班有多少学生
-- 学生数量
SELECT  COUNT (id)  as  '学生数量' 
FROM  student  GROUP  BY  banji_id;
-- 班级名称    数量
SELECT 
FROM  student  as 
INNER  JOIN  banji  as  b
ON  s.banji_id=b.id;
把inner join之后查询的结果当成一张表来使用, 在这个结果集里面根据班级id统计每个班级下面学生数量。
-- 列出所有学生学习的课程名称
-- 学生姓名   班级名称   课程名称    学分

-- inner join on 只有左右两个表有关联的才查询出来
-- left join on 左表中都显示出来,右表没有显示空
-- right join on 右表都显示,左表没有显示空
  SELECT 
FROM  student  as  INNER  JOIN  banji  as  b
on  s.banji_id=b.id;
SELECT 
FROM  student  as  LEFT  JOIN  banji  as  b
on  s.banji_id=b.id;
SELECT 
FROM student  as s  RIGHT  JOIN banji  as b
on  s.banji_id=b.id;
-- 没有分配课程也显示出来。
-- 班级名称   课程名称   学分
SELECT b.` nameAS  '班级名称',c.` nameas  '课程名称',c.credit  as  '学分'
FROM banji  AS b  LEFT  JOIN banji_course  AS bc
ON b.id=bc.banji_id
LEFT  JOIN course  as c
ON  bc.course_id=c.id;
总结:多表查询主要是注意下面两点
1、整个查询涉及到几张表,涉及到几张表就连接这几张表。
2、如果涉及到这几张表的关系搞不清楚,画一下ER图,弄清楚表和表之间的关系(就是根据外键建立的关系)
-- 统计每个班有多少学生
-- 学生数量
SELECT  COUNT (id)  as  '学生数量' 
FROM  student  GROUP  BY  banji_id;
-- 班级名称    数量
SELECT 
FROM  student  as 
INNER  JOIN  banji  as  b
ON  s.banji_id=b.id;
把inner join之后查询的结果当成一张表来使用, 在这个结果集里面根据班级id统计每个班级下面学生数量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/36726.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android课程表

最近开发的android版课程表,已经打包,欢迎使用。 已更新到了1.2版本,美化了界面显示效果,使显示更加美观。 使用截图如下: 联系邮箱:wangtian.rui163.com 新浪微博:http://weibo.com/tianru…

课程表小程序(0基础从入门到发布,做给同学们看)

个人主页:个人主页 系列专栏:前端小项目 热爱前端,有共同兴趣的小伙伴,一起交流哦。 🔮 效果动图: 目录 🍀准备工具 🌳准备代码: 🌞部署项目 &#x1f9a…

创建学生表,课程表,班级表,班级课程表

首先创建班级表,因为班级跟学生为一对多关系,先创建班级表能在学生表中插入外键 班级表 CREATE TABLE banji(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(10) NOT NULL ); INSERT INTO banji(name)VALUES(class1),(class2); SELECT * FROM banji;…

用HTML设计一个课程表

用HTML设计一个课程表 如下是其效果图&#xff1a; 其HTML的代码&#xff1a; <html > <head> <title>课程表 自我创作</title> </head> <body bgcolor "lightblue"> <table b…

android实现课程表界面

这是我第一次写博客&#xff0c;也是刚开始学习android&#xff0c;做了一个课程表界面的小练习。做的过程中遇到了一些问题也参考了许多人的解决方法&#xff0c;希望在这里总结下&#xff0c;就当做学习笔记。如果能对那些像我一样的初学者有一点点帮助就更好啦&#xff0c;要…

微信课程表小程序(0基础教你用,从入门到发布)

微信小程序课程表&#xff0c;微信小程序开发 目录 1.效果图&#xff1a; 2.准备工具&#xff1a; 3.下载代码 4.部署项目 1.打开微信小程序&#xff1a; 2.AppID查看方式: 3.拿出你的小手机扫码、 5.修改课程 6.项目发布 演示&#xff1a; 1.效果图&#xff1a; 2.准备工…

课程表管理系统

课程表管理系统 1.学生/教师用户登录界面 2.首页 3.课程详细 4.保存csv功能 5.管理员登录界面 6.管理员后台界面 7.代码详解 8.项目部署 课程表管理系统 1.学生/教师用户登录界面 2.首页 3.课程详细 点击已有课程&#xff0c;可弹出课程详细数据。 4.保存csv功能 点击…

Android课程表App

最近写了个简单的Android 课程表App,我是个初学者,这个App里使用了&#xff1a; Android内置的SQLite数据库储存课程数据。课程的视图用CardView卡片视图。 课程的View是动态加入的,动态添加View的好处是很灵活 如果靠静态的XML构建的话就有点难扩展了&#xff0c;因为你不知道…

微信小程序实现课程表

1.实现效果 2.实现步骤 2.1 获取当前日期一周数据 Date.getDay(): getDay() 方法返回指定日期是星期几&#xff08;从 0 到 6,星期日为 0&#xff0c;星期一为 1&#xff0c;依此类推。&#xff09;。 var d new Date();//2022-8-11 var n d.getDay();//4--周四Date.getDate…

学生表,选课表,课程表

课后作业 一、用Navicat Premium 12软件创建三张表&#xff1a;学生表、选课表、课程表 学生表(学号, 姓名, 性别, 年龄, 电话) - 学号是字符串类型 选课表(学号, 课程号, 成绩) 课程表(课程号, 课程名, 课时数) - 课程号是字符串类型 学生表&#xff1a; 选课表&#xff1a; …

Android课程表的设计开发

Android课程表的设计开发 下载链接 鉴于很多人需要源码&#xff0c;这里给下代码。 下载地址&#xff08;需要5积分&#xff0c;支持下&#xff08;积累点积分。。。&#xff09;&#xff0c;没有积分的直接留言邮箱&#xff0c;我发给你或者找其他已经发过的人要下&#xf…

超级课程表课表的界面的实现

由于毕业设计有一个功能模块是课程表,就想模仿一下超级课程表的界面,可是开始做的时候却没有一点头绪,百度google均无果,在CSDN和知乎上提问了也没人回答,总之自己鼓捣了几天还是弄出来了,虽然实现的方法很挫。。。因为有好几个人都发私信问我怎么实现的,现在毕设做完了…

尤瓦尔最新演讲:人工智能不需要意识就可以毁灭人类文明

我们现在必须与一种新的大规模杀伤性武器作斗争&#xff0c;这种武器可以消灭我们的精神和社会世界。核武器和人工智能最大的区别是&#xff0c;核武器不能制造更强大的核武器。 但人工智能可以产生更强大的人工智能&#xff0c;所以我们需要在人工智能失去控制之前迅速采取行动…

chatgpt赋能python:Python绘制雷达图教程

Python绘制雷达图教程 在数据分析和可视化中&#xff0c;雷达图是一种非常有用的可视化工具&#xff0c;用于显示多个变量的相对大小。在这篇文章中&#xff0c;我们将介绍如何使用Python绘制雷达图&#xff0c;使用Matplotlib和Seaborn这两个Python数据可视化库。 准备数据 …

测试职业的发展方向

测试职业转型 很多工作了几年的测试人员都会产生迷惘&#xff0c;随着经验的累积和技能的提升&#xff0c;会有一个瓶颈期。未来应该往哪个方向发展&#xff0c;之前说过做测试要懂得很多技能和知识。正因为如此测试可以发展的方向选择面就非常广了&#xff0c;既可以继续在测试…

重塑职业未来:在竞争激烈的职场上脱颖而出的关键策略

在竞争激烈的职场上&#xff0c;各种职场难题时常出现&#xff0c;如何进行有效沟通、如何应对工作压力、如何提升职业能力等&#xff0c;这都是需要去克服的问题。下面分享一下职场老人的经验&#xff01; 一、你遇到过哪些职场问题&#xff1f;分享一下你是怎么解决的呢&…

未来软件测试人员会失业?看ChatGPT怎么说

Q&#xff1a;未来软件测试人员会失业&#xff1f; A&#xff1a;虽然自动化测试和AI技术的应用已经带来了一定的冲击&#xff0c;但是软件测试人员未来失业的可能性非常低。以下是几个原因&#xff1a; 软件测试是软件开发生命周期的重要环节。在软件开发过程中&#xff0c;…

AI_News周刊:第二期

2023.02.13—2023.02.17 1.ChatGPT 登上TIME时代周刊封面 这一转变标志着自社交媒体以来最重要的技术突破。近几个月来&#xff0c;好奇、震惊的公众如饥似渴地采用了生成式人工智能工具&#xff0c;这要归功于诸如 ChatGPT 之类的程序&#xff0c;它对几乎任何查询做出连贯&a…

各大工作室都在用的视觉特效软件,开启你的虚拟制作之旅

为您的虚拟制作设置的免费视觉特效工具 使用领先工作室们所信任的创意资源管理软件&#xff0c;免费开始您的下一个虚拟制作项目。 花更多时间在创作上&#xff0c;更少时间在设置上 增强型Studio包 —— 现已可以部署在微软 Azure 上使用 —— 包含了您所需要的所有工具&…

博主,公司让我们无限期放假!

推荐阅读&#xff1a;程序员降薪40%去国企&#xff0c;只因要35岁了&#xff01;值得吗&#xff1f; 下午收到一位网友的求助&#xff1a; 公司无故辞退员工&#xff0c;却不按正常裁员程序走。公司以没钱为由&#xff0c;给出2种方案&#xff1a; 一个月赔偿&#xff1b;无限期…