理清WHERE语句的用法
我们先来创建两张表来做演示
- 创建
teacher
表
create table teacher
(
id bigint unsigned auto_increment,
username varchar(50) default null unique comment '用户名',
password char(64) default null comment '密码',
nickname varchar(50) default null comment '昵称',
phone varchar(50) default null unique comment '手机号码',
email varchar(50) default null unique comment '电子邮箱',
description varchar(255) default null comment '描述',
primary key (id)
) comment '管理员表' charset utf8mb4;
- 创建
maker
表
create table maker
(
id bigint unsigned auto_increment,
username varchar(50) default null unique comment '用户名',
password char(64) default null comment '密码',
nickname varchar(50) default null comment '昵称',
phone varchar(50) default null comment '手机号码',
email varchar(50) default null comment '电子邮箱',
description varchar(255) default null comment '描述',
primary key (id)
) comment '制造者表' charset utf8mb4;
- 往
teacher
中插入数据
insert into teacher (username, password, nickname, phone, email, description) values ('小明','1','路飞','1','yao@ch.com','格斗家');
insert into teacher (username, password, nickname, phone, email, description) values ('小红','12','路飞','12','daomei@nl.com','格斗家');
insert into teacher (username, password, nickname, phone, email, description) values ('小绿','123','路飞','123','jianhao@jl.com','格斗家');
insert into teacher (username, password, nickname, phone, email, description) values ('小蓝','1234','路飞','1234','jianhao1@jl.com','怒翼龙');
insert into teacher (username, password, nickname, phone, email, description) values ('小紫','12345','娜美','12345','jianji1@zl.com','怒翼龙');
insert into teacher (username, password, nickname, phone, email, description) values ('小橙子','1234567','娜美','1234567','jianji2@zl.com','怒翼龙');
insert into teacher (username, password, nickname, phone, email, description) values ('小橘子','6','娜美','6','jianji3@zl.com','幻镜龙');
insert into teacher (username, password, nickname, phone, email, description) values ('小苹果','56','索隆','56','jiansheng1@sl.com','幻镜龙');
insert into teacher (username, password, nickname, phone, email, description) values ('小香蕉','456','索隆','456','jiansheng2@sl.com','金鳞龙');
insert into teacher (username, password, nickname, phone, email, description) values ('小西瓜','3456','罗宾','5456','jiansheng3@sl.com','金鳞龙');
insert into teacher (username, password, nickname, phone, email, description) values ('小荔枝','23456','剑魔','23456','jiansheng4@sl.com','斗士');
- 效果图
开始测试(思考的过程)
主要目的是了解清楚用了where
语句之后它的查询出来的结果集会是什么样子的,以及它查询结果的规律.
当你写完
sql
语句,点击执行的那一刻,你就应该知道你查询出来的结果是什么样子
- 如果
maker
表中没有数据
(1)sql
语句
select a.username,a.password,a.nickname,a.email,b.username,b.password,b.nickname,b.email from teacher a, maker b where a.nickname = b.nickname
注:整篇文章的查询都使用的这一个
sql
语句
(2)查询结果
(3)说明
maker
表中 nickname = 路飞
的条数为0
,所以b.nickname
就都是空,a.nickname
没有为空的,所以自然就查询不到结果.
此时如果teacher
表中有一条nickname
为空的数据,maker
表中也有一条nickname
为空的数据,执行查询的时候,也会查询出来,因为他们满足了where
条件,大家可DIY
- 在
maker
表中插入一条数据
(1)sql
语句
insert into maker (username, password, nickname, phone, email, description) values ('马尔扎哈','99999','路飞','1','yao@ch.com','格斗家');
(2)查询结果
(3)说明
可见teacher
表中所有nickname = 路飞
的数据都查询出来了,而maker
表中只有一条为路飞的数据,此时查询出来的数据条数为1*4
(
maker
表中的一条 *teacher
表中的四条)
- 再往maker表中插入一条
nickname = 路飞
的数据
(1)sql
语句
insert into maker (username, password, nickname, phone, email, description) values ('迪丽热巴','666666','路飞','1','dllb@ch.com','星界龙');
(2)查询结果
(3)说明
此时原来的teacher
表中依然只有四条nickname = 路飞
的数据,而maker
表中nickname = 路飞
的数据增加到了两条,此时所有的数据条数为2*4
(
maker
表中的两条数据 *teacher
表中的四条数据)
4.那我们再往maker
表中插入一条数据呢?
(1)sql
语句
insert into maker (username, password, nickname, phone, email, description) values ('古力娜扎','333333','路飞','1','glnz@ch.com','神龙尊者');
(2)查询结果
(3)说明
此时原来的teacher
表总还是只有四条数据,而maker
表中增加了一条数据变为了三条数据,此时查询出来的所有数据条数为3*4
(
maker
表中的三条 *teacher
表中的四条)
- 小结
此时结果就显而易见了,如果你想要用where
去做两个表之间的关联查询,那么查询出来的数据条数就是每个表中符合 where
查询条件 的 数据条数 的乘积 之和
由此可见,where语句的查询效率是特别的低下的,那会有更好的改进方法么?
我会在接下来的文章中介绍
查询结果的规律如下图
补充
上边的maker
表在做测试的时候只有 nickname = 路飞
的数据,并没有nickname = 其他值
的数据,在这里我们补充一下
把maker
表中的数据全部删除
truncate table maker;
然后再插入以下数据
insert into maker (username, password, nickname, phone, email, description) values ('maker1','maker1','路飞','1','maker1@ch.com','maker');
insert into maker (username, password, nickname, phone, email, description) values ('maker2','maker2','路飞','1','maker2@ch.com','maker');
insert into maker (username, password, nickname, phone, email, description) values ('maker3','maker3','娜美','1','maker3@ch.com','maker');
insert into maker (username, password, nickname, phone, email, description) values ('maker4','maker4','娜美','1','maker4@ch.com','maker');
insert into maker (username, password, nickname, phone, email, description) values ('maker5','maker5','娜美','1','maker5@ch.com','maker');
查询结果
为什么是这个查询结果呢?
2 * 4 + 3 * 3
DIY
自言自语
其实这篇文章就是由 where t.zm = a.bzmc
引发的思考,数据量太大的时候真不好想明白这个!
t
中的zm
有10
个’米国注水站’, a
中的bzmc
有5
个’米国注水站’,那么总的查询出来的条数就有50
条,这50
条数据是什么呢?
t
为每条数据前面的部分,a
为每条数据后边的部分.
把 50
条数据分为10
组, 每组中的t
的数据完全相同,但是每个组的每条数据各不相同,然后再使t
中的每组(5
个)分别对应 a
中的5
个不同的bzmc
(1
对5
)
反过来说就是
a
中的每一条数据对应10
条不同的t
中的数据(1
对10
)
最后
百密终有一疏,我所写的所有文章都不是写完就不管他了,我会在对知识有了新的理解之后,就会去更新我所写的博客,也希望大家能够指正我所写的文章中的错误,也欢迎大家把自己对知识的理解写在评论区,大家一起学习,一起进步!