Mysql操作——进阶指令语法
本文主讲:Mysql数据库内高级的操作指令,例如where比较运算、order排序、grep分组、连接查询等..
强化练习——去重复【重点】
查询结果去重复关键字 —— distinct
功能:将查询结果去重复
语法: select distinct 字段名 from 数据表名;
快速代码
where之比较运算【重点】
Mysql数据库中几种比较运算符
常见几种Mysql运算符:
大于:>
小于:<
大于等于:>=
小于等于:<=
等于:=
不等于:!= 或者 <>
注意事项:在Mysql内,等于号是 = 而不是 ==
where之比较查询的方法
功能:利用比较运算符查询符合条件的数据
语法:
1:select * from 数据表名 where id <> 15;(表示查询id不等于15的所有字段数据)
2:select * from 数据表名 where id = 15; (表示查询id等于15的所有字段数据)
快速代码体验
<>
不等于运算符
= 等于运算符
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的代码体验
not代码体验
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字段中包含莉这个字符的所有数据信息)
快速代码体验
语法一代码
语法二代码
语法三代码
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 关键字
Between and 关键字与 not between and 关键字
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 这是甲鱼的臀部
快速代码体验
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指令的通道指令!
快速代码体验:
升序排列
降序排列
多字段排序
应用场景:按照单个字段进行排序时,如果有几个数据是一样的,就可以使用另一个字段将相同的数据再次进行排序
语法: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字段进行降序排列)
快速代码体验:
聚合函数【重点】
聚合函数的几个关键字
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 = “男”; 表示查询数据表内所有男性一共几行数据
快速代码体验:
查询指定字段内的最大、最小值
语法:
最大值
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字段内的最小值
快速代码体验
计算指定字段所有数据的总和以及平均值
语法:
总和:select sum(new_age)from classes;
平均值:select avg(new_age)from classes;
快速代码体验:
总和
平均值
round函数对数据的四舍五入以及保留几位小数的处理
语法简洁:round(数值,num)num代表保留几位小数
语法:select round(avg(new_age),2)from classes;表示计算classes数据表内new_age字段所有数据的平均值并且保留两位小数
注意事项:round(数据,num)不是聚合函数
快速代码体验:
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
语法2
group by + group_concat 的功能以及使用方法
功能:对分组之后的数据的某个字段的所有数据进行拼接
语法:
1:select gender ,count(), group_concat(name) from classes group by gender;
表示按照 gender 字段进行分组后,显示每个分组内有几行数据(count(*))并将分组后的数据的name字段内的所有数据进行拼接显示出来
快速代码体验:
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关键字的功能相同,都是按照某个条件查询数据
快速代码体验
limit限制记录【重点】
limit 关键字的功能
功能:在海量数据内查询部分数据是就可以用到limit关键字啦
limit 关键字的使用方法及其注意事项
语法:select * from 数据表名 limit 1 ,2;
其中 1 代表数据存储位置代号,2 代表从代号为 1 的数据开始查询2条数据
注意事项:limit关键字一定要写在mysql语法的最后面
快速代码体验:
连接查询【重点、面试点】
连接查询的使用场景
答:当数据库内有多张表时,要从几张数据表内取一些数据并且连接到一张表内,这是就要用到连接查询
mysql 数据库的几种连接查询方式
1:内连接查询(inner join)【常用】
查询的结果为两个表所产生交集的数据
2:外左连接查询(left join)
查询的结果为两个表交集部分加上左表特有的数据
3:外右连接查询(right join)
查询的结果为两个表交集部分加上表特有的数据
什么是笛卡尔积
答:对于两个数据表使用笛卡尔积,就是将第1张表的每一个数据与第2张表的每一个数据都进行一次排列产生总数据的表
注意事项:笛卡尔积是表1的数据先与表2最后一项数据进行排列,依次类推
内连接查询的使用方法
关键字:inner join
功能:查询两个表内有交集的数据
语法:select * from 表1 inner join 表2 where/on 表1.字段名 = 表2.字段名
表示查询表1与表2某个字段相等的那些数据项(条件关键字可以是where也可以是on)
注意事项:内连接语法内不加条件判断,默认是笛卡尔积
代码体验
外左连接查询的使用方法
功能:查询两个表内相同的数据信息在加上左边表为空的那部分信息(主表的字段数据与从表的字段数据进行比对)
关键字:主表 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补空!
快速代码体验
外右连接查询的使用方法
功能:查询两个表内相同的数据信息在加上右边表为空的那部分信息(主表的字段数据与从表的字段数据进行比对)
关键字:从表 right join 主表表
其中主表为右表,从表为做表
语法:select * from classes right join phone on/where classes.new_age = phone.age;
表示phone主表内的第一条记录的age字段值与classes从表的每一条记录的new_age字段值比对,
有相同的则查询出来,当字段数据不相同时,也将数据显示出来,并且将从表classes的那部位用null补空,以此类推直到phone主表内的每一条记录的age字段值都比对完毕!
快速代码体验:
自连接查询【理解】
自连接的使用场景
答:比如说省、市、县三级联动式就要用到自连接来查询数据,即找到自身数据表内的某种关系,从而取出某些数据
自连接的使用方法
含义:特殊的内连接,自己连接自己
关键字:数据表名 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字段相等的数据项并且连接打印出来,从而实现查找某某县是属于哪个市的!
快速代码体验:
注意事项:数据表自连接时必须给自己取两个别名,否则会造成混淆,报错!!
子查询【重点、面试点】
子查询的应用场景
答:查询某个信息,一条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; 在查询比平均年龄大的学生信息
———————————————————————————————————————————
快速代码体验:
列子查询语法: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);
快速代码体验:
数据的分页查询显示【目标】
分页查询的使用场景
答:数据库内有大量数据且要呈现给用户时,我们就要将所有数据进行分页显示,每页规定好有几条数据!
怎么实现数据的分页查询
答:利用 limit 限制记录可以实现分页查询
实现公式:limit (显示第几页 - 1 )* 每页展示给用户的数据数量(每页几条数据),每页几条数据
公式详解:
1:(显示第几页 - 1 )* 每页展示给用户的数据数量(每页几条数据) 代表数据存储代号
2:每页几条数据 代表查询几条数据
公式实例: limit (4-1)*6 ,6 实例表示向用户展示第四页数据,每页数据有6条,那么就会从数据存储代号为18的数据考试显示,显示6条!
公式截图:
实例语法:select * from classes limit (3-1)2 ,2 ; 这个语第法表示从classes数据表的所有数据内显示第3页的数据,每页2条数据
其中(3-1)2 等于4 表示从数据存储代号为4的数据开始显示!!!
快速代码体验
未完待续……