-
2021-08-31 15:23:28
多表查询—跨关联关系的查询
Django 提供一种强大而又直观的方式来“处理”查询中的关联关系,它在后台自动帮你处理JOIN。 若要跨越关联关系,只需使用关联的模型字段的名称,并使用双下划线分隔,直至你想要的字段:
上实战训练——更直观理解:
(得到的都是QuerySet型数据!)
from django.http import HttpResponse from .models import Department, Student, Course, Stu_detail def add_user(request): # 1.查询学院名为‘北大’的学生的信息 (注意是两个下划线,可以获取到其对应的属性) s_all = Student.objects.filter(department__d_name='北大') print(s_all) # 它还可以反向工作。若要引用一个“反向”的关系,只需要使用该模型的小写的名称!!! # 2.查询学生名字中包含'小'的学生的学院信息 d_all = Department.objects.filter(student__s_name__contains='小') print(d_all) # 3.查询学号为1的学生的所有的课程 c_all = Course.objects.filter(student__s_id=1) print(c_all) # 4.查询报了课程3的所有学生 stu_all = Student.objects.filter(course__c_id=3) print(stu_all) # 5.查询报了'python'课程的学生的所属学院的信息 cou_all = Department.objects.filter(student__course__c_name='python') print(cou_all) return HttpResponse("插入数据成功!")
❤️可以扫码关注本人公众号——任何问题都可在公众号提问(定时有专人解答);并且不定时更新干货文。欢迎关注哦!❤️
更多相关内容 -
多表查询
2020-07-14 16:50:54多表查询:在查询为多张表的数据时,通常在from表和表之间使用逗号,作为间隔符号。 1.内连接inner join,相当于两个集合关键字段的全交叉记录。 1:select * from table_name1inner join table_name2; 2:select ...多表查询:在查询为多张表的数据时,通常在from表和表之间使用逗号,作为间隔符号。
1.内连接inner join,相当于两个集合关键字段的全交叉记录。
- 1:select * from table_name1 inner join table_name2;
- 2:select * from table_name1,table_name2;
2.等值连接,将有等值条件筛选的称为等值连接,也就是相同外键约束的组合。
- 1:select * from table_name1 inner join table_name2 on table_name1.col_name=table_name2.col_name;
- 2:select * from table_name1,table_name2 where table_name1.col_name=table_name2.col_name;
3.外连接。
- 左连接left join:select * from table_name1 left jion table_name2 on table_name1.id=table_name2.id;
存在两张表,其中a表作为主表,b表作为副表,a表的记录数多于b表的话,那么当a表为主表显示时候,b表中的记录不够则自动用null去填充。
- 右连接right join:select * from a right join b on a.id=b.id;
同左连接思想一样,但是这个右连接的主表是b,副表是a,其他与左连接相似,当副表记录不够时用null填充。
4.全连接。
MySQL的全连接关键字是Union和Union all,而不是full join,full join关键字是Oracle中存有的。
- (select * from table_name1) union (select * from table_name2);
注意:
1.通过全连接union连接的两张表的列数必须相同。
2.合并的两张表中以第一张表作为主要表,也就是他们合并的记录取值的字段是第一张表的字段,而第二张表的字段消失。
3.通常来说,我们一般采用的全连接是union all进行合并,因为union耗时较长。
4.union连接的SQL字句,单个字句不写order by,因为不会存有排序的效果。
-
MySQL多表查询
2020-05-08 20:34:47在关系型数据库中,表与表之间是有练习的,所以在实际应用中,经常使用多表查询。多表查询就是同时查询两个或两个以上的表 在 MySQL 中,多表查询主要有 **交叉连接**,**内连接**,**外连接**,**子查询**多表查询
在关系型数据库中,表与表之间是有练习的,所以在实际应用中,经常使用多表查询。多表查询就是同时查询两个或两个以上的表
在 MySQL 中,多表查询主要有 交叉连接,内连接,外连接,子查询
交叉连接
交叉连接 ( CROSS JOIN ) 一般用来返回连接表的笛卡尔积
语法格式如下:
# 多表交叉连接时,使用 `cross join` 或者 `,` 皆可,前者是官方建议的标准写法 select <字段名> from <tab_name> cross join <tab_name> [where子句] select <字段名> from <tab_name>,<tab_name> [where子句]
当连接的表之间没有关系时,我们会省略掉 where子句,这时返回结果就是两个表的笛卡尔积,返回结果数量就是两个表的数据行相乘,如果每个表有 1000 行,那么返回数量就有 1000*1000=1000000 行,数据量是非常巨大的!
如果在交叉连接时使用 where子句,MySQL会先生成两个表的笛卡尔积,然后再选择满足 where条件的记录。因此,表的数量较多时,交叉连接会非常非常慢,一般情况下不建议使用交叉连接
笛卡尔积
笛卡尔积( Cartesian product ) 是指两个集合 x 和 y 的乘积
例如,有两个集合,它们值如下:
A = {1,2} B = {3,4,5} # 集合 A*B 的结果集为: A×B={(1,3), (1,4), (1,5), (2,3), (2,4), (2,5) }; # 集合 B*A 的结果集为: B×A={(3,1), (3,2), (4,1), (4,2), (5,1), (5,2) };
以上 AB 和 BA 的结果就叫做两个集合各自的笛卡尔积
内连接
内连接 ( inner join ) 使用
inner join
关键字连接两张表,并使用on
子句来设置连接条件语法格式如下:
select <字段名> from <tab_name> <tab_name> inner join <tab_name> [on子句]
多个表连接时,再 from 后边连续使用
inner join
或join
即可案例操作:
# 在 学生表 和 课程表中,查询 学生对应的课程 select s.name c.course_name from student as s inner join course as c on s.course_id = c.id
注意:当对多个表进行查询时,要在 select 语句后面指定字段是来源自哪一张表
语法为表名.列名
,如果表名较长,可以给表设置别名,这样就可以直接在 select 后写表的别名.列名
外连接
内连接查询的结果都是符合连接条件的结果,为外连接会先将连接的表分为基表和参考表,再以基表为依据返回满足与不满足条件的记录
外连接区分为 左外连接 和 右外连接
左外连接
左外连接又称为左连接,使用
left outer join
关键字连接两个表,也可以简写为left join
,并使用on
设置连接条件语法格式如下:
select <字段名> from <tab1> left join <tab2> [on子句]
上述语法中,tab1 为基表,tab2 为参考表,左连接查询时,可以查询处 tab1 中的所有记录和 tab2 中匹配连接条件的记录。如果 tab1 的某行在 tab2 中没有匹配行,那么在返回结果中,tab2 的字段值均为空值 NULL
右外连接
右外连接又称为右连接,右连接是左连接的反向连接。使用
right outer join
关键字连接两个表,可以简化为right join
,并使用on
子句来设置连接条件语法格式如下:
select <字段名> from <tab1> right outer <tab2> [on子句]
与左连接相反,右连接以 tab2 为基表,tab1 为参考表,可以查询出 tab2 中所有记录和 tab1 中匹配连接条件的记录。如果 tab2 的某行在 tab1 中没有匹配项,那么在返回结果中,tab1 的字段值均为 NULL
多个表 左/右 连接时,在 on 子句后连续使用
left/right join
即可子查询
子查询是 MySQL 中比较常用的查询方法,通过子查询可以实现多表查询。子查询指将一个查询语句嵌套在另一个查询语句中。子查询可以在 select,update 和 delete 语句中使用,而且可以进行多层嵌套,实际开发中,子查询经常出现在 where 语句中
语法格式如下:
select <字段> from <tab_name> where <字段><操作符>(子查询) );
其中,操作符可以是
in
,not in
,exists
,not exists
等关键字案例:
# 查询学习 python 课程的学生 select name from student s where s.course_id = (select id from course c where c.name = "Python") # 查询学习 python 和 html 的学生 SELECT name FROM student s WHERE s.course_id in (SELECT id FROM course c WHERE c.name="Python" OR c.name="Html");
进阶用法:
子查询语句可以嵌套在 SQL 语句中任何表达式出现的位置
select (子查询) from 表名; select * from (子查询) as 别名;
-
MySQL-多表查询
2021-10-19 20:08:43一、表架构 student(sid,sname,sage,ssex) 学生表 course(cid,cname,tid) 课程表 sc(sid,cid,score) 成绩表 teacher(tid,tname) 教师表 二 、建表sql语句 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---...一、表架构
- student(sid,sname,sage,ssex) 学生表
- course(cid,cname,tid) 课程表
- sc(sid,cid,score) 成绩表
- teacher(tid,tname) 教师表
二 、建表sql语句
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for course -- ---------------------------- DROP TABLE IF EXISTS `course`; CREATE TABLE `course` ( `cid` int(11) NOT NULL COMMENT '课程号', `cname` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '课程名', `tid` int(11) NULL DEFAULT NULL COMMENT '老师号', PRIMARY KEY (`cid`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of course -- ---------------------------- INSERT INTO `course` VALUES (3001, '英语', 1); INSERT INTO `course` VALUES (3002, '数学', 2); INSERT INTO `course` VALUES (3003, '物理', 3); INSERT INTO `course` VALUES (3004, '语文', 4); -- ---------------------------- -- Table structure for sc -- ---------------------------- DROP TABLE IF EXISTS `sc`; CREATE TABLE `sc` ( `sid` int(11) NOT NULL COMMENT '学生号', `cid` int(11) NOT NULL COMMENT '课程号', `score` int(11) NULL DEFAULT NULL COMMENT '成绩' ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of sc -- ---------------------------- INSERT INTO `sc` VALUES (101, 3001, 90); INSERT INTO `sc` VALUES (102, 3001, 85); INSERT INTO `sc` VALUES (103, 3001, 76); INSERT INTO `sc` VALUES (104, 3002, 87); INSERT INTO `sc` VALUES (105, 3001, 92); INSERT INTO `sc` VALUES (101, 3002, 81); INSERT INTO `sc` VALUES (102, 3002, 93); INSERT INTO `sc` VALUES (103, 3002, 73); INSERT INTO `sc` VALUES (104, 3002, 65); INSERT INTO `sc` VALUES (105, 3002, 96); INSERT INTO `sc` VALUES (101, 3003, 85); INSERT INTO `sc` VALUES (102, 3003, 76); INSERT INTO `sc` VALUES (103, 3003, 63); INSERT INTO `sc` VALUES (104, 3003, 59); INSERT INTO `sc` VALUES (105, 3003, 56); INSERT INTO `sc` VALUES (101, 3004, 100); INSERT INTO `sc` VALUES (102, 3004, 83); INSERT INTO `sc` VALUES (103, 3004, 75); INSERT INTO `sc` VALUES (104, 3004, 69); INSERT INTO `sc` VALUES (105, 3004, 50); INSERT INTO `sc` VALUES (106, 3001, 60); INSERT INTO `sc` VALUES (106, 3001, 60); -- ---------------------------- -- Table structure for student -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `sid` int(11) NOT NULL COMMENT '学生号', `sname` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '姓名', `sage` int(11) NULL DEFAULT NULL COMMENT '年龄', `ssex` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '性别', PRIMARY KEY (`sid`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES (101, '王明', 18, '女'); INSERT INTO `student` VALUES (102, '王天', 19, '男'); INSERT INTO `student` VALUES (103, '张三', 18, '男'); INSERT INTO `student` VALUES (104, '李四', 19, '女'); INSERT INTO `student` VALUES (105, '王五', 20, '男'); INSERT INTO `student` VALUES (107, '万源', 17, '男'); -- ---------------------------- -- Table structure for teacher -- ---------------------------- DROP TABLE IF EXISTS `teacher`; CREATE TABLE `teacher` ( `tid` int(11) NOT NULL COMMENT '老师号', `tname` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '老师名称', PRIMARY KEY (`tid`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of teacher -- ---------------------------- INSERT INTO `teacher` VALUES (1, '王老师'); INSERT INTO `teacher` VALUES (2, '李老师'); INSERT INTO `teacher` VALUES (3, '赵老师'); INSERT INTO `teacher` VALUES (4, '宋老师'); SET FOREIGN_KEY_CHECKS = 1;
三、查询
1、多表查询语法
select 字段1,字段2... from 表1,表2... [where 条件]
- 查询学生表和成绩表所有信息
select * from student,sc where student.sid = sc.sid
注意: 多表查询时,一定要找到两个表中相互关联的字段,并且作为条件使用
2、多表链接查询
多表连接查询语法(重点) SELECT 字段列表 FROM 表1 INNER|LEFT|RIGHT JOIN 表2 ON 表1.字段 = 表2.字段;
①内连接查询 (只显示符合条件的数据)
- 查询学生表和成绩表所有信息
select * from student inner join sc on student.sid = sc.sid;
内连接查询与多表联合查询的效果是一样的.
②左外连接查询 (左边表中的数据优先全部显示)
- 查询学生表和成绩表所有信息
select * from student left join sc on student.sid = sc.sid;
学生表中的数据全部都显示,而成绩表中的数据符合条件的才会显示,不符合条件的会以 null 进行填充
③右外连接查询 (右边表中的数据优先全部显示)- 查询学生表和成绩表所有信息
select * from student right join sc on student.sid = sc.sid;
正好与[左外连接相反]
④全连接查询(显示左右表中全部数据)全连接查询:是在内连接的基础上增加 左右两边没有显示的数据 注意: mysql并不支持全连接 full JOIN 关键字 注意: 但是mysql 提供了 UNION 关键字.使用 UNION 可以间接实现 full JOIN 功能
select * from student left join sc on student.sid = sc.sid UNION select * from student right join sc on student.sid = sc.sid;
注意: UNION 和 UNION ALL 的区别:UNION 会去掉重复的数据,而 UNION ALL 则直接显示结果
3、三表查询
①查询所有人的英语成绩
语法: select 表1.字段,表2.字段,表3.字段 from 表1 join 表2 on 表1.关联字段 = 表2.关联字段 join 表3 on 表2.关联字段 = 表3.关联字段 where....;
select student.sname,course.cname,sc.score from student join sc on student.sid = sc.sid join course on sc.cid = course.cid where course.cname = "英语";
4、其它查询
1、查询“3001”课程比“3003”课程成绩高的所有学生的学号与分数;
SELECT a.sid,a.score FROM (SELECT sid,score FROM sc WHERE cid="3001") a, (SELECT sid,score FROM sc WHERE cid="3003") b WHERE a.score>b.score AND a.sid=b.sid
2、查询平均成绩大于60分的同学的学号和平均成绩
SELECT sid,AVG(score) FROM sc GROUP BY sid HAVING AVG(score)>60
3、查询所有同学的学号、姓名、选课数、总成绩
select s.sid as 学号,s.sname as 姓名,count(sc.cid) as 选课数,SUM(sc.score) as 总成绩 from student s INNER JOIN sc sc on s.sid=sc.sid GROUP BY s.sid
4、查询姓“李”的老师的个数;
select count(distinct(Tname)) from teacher where tname like '李%';
5、查询学过“王老师”课的同学的学号、姓名
SELECT s.sid AS 学号,s.sname AS 姓名 FROM student s, sc sc, course c, teacher t WHERE s.sid = sc.sid AND sc.cid = c.cid AND c.tid = t.tid AND tname = "王老师"
6、查询没有学过“王老师”课的同学的学号、姓名
SELECT s.sid, s.sname FROM student s WHERE s.sid NOT IN ( SELECT s.sid FROM student s, sc sc, course c, teacher t WHERE s.sid=sc.sid AND c.cid=sc.cid AND t.tid=c.tid AND t.tname="王老师")
-
基于MybatisPlus的多表查询
2020-07-04 09:32:54基于MybatisPlus的多表查询 mybaitsPlus配置文档 mybatis3.x文档 目录: 一对一查询 1.1 方式一:非select配置方式 1.2 方式二,通过select进行多表查询 一对多查询(用户对应多账户示例) 2.1 方式一:非select配置... -
SQL语法 (排序、聚合、分组、分页) 多表关系,多表查询
2020-09-24 14:08:19sql指令和多表关系 ### 1. 排序 (order by) 数据库的查询(排序:order by) 默认是按升序排列的,但是升序ASC最好写上,代码可读性! SELECT * FROM 表名 ORDER BY 排序字段 ASC(升序)|DESC(降序); 如果排序列的值... -
总结mybatis多表查询(xml方式)
2019-07-29 17:26:18总结mybatis的多表查询前言数据库表及关系一对多查询多对一及一对一查询总结 前言 表之间的关系有几种:一对多、多对一、 一对一、多对多 在多对一关系中,把多的部分拆成一个一个对象其实就是一对一关系,如账户和... -
mybatis Plus多表查询
2021-08-17 16:07:23mybtaisPlus多表查询 连表查询比较特殊,mybatis-plus主要针对单表查询,多表查询的话,可以使用原生的mybatis,当然那样可能麻烦一点需要写大量的sql 如果要用mybatis-plus的话其实还是有办法的 Dao层 //这里为了... -
MySQL多表查询语句
2021-05-30 08:59:12MySQL多表查询语句 1.内连接查询 1.隐式内连接:使用where条件消除无用数据 例子: --查询所有员工信息和对应的部门信息 SELECT * FROM emp,dept WHERE emp.dept_id=dept.id; --查询员工表的姓名,性别,... -
手把手教你 SQL 多表查询
2020-04-10 20:24:33本文通过实际的例子来分析sql中经常涉及到的一些复杂查询,比如多表查询,连接查询,嵌套查询,集合查询,本文结合图片以及代码带你认识了解这些语句,最重要的是你可以和博主一起动手实践,实战的代码在文章最后有... -
Mybatis-plus实现多表查询
2021-02-28 17:20:21两个表: notice_send保存消息发送数据, notice_content保存具体消息内容 sql建表语句如下: CREATE TABLE `notice_send` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `content_id` bigint(20) NOT NULL DEFAULT '0... -
MySQL联合查询(多表查询)
2022-03-02 19:33:11on从语法上可省略,但如果省略它,将查询的是多表的笛卡尔积; 1.select *from 表1 join 表2 [ on过滤条件 ] [ where查询条件 ] ; 2.select *from 表1,表2 [ where查询条件 ] ; 3.select *fro -
MySQL多表查询where子查询
2019-05-31 21:49:32SQL不仅支持单条的检索数据查询还允许创建子查询,即嵌套在其他查询中的查询。 ...当前有用户表,以及订单表,订单详细表时,需要查询购买了某商品Id为“1001”的商品的客户信息 ...再从订单表查询该购物订单id... -
Select之多表查询
2018-06-03 18:34:45今天来学习多表查询。 我们用一个简单的公司管理系统,有三张表EMP ,DEPT,SALGRADE来演示如何进行多表查询。 表内容如下: 创建部门表 drop table if exists dept; create table if not exists dept ( ... -
总结mybatis多表查询(注解方式,注解详细说明)
2019-07-29 20:30:56在之前的总结mybatis多表查询(xml方式)的博客中,已经对多表查询做了一定的介绍,而且总结了基于xml的mybatis多表查询,一些通用的技术点可以翻阅上一篇博客。这次我们总结基于注解的mybatis多表查询。多对多查询... -
如何进行多表查询
2020-12-24 19:13:10多表查询 查询分数在80-90分的学生的学号、姓名、分数 select student_info.学号,student_info.姓名,grade.分数 from student_info,grade where grade.分数 between 80 and 90 查询学习了’C语言’课程的学生... -
Oracle 查询技巧与优化(二) 多表查询
2016-08-05 08:59:59关于Oracle多表查询的一些技巧和优化~ -
Springboot+mybatis+MySQL实现简单的多表查询
2018-11-18 15:10:10Springboot+mybatis+MySQL实现简单的多表查询 直接进入正题 1.首先我们新建一个数据库,再建两个表 tbl_employee表建表SQL语句 CREATE TABLE `tbl_employee` ( `id` int(200) NOT NULL AUTO_INCREMENT, `last_name... -
单表查询和多表查询
2019-04-18 08:37:44我们知道数据库有增、删、查、改的四个操作,其中还分为单表和多表的,但凡事都是从简单再到复杂,所有我们就先来说下单表的查询。 注意不是在数据库查询,而是在控制器中从数据库查询,所有写法和数据库中的写法也... -
Hibernate之HQL多表查询
2018-10-25 20:35:00多表的查询进行使用HQL语句进行查询,HQL语句和SQL语句的查询语法比较类似 内连接查询 显示内连接 select * from customer c inner join orders o on c.cid = o.cno 隐式内连接 select * from customers c.... -
mysql多表查询的分类
2021-07-15 17:39:01内连接 等值连接 非等值连接 自连接 外连接 inner join 等值连接 非等值连接 自连接 外连接 -
多表查询和子查询
2016-11-13 17:59:11主要介绍了多表查询,以及在多表/单表查询时常用的函数和关键字,介绍了如何使用子查询。 多表查询 employee表,departments表,localtions表结构 引例: select last_name, department_... -
【Mybatis】多表查询
2017-11-21 21:58:45多表查询一直是数据库的关键部分。网上关于Mybatis的例子天华龙凤,又要自己新建实体类,又在一个实体类中将另一个实体类联系起来,在我看来大可不必,只要将sql查询结果的视图映射到Java里面即可。下面举一个例子来... -
Spring Data JPA多表查询的几种方法
2019-11-29 16:51:04Spring Data JPA多表查询的几种方法 前言 公司目前在ORM框架上选型只有两个选择 MyBatis-Plus Spring Data JPA 相信很多人会选择MyBatis-Plus(MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的... -
mybatis-plus多表查询
2020-03-09 16:24:45在多表查询返回结果时:应该如何处理呢? 第一种:在xml中使用 resultMap 处理,我本人不推荐,因为(如果一个xml中如果有多个多张表查询,就得写多个resultMap与之对应) 第二种:返回结果用实体接收,但是返回的... -
【Mybatis】多表查询(一对多、多对一)
2021-07-09 23:51:32一对多:查询某位老师的所有学生。 多对一:查询所有学生以及他们的老师。 1. resultMap resultMap元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBCResultSets数据提取代码中解放出来,并在一些... -
hive 之多表查询
2018-05-21 15:05:02hive 多表查询,转化为一个mapreduce的作业hive>desc dept;deptno doubledname stringloc stringhive>desc emp;empno doubleename stringjob stringmgr doublehiredate stringsal double... -
数据库中的多表查询总结
2018-08-31 21:12:56在数据库的查询中,多表连接查询是一大难点,也是多表查询里的重点。连接主要有以下四种情况: INNER JOIN(内连接):如果表中有至少一个匹配,则返回行 【在语法中可以省略INNER关键字】 LEFT JOIN(左连接):... -
通用Mapper进行多表查询
2020-07-30 08:13:31通用Mapper大大简化了Mybatis的单表CRUD操作。今天我测试了一下用Mapper进行...在test库中建立学生表和班级表,两个表靠班级ID连接,一个学生对应一个班级,所以最终实现的是一对一查询。sql语句如下: 学生表: CREATE