【MySQL】不就是多表查询

【MySQL】不就是多表查询

前言

  嗨!小伙伴们大家好呀,忙碌的一周就要开始!在此之前我们学习的MySQL数据库的各种操作都是在一张表之中,今天我们学习要对多张表进行相关操作,相比较于单一的表来说,多张表操作相对复杂一些,我相信只要认真学习多表查询也不再话下!

 目录

目录

前言

 目录

一、多表关系

1.概述

1.1 一对一

1.2 一对多(多对一) 

​1.3 多对多

 二、多表查询概述

三、多表查询分类 

3.1 连接查询

3.2 内连接语法

3.3 内连接练习

3.4 外连接语法

3.5 外连接练习

3.6 自连接语法

3.7 联合查询 union,union all

四、总结 


一、多表关系

1.概述

  项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:

一对一(多对一)

一对多

多对多

1.1 一对一

案例: 用户与 用户详情的关系
关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率

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

 1.1.1 创建用户基本信息

create table tb_user
(
    id     int auto_increment ***ment '主键id'
        primary key,
    name   varchar(10) null ***ment '姓名',
    age    int         null ***ment '年龄',
    gender char        null ***ment '年龄 1男 2女',
    phone  char(11)    null ***ment '手机号'
)
    ***ment '用户基本信息表';

1.1.2 创建用户教育信息表

create table tb_user_edu
(
    id            int auto_increment ***ment '主键id'
        primary key,
    degree        varchar(20) null ***ment '学历',
    major         varchar(50) null ***ment '专业',
    primaryschool varchar(50) null ***ment '小学',
    middleschool  varchar(50) null ***ment '中学',
    university    varchar(50) null ***ment '大学',
    userid        int         null ***ment '用户id',
    constraint userid
        unique (userid),
    constraint fk_userid
        foreign key (userid) references tb_user (id)
)
    ***ment '用户教育信息表';

1.2 一对多(多对一) 

案例:部门与员工的关系
 关系:一个部门对应多个员工,一个员工对应一个部门
 实现: 在多的一方建立外键,指向一的一方的主键

1.3 多对多

案例: 学生与 课程的关系
关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择
实现: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

 建立三张表的代码如下

1.3.1 创建学生表且插入数据

create table student(id int auto_increment primary key ***ment'主键id',
name varchar(10) ***ment'姓名',
novar char(10) ***ment'学号') ***ment'学生表';

insert into student values(null,'宋江','001'),(null,'鲁智深','002'),(null,'李逵','001');

1.3.2 创建课程表且插入数据

create table course(
id int auto_increment primary key ***ment '主键id',
name varchar(10) ***ment'课程名称'
) ***ment'课程表';
insert into course values(null,'java'),(null,'js'),(null,'MySQL');

1.3.3 创建课程中间表且插入数据

create table student_course
(
    id        int auto_increment ***ment '主键'
        primary key,
    studentid int not null ***ment '学生id',
    courseid  int not null ***ment '课程id',
    constraint f_kcourseid
        foreign key (courseid) references course (id),
    constraint f_kstudentid
        foreign key (studentid) references student (id)
)
    ***ment '学生课程中间表';

 

 二、多表查询概述

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

创建两张表:部门表、员工表

create table dept
(
    id   int auto_increment ***ment 'id'
        primary key,
    name varchar(50) not null ***ment '部门名称'
)
    ***ment '部门表';

create table emp
(
    id         int auto_increment ***ment 'id'
        primary key,
    name       varchar(50) not null ***ment '姓名',
    age        int         null ***ment '年龄',
    job        varchar(20) null ***ment '职位',
    salary     int         null ***ment '薪水',
    entrydate  date        null ***ment '入职时间',
    mangagerid int         null ***ment '直属的领导id',
    dept_id    int         null ***ment '部门id',
    constraint dept_id
        foreign key (dept_id) references dept (id)
)
    ***ment '员工表';

 两张表消除笛卡尔积的方法:emp.dept_id=dept.id

三、多表查询分类 

3.1 连接查询


内连接:相当于查询A、B交集部分数据。
外连接:
 左外连接:查询左表所有数据,以及两张表交集部分数据 。
 右外连接:查询右表所有数据,以及两张表交集部分数据。

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

3.2 内连接语法

3.2.1隐式内连接

select 字段名 from 表1,表2 where 条件....;

3.2.2 显式内连接

select 字段名 from 表1 [inner] join 表2 no 连接条件;

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

3.3 内连接练习

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

select emp.name,dept.name from emp,dept where emp.dept_id=dept.id;

3.3.2 查询每一个员工的姓名,及关联的部门的名称(显示内连接实现)

select emp.name,dept.name from emp join dept on emp.dept_id=dept.id;

3.4 外连接语法

左外连接

select 字段列表 from 表1 left [outer] join 表2 on 条件...;

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

右外连接

select 字段列表 from 表1 right [outer] join 表2 on 条件...;

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

3.5 外连接练习

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

3.5.1 查询emp表的所有数据,和对应部门信息(左外连接)

select e.*,d.name from emp e left outer join dept d on e.dept_id=d.id;

3.5.2 查询dept表的所有数据,和对应的员工信息(右外连接)

select d.*,e.* from emp e right outer join dept d on e.dept_id=d.id;

右连接可以改为左连接

select d.*,e.* from dept d left outer join emp e on e.dept_id=d.id;

 

3.6 自连接语法

select 字段列表 from 表A 别名A join 表B 别名B on 条件;

子连接查询,可以是内连接查询,也可以是外连接查询。

3.7 联合查询 union,union all

对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。

 union 语法

SELECT 字段列表 FROM 表A ....
UNION [ ALL]
SELECT 字段列表 FROM 表B ....;

注意:

对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。

union all 会将全部的数据直接合并在一起,union 会对合并之后的数据去重。

四、总结 

  今天的课程就到此结束了,今天所学的课程为多表查询的一部分,在下一期的课程中我们主要学习子查询,期待我们下次再见!

转载请说明出处内容投诉
CSS教程_站长资源网 » 【MySQL】不就是多表查询

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买