查询所有列
Select *from 表名;
查询指定列
Select 列名1,列名2…… from 表名;
常见运算符
关系运算符:=、!=、<>(不等于)、>=、<=
区间:between A and B ->[A,B]
And:并且,和
Or:或者
Is null:空
Not:否,非
Is not null:非空
In:在……里面
并且and 或者or
查询性别女,并且年龄65的学生记录
select * from stu where gender='female' and age=65;
查询学号S_1001或者名字为xxx的记录
select * from stu where sid='S_1001' or sname='xxx';
在什么里面in
查询学号是S_1001,S_1002,S_1003的记录
写法一:
select * from stu where sid in('S_1001','S_1002','S_1003');
写法二:
select * from stu where sid='S_1001' or sid='S_1002' or sid='S_1003';
是否为空is (not)null
查询年龄为null的记录
select * from stu where age is null;
查询名字不为空的学生信息
select * from stu where sname is not null;
区间between and
查询年龄为20~40岁之间的
方式一:select * from stu where age >=20 and age<=40;
方式二:select * from stu where age between 20 and 40;
非!= <> not
查询性别:非男的 学生记录
select * from stu where gender !='male';
select * from stu where gender <>'male';
select * from stu where not gender='male';
介绍
(1)当想查询学生名字中包含字符a,就需要使用到模糊查询,用关键字是like(像)。
(2)通配符
_:任意一个字符
张_:张三,张三丰
张__:,张三丰张三
%:表示0或则和多个字符串
张%
通配符:_
#查询名字由5个字符组成的学生记录
select * from stu where sname like '_____';
#查询名字由5个字符组成的,并且第五个字符是i的学生记录
select * from stu where sname like '____i';
通配符:%
#查询名字是z开头的学生记录
select * from stu where sname like 'z%';
#查询名字中第二个字符是i的学生记录
select * from stu where sname like '_i%';
#查询名字中包含a字符的学生记录
select * from stu where sname like '%a%';
去除重复数据(distinct去重)
查询员工部门信息
select distinct deptno from emp;
ifnull处理
#查询员工薪资(工资+奖金)
select ename,sal,comm,(sal+comm) from emp;
#问题:任何数据+null=null
#ifnull(A,B):如果A是null,使用B的值,如果A不是null,就使用B的值
select ename,sal,comm,sal+ifnull(comm,0) from emp;
别名(as)
给这个列换一个新的名字
select ename,sal,comm,sal+ifnull(comm,0) as money from emp;
#as:关键字可以省略
select ename name,sal,comm,sal+ifnull(comm,0) as money from emp;
排序 order by
升序:asc
查询所有学生信息,根据年龄进行升序排序
select * from stu order by age asc;
降序:desc
查询所有学生信息,根据名字进行降序排序
select * from stu order by sname desc;
升序且降序
查询所有学生信息,根据工资进行排序,如果工资相同按照员工号升序
select * from emp order by sal desc,empno asc;
MySQL系统提供了很多的函数
Count:统计个数,次数,null不统计 |
|
Max:最大值 |
Min:最小值 |
Sum:求和 |
Avg:平均值 |
Round:四舍五入 |
|
有使用聚合函数时,都会有别名
count函数
#查询emp表中记录数
#count(*):不会忽略null的值
select count(*) from emp;
总和sum 平均值avg 四舍五入round
总和
查询所有员工工资总和
select sum(sal) from emp;
平均值avg
计算员工的平均工资
select avg(sal),avg(comm) from emp;
四舍五入round
平均工资,保留2位小数
select round(avg(sal),2),avg(comm) from emp;
最大值max 最小值min
#查询员工表中,工资最高的,最低的
select max(sal) max_sal,min(sal) min_sal from emp;
分段函数case
#员工表中,根据薪资不一样,给不一样的评论
>4000 ---NB666
>3000 ---NB66
>2000 ---NB6
<2000 ---zz
select
ename,sal,
case
when sal >4000 then 'NB666'
when sal >3000 then 'NB66'
when sal >2000 then 'NB6'
else 'zz'
end as 'pj'
from
emp;
字符串的截取
Left(A,4)从左边开始截取A中前四个字符
Right(A,4)从右边开始截取A中前四个字符
1987-04-19 ---》1987
#(1)获取员工的入职年份
select left('1987-04-19',4);
#(2)获取员工的入职工龄
select ename,hiredate,2021-left(hiredate,4) from emp;
场景
统计各个部门的人数情况
按照性别统计人数
按照班级统计参加比赛的人数
group by 分组
1.1统计各个部门的人数情况
1.2统计各个部门的平均工资
Deptnp count avg(sal)
10 3 2916.66667
20 5 2175
30 6 1566.66667
select deptno,count(*),avg(sal) from emp group by deptno;
1.3各个部门各个岗位人数
select deptno,job,count(*) from emp group by deptno,job;
having
需求一:算出平均工资超过2000的部门
算出各个部门的平均工资
过滤,只留下超过2000的部门
select
deptno,avg(sal) as avg_sal
from
emp
group by
deptno
having
avg_sal>2000;
需求二:部门30中,平均工资超过1000的岗位
select
deptno,job,avg(sal) as avg_sal
from
emp
where
deptno=30
group by
job
having
avg_sal>1000;
where和having的区别
Where:过滤;分组之前的过滤
Having:过滤;分组之后的过滤
limit限制
limit限制查询结果的条目数
1.1查询前五条数据
select * from emp limit 5;
1.2从第二条开始查到第五条-------下标从0开始
select * from emp limit 2,5;
使用场景:分页查询
如果一个页面显示10条数据,获取数据
第一次:limit 0,10
第二次:limit 10,10
第三次:limit 20,10
语法:limit , start len ; 从start开始,查len条
1.3查询各个部门平均工资前二
(1)各个部门平均工资
(2)对平均工资进行排序
(3)取前两位
select deptno,avg(sal) from emp group by deptno order by avg(sal) desc limit 2;
from -> where -> group by ->select -> having -> order by -> limit