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、条件查询:
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,job
from emp
where job='manager' or job='salesman';
使用in:
select ename,job
from emp
where job in('manager','salesman');
找出工资为1500和5000的员工:
select ename,sal
from emp
where sal in(1500,5000);
找出工资不是1500和5000的员工:
select ename,sal
from emp
where 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、数据处理函数/单行处理函数:
单行处理函数:只针对当前行进行处理
转小写:(底层数据库没改,只是将查询结果显示成小写)
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 排序输出