mysql多行合并成一行_MySQL高级查询

连接查询操作

当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,再选择合适的列返回。

mysql支持三种类型的连接查询,分别为:

994e72a97898b299362cc2d37594809a.pngb0a9802db7675bf421f2bb70afc53c89.pngde4393ae14acff08f3c06875bea649dd.png

下面是一个班级表:

create table classes(

id int unsigned primary key auto_increment not null,

name varchar(20) default '',

isdelete bit default 0

);

insert into classes values

(1,"python1", 0),

(2,"python2",0),

(3,"python3",0),

(4,"python4",0),

(6,"python5", 1);

4fe103827148878c76a139d137b91d97.png

下面是一个学生表:

4e69bdfb9344c54bbf2801ce1c004fbe.png

注意:一个数据库中如果有多个表的话,表名是不能省略的。

44906bdebc89bf06c141e065c9640baa.pngd4db13979732c68c82babb20aa60720b.png

出来的数据不太符合。

使用内连接查询班级表与学生表

ac90cddaad9abec336981c848ba445ff.png

on后面跟着连接查询的条件。

9332058da0969659828f00519487b03d.pnge1395a33297993f5a51ef6d53f7c9e7e.pngec71faa00fa21167039d0990a335d1a3.png

可以通过as将sql语句简化一下:

d5d15e3101ce540c7e1dc82161cd6092.png6e0c8d3376e12e9f34d520c8832cc0a1.pngfde2e1b725fa7bd3c88bd503680e0910.png

fb818c67250e2292e47dfecbb0649e1c.png

左右连接查询

左右连接有主和从的关系。

左连接,那students是主表,那classes是从表。

b9e9c358e0cbc273c0126a833a6ae159.png5833f8f886b637928ff7885e032966bd.pngb618ea338fc4c7a7f844bb5befcd6111.pngc948041a62fcb079ae570ee2f03806f5.png

右连接查询:就是以classes为主表,那students就是从表。

030bc8ce65dd3a0bd2ba627a4a392e61.png

(了解)连接查询的其他的写法扩充---自行学习

下面是内连接的两种简写形式:

78ff744d262aa06b0b0a039082eb18aa.png8827c57ea35a25e7ec5de422cfd08afc.png

下面是右连接的另外一种语法形式:

47d71c95bed2303ead4d828e2e9c169d.png9d245f3f0fa98ef1ed3281c2df620510.png

还有left outer join这种语法---可以自行测试一下。

自关联查询的基本操作

准备工作:

d57c8a7a96e9fd867c6a9e7bf62e0b11.pngeb52fd4844efcda838c7e77e2dfbefbd.png

查询所有的省和自治区:

f81528de2442c96cd0ee48e995892383.pngee7a5d8a692e49614469c0439618c8ed.png

统计中国所有的省和自治区和直辖市:

0c27f60a6ada157691069932ff608739.png

查询广东省都有哪些市(想像成两张表):

64147fd0615a2c443f3a316336c3d50c.pnga8c52a058be9d5049548cac1fdf3ef3e.png50a5f44304de4bfc696c7aa16a6c551f.png

子查询的概念和分类

子查询

在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句

主查询

主要查询的对象,第一条 select 语句

主查询和子查询的关系

子查询是嵌入到主查询中

子查询是辅助主查询的,要么充当条件,要么充当数据源

子查询是可以独立存在的语句,是一条完整的 select 语句

子查询分类

标量子查询: 子查询返回的结果是一个数据(一行一列)
查询大于平均身高的学生

5303f9b38baa038142ccafcf2b634988.png4b9a05fe77c215fb75641cdec9fd68cf.png363925fef13b1b8dd73053d9a573b36f.png

上面是分了两次进行查询出来想要的数据的,那也可以进行合并成一次查询,而且上面的查询是写死的,下面的这种形式是活的,当再添加与删除数据以后,都不用手动的改变:

0817c00bfdb9971e45e0501fd6289d9a.png

列级子查询: 返回的结果是一列(一列多行)
查询出有学生的班级都有哪些?

04365a4a508b1e8e056563bfd4d881a3.pngadb5b683c69995f52e1ed6cb9929add6.png

通过子查询去实现:

6a19690632f56c85b2527a65a1f11637.png

下面是将子查询换成了实现的结果,分步进行讲解了:

26a9966742ea9d36d270977b4b6d8174.png740eaa84e4bf7e15885978c1c8891150.png

行级子查询: 返回的结果是一行(一行多列)
需求: 查找班级年龄最大,身高最高的学生

行元素: 将多个字段合成一个行元素,在行级子查询中会使用到行元素

f76c64ee073a83823eea5d7a949bf9ff.png

查询结果为空说明这两个没有出现在同一个人的身上。

88638b7a84bf9047c03eae2d12a2a7a7.png101f44a9b55f595080d0c5137e2235fa.png82fdaeb642aadc2e269dfdfacbd63abf.pngc2cdea8e162c2c164152d34ff38b6cf6.png

查询班级中年龄最小并且身高也最小的人:

b4e452cf24862cdd77daca732148498d.png7a43e5a01c2d94606f90578aec2713a5.pngeaa19a48bb2c69d788098495b3cc743d.pnga135ec9ea387e5c7ae61fbab2e2b1bc8.png

表级子查询: 返回的结果是多行多列
查询学生与班级对应的信息

下面是用上面讲的内连接查询实现的:

5b41ad2e586be7a6c38ba93e2786b987.png

下面是使用子查询实现的:

f2533e0744879ea8b831cb48b0db585d.png

一般不用,查询效率相对费时间。

说明:发现很多表级子查询的语句,都是可以使用连接查询实现的,此时推荐使用连接查询,因为连接查询的语句更简洁,逻辑更清晰

子查询中出现的关键字

带any关键字的子查询:

e0e6a3b51ce7a68dc6e655ff8a7ff0ea.png

any关键字表示满足其中任意一个条件,它允许创建一个表达式对子查询的返回值列进行比较,只要满足内层子查询中的任意一个比较条件,就返回一个结果作为外层查询条件。

3499172ace52d6849508f53b9a55386b.png

6a19690632f56c85b2527a65a1f11637.png

a6403eb9a393fb039897e840b4fc31c5.png

0c984db52290d478a696d30553d0a46e.pngc574fe9fe5a34153871135c6e35970f3.pngfd9f8e80e80fc6745336227fefb07eaa.png8ae6e9298132784a40e808a809608ed1.png

de9b8b8b610c0186e59407611b2cb87f.png

带all关键字的子查询:

01446eb9fb4ac79f1d75330591522734.png

all与any有点类似,只不过带all关键字的子查询返回的结果需同时满足所有内层查询条件。

acee3cdea2677bf4db13341c8684ec5e.png3468cb946c8fda9ceca90c0649e2bbf1.png

带in关键字的子查询:

3bd6601f7b67724dcdf333ebc2da1d30.pngc20de2db53d9f8c2415879492563a6ec.png

查询存在年龄为20岁的员工的部门。

fab813231a6038d1f6d12f0c2ffe630e.png

在查询的过程中,首先:会执行内层子查询,得到年龄为20岁的员工的部分id,然后,再根据部门的id与外层查询的比较条件,最终最到符合条件的数据。

查询不存在年龄为20岁的员工的部门。

select语句中还可以使用not in关键字,其作用正好与in相反。

e8178f801af6962d167b3d271e84cbf1.png

带exists关键字的子查询:

exists关键字后面的参数可以是任意一个子查询,这个子查询的作用相当于测试。它不产生任何数据,只返回true或flase,当返回值为true时,外层查询才会执行。

查询employee表中是否存在年龄大于21岁的员工,如果存在,则查询department表中的所有记录:

c31f2f91b9e795e28c921e8385b599fc.png

由于employee表中有年龄大于21岁的员工,因此,子查询的返回结果为true,所以,外层的查询语句会执行,即查询出所有的部门信息。

需要注意的是:exists关键字比in关键字的运行效率高,所以,在实际开发中,特别是大数据量时,推荐使用exists关键字。

带比较运算符的子查询:

在前面的子查询中使用了“>”比较运算符,子查询中还可以使用其他的比较运算符,如“=”“<=”“=”“!=”等。< span="">

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值