写在最前面:本博文如有错误,还望大家指出,谢谢
MySQL数据库复习(2)----多表查询和增删改sql语句
MySQL数据库复习(3)------约束
MySQL数据库复习(4)----存储引擎,事务,索引,视图和设计三范式
DQL(数据查询语言):查询语句(select)
DML(数据操作语言):insert delete update,对表中的数据进行增删改
DDL(数据定义语言):create drop alter,对表结构的增删改
TCL(事务控制语言):commit提交事务,rollback回滚事务
DCL(数据控制语言):grant授权、revoke撤销权限等
当一个文件的扩展名是.sql,并且该文件中编写了大量的sql语句,我们称这样的文件为sql脚本
在mysql中可以直接使用source命令执行sql脚本
sql脚本中的数据量太大的时候,无法直接打开,请使用source命令完成初始化
drop database XXX;
语法格式:
select 字段1,字段2…
from 表名
where 条件;
先执行from,再执行where,最后执行select
例1:查询工资等于5000的员工姓名
select name from emptable where sal = 5000;
例2:查询张三的工资
select sal from emptable where name = ‘张三’;
例3:找出工资高于3000的员工
select name,sal from emptable where sal > 3000;
例4:找出工资不等于3000的员工(两者均可)
select name,sal from emptable where sal <> 3000;
select name,sal from emptable where sal != 3000;
例5:找出工资在1100和3000之间的员工(包括1100和3000)
select name,sal from emptable where sal >= 1100 and sal <= 3000;
select name,sal from emptable where sal between 1100 and 3000;
注意:between and是闭区间
但select name,sal from emptable where sal between 3000 and 1100;
查询不到任何数据,between and在使用的时候必须左小右大
between and除了可以使用在数字方面之外,还可以使用在字符串方面
select name from emptable where name between ‘A’ and ‘B’;
例6:找出哪些人津贴为null
在数据库中NULL不是一个值,代表什么也没有,为空
空不是一个值,不能用等号衡量,必须使用is null 或is not null
select name,sal,comm from emptable where comm is null;
注意这里不能写成comm = null
例7:找出哪些人津贴不为NULL
select name,sal,comm from emptable where comm is not null;
例8:找出哪些人没有津贴(为NULL或者为0)
select name,sal,comm from emptable where comm is null or comm = 0;
例9:找出工作岗位是manager和salesman的员工
select name,job from emptable where job = ‘manager’ or job = ‘salesman’;
例10:找出薪资大于1000的并且部门编号是20或30的员工
select name,sal,depno from emptable where sal > 1000 and (depno = 20 or depno = 30);
and比or的运算符优先级高,运算符优先级不确定的时候直接加括号即可
例11:找出工作岗位是manager和salesman的员工
select name,job from emptable where job = ‘manager’ or job = ‘salesman’;
或者
select name,job from emptable where job in(‘salesman’,’manager’);
注意:
select name,job from emptable where salin(‘1000,’5000’);
找出工资等于1000或工资等于5000的员工
in后面的值不是区间,是具体的值
not in:不在这几个值里面
例12:模糊查询like
a)找出名字中含有O的
两个特殊的符号:%(任意多个字符),_代表任意一个字符
select name from emptable where name like ‘%O%’;
b)找出第二个字母是A的
select name from emptable where name like ‘_A%’;
c)找出名字中有下划线的?(使用转义字符即可)
select name from emptable where name like ‘%\_%’;
1)按照工资升序排列?
select name,sal from emptable order by sal;
注意:默认是升序
asc表示升序,desc表示降序
select name,sal from emptable order by sal asc;
select name,sal from emptable order by sal desc;
2)按照工资的降序排列,当工资相同的时候再按照名字的升序排列?
select name,sal from emptable order by sal desc, name asc;
多个字段排序,越靠前的字段起的主导作用越大,只有当前面的字段无法完成排序的时候,后面的字段才会起作用
3)找出工作岗位是salesman的员工,并要求按照薪资的降序排列
select name,job,sal from emptable where job = ‘salesman’ order by sal desc;
select * from tablename where 条件 order by xx
先执行from,再where,再select,最后执行order by
4)分组函数
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
所有分组函数都是对某一组数据进行操作的
a)求工资的总和
select sum(sal) from emptable;
b)找出最高/最低/平均工资
select max(sal) from emptable;
select min(sal) from emptable;
select avg(sal) from emptable;
c)找出总人数
select count(*) from emptable;
注意:分组函数自动忽略NULL
所有数据库都规定,只要有NULL参与的运算,结果就为NULL
ifnull ( ) 空处理函数?
格式:
ifnull(可能为NULL的数据,被当作什么处理)
d)如果津贴为NULL,就当作0处理
select name,ifnull(comm,0) as coom from emptable;
注意:所有分组函数自动忽略NULL
e)找出工资高于平均工资的员工?
select name,sal from emptable where sal > avg(sal);
以上代码是错误的
SQL语句中有一个语法规则,分组函数不可出现在where子句中
原因:因为group by是在where执行之后才会执行的,而分组函数是在group by执行之后才执行
正确写法:
select name,sal from emptable where sal > (select avg(sal) from emptable);
count()与count(某个具体字段)的区别:
count():统计总记录条数
count(XX):表示统计XX字段中不为NULL的元素的总数量
分组函数也可以组合使用:
select count(*),sum(sal),avg(sal) from emptable;
5)group by 和 having
group by:按照某个字段或者某些字段进行分组
having:对分组之后的数据进行再次过滤
找出每个工作岗位的最高薪资?
select max(sal),job from emp group by job;
分组函数一般都会和group by联合使用,且分组函数是在group by语句执行结束后执行
当一条sql语句没有group by的时候,整张表的数据会自成一组
各个语句执行顺序如下
注意:当一条语句中有group by的话select后面只能跟分组函数和参与分组的字段
多个字段联合分组
找出每个部门不同工作岗位的最高薪资
select deptno,job,max(sal) from emptable group by deptno,job;
having
找出每个部门的最高薪资,要求显示薪资大于2900的数据
select max(sal),deptno from emptable group by deptno having max(sal) > 2900;
或者
select max(sal),deptno from emptable where sal > 2900 group by deptno;
加上distinct关键字即可
select distinct job from emptable;
注意:distinct关键字只能出现在所有字段的最前面
select distinct deptno,job from emptable;
这里表示deptno和job联合去重
案例:统计岗位的数量?
select count(distinct job) from emp;
本笔记网课资料来源:
https://www.bilibili.com/video/BV1fx411X7BD