mysql
行(row):被称为数据/记录
列(column):被称为字段
mysql语句分类
DQL:数据查询语句(select 查)
DML:数据操作语句(insert 增 delete 删 update 改)(表数据)
DDL:数据定义语句(create:新建,增drop:删alter:修改)(表结构)
TCL:事务控制语句(事务提交:commit事务回滚:rollback)
DCL:数据控制语句(授权 grant 撤销授权 revoke)
1.简单查询
1.1查询一个字段
select 字段名 form 表名;
注意:
select和form都是关键字,字段名和表名都是标识符。
1.2查询两个或多个字段
用逗号隔开
eg:select depeon,dname from dept;
1.3查询所有字段
1.将字段都写上
2.使用*(效率低,不建议)
select * from dept;
1.4给查询列起别名
只是将显示的查询结果列名显示为deptname,原表列名还是叫:dname
as关键字可省略,别名是中文用单引号括起来
在所有的数据库中,字符串统一用单引号括起来,双引号在oracle中不可用
字段可以使用数学表达式(+,-,*,/)
2.条件查询
select
字段一,字段二,字段三······
from
表名
where
条件;
2.1都有哪些条件
= | 等于 |
!=或<> | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
between (小值) and (大值),两个值之间,等同于">= and<="
is null为null(is not null为不为空)
and 并且
eg:查询工作岗位是MANAGER并且工资大于2500的员工信息;
select empno,ename,job,sal
from emp
where job='MANAGER' and sal>2500;
or 或者
eg:查询工作岗位是MANAGER和SALESMAN的员工
select empno,ename,job
from emp
where job='MANAGER' or job='SALESMAN';
and优先级比or高
where sal>2500 and deptno=10 ordeptno=20;
where sal>2500 and (deptno=10 ordeptno=20);
in 包含,相当于多个or(not in表示不在这个范围)
where job='MANAGER' or job='SALESMAN'等价于
where job in('MANAGER', 'SALESMAN')
in不是一个区间。in后面跟的是具体的值
like 模糊查询,支持%或下划线匹配
%匹配任意多个字符
下划线:匹配任意一个字符
(%是一个特殊的符号,_也是一个特殊的符号)
eg:找出名字中含有o的?
select ename from emp where ename like '%o%';
找出名字以t结尾的?
select ename from emp where ename like '%t';
找出第三个字母是r的?
select ename from emp where ename like '__r%';
找出名字中有下划线的?
select ename from emp where ename like '%\_%';
3.排序
3.1查询所有员工薪资,排序?
select ename,sal
from emp
order by sal; //默认升序
3.2怎么降序
select ename,sal
from emp
order by sal desc; //指定降序
select ename,sal
from emp
order by sal asc; //指定升序
3.3按照多个字段排序
查询员工名字和薪资,要求按照薪资升序,如薪资相同,按名字升序排列
select ename,sal
from emp
order by sal asc,ename asc;//sal在前,起主导,只有sal相等时,才会考虑启用ename排序
3.4了解:根据字段的位置也可以排序
select ename,sal
from emp
order by 2;//2表示第二列,第二列是sal
开发中不建议,因为不健壮,列顺序任意发生改变。
3.5综合一点的案例
找出工资在1250到3000之间的员工信息,要求按薪资降序排列
select ename,sal
from emp
where sal between 1250 and 3000
order by sal desc;
关键字顺序不能变
第一步:from
第二步:where
第三步:select
第四步:order by (排序总是在最后执行)
4.数据处理函数
又被称为单行处理函数
特点:一个输入对应一个输出。
4.1单行处理函数常见有哪些
lower 转换小写
select lower(ename) from emp;
upper 转换大写
select upper(name) from t_student;
substr 取子串(substr(被截取的子串,起始下标,截取的长度))
select substr(ename,1,1) as ename from emp;
起始下标从1开始,没有0
concat 函数进行字符串拼接
select concat(sal,ename) from emp;
length 取长度
select length(ename) enamelength from emp;
trim 去空格
select * from emp where ename=' king';//表中有king,代码多写了空格,错误
select * from emp where ename=trim(' king');//正确
str_to_date
round()四舍五入
select 字段 from 表名;
select round(数值,保留位数) form emp;
rand()生成随机数
round(rand()*100,0)//100以内的随机数
ifnull把null转换成一个具体数
ifnull(数据,被当做哪个值)
在所有数据库中,只要null参与的数据运算,值都是null。
计算每个员工的年薪
年薪=(月薪+月补助)*12
select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;
case··when··then··when··then··else··end相当于if else
当员工的工作岗位为MANAGER时,工资上调10%,是SALESMAN,工资上调50%(不修改数据库,之上将查询结果显示为工资上调)
select ename,job,sal as oldsal,(case job when 'MANAGER' then sal*1.1 when 'SALESMAN' then sal*1.5 else sal end) as newsal
form emp;
5.分组函数(多行处理函数)
特点:输入多行,最终输出一行。
注意:必须先分组,在使用。如果未对数据进行分组,整张表默认为一组
count()数量总和
sum()总和
avg()平均值
max()最大值
min()最小值
5.1注意
1.分组函数自动忽略null,不需要对null进行处理。
2.count(*):统计表中行数的总和(含null)
count(具体字段):代表不为null的元素的总和
3.分组函数不能直接使用在where子句中。
原因:where执行时未分组,
4.所有的分组函数可以组合一起用。
6.分组查询*
6.1什么是分组查询
select
fom
group by
6.2执行顺序
写法
select
from
where
group by
order by
顺序不能颠倒
执行顺序
1.from
2.where
3.group by
4.select
5.order by
6.3找出每个工作岗位的工资和?
select job,sum(sal)
form emp
group by job;
在一条select语句中,如果有group by语句的话,select后面只能跟:参加分组的字段,以及分组函数。其他一律不能跟。
6.4找出每个部门,不同工作岗位的最高薪资?
技巧:两个字段联合成一个字段看。
select job,deptno,max(sal)
from emp
group by deptno,job;
6.5having语句
使用having可以对分完组之后的数据进行过滤。
having不能单独使用,不能代替where,having必须和group by联合使用
找出每个部门最高薪资,要求只显示最高薪资大于3000的?
select deptno,max(sal)
from emp
group by deptno
having max(sal)>3000;
以上sql语句执行效率比较低,可以考虑先将大于3000的都找出来,然后再分组。
select deptno,max(sal)
from emp
where sal>3000
group by deptno;
优化策略:优先选择where,where实在完不了了,使用having。
6.6where解决不了的
找出每个部门平均薪资,要求显示“平均薪资”高于2500的。
select deptno,avg(sal)
from emp
group by deptno
having avg(sal)>2500;