Mysql学习---day01查询语句

简单查询

1.查看一个字段
select 字段名 from 表名;
在这里插入图片描述
注意:SQL语句不区分大小写,分号结尾,

2.查询两个或者多个字段
select 字段1,字段2 from 表名;
在这里插入图片描述
3.查询所有字段
方式1:写上所有字段,select 字段1,字段2… from 表名。
方式2: select * from 表名;(这种方式效率低、可读性差,在实际开发中不推荐使用)
在这里插入图片描述
4.给查询列起别名
select 字段 as 别名 from 表名;
在这里插入图片描述
使用关键字as起别名。
注意:
只是将显示结果列名显示为别名,不会起修改作用。
as 关键字可以省略。
别名可以是中文,需要用单引号括起来。
在这里插入图片描述
假设起别名时,别名里面有空格怎么办?编译报错,不符合语法。
怎么解决?将别名用 单引号/双引号 括起来。
在这里插入图片描述
注意:在所有数据库当中,字符串统一使用单引号括起来,单引号是标准,双引号在Oracle中无法使用。

5.计算员工年薪
select ename,sal12 from emp;
select ename,sal*12  from emp;
注:字段可以参与数学表达式。
给年薪起别名:select ename,sal
12 as yearSAL from emp;
在这里插入图片描述

条件查询

什么是条件查询?不是将表中所有数据都查出来,而是只查询符合条件的数据。
条件有哪些?

  1. 等于
    查询薪资等于800的员工的姓名和编号?
    select empno,ename from emp where SAL=800;
    在这里插入图片描述

  2. 不等于
    select empno,ename from emp where SAL !=800;
    在这里插入图片描述
    还可以用: select empno,ename from emp where SAL <> 800;
    在这里插入图片描述
    是否可以用来查询字符串???
    select empno,ename from emp where ename=‘smith’;
    在这里插入图片描述

  3. 小于:select empno,ename from emp where SAL < 3000;

  4. 大于:select empno,ename from emp where SAL > 1000;

  5. 小于等于:select empno,ename from emp where SAL <= 1000;

  6. 大于等于:select empno,ename from emp where SAL <> 800;

  7. between and 查询两个数据之间的数据,等同于 >=and <=;

select ename from emp where sal between 1000 and 4500;
在这里插入图片描述
注意:右边数据必须比左边大,否则查不出数据,而且查询区域是闭区间。

  1. 查询哪些员工的补助为null?
    select empno,ename from emp where COMM is null;
    注意:在数据库中,null不能用等号来衡量,而是用is null。因为在数据中,null代表什么也没有。
    在这里插入图片描述

  2. 查询不为nul?
    select empno,ename from emp where COMM is not null;
    在这里插入图片描述

  3. and
    查询工作岗位是manager并且薪资大于2500的员工?
    select empno,ename,job,sal from emp where job=‘MANAGER’ and sal>2500;
    在这里插入图片描述

  4. 或者or
    查询工作岗位为MANAGER或者SALESMAN的员工?
    select empno,ename,job from emp where job=‘MANAGER’ or job=‘SALESMAN’;
    在这里插入图片描述
    注意,当and和or同时出现时,有优先级问题吗???
    查询工资大于2500并且部门编号为10或者20的员工?

select * from emp where sal>2500 and deptno =10 or deptno =20;

!!and的优先级比or高,以上语句和题意不符合。以上语句表示查询工资大于2500且部门编号为10,或者查询部门编号为20的员工。
在这里插入图片描述
select * from emp where sal>2500 and (deptno =10 or deptno =20);
在这里插入图片描述
**and的优先级比or高,如果想要and和or处于同一级,需要加小括号。**如果不确定优先级,加小括号就行。

  1. 包含 in,相当于多个or(not in 则是不在这个范围)
    查询工作岗位是MANAGER和SALESMAN的员工?
    select empno ,ename,job from emp where job=‘MANAGER’ or job=‘SALESMAN’;
    在这里插入图片描述
    使用in: select empno ,ename,job from emp where job in(‘MANAGER’ ,‘SALESMAN’);
    在这里插入图片描述
    注意:in后面不是区间,而是具体的值

使用not in:select empno ,ename,job from emp where job not in(‘MANAGER’ ,‘SALESMAN’);
在这里插入图片描述

模糊查询

  1. like
    称为模糊查询,支持%或者下划线匹配;%匹配任意多个字符,下划线:任意一个字符。

查询名字里面含有O的员工:
select ename from emp where ename like ‘%O%’;
找出名字以T结尾的:
select ename from emp where ename like ‘%T’;
找出名字以K开头的:
select ename from emp where ename like ‘K%’;
找出第二个字母是A的:
select ename from emp where ename like ‘_T%’;

注:
加入一个员工的名字为JACK_SON,怎么查找员工名字中有下划线的?
select name from emp where ename like ‘%_%’; 使用转义字符。

排序

1.查询所有员工工资并排序:select ename,sal from emp order by sal;默认升序。
在这里插入图片描述2.怎么降序?
select ename,sal from emp order by sal desc;
在这里插入图片描述
3.指定升序?
select ename,sal from emp order by sal asc;

4.可以两个字段或者多个字段排序吗?
查询员工姓名和薪资,要求按照薪资升序,如果薪资一样再按照名字升序排列:
select ename,sal from emp order by sal asc,ename asc;只有在按照sal排序之后才会按照ename排序。
在这里插入图片描述
5.根据字段的位置也可以排序
select ename,sal from emp order by 2;//2表示第二列,第二列是sal.按照查询结果的第二列sal查询。

关键字的顺序:select … from… . where… order by…

数据处理函数

又被称为·单行处理函数。
特点:一个输入对应一个输出。
多行处理函数:多个输入一个输出。

1.单行处理函数有哪些?
lower:转换小写
select lower(ename) from emp; 在这里插入图片描述

upper转换大写

sbstr取字串
select substr(ename,1,2) as ename from emp;//起始下标从1开始。
在这里插入图片描述
找出员工名字第一个字母是A的员工:
第一种:select ename from emp where ename like ‘A%’;
第二种:select ename from emp where substr(ename,1,1)=‘A’;

length取长度
select length(ename) as len from emp;
在这里插入图片描述
concat字符串拼接
select concat(empno,ename) from emp;
在这里插入图片描述
trim去除空格
select * from emp where ename =trim(’ KING’);

str_to_date 将字符串转换成日期

date_format 格式化日期

format 设置千分位

round 四舍五入
select 字段 from 表名;

select后面可以跟字段或者字面量,而跟字面量时,结果如下。
select ‘abc’ from emp;
在这里插入图片描述
select round(123.456,0) from emp;//保留0位小数
在这里插入图片描述(因为查询的表有14行,因此结果有14行)

select round(123.456,-1) from emp;//保留到10位
在这里插入图片描述

rand 生成随机数

ifnull 可以将null转换成一个具体值

case…when…then…when…then…else…end
当员工的工作岗位是MANAGER的时候,工资上调10%,当工作岗位是SALESMAN的时候,工资上调50%,其他正常。(注意不会修改数据库,只是将查询结果改变)
select ename, job,sal as oldsal, (case job when ‘MANAGER’ then sal 1.1 when ‘SALESMAN’ then sal1.5 else sal end) as newsal from emp;
在这里插入图片描述

分组函数

又称为多行处理函数。输入多行,最终输出一行。(分组函数在使用的时候,必须先进行分组,然后才能用。如果没有对数据进行分组,整张表默认为一组)
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值

找出最高工资:select max(sal) from emp;
找出最低工资:select min(sal) from emp;
计算工资和: select sum(sal) from emp;
计算平均工资:select avg(sal) from emp;
计算员工数量总和: select count(ename) from emp;

分组函数在使用时:
1.自动忽略null;不需要提前对null进行处理。
select sum(comm) from emp;
在这里插入图片描述
2.分组函数中count()与 count(具体字段)的区别:
count(具体字段)表示统计该字段下所有不为null的元素的总数。
count(
) 统计表当中的总行数,只要有一行数据count则++。(因为一行数据不可能每个字段都为null);
在这里插入图片描述

3.分组函数不能直接使用在where子句当中
找出比最低工资高的员工:select ename ,sal from emp where sal >min(sal);
该句是错误的。
在这里插入图片描述

4.所有的分组函数可以组合起来一起使用。
select sum(sal) ,min(sal),max(sal),avg(sal),count(sal) from emp;
在这里插入图片描述
关键字执行顺序:
select、 from 、where、group by、order by
执行顺序:

  1. from
  2. where
  3. group by
  4. select
  5. order by

为什么分组函数不能直接使用在where后面??
因为分组函数必须先分组再使用,where执行时还没有分组,因此where后面不能跟分组函数。
而select sum(sal) from emp;为什么正确?因为select执行的时候,已经执行了分组。

案例:
1.找出每个工作岗位的工资总和:
select sum(sal) from emp group by job;
在这里插入图片描述
2.找出每个部门、不同工作岗位的最高薪资:
select max(sal) from emp group by deptno,job;
在这里插入图片描述
3.找出每个部门最高薪资,要求显示薪资大于三千的:
select deptno,max(sal) from emp group by deptno having max(sal)>3000;
在这里插入图片描述
使用having可以对分组之后数据进行进一步处理。
注意:having不能单独使用,必须要和group by 一起使用。

改进语句:
select deptno,max(sal) from emp where sal>3000 group by sal;
优化策略:where与having优先使用where;

4.找出每个部门的薪资:(使用不了where)
select deptno,avg(sal) from emp group by deptno having avg(sal)>2500;
在这里插入图片描述
(因为要求是平均薪资大于2500,因此必须要使用avg(sal),而在where后面不能使用分组函数)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值