Mysql操作——进阶指令语法

本文主讲:Mysql数据库内高级的操作指令,例如where比较运算、order排序、grep分组、连接查询等..

强化练习——去重复【重点】

查询结果去重复关键字 —— distinct

功能:将查询结果去重复

语法: select distinct 字段名 from 数据表名;

快速代码

image-20211011202331816

where之比较运算【重点】

Mysql数据库中几种比较运算符

常见几种Mysql运算符:

大于:>

小于:<

大于等于:>=

小于等于:<=

等于:=

不等于:!= 或者 <>

注意事项:在Mysql内,等于号是 = 而不是 ==

where之比较查询的方法

功能:利用比较运算符查询符合条件的数据

语法:

1:select * from 数据表名 where id <> 15;(表示查询id不等于15的所有字段数据)

2:select * from 数据表名 where id = 15; (表示查询id等于15的所有字段数据)

快速代码体验

<> 不等于运算符

image-20211011202447791

= 等于运算符

image-20211011202455234

where之逻辑运算【重点】

Mysql的几种逻辑运算符

和运算符:and

或运算符:or

非运算符:not

where之逻辑运算符查询的语法

功能:按照逻辑运算符查询符合条件所有字段的数据

语法:
1:select * from 数据表名 where id > 15 and gender = “女”; (表示查询id大于15并且性别为女的所有字段数据)

2:select * from 数据表名 where id > 15 or new_age > 20 ; (表示查询 id 大于 15 或者 new_age 大于 20 的所有字段数据)

3:select * from 数据表名 where not id > 15 ; (表示查询id小于等于15的所有字段数据)

4:select * from 数据表名 where not id > 15 and gender = “女”; (表示查询id小于等于15并且性别为女的所有字段数据)

快速代码体验

and和or的代码体验

image-20211011202535900

not代码体验

image-20211011202554729

where之模糊查询(类似于正则)【重点、常用】

模糊查询的几个关键字

like:放在字段后面使用用于模糊查询

%:表示匹配0个或多个任意字符,类似于正则表达式中的 *

_:表示匹配单个任意字符,类似于正则表达式中的 .

where之模糊查询的使用方法

功能:模糊查询符合规则的字段所有数据,类似于正则表达式匹配字符串

应用场景:百度搜索引擎的模糊关键字查询

语法:
1:select * from 数据表名 where name like “张%”; (表示查询name字段中 第一个字符是张的所有名字信息)

2:select * from 数据表名 where name like “张_”;(表示查询name字段第一个字符是张,第二个字符任意的所有名字信息,注意名字只有两个字符)

3:select * from 数据表名 where name like “%莉%”;(表示查询name字段中包含莉这个字符的所有数据信息)

快速代码体验

语法一代码

image-20211011202631791

语法二代码

image-20211011202640661

语法三代码

image-20211011202647375

where之范围查询【重点】

in、not in、between and、not between and 关键字的作用

in:表示查询在非连续范围内的所有数据

not in :表示查询不在这个非连续范围内的所有数据

between and:表示查询在连续范围内的所有数据

not between and :表示查询不在这个连续范围内的所有数据

where之范围查询的使用方法

功能:查询指定范围内(非连续范围与连续范围)的所有数据

语法:

1:select * from 数据表名 where id in(14,16,18);(表示查询id为14,16,18的所有字段数据)

2:select * from 数据表名 where id not in (14,16,18);(表示查询id不是14,16,18的所有字段数据)

3:select * from 数据表名 where id between 14 and 16;(表示查询id在14到16之间的所有字段数据,包括14与16)

4:select * from 数据表名 where id not between 14 and 16;(表示查询id不在14到16之间的所有字段数据)

注意事项:

1:利用关键字 between 16 and 18 在连续范围内查询数据时,包含16与18

2:利用关键字 not between 16 and 18 查询数据时不能这么写 not (between 16 and 18)即不能加括号!

快速代码体验:

in关键字与not in 关键字

image-20211011202723777

Between and 关键字与 not between and 关键字

image-20211011202732020

where之空值判断【重点】

is null 关键字与 is not null 关键字的作用

is null :查询指定字段内数值为空(null)的所有数据(将指定字段内数据为空的数据查询出来)

is not null:查询指定字段内数据非空的所有数据

where值空值判断的使用方法

功能:查询某一个字段内的空(null)与非空的所有数据值

语法:

1:select * from 数据表名 where new_age is null;(表示查询new_age字段中所有数值为空(null)的所有数据)

2:select * from 数据表名 where new_age is not null;(表示查询new_age字段中所有数值不为空的所有数据)

注意事项:在查询非空数据的时候,不能写成 not is null 而是 is not null 这是甲鱼的臀部

快速代码体验

image-20211011202821485

order排序【重点】

Mysql排序关键字 order by

当sql语句中出现 where 关键字时就说明要按照条件查询数据, 当出现 order by 关键字时就说明要对查询数据进行排序啦

where 关键字与 order by 关键字关系图示

Mysql 升序(asc)与降序(desc)的关键字

asc:当字段后面出现 asc 关键字时就说明将这个字段内的所有数据按照升序排列

desc:当字段后面出现 desc 关键字时就说明将这个字段内的所有数据按照降序排列

注意事项:
1:在写sql排序语句时,字段后面没有出现 asc与desc 默认按照升序(asc)进行排序
2:字母的升序是 a-z ,降序为 z-a

order by 排序的使用方法

功能:将查询的数据按照升序或者降序进行排序

语法:

1:select * from 数据表名 where id between 14 and 18 and gender = “男”order by new_age asc ;
(表示先查询id在14到18之间的所有男性信息,然后将这些信息再次按照 new_age 字段内的数据进行升序排序)

2:select * from 数据表名 where id between 14 and 18 and gender = “男”order by new_age desc
(表示先查询id在14到18之间的所有男性信息,然后将这些信息再次按照 new_age 字段内的数据进行降序排序)

注意事项:where关键字先按照后面的条件查询出符合条件的数据信息,然后 order by 关键字将 where查询的数据按照升序或者降序的规则进行排序,有点类似于linux指令的通道指令!

快速代码体验:

升序排列

image-20211011202943725

降序排列

image-20211011202951809

多字段排序

应用场景:按照单个字段进行排序时,如果有几个数据是一样的,就可以使用另一个字段将相同的数据再次进行排序
语法:select * from 数据表名 where id between 14 and 18 and gender= “男”order by new_age desc,id desc;
(表示先查询id在14到18之间的所有男性信息,然后将这些信息再次按照 new_age 字段内的数据进行降序排序,如果new_age字段内有相同的数据信息,将相同的数据信息再次按照 id字段进行降序排列)

快速代码体验:

image-20211011203007534

聚合函数【重点】

聚合函数的几个关键字

count(*):查询整个数据表内有几行数据

max(字段名):查询指定字段内的数据最大值

min(字段名):查询指定字段的数据最小值

sum(字段名):计算指定字段内的所有数据总和

avg(字段名):计算指定字段内所有数据的平均值

使用聚合函数的注意事项

1:聚合函数不能嵌套使用,例如 sum(max(字段名))

2:聚合函数内的数据一般为字段名或者表达式

聚合函数的使用方法

计算数据表内总共几行数据——count(*)

语法:

1:select count() from classes;表示查询classes数据表内一共有几行数据

2:select count()as 总数量 from classes;表示查询classes数据表内一共有几行数据,并将count()替换为总数量显示出来

3:select count(*) from classes where gender = “男”; 表示查询数据表内所有男性一共几行数据

快速代码体验:

image-20211011203105924

查询指定字段内的最大、最小值

语法:

最大值

1:select max(new_age) from classes;表示查询new_age字段内数据的最大值

2:select max(new_age) from classes where gender = “女”; 表示查询所有女性new_age字段内的最大值

最小值

1:select min(new_age) from classes;表示查询new_age字段内数据的最小值

2:select min(new_age) from classes where gender = “女”;表示查询所有女性new_age字段内的最小值

快速代码体验

image-20211011203126427

计算指定字段所有数据的总和以及平均值

语法:

总和:select sum(new_age)from classes;

平均值:select avg(new_age)from classes;

快速代码体验:

总和

image-20211011203407105

平均值

image-20211011203414077

round函数对数据的四舍五入以及保留几位小数的处理

语法简洁:round(数值,num)num代表保留几位小数

语法:select round(avg(new_age),2)from classes;表示计算classes数据表内new_age字段所有数据的平均值并且保留两位小数

注意事项:round(数据,num)不是聚合函数

快速代码体验:

image-20211011203438263

grep分组【重点】

分组关键字是什么?

答:分组关键字是 group by 类似于 order by 以及 where

对数据的分组

功能:将数据表内的某一个字段的所有数据进行分组(分类),有便于聚合函数计算统计

语法:

1:select gender from classes group by gender;表示将gender这个字段内数据进行分组(去重复)

2:select gender ,count(*)from classes group by gender;表示将gender这个字段内数据进行分组(去重复),并且计算每一个分组的人数(数量)

3:select gender,max(new_age) from classes group by gender ;表示按照gender进行分组然后查找这些分组内new_age字段中的最大值打印

注意事项:在写分组语法的时候 select 后面的字段必须是 group by 后面那个字段或者是聚合函数字段

快速代码体验:

语法1

image-20211011203506120

语法2

image-20211011203515195

group by + group_concat 的功能以及使用方法

功能:对分组之后的数据的某个字段的所有数据进行拼接

语法:

1:select gender ,count(), group_concat(name) from classes group by gender;
表示按照 gender 字段进行分组后,显示每个分组内有几行数据(count(*))并将分组后的数据的name字段内的所有数据进行拼接显示出来

快速代码体验:

image-20211011203601072

group by + having 的功能以及使用方法及其注意事项

功能:一个数据表内的数据进行group by 分组后,在按照一定条件查询数据就要使用 having 关键字,而不能使用 where关键字了

语法:

1:select gender , avg(new_age) as avg ,group_concat(name) from classes group by gender having avg > 18 ;
表示按照gender进行分组后查询所有分组后数据的年龄平均值以及所有name字段的拼接字符串,在查询平均年龄大于18的数据

注意事项:

1:where关键字只能用在 group by 关键字前面,而having关键字只能用在group by 关键字前面

2:order by 关键字也只能放在 group by 关键字后面

3:where与having关键字的功能相同,都是按照某个条件查询数据

快速代码体验

image-20211011203633969

limit限制记录【重点】

limit 关键字的功能

功能:在海量数据内查询部分数据是就可以用到limit关键字啦

limit 关键字的使用方法及其注意事项

语法:select * from 数据表名 limit 1 ,2;

其中 1 代表数据存储位置代号,2 代表从代号为 1 的数据开始查询2条数据

注意事项:limit关键字一定要写在mysql语法的最后面

快速代码体验:

image-20211011203715243

连接查询【重点、面试点】

连接查询的使用场景

答:当数据库内有多张表时,要从几张数据表内取一些数据并且连接到一张表内,这是就要用到连接查询

mysql 数据库的几种连接查询方式

1:内连接查询(inner join)【常用】

查询的结果为两个表所产生交集的数据

image-20211011203728204

2:外左连接查询(left join)

查询的结果为两个表交集部分加上左表特有的数据

image-20211011203737285

3:外右连接查询(right join)

查询的结果为两个表交集部分加上表特有的数据

image-20211011203742496

什么是笛卡尔积

答:对于两个数据表使用笛卡尔积,就是将第1张表的每一个数据与第2张表的每一个数据都进行一次排列产生总数据的表

image-20211011203752250

注意事项:笛卡尔积是表1的数据先与表2最后一项数据进行排列,依次类推

内连接查询的使用方法

关键字:inner join

功能:查询两个表内有交集的数据

语法:select * from 表1 inner join 表2 where/on 表1.字段名 = 表2.字段名

表示查询表1与表2某个字段相等的那些数据项(条件关键字可以是where也可以是on)

注意事项:内连接语法内不加条件判断,默认是笛卡尔积

代码体验

image-20211011204209868

外左连接查询的使用方法

功能:查询两个表内相同的数据信息在加上左边表为空的那部分信息(主表的字段数据与从表的字段数据进行比对)

关键字:主表 left join 从表

其中主表为左表,从表为右表

语法:select * from classes left join phone on/where classes.new_age = phone.age;

表示classes主表内第一条记录的new_age字段值与phone从表的每一条记录的age字段值比对,有相同的则查询出来,当字段数据不相同时,也将数据显示出来,并且将从表phone的那部位用null补空,以此类推直到classes主表内的每一条记录的new_age字段值都比对完毕!

注意事项:主表第一行记录的字段数据与从表每一行记录都要进行比对,有相等的查询出来,全都比对完还是没有相等的,从表那部分字段数据用null补空!

快速代码体验

image-20211011204228413

外右连接查询的使用方法

功能:查询两个表内相同的数据信息在加上右边表为空的那部分信息(主表的字段数据与从表的字段数据进行比对)

关键字:从表 right join 主表表

其中主表为右表,从表为做表

语法:select * from classes right join phone on/where classes.new_age = phone.age;

表示phone主表内的第一条记录的age字段值与classes从表的每一条记录的new_age字段值比对,
有相同的则查询出来,当字段数据不相同时,也将数据显示出来,并且将从表classes的那部位用null补空,以此类推直到phone主表内的每一条记录的age字段值都比对完毕!

快速代码体验:

image-20211011204241438

自连接查询【理解】

自连接的使用场景

答:比如说省、市、县三级联动式就要用到自连接来查询数据,即找到自身数据表内的某种关系,从而取出某些数据

自连接的使用方法

含义:特殊的内连接,自己连接自己

关键字:数据表名 as 数据表别名1 inner join 数据表名 as 数据表别名2

例如: classes as a inner join classes as b

语法: select * from aress as a inner aress as b on a.aid = b.pid where a.name = “内蒙古”;

表示 aress 数据表自连接,查询a(aress)表的aid字段与b(aress)表的pid字段相等的数据项并且连接打印出来,从而实现查找某某县是属于哪个市的!

快速代码体验:

image-20211011204317242

注意事项:数据表自连接时必须给自己取两个别名,否则会造成混淆,报错!!

子查询【重点、面试点】

子查询的应用场景

答:查询某个信息,一条SQL语句不能成功查询,需要多条SQL语句才可成功查询,这是就可以用到子查询(sql语句的嵌套)

什么是子查询以及分类及其用法

子查询:子查询就是将一条或多条sql语句嵌套进另外一条SQL语句内,嵌套语句是子查询语句,被嵌套语句(外部)是主查询语句

例如 select * from classes where age > (select avg(new_age) from phone); 黄色区域的就是子查询语句,外面的就是主查询语句

子查询语句的分类:

【重点】1.标量子查询:子查询语句返回的是一个数据,但不局限于数据(一行一列)

【重点】2.列子查询:子查询语句返回的是一列多行的数据

3.行子查询:子查询语句返回的是一行多列的数据

4.表子查询:子查询语句返回的是多行多列的数据

注意事项:子查询是一条完整独立的SQL语句

子查询的用法(代码示例):

标量子查询语法:select * from classes where age > (select avg(age) from classes) ;

表示查询 classes表内学生年龄age 大于学生平均年龄avg(age)的所有学生信息

——————————————————————————————————————————

普通语法:为了达到上面的结果,不使用子查询,需要写两条SQL语句才能实现

语句1:select avg(age) from classes; 先求出学生的平均年龄,假设是28
语句2:select * from classes where age > 28; 在查询比平均年龄大的学生信息

———————————————————————————————————————————

快速代码体验:

image-20211011204342655

列子查询语法:select * from classes where classes.new_age in (select age from phone);
表示查询出classes表内的new_age字段信息等于 phone表的age字段的所有学生信息

——————————————————————————————

普通语法:

语句1:select age from phone 先查询出phone表内的所有age字段信息,返回值是一列多行,假设为1,2,5

语句2:select * from classes where classes.new_age in (1,2,5);

快速代码体验:

image-20211011204402251

数据的分页查询显示【目标】

分页查询的使用场景

答:数据库内有大量数据且要呈现给用户时,我们就要将所有数据进行分页显示,每页规定好有几条数据!

怎么实现数据的分页查询

答:利用 limit 限制记录可以实现分页查询

实现公式:limit (显示第几页 - 1 )* 每页展示给用户的数据数量(每页几条数据),每页几条数据

公式详解:

1:(显示第几页 - 1 )* 每页展示给用户的数据数量(每页几条数据) 代表数据存储代号

2:每页几条数据 代表查询几条数据

公式实例: limit (4-1)*6 ,6 实例表示向用户展示第四页数据,每页数据有6条,那么就会从数据存储代号为18的数据考试显示,显示6条!

公式截图:

image-20211011204427513

实例语法:select * from classes limit (3-1)2 ,2 ; 这个语第法表示从classes数据表的所有数据内显示第3页的数据,每页2条数据
其中(3-1)
2 等于4 表示从数据存储代号为4的数据开始显示!!!

快速代码体验

image-20211011204436010

未完待续……