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、条件查询:

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  排序输出

你可能感兴趣的:(My,SQL)