mysql-连接查询

一.概述

项目开发中,在进行数据结构设计时,会根据业务需求以及业务模块之间的关系,分析并设计表结构,由于业务之间的关系错综复杂:

1.一对一

实现**:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIUE)。**

2.多对多

一个学生可以选修多门课程,一门课程可以被多个学生选择

需要建立一个中间表,至少有两个主键,一个关联学生表的主键,一个关联课程表的主键。

3.一对多(多对一)

一个部门下可以有多个员工,一个员工只能有一个部门,在多的一方关联外键。

二.笛卡尔乘积

笛卡尔乘积是指在数学中,两个集合A集合和B集合的所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)

A: 1 2

B:1 2 3 4

总共的集合情况是8种

消除无效的笛卡尔积,查询关联的数据:

sql 复制代码
select * from emp,dept  where emp.dept_id=dept.id;

三.多表查询的分类

1.连接查询

内连接:相当于查询A,B交集部分的数据

外连接:

左外连接:查询左表所有数据,以及两张表交际部分数据

右外连接:查询右表所有数据,以及两张表交集部分数据

自连接:

当前表与自身的连接查询,自连接必须使用表别名

2.子查询

四.内连接查询语法

1.隐式内连接

sql 复制代码
SELECT  字段列表 FROM  表1,表2 WHERE 条件...;

2.显式内连接

sql 复制代码
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件...;

内连接查询的是两张表交集的部分

.案例

1.查询每一个员工的姓名,及关联的部门(隐式内连接实现)

sql 复制代码
select * from  emp.name, dept.name from emp, dept where emp.dept_id=dept.id

2.取别名

sql 复制代码
select e.name ,d.name from emp e,dept d where e.dept_id=d.id

表结构:emp ,dept

连接条件 :emp.dept_id=dept.id

如果给表取了别名,就不能使用表名了。

3.查询每一个员工的姓名,以及关联的部门名称(显式内接实现)

sql 复制代码
select e.name,d.name from emp e inner join dept d on e.dept_id=d.id

inner这个关键字是可以省去的

sql 复制代码
SELECT 字段列表 FROM 表1  RIGHT[OUTER] JOIN 表2 ON条件...

六.外连接

1.左外连接

sql 复制代码
SELECT 字段列表 FROM 表1  LEFT[OUTER] JOIN 表2 ON条件...

相当于查询表1(左表)的所有数据 包含表1和表2交集部分的数据

2.右外连接

相当于查询表2(右表)的所有数据 包含表1和表2交集部分的数据

七.自连接

1.查询语法

sql 复制代码
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON条件...;

自连接查询,可以是内连接查询,也可以是外连接查询

managerid指待的是直属领导的id。

员工的managerid关联的是领导的id

sql 复制代码
select a.name,b.name from emp a,emp b where a.managerid=b.id;

在自连接查询的时候,必须对表取别名。

2.查询所有员工emp 及其领导的名字emp,如果员工没有领导,也需要查询出来

sql 复制代码
select a.name '员工',b.name '领导'  from emp a left join emp b on a.managerid=b.id;
相关推荐
pokemon..1 小时前
MySQL主从复制与读写分离
数据库·mysql
码农鑫哥的日常1 小时前
MySQL高可用配置及故障切换
数据库·mysql
longlongqin1 小时前
redis的 stream数据类型实现 消息队列?
数据库·redis·缓存
wrx繁星点点1 小时前
多个线程同时写入一个共享变量,会发生什么问题?如何解决?
java·开发语言·数据库
鲨鱼辣椒ii2 小时前
sql中索引查看是否生效
数据库·sql
leidata2 小时前
MySQL系列—10.Innodb行格式
数据库·mysql
阿维的博客日记3 小时前
聚簇索引和二级索引
数据库·聚簇索引·二级索引
璇嘟嘟3 小时前
springboot-创建连接池
数据库
计算机程序设计开发3 小时前
小说阅读网站登录注册搜索小说查看评论前后台管理计算机毕业设计/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序
数据库·vue.js·spring boot·java-ee·课程设计·计算机毕业设计·数据库管理系统
赵利伟@3 小时前
springboot对数据库进行备份+对一个文件夹内的文件按时间排序,只保留最近的8个文件
数据库