SQL查询——SQL LEFT JOIN/SQL RIGHT JOIN

简介

在实际情况下,比如在一个大学里,有很多老师,老师都有自己的研究方向和职称。并且,可能并不是每个老师都带有研究生,如果一个新来的老师,可能还没有带研究生。所以,如果领导要求查出所有老师带研究生的数量(没有带研究生的为0),那么就需要用到左/右外连接的查询。

本文将针对上述的类似情况,进行分析和给出实际的解决方案。

 

本文的表结构:

  • 研究生表结构:

CREATE TABLE `g_student` (
  `gid` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `gender` char(1) DEFAULT NULL,
  `start_time` date DEFAULT NULL,
  `tid` int(11) DEFAULT NULL,
  PRIMARY KEY (`gid`),
  KEY `FK_student_teacher` (`tid`),
  CONSTRAINT `FK_student_teacher` FOREIGN KEY (`tid`) REFERENCES `teacher` (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

  • 导师表结构:

CREATE TABLE `teacher` (
  `tid` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `job_title` varchar(20) DEFAULT NULL,
  `major` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

  • 导师表数据

insert  into `teacher`(`tid`,`name`,`job_title`,`major`) values

(1,‘Shen‘,‘professor‘,‘image‘),

(2,‘刘‘,‘教授‘,‘数据库‘),

(3,‘黄‘,‘副教授‘,‘机器学习‘),

(4,‘黄春‘,‘讲师‘,‘多媒体‘),

(5,‘王‘,‘副教授‘,‘机器学习‘);

  • 研究生表数据:

insert  into `g_student`(`gid`,`name`,`gender`,`start_time`,`tid`) values

(1,‘A‘,‘男‘,‘2015-01-01‘,1),

(2,‘B‘,‘男‘,‘2015-09-01‘,2),

(3,‘C‘,‘男‘,‘2015-09-01‘,3),

(4,‘D‘,‘女‘,‘2015-09-01‘,1);

查询项目

  • 请查出每个导师所带研究生的数量。

分析:

不是每个老师都带有研究生,所以没有带研究生的老师对应的研究生数量应为0。因此需要采用外连接

SELECT COUNT(gs.name), t.`name` FROM g_student gs RIGHT JOIN teacher t
ON gs.`tid`=t.`tid`
GROUP BY gs.`tid` ;

这里,如果要使用left join,那么g_student 和teacher的位置需要交换

时间: 2024-10-10 13:02:29

SQL查询——SQL LEFT JOIN/SQL RIGHT JOIN的相关文章

ECSHOP后台SQL查询提示错误 this sql May contain UPDATE,DELETE,TRUNCATE,ALTER,DROP,FLUSH,INSERT

一). 首先说一下错误现象: 市面上流行的绝大部分ECSHOP模板,安装的时候都需要执行一段或几段SQL语句来修改数据结构或者初始化一些数据. 大多数ECSHOP管理员为了省事,都会通过 “ECSHOP后台>数据库管理 >SQL查询” 来执行这些SQL语句. 这时问题就来了,当你粘贴进SQL语句,点“提交查询”时,系统就会报出下面的错误: this sql May contain UPDATE,DELETE,TRUNCATE,ALTER,DROP,FLUSH,INSERT,REPLACE,SE

[转]sql语句中出现笛卡尔乘积 SQL查询入门篇

本篇文章中,主要说明SQL中的各种连接以及使用范围,以及更进一步的解释关系代数法和关系演算法对在同一条查询的不同思路. 多表连接简介 在关系数据库中,一个查询往往会涉及多个表,因为很少有数据库只有一个表,而如果大多查询只涉及到一个表的,那么那个表也往往低于第三范式,存在大量冗余和异常. 因此,连接(Join)就是一种把多个表连接成一个表的重要手段. 比如简单两个表连接学生表(Student)和班级(Class)表,如图: 进行连接后如图: 笛卡尔积 笛卡尔积在SQL中的实现方式既是交叉连接(Cr

Hibernate 的原生 SQL 查询

Hibernate除了支持HQL查询外,还支持原生SQL查询.         对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口.该接口是Query接口的子接口.         执行SQL查询步骤如下:         1.获取Hibernate Session对象         2.编写SQL语句         3.通过Session的createSQLQuery方法创建查询对象         4.调用SQ

Hibernate SQL查询 addScalar()或addEntity()

Hibernate除了支持HQL查询外,还支持原生SQL查询.          对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口.该接口是Query接口的子接口.          执行SQL查询步骤如下:          1.获取Hibernate Session对象          2.编写SQL语句          3.通过Session的createSQLQuery方法创建查询对象         

SQL查询 thinkphp

http://doc.thinkphp.cn/manual/query.html SQL查询 ThinkPHP内置的ORM和ActiveRecord模式实现了方便的数据存取操作,而且新版增加的连贯操作功能更是让这个数据操作更加清晰,但是ThinkPHP仍然保留了原生的SQL查询和执行操作支持,为了满足复杂查询的需要和一些特殊的数据操作,SQL查询的返回值因为是直接返回的Db类的查询结果,没有做任何的处理.主要包括下面两个方法:1.query方法 query  执行SQL查询操作 用法 query

笔记:Hibernate SQL 查询

Hibernate 支持使用原生的SQL查询,使用原生SQL查询可以利用某些数据库特性,原生SQL查询也支持将SQL语句放在配置文件中配置,从而提高程序的解耦,命名SQL查询还可以用于调用存储过程. SQL查询是通过SQLQuery接口来表示的,SQLQuery接口是Query接口的子接口,完全可以使用Query接口的方法,SQLQuery增加了二个重载方法 addEntity():将查询到的记录与特定的实体关联 addScalar():江查询的记录关联标量值 执行SQL的步骤如下: 获取Hib

在MyEclipse中构建SQL查询语句

在MyEclipse中的Visual SQL查询编辑器可用于轻松创建复杂的SQL语句,同时还无需记住其语法.不仅如此,它还利用易于使用的向导来直观地添加表.创建连接.管理组.表达式以及输出命令等等.在本教程中,您将学习到: 打开Visual SQL查询编辑器 将表添加到查询中并创建连接 构建一个表达式 运行该SQL 持续时间:10分钟 没有MyEclipse?立即下载 1. 打开Visual SQL查询编辑器 这里有几种方法可以用来访问Visual SQL查询编辑器. 1.1 从SQL编辑器中打

SQL查询语句 [2]

一.快捷查询 快捷查询方式是一种多字段查询的简化写法,在多个字段之间用'|'隔开表示OR,用'&'隔开表示 AND. 1.不同字段相同查询条件 在  Home/controller/UserController.class.php   中插入 //使用相同查询条件 $user = M('User'); $map['user|email'] = '蜡笔小新'; //'|'换成'&'变成AND var_dump($user->where($map)->select()); 这时在浏

(一)SQL关联查询的使用技巧 (各种 join)

---恢复内容开始--- (一)SQL关联查询的使用技巧 (各种 join) 这几天因为工作的时候,发现自己的sql语句基础不是很好,特意研究了一下,发现sql语句真的是博大精深,sql语句不仅是要查出来你想要的数据,更讲究查询的效率,因为在查询大量数据时往往会因为数据量大,造成效率很低,再加上前后台数据的交互,造成了访问延迟等等的一系列问题. 在我们的日常工作中往往用到很多的查询方式,例如 嵌套查询,关联查询,子查询等等,就我而言,我感觉关联查询是最容易学习,和效率最高的.下面就我总结的关联查

sql 查询 – left join on

p{line-height: 200%} 1. 问题引入 主要是为了查询在一个表中出现,而不在另一个表中出现的数据,具体来说: 如下图所示, 有A.B两个表,其中B表的Aid字段参照A表的主键id,为了查询在A表中出现,却没有被B表引用的数据: 限定条件:A和B中is_deleted字段为'n'  并且B中type为'common'. 2. 解决方法 2.1 left join on 使用not in可以方便实现,具体为: select p.id, p.is_deleted, q.id from