MySql多表查询、子查询

206 阅读3分钟

这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战

一、多表查询

1.1 内连接

规则:返回两个表的公共记录。

语法: 1、select * from 表1 inner join 表2 on 表1.公共字段=表2.公共字段 (inner可以省略) 在MySql实体关系、数据库设计、查询语句、模糊搜索的测试数据基础上,再添加如下测试数据代码:

create table stuMarks (
  examNo char(7) primary key,
  stuNo varchar(6) not null,
  writtenExam int,
  labExam int
);

insert into stumarks values ('001','01', 80, 60);
insert into stumarks values ('002','05', 90, 55);
insert into stumarks values ('003','08', 88, 89);
insert into stumarks values ('004','09', 90, 92);

在这里插入图片描述 例题: 在这里插入图片描述 2、select * from 表1, 表2 where 表1.公共字段=表2.公共字段; 在这里插入图片描述

1.2 左外连接

规则:以左边的表为准,右边如果没有对应的记录,显示null 语法:select * from 表1 left join 表2 on 表1.公共字段=表2.公共字段; 在这里插入图片描述

1.3 右外连接

规则:以右边的表为准,左边如果没有对应的记录,显示null 语法:select * from 表1 rightjoin 表2 on 表1.公共字段=表2.公共字段; 在这里插入图片描述

1.4 交叉连接

语法:select * from 表1 cross join 表2 on 条件字段; 返回笛卡尔积。 在这里插入图片描述 在这里插入图片描述 小结: 1、交叉连接如果没有连接条件返回笛卡尔积 2、如果有连接条件和内连接是一样的

1.5 自然连接

自动判断条件连接,判断的条件是依据同名字段 1、自然内连接(natural join) 在这里插入图片描述 2、自然左外连接(natural left join) 在这里插入图片描述

3、自然右外连接(natural right join) 在这里插入图片描述

小结: 1、表连接是通过同名字段来连接的 2、如果没有同名字段则返回笛卡尔积 3、同名的连接值显示一个,并且将该字段放在最前面

1.5.1 using

using用来指定连接字段,using也会做公共字段的优化,优化的规则和自然连接的是一样的。 例: 在这里插入图片描述

1.6 练习

1、显示地区及每个地区参加考试(writtenExam(笔试))的人数,并按人数降序排列: 在这里插入图片描述 在这里插入图片描述 2、显示有学生参加考试的地区 在这里插入图片描述

3、显示男生和女生的人数 方法一,分组查询: 在这里插入图片描述 方法二,union: 在这里插入图片描述 方法三,直接写条件: 在这里插入图片描述

4、显示每个地区男生、女生、总人数 在这里插入图片描述

二、子查询

语法:select * from 表1 where (子查询) 外面的查询称为父查询 子查询为父查询提供查询条件

2.1 标量子查询

特点:返回的结果是一个。 例题:查找笔试成绩是88的学生: 在这里插入图片描述

2.2 列子查询

如果标量子查询的结果返回多条记录,不能使用等于,用in 或 not in。 特点:列子查询的返回结果是一列。

1、查找笔试成绩大于80的同学: 在这里插入图片描述

2.3 行子查询

特点:子查询返回的结果是多个字段组成

1、找出语文成绩最高的男生和女生 在这里插入图片描述

2.4 表子查询

特点:将子查询的结果作为表

1、找出语文成绩最高的男生和女生

在这里插入图片描述 注意:from后面跟的是数据源,如果将子查询当成表来看,必须给结果集取别名。

2.5 exists 子查询

1、如果笔试成绩有人超过90分,就显示所有学生信息: 在这里插入图片描述 2、如果笔试成绩没有人超过90分,就显示所有学生信息: 在这里插入图片描述

在学习的MySQL的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。