mysql进阶篇

本人也是很久之前学习了mysql,今天打算复习一下随手写一篇笔记整理一下

1.连接(连结)查询

按照我们设计表的一个规范,一个实体应该在一张表里面完成
如果一个业务要使用多个实体的数据呢?那是不是应该有多张表一起使用,将多个表的记录连结起来,这就是连接的目的

自然连接mysql语句 mysql中的自然连接_Mysql


上图这张表描述了哪一个老师在什么时期之内教了哪个班级

我们现在用一个表来存储它是可以做到的,但是按照数据库的设计规范的话,它是不符合第三范式的,他有传递依赖

所以我们要将这个表拆为三部分,从而做一些查询

自然连接mysql语句 mysql中的自然连接_数据库_02

create table join_teacher(
id int primary key auto_increment,
t_name varchar(20),
gender enum('male','famale')
) engine innoDB character set utf8;

insert into join_teacher values
(1,'冯老师','male'),
(2,'魏老师','famale'),
(3,'秦老师','male'),
(4,'陈老师','male');

create table join_class(
id int primary key auto_increment,
c_name char(10),
room char(5)
) engine innoDB character set utf8;

insert into join_class values
(1,'python1','33201'),
(2,'python2','33202'),
(3,'python3','33203'),
(4,'python4','33204');

create table join_teacher_class(
id int primary key auto_increment,
t_id int,
c_id int,
days int,
start_date date,
end_date date
) engine innoDB character set utf8;

insert into join_teacher_class values
(1,1,1,15,"2019-03-05","2019-03-20"),
(2,1,1,5,"2019-03-05","2019-03-10"),
(3,2,2,20,"2019-03-05","2019-03-25"),
(4,2,2,1,"2019-03-05","2019-03-06"),
(5,3,3,7,"2019-03-05","2019-03-12"),
(6,1,1,8,"2019-03-05","2019-03-13"),
(7,3,3,4,"2019-03-05","2019-03-09");

连接总体思路:将数据按照某种条件连接起来在做查询,因为连接的条件不同,连接又分为:内连接,外连接,自然连接,连接是指根据表规定的结构来进行数据的连接,首先讲解什么是内连接

内连接

数据内部的连接,要求连接的多个数据必须真实存在才能进行连接

先来段语法,一看便知一二

table_left inner join table_right on(连接条件) ps:在join左边则是左表,右边则为右表

来个例子:

我们查询一下每个老师带了多少天课

自然连接mysql语句 mysql中的自然连接_自然连接mysql语句_03

select join_teacher.t_name,join_teacher_class.days from join_teacher inner join join_teacher_class on join_teacher.id=join_teacher_class.t_id;

先不要看这个语法,先看一下这个结果有没有展示陈老师的代课信息

自然连接mysql语句 mysql中的自然连接_Mysql_04


因为当前没有记录可以和陈老师进行连接,内连接不存在连接不上的数据

自然连接mysql语句 mysql中的自然连接_连接查询_05


我们先分析一下这个连接过程:

首先将所有的数据连接起来(图中第一步)

自然连接mysql语句 mysql中的自然连接_连接查询_06


PS:不满足条件结果不保留

内连接在连接时是可以省略条件的,一旦省略条件mysql这判断所有连接全为真,意味着所有左表数据都要与右表的记录做一次连接,共有 m*n个连接
这种没有条件的内连接叫做交叉连接或笛卡尔积,笛卡尔积是获得最高记录数的一种,当然处理起来也是非常缓慢的,除非是将所有可能性展示出来,否则不做这种笛卡尔积连接的
Mysql中 inner join是默认的连接方式 所以inner是可以省略的

外连接

如果负责连接的多个数据不真实存在,称之为外连接

外连接分类:左外连接、右外连接、全外连接 但是mysql没有全外连接

左外连接:在连接时如果出现左边表数据连接不到右边表的情况.则左边表的数据在最终结果里保留,如果右表数据连接不到左表,则右表数据被丢弃(灵魂画师别介意

右外连接反之

自然连接mysql语句 mysql中的自然连接_Mysql_07

跟内连接的例子一样 : 我们查询一下每个老师带了多少天课

自然连接mysql语句 mysql中的自然连接_IT_08

select join_teacher.t_name,join_teacher_class.days from join_teacher left outer join join_teacher_class on join_teacher.id=join_teacher_class.t_id;

left outer join (outer是可以省略的)

而这里出现了陈老师的信息

自然连接mysql语句 mysql中的自然连接_连接查询_09


当数据连接不上时 保留左表 右边用虚拟数据代替

左连接是开发过程中用到最多的一种连接方式

注意:外连接不能使用where

自然连接

natural join 通过mysql自己的判断完成连接
自然连接暂不介绍,有时间我会补上

注意

取别名:
select join_teacher.t_name,join_teacher_class.days from join_teacher left outer join join_teacher_class on join_teacher.id=join_teacher_class.t_id;
将表名称取别名后:
select t.t_name,tc.days from join_teacher as t left outer join join_teacher_class as tc on t.id=tc.t_id;
跟上面语句一样 变得更简洁更清晰

无论是连接条件还是连接查询多字段列表,没有必要一定要写 表名.字段的写法,是否写,取决于是否发生了冲突,冲突需要些,不冲突无所谓,建议写上,提高代码的可读性

以上就是本章的全部内容了,因为时间关系写的有些匆忙,后期会做一些修改,光看是学不会的,重要的是练习,最后感谢大家的阅读