MySql中的语句查询
目录
一、简单查询
二、条件查询
三、排序
四、单行处理函数
五、分组函数(多行处理函数)
六、分组查询
七、distinct关键字
八、连接查询
九、子查询
十、union合并查询结果集
十一、limit
十二、关于DQL语句的总结
一、简单查询
1.查询一个字段?
select 字段名 from 表名;
2.查询多个字段
select 字段名1,字段名2... from 表名;
3.查询全表数据
select * from 表名;
4.给查询的列起别名
select 列名 as 别名 from 表名;
别名是中文用单引号括起来
二、条件查询
条件运算符:=、<、>、>=、<=、!=
1.查询工资等于800的成员信息
select empno,ename from emp where sal = 800;
2.查询工资处于800到2000的成员信息
select empno,ename,sal from emp where sal >= 2450 and sal <= 3000;
select empno,ename,sal from emp where sal between 800 and 2000;
between and 必须遵循左小右大
3.查询那些员工津贴为空
select empno,ename,sal,comm from emp where comm is null;
4.查询工作岗位是manager并且工资大与2500的员工信息
select empno,job,sal from emp where job = 'manager' and sal > 2500;
5.查询工作岗位是manager或salesman的员工
select empno,job,sal from emp where job = 'manager' or job = 'salesman';
6.查询工资大于2500,并且部门编号为10或20部门的员工(and优先级大与or)
select * from emp where sal>2500 and (deptno = 10 or deptno = 20);
7.查询工作岗位是manager和salesman的员工(in后面跟具体值)
select empno,job,sal from emp where job in ('manager','salesman');
8.查询名字中含有o的
select ename from emp where ename like '%o%';
9.查询名字以T结尾或者以k开始
select ename from emp where ename like '%T';
select ename from emp where ename like 'K%';
10.查询名字第二个字母是A的
select ename from emp where ename like '_A%';
三、排序
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;
5.找出薪资在1250到3000之间的员工信息,按照薪资降序排列
select ename,sal from emp where sal between 1250 and 3000 order by sal desc;
四、单行处理函数
单行处理函数的特点:一个输入对应一个输出。
和单行处理函数相对的是:多行处理函数。(多行处理函数特点:多个输入,对应1个输出!)
1.lower转换小写
select lower(ename) as ename from emp;
2.upper转换大写
select upper(name) as NAME from t_student;
3.substr取子串((substr(被截取的字符串,起始下标,截取的长度))
select substr(ename,1,1) as ename from emp;
4.length取长度
select length(ename) from emp;
5.trim去空格
select * from emp where ename = trim(' KING ');
6.str_to date将字符串转换成日期
7.date_format格式化目期
8.format设置千分位
9.round四舍五入
(输出124,0代表保留0个小数,1代表保留1个小数,-1四舍五入保留到十位数)
select round(123.56,0) as result from emp;
10.rand ()生成随机数
select rand() from emp;
select round(rand()*100,0) from emp;
11.ifnull 可以将null转换成一个具体值(ifnull(数据,被当作哪个值))
只要有空参与的计算最终结果为空
计算每个员工年薪
select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;
12.case..when..then..when..then..else..end
当员工的工作岗位是MANAGER的时候,工资上调10%,当工作岗位是SALESMAN的时候,工资上调50%
select ename, job,(case job when ‘MANAGER' then sal*1.1 when ' SALESMAN’ then sal*1.5 else sal end) as newsal from emp;
五、分组函数(多行处理函数)
使用分组函数需要先分组,如果没有分组整张表默认为一组
1.找出最高工资
select max(sal) from emp;
2.计算最低工资
select min(sal) from emp;
3.计算工资和
select sum(sal) from emp;
4.计算平均工资
select avg(sal) from emp;
5.计算员工数量总和
select count(ename) from emp;
注意:
(1)分组函数自动忽略null
(2)分组函数count (*) 统计表中的总行数
count (具体字段) 统计该字段下所有不为null的。
(3)分组函数不能直接使用在where子句中
select
...
from
...
where
...
group by
...
having
...
order by
...
执行顺序:from->where->group by->select->order by
where运行时group by还没有执行
(4)所有分组函数可以组合在一起
六、分组查询
1.查询每个工作岗位的工资总和
按照工作岗位分组,求工资总和
select job,sum(sal) from emp group by job;
2.查询每个部门的最高薪资
按照部门编号分组,求每一组的最大值
select deptno,max(sal) from emp group by deptno;
3.查询每个部门不同工作岗位的最高薪资
部门与岗位联合分组
select deptno,job,max(sal) from emp group by deptno,job;
4.找出每个部门最高薪资,要求显示最高薪资大与3000的
使用having可以对分完组之后的数据进一步过滤。having不能单独使用,
having不能代替where, having必须和group by联合使用。
where和having优先选择where
select deptno,max(sal) from emp group by deptno having max(sal) > 3000;(效率较低)
select deptno,max(sal) from emp where sal > 3000 group by deptno;(效率较高)
5.查询每个部门平均薪资,要求显示平均薪资大与2500
select deptno,avg(sal) from emp group by deptno having avg(sal) > 2500;
6.找出每个岗位的平均薪资,要求显示平均薪资大于1500的,除MANAGER岗位之外,要求按照平均薪资降序排。
select job,avg(sal) as avgsal from emp where job != 'manager'
group by job having avg(sal) > 1500 order by avgsal desc;
七、distinct关键字
去除重复记录
select distinct job from emp;
distinct出现在job , deptno两个字段之前,表示两个字段联合起来去重。
select distinct job,deptno from emp;
八、连接查询
从一张表中单独查询,称为单表查询。
emp表和dept表联合起来查询数据,从emp表中取员工名字,从dept表中取部门名字。
这种跨表查询,多张表联合起来查询数据,被称为连接查询。
根据表连接的方式分类:
内连接:
等值连接
非等值连接
自连接
外连接:
左外连接(左连接)
右外连接(右连接)
全连接
1.连接两个表进行查询
select ename,dname from emp,dept where emp.deptno = dept.deptno;(匹配此数较多,效率较低)
select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno;(起个别名)
select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno;(与上述相同,最新版本)
2.内连接
2.1等值连接
查询每个员工所在部门,显示员工名和部门名
select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno;(条件是等值关系)
2.2非等值连接
找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级
select e.ename,e.sal,s.grade from emp e join salgrade s on e.sal>=losal and e.sal<=s.hisal;(条件不是等值关系)
2.3自连接(一张表看作两张表)
查询员工的上级领导,要求显示员工名和对应的领导名(员工的领导编号等于领导的员工编号)
select a.ename as '员工名',b.ename as '领导名' from emp a join emp b on a.mgr = b.empno;
3.外连接
3.1右外连接(将join右边看作主表,将其全部查询出来,捎带查询关联左边的表)
select e.ename,d.dname from emp e right outer join dept d on e.deptno = d.deptno;(outer可以省略)
3.2左外连接(将join左边看作主表)
select e.ename,d.dname from dept d left outer join emp e on e.deptno = d.deptno;(outer可以省略)
3.3查询每个员工的上级领导,要求显示所有员工的名字和领导名
select a.ename as '员工名',b.ename as '领导名' from emp a left join emp b on a.mgr = b.empno;
4.连接三张表
select
...
from
a
join
b
on
a和b的连接条件
join
c
on
a和c的连接条件
right join
d
on
a和d的连接条件
...
案例:找出每个员工的部门名称以及工资等级还有上级领导,要求显示员工名、领导名、部门名、薪资、薪资等级?
select
e.ename,e.sal,d.dname,s.grade ,l.ename
from
emp e
join
dept d
on
e.deptno = d.deptno
join
salgrade s
on
sal between losal and hisal
left join
emp l
on
e.mgr = l.empno;
九、子查询
select语句中嵌套select语句,被嵌套的select语句称为子查询。
2.1、where中的子查询语句
找出比最低工资高的员工姓名和工资
select ename,sal from emp where sal > (select min(sal) from emp);
2.2、from中的子查询语句
from后面的子查询,可以将子查询的查询结果当做一张临时表.
案例:找出每个岗位的平均薪资等级
第一步:找出每个岗位的平均工资
select job,avg(sal) from emp group by job;
第二步:将以上查询结果看作一张表
select
t.*,s.grade
from
(select job,avg(sal) as avgsal from emp group by job) as t
join
salgrade s
on
t.avgsal between s.losal and s.hisal;
2.3、select后面的子查询
注意:对于select后面的子查询来说,这个子查询只能一次返回1条结果,多于1条,就报错了
案例:找出每个员工的部门名称,要求显示员工名,部门名
select e.ename,(select d.dname from dept d where e.deptno = d.deptno) as dname from emp e;
十、union合并查询结果集
案例:查询工作岗位是manager和salesman的员工
select ename,job from emp where job = 'manager' or job = 'salesman';
select ename,job from emp where job = 'manager'
union
select ename,job from emp where job = 'salesman';
union的效率要高一些。对于表连接来说,每连接一次新表,则匹配的次薮满足笛卡尔积,成倍的翻。
但是union可以减少匹配的次数。在减少匹配次数的情况下,还可以完成两个结果集的拼接。
注意:union在进行结果集合并的时候,要求两个结果集的列数相同,
结果集合并时列和列的数据类型也要相同
十一、limit
limit作用:将查询结果集的一部分取出来。通常使用在分页查询当中。
完整用法:limit startIndex, length
startIndex是起始下标,length是长度
缺省用法: limit 5;这是取前5。
4.1按照薪资降序,取出排名在前五的员工
select
ename,sal
from
emp
order by
sal desc
limit 0,5;
注意:mysql中limit是在order by之后执行
4.2取出工资排名在(3~5)名的员工
select
ename,sal
from
emp
order by
sal desc
limit
2,3;
4.3分页
每页显示3条记录
每页显示pagesize条记录
第pageNo页: limit (pageNo - 1) * pagesize, pagesize
十二、关于DQL语句的总结
select
...
from
...
where
...
group by
...
having
...
order by
...
limit
...
执行顺序?
1.from
2.where
3.group by
4.having
5.select
6.order by
7.limit
注意:下附各表建表语句以及插入数据。
-- Table structure for `dept`
-- ----------------------------
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (`deptno` int(4) NOT NULL,`dname` varchar(50) DEFAULT NULL,`loc` varchar(50) DEFAULT NULL,PRIMARY KEY (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES ('10', 'ACCOUNTING', 'NEW YORK');
INSERT INTO `dept` VALUES ('20', 'RESEARCH', 'DALLAS');
INSERT INTO `dept` VALUES ('30', 'SALES', 'CHICAGO');
INSERT INTO `dept` VALUES ('40', 'OPERATIONS', 'BOSTON');-- ----------------------------
-- Table structure for `emp`
-- ----------------------------
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (`EMPNO` int(4) NOT NULL,`ENAME` varchar(10) DEFAULT NULL,`JOB` varchar(9) DEFAULT NULL,`MGR` int(4) DEFAULT NULL,`HIREDATE` date DEFAULT NULL,`SAL` double(7,2) DEFAULT NULL,`COMM` double(7,2) DEFAULT NULL,`DEPTNO` int(2) DEFAULT NULL,PRIMARY KEY (`EMPNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of emp
-- ----------------------------
INSERT INTO `emp` VALUES ('7369', 'SMITH', 'CLERK', '7902', '1980-12-17', '800.00', null, '20');
INSERT INTO `emp` VALUES ('7499', 'ALLEN', 'SALESMAN', '7698', '1981-02-20', '1600.00', '300.00', '30');
INSERT INTO `emp` VALUES ('7521', 'WARD', 'SALESMAN', '7698', '1981-02-22', '1250.00', '500.00', '30');
INSERT INTO `emp` VALUES ('7566', 'JONES', 'MANAGER', '7839', '1981-04-02', '2975.00', null, '20');
INSERT INTO `emp` VALUES ('7654', 'MARTIN', 'SALESMAN', '7698', '1981-09-28', '1250.00', '1400.00', '30');
INSERT INTO `emp` VALUES ('7698', 'BLAKE', 'MANAGER', '7839', '1981-05-01', '2850.00', null, '30');
INSERT INTO `emp` VALUES ('7782', 'CLARK', 'MANAGER', '7839', '1981-06-09', '2450.00', null, '10');
INSERT INTO `emp` VALUES ('7788', 'SCOTT', 'ANALYST', '7566', '1987-04-19', '3000.00', null, '20');
INSERT INTO `emp` VALUES ('7839', 'KING', 'PRESIDENT', null, '1981-11-17', '5000.00', null, '10');
INSERT INTO `emp` VALUES ('7844', 'TURNER', 'SALESMAN', '7698', '1981-09-08', '1500.00', '0.00', '30');
INSERT INTO `emp` VALUES ('7876', 'ADAMS', 'CLERK', '7788', '1987-05-23', '1100.00', null, '20');
INSERT INTO `emp` VALUES ('7900', 'JAMES', 'CLERK', '7698', '1981-12-03', '950.00', null, '30');
INSERT INTO `emp` VALUES ('7902', 'FORD', 'ANALYST', '7566', '1981-12-03', '3000.00', null, '20');
INSERT INTO `emp` VALUES ('7934', 'MILLER', 'CLERK', '7782', '1982-01-23', '1300.00', null, '10');-- ----------------------------
-- Table structure for `salgrade`
-- ----------------------------
DROP TABLE IF EXISTS `salgrade`;
CREATE TABLE `salgrade` (`GRADE` int(11) DEFAULT NULL,`LOSAL` int(11) DEFAULT NULL,`HISAL` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of salgrade
-- ----------------------------
INSERT INTO `salgrade` VALUES ('1', '700', '1200');
INSERT INTO `salgrade` VALUES ('2', '1201', '1400');
INSERT INTO `salgrade` VALUES ('3', '1401', '2000');
INSERT INTO `salgrade` VALUES ('4', '2001', '3000');
INSERT INTO `salgrade` VALUES ('5', '3001', '9999');-- ----------------------------
-- Table structure for `t_student`
-- ----------------------------
DROP TABLE IF EXISTS `t_student`;
CREATE TABLE `t_student` (`no` int(11) DEFAULT NULL,`name` varchar(32) DEFAULT NULL,`sex` char(1) DEFAULT NULL,`age` int(3) DEFAULT NULL,`email` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of t_student
-- ----------------------------
INSERT INTO `t_student` VALUES ('1', 'zhangsan', 'm', '20', 'zhangsan@qq.com');
MySql中的语句查询相关推荐
- any在mysql语句中用法,MySQL中,子查询中可以使用运算符ANY,它表示的意思是______。...
MySQL中,子查询中可以使用运算符ANY,它表示的意思是______. 答:至少一个值满足条件 According to your textbook, the main purpose of a s ...
- MySQL中的分页查询
MySQL中的分页查询 一.MySQL分页查询原则 在MySQL数据库中使用limit子句进行分页查询: MySQL分页中开始位置为0: 分页子句在查询语句的最后侧: 二.Limit子句(较为常 ...
- MySQL中SELECT语句简单使用
MySQL中SELECT语句简单使用 最近开始复习mysql,查漏补缺吧. 关于mysql 1.MySQL不区分大小写,但是在MySQL 4.1及之前的版本中,数据库名.表名.列名这些标识符默认是区分 ...
- Mysql中SQL语句不使用索引的情况
Mysql中SQL语句不使用索引的情况 MySQL查询不使用索引汇总 众所周知,增加索引是提高查询速度的有效途径,但是很多时候,即使增加了索引,查询仍然不使用索引,这种情况严重影响性能,这里就简单总结 ...
- mysql数据库语句分类_细数MySQL中SQL语句的分类
1:数据定义语言(DDL) 用于创建.修改.和删除数据库内的数据结构,如:1:创建和删除数据库(CREATE DATABASE || DROP DATABASE):2:创建.修改.重命名.删除表(C ...
- 关于mysql中Join语句的几个问题
本文来说下关于mysql中Join语句的几个问题,JOIN语句在平时的开发中还是使用的非常多的 文章目录 概述 基本介绍 举个例子 一个注意点 Join原理 Simple Nested-Loop In ...
- mysql监控---慢语句查询
慢语句查询. 1,开启慢sql日志查询功能. 2,用show full processlist :查询执行的sql语句,然后看哪些语句有问题. 3,将有问题的语句拿出来,前面放上explai ...
- MySQL中的各种查询
文章目录 MySQL中的各种查询 基础查询 条件查询 排序查询 常见函数查询 分组查询 连接查询 内连接 外连接 交叉连接 子查询 联合查询 MySQL中的各种查询 基础查询 条件查询 #语法:sel ...
- mysql中where语句的不等于操作
mysql中where语句的不等于操作 众所周知,我们在使用多表查询的时候常常需要用到where中的等于号来进新筛选,但是某些条件下不等于也是我们的业务要求之一 针对单个数据数据的筛选 SELECT ...
最新文章
- 如何在企业推行OKR?
- QIIME 2用户文档. 3老司机上路指南(2019.7)
- Codeforces 861 B Which floor? 思维
- c# 通过字体对话框获取字体名称和字体大小_PS插件神器 :fonTags,超好用的PS字体管理插件(附安装方法)
- iOS之深入解析多环境配置的实现方案
- 网站外链数量的变化可以从哪几点去理解
- android 城市列表数据,用RecyclerView写的城市列表
- coffeeScript学习01
- java异常标记_java异常机制
- CUDA10.0+python3.6+pytorch1.2.0+torchvision0.4.0
- 设计模式(一)--单一职责模式(衡量接口或类设计)
- 拓端tecdat:R语言贝叶斯广义线性混合效应(多层次/水平/嵌套)模型GLMM、逻辑回归分析教育留级影响因素数据
- 北京地铁和广州地铁之感想
- 家庭理财系统 -- 功能清单
- LaTeX 页眉和页脚
- 【三角函数】和差化积、积化和差的公式及推导证明
- Games101-课程9笔记
- 大学英语综合教程一 Unit 1 课文内容英译中 中英翻译
- 家里蹲太孤单?来用python画一只单身狗吧
- 决定人生高度的,不是智力,而是体力