mysql 保留两位小数 查询_原创MySql专题之第一篇基本查询

My SQL的基本查询

一、SQL的分类

数据查询语言(DQL Data Query Language):select数据操纵语言(DML Data Manipulation Language):insert,delete,update(针对表中的数据)数据定义语言(DDL Data Definition Language):create,drop,alter(针对表的结构)事务控制语言(TCL Transactional Control Language):commit,rollback数据控制语言(DCL Data Control Language):grant,revoke 

二、常用命令

查看当前数据库管理系统中得所有数据库:show databases;创建数据库:create database 数据库名;选择数据库:use 数据库名;导入数据:source 路径;删除数据库:drop database 数据库名;查询当前使用的数据库:select database();查看当前数据库中的表:show tables;查看表结构:desc 表名;退出数据库:exit/ctrl+c/quit查看其它库中的表:show tables from 数据库名;查看表的创建语句:show create table 表名;

三、DQL

查询字段:

select 字段名 from 表名;一个:select ename from emp;多个:select empno,ename from emp;所有:select * from emp;

别名的使用:

select empno,ename,sal*12 as yearsal from emp;as关键字可以省略别名为中文,需要加上''select empno,ename,sal*12 '年薪' from emp;注意:SQL语句中带有select,不会修改底层表中的数据,只是将表中的记录检索出来;
1、条件查询:

37af60cc5fe2b803fccd5a30a5ebef09.png

运算符.PNG

My SQL的基本查询

使用where关键字:

查询工资等于5000的员工信息:select empno,ename,sal from emp where sal=5000;工资为double类型,也可以带上'';但最好不要select empno,ename,sal from emp where sal>'3000';工资大于等于3000并且小于等于5000:select empno,ename,sal from emp where sal>=3000 and sal<=5000;或:select empno,ename,sal from emp where sal between 3000 and 5000;注意:between...and...必须前面是小的,后面是大的between...and..也可用在字符上:前闭后开:select ename from emp where ename between 'A' and 'K';结果中包含A但不包含K

null:不是一个值,表示什么也不是,空

找出补助是空的所有员工:select ename,comm from emp where comm is null;查询补助不是空的员工:select ename,comm from emp where comm is not null;

and:并且    or:或者 (and优先级高于or)

找出从事salesman和manage的员工select ename,job from emp where job='salesman' or job='manager';找出工资大于1800的员工,要求部门编号是20或者30的select empno,ename,sal,deptno from emp where sal>1800 and (deptno=20 or deptno=30);

in:在某个范围中搜索

找出工作岗位是manager和工作岗位是salesman的员工:select ename,jobfrom empwhere job='manager' or job='salesman';使用in:select ename,job from emp where job in('manager','salesman');找出工资为1500和5000的员工:select ename,salfrom empwhere sal in(1500,5000);找出工资不是1500和5000的员工:select ename,salfrom empwhere sal not in(1500,5000);

like:模糊查询

%:0~N个任意字符
_:任意一个字符
找出名字里含有O的员工:
select ename from emp where ename like '%O%';
找出第一个字母为S的员工:
select ename from emp where ename like'S%';
找出最后一个字母为T的员工:
select ename from emp where ename like '%T';
找出第二个字母为A的员工:
select ename from emp where ename like '_A%';
找出第三个字母为A的员工:
select ename from emp where ename like '__A%';
找出倒数第二个字母为N的员工:
select ename from emp where ename like '%N_';
2、排序:

排序采用order by子句,order by后面跟上排序字段,排序字段可以放多个,多个采用逗号间隔,order by默认采用升序(asc),如果存在where子句,那么order by必须放到where语句的后面

通过薪水排序:
select ename,sal from emp order by sal;
通过薪水排序(降序):
select ename,sal from emp order by sal desc;
通过薪水降序,如果薪水一样的,再按名字升序排
select ename,sal from emp order by sal desc,ename asc;
按所选的第二个字段排(ename,sal中的sal)
数字表示查询结果中的字段的编号,从1开始
select ename,sal from emp order by 2;
3、数据处理函数/单行处理函数:

9fb10bcba85a33740637e0b888b4e0b6.png

单行处理函数.PNG

单行处理函数:只针对当前行进行处理

转小写:(底层数据库没改,只是将查询结果显示成小写)
select lower(ename) from emp;
转大写:
select upper(ename) as ename from emp;
substr:
select substr(ename,1,1) from emp;
找出员工名字第二个字母为A的员工:
select ename from emp where substr(ename,2,1)='A';
length:
select length(ename) from emp;
trim:
select ename from emp where ename =trim(' smith ');
保留两位小数:
select round(123.456,2);
不保留小数:(0可以不写)
select round(123.456,0);
保留到个位,十位,百位:-1,-2,-3
select round(123.456,-1) 120
select round(123.456,-2) 100
select round(153.456,-2) 200
生成随机数:
select rand();
ifnull:
补助是空的显示为0:
select ename,ifnull(comm,0) from emp;
注意:null参与运算,结果还是null
补助为空的,每月发100:
select sal + ifnull(comm,100) from emp;
计算年薪:
select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;

关于数据库的日期处理

每一个数据库处理日期的时候,采用的机制都是不同的,日期处理都有自己的一套机制,所以在实际的开发中,表中的字段定义为date类型的情况很少。因为一旦使用日期类型,那么java程序将不能够通用。在实际开发中,一般会使用"日期字符串"来表示日期。

mysql数据库管理系统中对日期的处理提供了两个重要的函数:

str_to_date
date_format

java中的日期格式:

YYYY 年
MM 月
dd 日
HH 时
mm 分
ss 秒
SSS 毫秒

java中

将字符串转换成日期类型:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse("1970-10-10");
日期格式化:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date nowTime = new Date();
String strTime = sdf.format(nowTime);

mysql的日期格式:

%Y  年
%m 月
%d 日
%H 时
%i 分
%s 秒

str_to_date函数:

作用:将“日期字符串”转换成“日期类型”数据。(varchar--->date)
执行结果:为date类型
使用格式:str_to_date('日期字符串','日期格式')

例:

查询出1980-12-17入职的员工(hiredate为date类型):
select ename,hiredate from emp where hiredate='1980-12-17';
能查出结果:mysql默认的日期格式:%Y-%m-%d,以上的日期字符串'1980-12-17'正好和默认的日期格式一样,
存在了自动类型转换,自动将日期字符串转换成了日期类型,所以以上查询可以查询出结果。
select ename,hiredate from emp where hiredate='12-17-1980';
发生错误:
'12-17-1980'日期字符串和mysql默认的日期格式不同,
hiredate是date类型,'12-17-1980'是一个字符串varchar类型,
类型不匹配,无法查询出结果,发生错误。
纠正:
select ename,hiredate from emp where hiredate=str_to_date('12-17-1980','%m-%d-%Y');

str_to_date函数通常使用在插入操作中。字段是date类型,不接收字符串varchar类型,需要先通过该函数将varchar变成date再插入数据。才能成功。

date_format函数:

作用:将日期类型date转换成具有特定格式的日期字符串varchar(date--->varchar)
运算结果:varchar类型(具备特定格式的)
语法:date_format(日期类型数据,'日期格式')

例:

查询员工的入职日期,以'10-12-1980'的格式显示
select ename,date_format(hiredate,'%m-%d-%Y') as hiredate from emp;
查询员工的入职日期,以'10/12/1980'的格式显示
select ename,date_format(hiredate,'%m/%d/%Y') as hiredate from emp;
以下两个DQL语句的执行结果相同:
select ename,hiredate from emp;(hiredate自动转换成varchar类型,采用'%Y-%m-%d'格式)
select ename,date_format(hiredate,'%Y-%m-%d') as hiredate from emp;

结论:date_format函数主要使用在查询操作中。客户需要日期以特定格式展示的时候,需要使用该函数。

4、分组函数/聚合函数/多行处理函数:
count sum max min avg:(自动忽略null)
求和:select sum(sal) from emp;
求平均值:select avg(sal) from emp;
最高薪水:select max(sal) from emp;
最低薪水:select min(sal) from emp;
统计:select count(ename) from emp;

注意:count

查询该字段中不为null的元素总数:select count(comm) from emp;
查询满足条件的所有记录总数:select count(*) from emp where comm is null;

分组函数不能直接使用在where子句中:

select ename,sal from emp where sal>avg(sal);报错!
distinct:去除重复记录,只能出现在所有字段的最前方
select distinct job from emp;
统计公司一共有多少岗位:
select count(distinct job) from emp;
分组查询:

主要涉及两个子句:group by和having

group by:通过某个或者某些字段进行分组
having:和where相同,都是为了完成数据的过滤,
where和having后面都是添加条件
where在group by之前完成过滤
having在group by之后完成过滤

例:

找出每个工作岗位的最高薪水:
先按照工作岗位分组,使用max函数求每一组的最高薪水:
select max(sal) from emp group by job;
工作岗位也可以写到select后面,因为正好工作岗位也是5个不同的值
select job,max(sal) from emp group by job;
ename不可以写到select后面,因为不属于分组字段
select ename,job,max(sal) from emp group by job;
--mysql中可以,语法在这方面比较松散,不严格,但是查询结果没有意义
--oracle中不可以,语法严格,执行的时候报错。

总结:如果语句中有group by子句,select后面只能跟参与分组的字段和分组函数。

例:

计算每个部门的平均薪水(按照部门编号分组,对每一组求平均薪水):select deptno,avg(sal) as avgsal from emp group by deptno;计算出不同部门中的不同工作岗位的最高薪水:select deptno,job,max(sal) from emp group by deptno,job;//deptno,job两个字段联合起来分组。找出每个工作岗位的最高薪水,除manager之外:select job,max(sal) from emp where job<>'manager' group by job;找出每个工作岗位的平均薪水,要求显示平均薪水大于1500:select job,avg(sal) from emp where avg(sal)>1500 group by job;报错!where关键字后不能直接使用分组函数分组函数必须在分组完成后执行,而分组需要group by,而group by在where后面执行使用having:select job,avg(sal) from emp group by job having avg(sal)>1500;

注意:尽量在where中过滤,无法过滤的数据,通常都是需要先分组之后再过滤的,这个时候可以选择使用having。(效率问题)

总结:一个完整的DQL语句的总结:

select ...from ...where ...group by ..having ...order by...第一:以上的关键字顺序不能变,严格遵守第二:执行顺序:1.from      从某张表中检索数据2.where     经过某条件进行过滤3.group by  然后分组4.having    分组之后不满意再过滤5.select    查询出来6.order by  排序输出

推荐关注:一个二代的编程历程

8780eb11c2cadf84f30146d3a1c3960e.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值