联合查询

  • 笛卡尔积
    • 多表查询一份数据
    • join 实现多表查询
    • join 查询多个表
  • 内外连接
    • 内连接
    • 外连接
  • 自连接
  • 子查询
    • 使用注意
  • 合并查询

笛卡尔积

笛卡尔积:多表查询的核心操作。 笛卡尔积的计算很简单,就类似于排列组合。笛卡尔积是针对任意两张表之间的运算。
举例:


笛卡尔积计算过程:先拿第一张表的第一条记录,和第二张表的每个记录,分别组合,得到一组新的记录。然后再拿第一张表的第二条记录,和第二张表的每条记录,分别组合,又得到新的记录,最终得到的记录就是笛卡尔积。针对两张表计算笛卡尔积,笛卡尔积的列数,就是 A 的列数 + B 的列数。笛卡尔积的行数,就是 A 的行数 * B 的行数。笛卡尔积的效率不高,但是可以借助来完成发复杂的操作。
笛卡尔积用法:select * from 后面跟上多个表名,表名之间用逗号隔开。
两张表中都有 班级Id 这一列,班级Id 的值。班级Id 就是连接条件。如果笛卡尔积的两个列名相同,在写条件的时候,就可以通过 表名.列名 的方式来访问。如果列不会混淆,就可以省略表名。代码如下:

select student.name, class.name from student, class where student.classId = class.classId;

通过 表名.列名 就可以区分了。

多表查询一份数据

先建表,并且插入数据:

create table classes (id int primary key auto_increment, name varchar(20), `desc` varchar(100));create table student (id int primary key auto_increment, sn varchar(20),  name varchar(20), qq_mail varchar(20) ,classes_id int);create table course(id int primary key auto_increment, name varchar(20));create table score(score decimal(3, 1), student_id int, course_id int);

建立四个表,然后插入数据:

insert into classes(name, `desc`) values('计算机系2020级1班', '学习了计算机原理、C和Java语言、数据结构和算法'),('中文系2020级3班','学习了中国传统文学'),('自动化2020级5班','学习了机械自动化');insert into student(sn, name, qq_mail, classes_id) values('09982','黑旋风李逵','xuanfeng@qq.com',1),('00835','菩提老祖',null,1),('00391','白素贞',null,1),('00031','许仙','xuxian@qq.com',1),('00054','不想毕业',null,1),('51234','好好说话','say@qq.com',2),('83223','小菜鸡',null,2),('09527','老外学中文','foreigner@qq.com',2);insert into course(name) values ('Java'),('中国传统文化'),('计算机原理'),('语文'),('高阶数学'),('英文');insert into score(score, student_id, course_id) values
-- 黑旋风李逵
(70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),
-- 菩提老祖
(60, 2, 1),(59.5, 2, 5),
-- 白素贞
(33, 3, 1),(68, 3, 3),(99, 3, 5),
-- 许仙
(67, 4, 1),(23, 4, 3),(56, 4, 5),(72, 4, 6),
-- 不想毕业
(81, 5, 1),(37, 5, 5),
-- 好好说话
(56, 6, 2),(43, 6, 4),(79, 6, 6),
-- 小菜鸡
(80, 7, 2),(92, 7, 6);

查找许仙成绩,先进行笛卡尔积,不过要指定 student.id = score.student_id; 这两个匹配,不然就会有很多无效信息。代码如下:

select * from student,score where student.id = score.student_id;

结果如下:

这样就不会产生无效信息了。所以下一步,我们只需要留下名字是 ”许仙“ 的信息了,所以加一个筛选条件就好了,代码如下:

select * from student,score where student.id = score.student_id and student.name = '许仙';

这样的结果就是剩 ”许仙“ 了:

最后要的是成绩,所以只保留 名字 和 成绩 部分就好了:

select student.name,score.score from student,score where student.id = score.student_id and student.name = '许仙';

运行结果如下,这样就完成了多表查询一份数据了:

join 实现多表查询

通过 join 这样的关键字,也可以实现多表查询,代码如下:

select student.name, score.score from student join score on student.id = score.student_id and student.name = '许仙';

运行结果如下:

join 查询多个表

通过 select from 表1 join 表2 on 条件 join 表3 on 条件。代码如下:

select student.name, course.name, score.score from student join score on student.id = score.student_idjoin course on score.course_id = course.id;

运行结果如下:

日常使用多表的时候,建议使用 from 多个表 where。

内外连接

使用 join on 可以做到 from where 做不到的事情。上面的 from 多个表 where 写法叫做 “内连接”,使用 join on 的写法,既可以表示内连接,还可以表示外连接。

内连接:select 列 from 表1 inner join 表2 on 条件。 inner 表示内连接,其中 inner 可以省略

外连接

  • select 列 from 表1 left join 表2 on 条件; 左外连接
  • select 列 from 表1 right join 表2 on 条件; 右外连接

多表查询的时候,内连接用的最多,但是外连接也会用到。创建两个表:

create table student(id int, name varchar(20), classId int);
create table class(id int,name varchar(20));

然后插入数据:

insert into student values (1, '张三', 1);
insert into student values (2, '李四', 1);
insert into student values (3, '王五', 2);
insert into student values (4, '赵六', 3);insert into class values (1, '计算机一班');
insert into class values (2, '计算机二班');

内连接

内连接就是要求两个表里面都要有的数据,代码如下:

select * from student, class where student.classId = class.id;

运行结果如下:

这里的结果少了赵六,因为赵六,只在一个表里面存在。

外连接

左外连接:就是 left join 会以左边表的记录为主,尽可能的把记录都列出来,对于没有的右边数据,就改成 null。代码如下:

select * from student left join class on student.classId = class.id;

运行结果如下:

右外连接:就是 right join 会尽量以右边表的记录为主,尽可能的吧记录都列出来,大不了左边改成 null。

自连接

自己和自己笛卡尔积,处理特殊场景的问题。就是把行转化为列。因为也是笛卡尔积,所以还是并不高效的方法。不过要指定别名,不然自连接就会重名。在自连接的时候,使用多个条件来完成筛选。代码如下:

select * from score as s1, score as s2 where s1.student_id = s2.student_id;

这样筛选之后的就是 id 相等的结果了,如果再加一些条件的话,筛选效果就更明显了:

select * from score as s1, score as s2 where s1.student_id = s2.student_id and s1.course_id=3 and s2.course_id=1;

这样筛选之后的结果就更精确了,运行结果如下:

子查询

子查询就是把拆分好的代码合成一个,单行子查询:返回一条记录。例如:查询之前 “不想毕业” 同学的同班同学。代码如下:

select classes_id from student where name = '不想毕业';

这里就是先查询出班级,然后再查询班级为 1 的同学就好了:

select name from student where classes_id = 1;

运行结果如下:

将 SQL 语句合并在一起,也就是子查询:

select name from student where classes_id = (select classes_id from student where name = '不想毕业');

运行结果如下:

使用注意

在使用子查询的时候,要把 = 换成 in 来操作。例如要查询课程成绩,先查询语文和英语的课程,然后再查询课程的成绩。代码如下:

select id from course where name = '语文' or name = '英文';

这里得到课程 id :

然后查询对应的课程 id 的成绩就可以了:

select * from score where course_id in (4,6);

运行结果如下:

然后再合并成一句,代码如下:

select * from score where course_id in (select id from course where name = '语文' or name = '英文');

运行结果如下:

合并查询

合并查询:把多个查询语句的结果合并到一起了。通过 union 来实现:把查询的结果放到一起。对两个查询结果取并集。可以自动去重。代码如下:

select * from course where name = '英文' union select * from course where id < 3;

运行结果如下:

也可以使用 or 实现,不过使用 or 的时候必须保证是针对同一个表来进行操作的。代码如下:

select * from course where name = '英文' or id < 3;

运行结果如下:

MySQL 联合查询相关推荐

  1. MySQL联合查询语法内联、左联、右联、全联

    MySQL联合查询效率较高,以下例子来说明联合查询(内联.左联.右联.全联)的好处: T1表结构(用户id,用户名,密码)    userid   username  password 1   jac ...

  2. mysql联合查询(UNION)

    mysql联合查询(UNION) 下面我就直接po截图和代码 #联合查询 /* union 联合 合并:将多条查询语句的结果合并成一个结果语法: 查询语句1 union 查询语句2 union ... ...

  3. mysql联合查询sql优化

    我们在使用mysql数据库时,经常会使用到mysql的联合查询,联合查询分为内连接和外连接,内连接查询结果是联合的表都存在匹配才会有结果,外连接则根据驱动表是否存在匹配来生成结果集. 这里使用mysq ...

  4. mysql联合查询注入防护,SQL注入之BypassWaf

    0x00 前言 无论是在CTF比赛中还是在现实项目中,都会遇到各种各样的waf,没有绝对安全的系统,仔细的研究总会发现被"漏掉"的地方. 最近在研究过waf的技巧,期间还是很有趣的 ...

  5. mysql联合查询和关联查询

    最近面试中,Java的都会考察数据库,写SQL语句,大多数就问关联查询,索引 看看下面三个关联查询的 SQL 语句有何区别?SELECT * FROM score, student WHERE sco ...

  6. mysql联合查询查询语句_mysql多表联合查询语句是什么

    mysql多表联合查询语句是:使用select语句,union关键词,语法为[select 语句1 union [union 选项] select 语句2 union [union 选项] selec ...

  7. mysql联合查询怎么加子查询_MySQL数据库 —子查询,联合查询

    编程之家收集整理的这篇文章主要介绍了MySQL数据库 -子查询,联合查询,编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考. <MySQL数据库 -子查询,联合查询>要点: 本文 ...

  8. mysql 联合查询后排序_MySQL的查询(联合查询,查询排序,正则表达式)

    MySQL的查询(联合查询,查询排序,正则表达式) MySQL的查询(联合查询,查询排序,正则表达式) MySQL的查询 联合查询实例 -- 联合查询 SELECT * FROM user union ...

  9. mysql联合查询查询语句_mysql 各种联合查询语句

    简单的介绍了各种联合查询语句的用法,有inner join ,join left等多表联合查询,有需要的朋友可以参考一下. INNER JOIN(等值连接) 只返回两个表中联结字段相等的行 LEFT ...

  10. mysql联合查询语句详解_实例讲解MySQL联合查询

    1. 内联结: Select A.Name, B.Hobby from A, B where A.id = B.id,这是隐式的内联结,查询的结果是: Name Hobby Tim Football ...

最新文章

  1. postgresql存图片字段类型_PostgreSQL 入门
  2. 软件工程软件产品质量要求与评价_软件工程定义
  3. 按钮控制android progressbar,Android ProgressBar手动控制开始和停止
  4. 航大之星礼仪大赛结束,欣赏现场抓图。
  5. 为什么古代皇帝总是治不了腐败?因为拿得越多、越安全
  6. Linux系统下的TCP测试工具,TCPING安装简明教程
  7. 中继器有何作用?它的工作原理是什么?-道合顺大数据Infinigo
  8. JAVA毕业设计共享充电宝管理系统演示录像2021计算机源码+lw文档+系统+调试部署+数据库
  9. 无领导小组讨论题目分类
  10. 省市区json格式数据及异步请求json数据
  11. 打造原生的图文混排控件
  12. 2B青年答疑:什么是2B青年?如何脱离2B青年行列?
  13. 手把手带你学Docker:Docker容器日常管理(四)
  14. 禁用和恢复用户账户Linux,linux用户和组管理.ppt
  15. 从键盘中输入姓名和电话号码,以#号结束,编程实现输入姓名可查询电话号码的功能。
  16. java计算机毕业设计在线云音乐系统源码+mysql数据库+系统+lw文档+部署
  17. 【原创】关于not in的一些事情
  18. 游戏互动营销案例 | 游戏化营销特点
  19. 【FOC】HALL同步电角度测试
  20. freetype2 下载编译以及测试代码

热门文章

  1. OpenGL编程指南第九版第一个示例配置
  2. JS base64 加密和 后台 base64解密(防止中文乱码)
  3. YUI Compressor Maven Plugin
  4. android生成系统应用签名
  5. 德尔福和Mobileye强强联手,将展示双方共同开发的CSLP系统
  6. 盘点那些Wifi破解姿势(1)
  7. 转载python操作wps V9 API,测试好用
  8. C++学生信息管理系统
  9. 小米8绑定账号和设备验证失败_网赚项目刚需账号答疑大集合!
  10. Drool规则引擎详解(一)