前言:

本文内容:模糊查询操作符详解、连表查询JoinON详解、自连接和连表查询

推荐免费MySQL基础讲解视频:【狂神说Java】MySQL最新教程通俗易懂_哔哩哔哩_bilibili

模糊查询操作符详解

运算符 语法 描述
is null a is null 如果操作符为null,结果为真
is not null a is not null 如果操作符不为null,结果为真
between a between b and c 若a和b和c之间,则结果为真
like a like b SQL匹配,如果a匹配b,结果为真
in a in (a1,a2,a3) 假设a在a1或a2其中的某一个值中,结果为真

举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 模糊查询 like 结合%(代表0到任意字符)
-- 查询姓张的人
select * from student where name like '张%';
-- 查询姓张且两个名字的人
select * from student where name like '张_';
-- 查询中间是肥的名字
select * from student where name like '%肥%';
-- in关键字
-- 查询 1,2,3号学员
select * from student where `id` in (1,2,3);
-- 查询在咸阳的学生
select * from student where `address` in ('陕西咸阳');
-- null not null 查询邮箱为空的
select * from student where email='' or email is null;
-- 查询生日不为空的
select * from student where birthday is not null;

连表查询JoinON详解

Join图例

173

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
-- 连接查询
-- 查询学生信息(包括年级显示)
/*
思路:
1. 找到需要查询的字段,去掉重复和无关的字段
2. 通过外键连接两张表进行查询
*/
-- 内连接 inner join...where
select `id` as '编号',`name` as '姓名',`sex` as '性别',`birthday` as '生日',`address` as '地址',`email` as '邮箱',`gradename` as '年级' from student st inner join grade gr where st.gradeid=gr.gradeid;
-- 左连接left join...on
select `id` as '编号',`name` as '姓名',`sex` as '性别',`birthday` as '生日',`address` as '地址',`email` as '邮箱',`gradename` as '年级' from student st left join grade gr on st.gradeid=gr.gradeid;
-- 右连接 right join...on
select `id` as '编号',`name` as '姓名',`sex` as '性别',`birthday` as '生日',`address` as '地址',`email` as '邮箱',`gradename` as '年级' from student st right join grade gr on st.gradeid=gr.gradeid;

总结:

操作 描述
inner join 表中至少有一个匹配,就返回结果
left join 会从左表中返回所有的值,即使右表中没有匹配
right join 会从右表中返回所有的值,即使左表中没有匹配

遇到多张表连接查询,理清思路,循序渐进

自连接及连表查询

自己的表和自己连接(理解为一张表拆为两张表)

父类

categoryid categoryName
2 信息技术
3 软件开发
5 美术设计

子类

pid categoryid categoryName
3 4 数据库
2 8 办公信息
3 6 web开发
5 7 美术设计

查询父类对应的子类关系

父类 子类
信息技术 办公信息
软件开发 数据库
软件开发 web开发
美术设计 ps技术

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- 自连接
create table `category`(
`categoryid` int(10) unsigned not null auto_increment comment '主题id',
`pid` int(10) not null comment '父类id',
`categoryName` varchar(50) not null comment '主题名字',
primary key(`categoryid`)
)engine=innodb auto_increment=9 default charset=utf8

insert into `category`(`categoryid`,`pid`,`categoryName`)
values('2','1','信息技术'),
('3','1','软件开发'),
('4','3','数据库'),
('5','1','美术设计'),
('6','3','web开发'),
('7','5','ps技术'),
('8','2','办公信息');
-- 查询父子信息 把一张表看为两张表
select a.`categoryName` as '父栏目',b.`categoryName` as '子栏目' from `category` as a,`category` as b where a.`categoryid` = b.`pid`;