首页 > 数据库 >MySQL学习3--联表查询

MySQL学习3--联表查询

时间:2023-06-30 21:34:18浏览次数:39  
标签:join name -- 教学部 ts 联表 MySQL id select

1、常规联表查询

创建两张数据库表如下:

mysql> select * from dept;
+----+-----------+
| id | deptName  |
+----+-----------+
|  3 | 教学部    |
+----+-----------+
1 row in set (0.00 sec)

mysql> select * from employee;
+----+---------+--------+---------------------+
| id | empName | deptId | regTime             |
+----+---------+--------+---------------------+
|  1 | 老邢    |      3 | 2023-06-29 16:28:09 |
|  4 | 老万    |      3 | 2023-06-29 16:28:47 |
|  5 | 小磊    |      3 | 2023-06-29 16:28:48 |
+----+---------+--------+---------------------+

联表查询  老邢属于哪个部门?

mysql> select employee.id, employee.empName, dept.deptName  #查什么
    ->from  employee,dept #从哪查   多张表使用逗号隔开
    ->where  employee.deptId = dept.id and employee.empName = "老邢";#约束的条件一定要带
+----+---------+-----------+
| id | empName | deptName  |
+----+---------+-----------+
|  1 | 老邢    | 教学部    |
+----+---------+-----------+

联表查询的时候对字段可以起别名

mysql> select e.id, e.empName, d.deptName
    -> from employee e, dept d
    -> where e.deptId = d.id;
+----+---------+-----------+
| id | empName | deptName  |
+----+---------+-----------+
|  1 | 老邢    | 教学部    |
|  4 | 老万    | 教学部    |
|  5 | 小磊    | 教学部    |
+----+---------+-----------+

mysql> select e.id as "编号", e.empName as "名字", d.deptName as "部门"
    -> from employee e, dept d
    -> where e.deptId = d.id;
+--------+--------+-----------+
| 编号   | 名字   | 部门      |
+--------+--------+-----------+
|      1 | 老邢   | 教学部    |
|      4 | 老万   | 教学部    |
|      5 | 小磊   | 教学部    |
+--------+--------+-----------+

2、内连接和外连接

join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。

2.1、内连接  inner join

语法格式:

select 字段
from 表1
inner join 表2
on 约束关系

例1:#查教学部有多少人

mysql> select d.deptName, e.empName
    -> from dept d
    -> inner join employee e
    -> on d.id = e.deptId;
+-----------+---------+
| deptName  | empName |
+-----------+---------+
| 教学部    | 老邢    |
| 教学部    | 老万    |
| 教学部    | 小磊    |
+-----------+---------+

例2:查看老邢属于哪个部门

mysql> select e.empName, d.deptName
    -> from employee e
    -> inner join dept d
    -> on e.deptId = d.id
    -> where e.empName = "老邢";
+---------+-----------+
| empName | deptName  |
+---------+-----------+
| 老邢    | 教学部    |
+---------+-----------+

2.2、外连接

a、左外连接

left join关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。也要展示。

语法格式:

select 字段 from 左表1 left outer join 右表2 on 约束条件

左边表全部显示,右边表去匹左边表,如果没有匹配上就显示null  例:

mysql> select d.deptName, e.empName
    -> from dept d
    -> left outer join employee e
    -> on d.id = e.deptId;
+-----------+---------+
| deptName  | empName |
+-----------+---------+
| 教学部    | 老邢    |
| 教学部    | 老万    |
| 教学部    | 小磊    |
| 技术部    | NULL    |
+-----------+---------+
b、右外连接

语法格式:

select 字段  from 左表1  right outer join 右表2 on  约束条件

以右边表为主右边表要全部显示,左边如果没有匹配到就显示为null  例:

mysql> select *
    -> from employee e
    -> right outer join dept d
    -> on e.deptId = d.id;
+------+---------+--------+---------------------+----+-----------+
| id   | empName | deptId | regTime             | id | deptName  |
+------+---------+--------+---------------------+----+-----------+
|    1 | 老邢    |      1 | 2022-04-25 10:08:04 |  1 | 教学部    |
|    2 | 雪珂    |      2 | 2022-04-25 10:08:17 |  2 | 行政部    |
|    3 | 凯旗    |      3 | 2022-04-25 10:08:30 |  3 | 技术部    |
|    4 | 小磊    |      1 | 2022-04-25 10:08:43 |  1 | 教学部    |
|    5 | 帅栋    |      1 | 2022-04-25 10:08:56 |  1 | 教学部    |
| NULL | NULL    |   NULL | NULL                |  4 | 后勤部    |
+------+---------+--------+---------------------+----+-----------+

2.3、一对一、一对多查询

例:现有学生表和老师表

一个老师对应着多个学生(一对多)     一个学生对应着咱们的一个老师(一对一)

a、一对一查询(使用内连接)

查询邱博的老师?   一对一

select ts.s_name, tt.t_name
from t_student ts
inner joint_teacher tt
on ts.teacher_id = tt.t_id
where ts.s_name = "邱博"
b、一对多查询(使用内连接)

查询老邢所带的学生

select tt.t_name, ts.s_name
from t_teacher tt
inner join t_student ts
on tt.t_id = ts.teacher_id
where tt.t_name = "老邢"
c、一对多查询(不使用内连接)
select tt.t_name, ts.s_name
from t_student ts, t_teacher tt
where ts.teacher_id = tt.t_id and tt.t_name = '老邢'

2.4、多对多查询

例:

学生和课程的关系
学生选课,
一个学生对应着多个课程
一个课程要被多个学生选择
一个课程对应着多个学生

创建学生表、课程表、学生_课程关联表,三表联查 两个inner join

#看所有学生选择了哪些的课程
select ts.s_name, tc.c_name
from t_stu ts
inner join stu_course sc
on ts.s_id = sc.stu_id
inner join t_course tc
on sc.course_id = tc.c_id
#查看狗蛋选择了哪些课程
select ts.s_name, tc.c_name
from t_stu ts
inner join stu_course sc
on ts.s_id = sc.stu_id
inner join t_course tc
on sc.course_id = tc.c_id
where ts.s_name = "狗蛋"

#Java被哪些学生选择了
先写课程表
select *
from t_course tc
inner join stu_course sc
on tc.c_id = sc.course_id
inner join t_stu ts
on sc.stu_id = ts.s_id
where tc.c_name = "Java"

 

标签:join,name,--,教学部,ts,联表,MySQL,id,select
From: https://www.cnblogs.com/y15136702274/p/17517857.html

相关文章

  • k8s安装环境准备:Virtualbox安装CentOS;复制多个CentOS虚拟机
    1.安装virtualbox下载virtualboxhttps://www.virtualbox.org/wiki/Downloads安装(windows)双击VirtualBox-7.0.8-156879-Win.exe选择安装目录安装完成后,打开virtualbox2.下载CentOS下载CentOS-7-x86_64-DVD-2009.isohttp://isoredirect.centos.org/centos/7/isos/......
  • Nacos如何避免并发读写冲突问题
    刚开始:privatefinalMap<String,Map<String,Service>>serviceMap=newConcurrentHashMap<>();这个serviceMap装的时一个旧的实例列表,在对集群注册更新的时候,后台异步执行时会将旧的实例拷贝一份整出一个全新的集合,拷贝后异步执行的线程池里面要往里面新加就新加,想从里面......
  • CSS:z-index属性
    如果父div元素设置了z-index:100属性,子div元素的行为将取决于其自身的z-index值和定位方式。子div元素没有显式设置z-index:如果子div元素没有设置position属性,或者设置为static,则子元素的层叠顺序将继承自父元素,并且父元素的z-index值(100)将影响子元素。如......
  • CF1753 题解
    CF1753题解A首先我们发现,我们可以将序列一部分取反,将1变-1,-1变1的操作每次将总和增加2,所以如果初始和的绝对值为奇数则无解。我们发现,一段区间可以拆成若干个长度为2和1的小区间(+-+-+-+-....)变成(+-+-+-...)。我们假设初始都是长度为1的小区间,这时答案等于所有数的总和。我们......
  • Nacos与Eureka的区别有哪些?
    Nacos与Eureka有相同点,也有不同之处,可以从以下几点来描述:接口方式:Nacos与Eureka都对外暴露了Rest风格的API接口,用来实现服务注册、发现等功能实例类型:Nacos的实例有永久和临时实例之分;而Eureka只支持临时实例健康检测:Nacos对临时实例采用心跳模式检测,对永久实例采用主动请求来......
  • 根据Twitter上的专家,我们都是懒惰的人,没有投入足够的工作。
    只是喜欢看电视的懒鬼,或者对社交媒体上瘾。我们都认为自己有权享有成功。太忙于白日梦,以至于变成了大婴儿。太容易分心,没有付出努力和时间来取得成功。这就是那些催促你奋斗的人想让你相信的。论点社交媒体上充斥着那些向你推销奋斗文化的影响者。让我总结一下我经常看到的热......
  • 明明说参加秋招,怎么就开始“夏招”了
    本文首发自公粽hao「林行学长」,欢迎来撩,免费领取20个求职工具资源包。了解校招、分享校招知识的学长来了!你可能真没想到,但是24届秋招它真的真的开始了…俗话说,秋招时间看得准,早拿Offer没烦恼。在很多人还翘首静待秋招时,很多公司其实已经不声不响的就开始进行秋招提前批的启动了......
  • 一篇文章搞懂网络IO
    IO是Input/Output的缩写。Unix网络编程中有五种IO模型:blockingIO(阻塞IO)nonblockingIO(非阻塞IO)IOmultiplexing(多路复用IO)signaldrivenIO(信号驱动IO)asynchronousIO(异步IO)背景java.io包基于流模型实现,提供File抽象、输入输出流等IO的功能。交互方式是同步、阻塞的方式,在读取输入......
  • 彻底搞懂epoll高效运行的原理
    概念初探epoll是一种I/O事件通知机制,是linux内核实现IO多路复用的一个实现。IO多路复用是指,在一个操作里同时监听多个输入输出源,在其中一个或多个输入输出源可用的时候返回,然后对其的进行读写操作。IO多路复用,以后会有详细讲解。I/O输入输出(input/output)的对象可以是文件(file),......
  • Android面经:小厂被diss到自闭,“试水”大厂竟收3份offer
    写在最前面:有时候某人的放弃,将会成就你更好的选择!刚开始面试的时候我真的是处处碰壁,面一家挂一家,面完之后怀疑自我,是不是自己真的太菜了找不到工作,还是真的是像网上所焦虑的那样,Android开发真的是要凉了?这次跳槽经历让我明白,工作本身就是双向选择,一家不行再换一家,总有合适的,千万不......