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');

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值