首页 > 数据库 >MySQL多表查询

MySQL多表查询

时间:2022-08-16 19:24:12浏览次数:61  
标签:多表 name course 查询 stu MySQL sc id

多表连接的方式有四种:

  • 内连接
  • 外连接**
  • 全连接
  • 子查询

SQL92语法

1992年的语法。

-- 查询学号,姓名,年龄,分数,通过多表连接查询,student和scores通过id和s_id连接
SELECT
	stu.id 学号,
	stu.name 姓名,
	stu.age 年龄,
	sc.score 分数 
FROM
	student stu,
	scores sc 
WHERE
	stu.id = sc.s_id;
-- 查询学号,姓名,年龄,分数,科目名称,通过多表查询,student和scores,course
SELECT
	stu.`id` 学号,
	stu.`name` 姓名,
	stu.`age` 年龄,
	sc.`score` 分数,
	c.`name` 科目
FROM
	student stu,
	scores sc,
	course c
WHERE
	stu.id = sc.s_id
AND
	c.id = sc.c_id;
-- 查询学号,姓名,年龄,分数,科目名称,老师名称,通过多表查询,student和scores,course,teacher
SELECT
	stu.`id` 学号,
	stu.`name` 姓名,
	stu.`age` 年龄,
	sc.`score` 分数,
	c.`name` 科目,
	t.`name` 老师
FROM
	student stu,
	scores sc,
	course c,
	teacher t
WHERE
	stu.id = sc.s_id
AND
	c.id = sc.c_id
AND
	c.t_id = t.id;
-- 查询老师的信息以及对应教的课程
SELECT
	t.id 教师号,
	t.NAME 教师姓名,
	c.NAME 科目名
FROM
	teacher t,
	course c 
WHERE
	t.id = c.t_id;

SQL92语法,多表查询,如果有数据为null,会过滤掉。

-- 查询学号,姓名,年龄,分数,科目名称,通过多表查询,student和scores,course
-- 在查询的基础上,进一步筛选,筛选小红和张小军的成绩
SELECT
	stu.`id` 学号,
	stu.`name` 姓名,
	stu.`age` 年龄,
	sc.`score` 分数,
	c.`name` 科目
FROM
	student stu,
	scores sc,
	course c
WHERE
	stu.id = sc.s_id
AND
	c.id = sc.c_id
AND
	stu.`name` in ('小红','张小军');
-- 查询学号,姓名,年龄,分数,科目名称,通过多表查询,student和scores,course
-- 在查询的基础上,进一步筛选,筛选小红和张小军的成绩
-- 在小红和张小军成绩的基础上进一步再筛选,筛选他们的java成绩
SELECT
	stu.`id` 学号,
	stu.`name` 姓名,
	stu.`age` 年龄,
	sc.`score` 分数,
	c.`name` 科目
FROM
	student stu,
	scores sc,
	course c
WHERE
	stu.id = sc.s_id
AND
	c.id = sc.c_id
AND
	stu.`name` in ('小红','张小军')
AND
	c.`name` = 'java';
-- 查询学号,姓名,年龄,分数,科目名称,通过多表查询,student和scores,course
-- 找出最低分和最高分,按照科目分组,每一科
SELECT
	sc.c_id,
	max( score ),
	min( score ),
	c.`name` 
FROM
	scores sc,
	course c 
WHERE
	sc.c_id = c.id 
GROUP BY
	sc.c_id;

SQL99语法

1999年的语法。

内连接

在我们刚才的sql当中,使用逗号分隔两张表进行查询,mysql进行优化默认就等效于内连接。

使用【join】关键字,使用【on】来确定连接条件。【where】只做筛选条件。

SELECT
	t.*,
	c.* ,
	sc.*
FROM
	teacher t
	INNER JOIN course c ON c.t_id = t.id
	INNER JOIN scores sc ON sc.c_id = c.id;

外连接(常用)

内连接和外连接的区别:

  • 对于【内连接】的两个表,如果【驱动表】在【被驱动表】找不到与之匹配的记录,则最终的记录不会出现在结果集中。
  • 对于【外连接】中的两个表,即使【驱动表】中的记录在【被驱动表】中找不到与之匹配的记录,也要将该记录加入到最后的结果集中。针对不同的【驱动表】的位置,有分为【左外连接】和【右外连接】。
  • 对于左连接,左边的表为主,左边的表的记录会完整的出现在结果集里。
  • 对于右连接,右边的表为主,左边的表的记录会完整的出现在结果集里。

外连接的关键字【outter join】,也可以省略outter,连接条件同样使用【on】关键字。

左连接
SELECT
	t.*,
	c.* 
FROM
	teacher t
	LEFT JOIN course c ON t.id = c.t_id;
右连接
SELECT
	t.*,
	c.* 
FROM
	course c
	RIGHT JOIN teacher t ON t.id = c.t_id;

标签:多表,name,course,查询,stu,MySQL,sc,id
From: https://www.cnblogs.com/sevenxx/p/16592666.html

相关文章

  • 2022-08-16 第六组 Myy 学习笔记_DQL数据库查询语言
    DQL数据库查询语言重点,DQL是我们每天都要接触编写最多也是最难的SQL,该语言用来查询记录,不会修改数据库和表结构。构建数据库创建一张student表:DROPTABLEIFEXISTSst......
  • 【MySQL】分组GROUP BY
    目录1.GROUPBY分组使用2.使用多个列分组3.GROUPBY中使用WITHROLLUP1.GROUPBY分组使用例:求员工表中各部门的平均工资使用GROUPBY子句将数据按部门分SELECT depa......
  • 动手实验查看MySQL索引的B+树的高度
    一:简化几个概念:h:统称索引的高度;h1:聚簇索引的高度;h2:二级辅助索引的高度;k:中间结点的扇出系数。二:索引结构叶子节点其实是双向链表,而叶子节点内的行数据是单向链表,该......
  • 如何解决生产环境MySQL的死锁问题
    生产问题云服务上的生产环境中发现我们数据库出现了一个异常,异常堆栈信息如下:Errorupdatingdatabase.Cause:com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRol......
  • 多簿多表合并
    问题:同一文件夹内的多个工作簿,每个工作簿内工作表数量不定,需要合并到一个工作表里。注意:每个工作表标题均在第一行示例工作簿在C盘下的数据源文件夹中,每列标题分别为:日期......
  • mysql问题记录:varchar字段存数字加了索引,导致between速度非常慢,走了全表扫描
    在字段类型为varchar并且是数字的时候,此时使用betweennum1andnum2。会导致不走索引。原因是因为当条件是数字的时候,mysql会将varchar字段先转换为数值,然后进行比较。......
  • 【sql效率优化】优雅地解决mysql深分页问题
    背景日常需求开发过程中,数据库开发是必不可少的,大家应该都习惯将数据库部署在虚拟机上吧,那么相信大家对于limit一定不会陌生,但是使用limit时,当偏移量(offset)非常大时,会发现......
  • MySQL---索引
    索引下推:概念:索引下推(IndexConditionPushdown,简称ICP),实质上就是指将部分上层(服务层)负责的事情,交给了下层(引擎层)去处理。是MySQL5.6版本的新特性,它能减少回......
  • 解决Redis、MySQL缓存双写不一致问题
     redis、mysql双写缓存不一致: 但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存。又或者是先删除缓存,再更新数据库,其实大家存在很大的争议。目前没有一......
  • MySQL三
    约束条件之主键约束条件之外键操作表的SQL语句补充今日内容详细约束条件1.primarykey主键 1.单从约束角度上而言主键等价于非空且唯一notnullunique cr......