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

运算符.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,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、数据处理函数/单行处理函数:

单行处理函数.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  排序输出
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272

推荐阅读更多精彩内容

  • 原文:https://my.oschina.net/liuyuantao/blog/751438 查询集API 参...
    阳光小镇少爷阅读 3,776评论 0 8
  • SQL与MySQL简介 数据库基础 从SQL的角度来看,数据库就是一个以某种有组织的方式存储的数据集合。我们可以采...
    heming阅读 2,985评论 1 8
  • SQL语言基础 本章,我们将会重点探讨SQL语言基础,学习用SQL进行数据库的基本数据查询操作。另外请注意本章的S...
    厲铆兄阅读 5,232评论 2 46
  • 最近交了一个新朋友,名字带涵,很好听,也是应该可爱明媚的女孩。 开学第一天,我们坐了同桌,好多友情应该都是这...
    有亦凉心阅读 196评论 0 0
  • 已经深刻认识到了自己的问题,基础薄弱,知识不系统,学习效率不高,技术不好。总觉得自己技术还可以,真是没有比较就没有...
    热爱生活热爱家阅读 139评论 0 0