MySQL数据库表单数据的查询操作和常见的操作案例(这一篇就够了)

表单的查询操作是数据库中最重要的一部分,这一节将从多个角度阐述数据库表的查询操作
对于表的插入,更新,删除点击这里
数据库的相关操作点击这里
更多精彩内容点击这里

提前说明一些语法规则
table-name:表名
column-name:字段名
value:字段值
where-condition:条件
这个是本篇查询所用到的例样表

CREATE TABLE `emp` (
  `EMPNO` int(4) NOT NULL,
  `ENAME` varchar(10) NOT 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(4) DEFAULT NULL,
  PRIMARY KEY (`EMPNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert  into `emp`(`EMPNO`,`ENAME`,`JOB`,`MGR`,`HIREdate`,`SAL`,`COMM`,`DEPTNO`) values (1,'孙悟空','销售',4,'1980-12-17',800.00,NULL,1),(2,'猪八戒','销售',4,'1981-02-20',1600.00,300.00,1),(3,'沙僧','销售',4,'1981-02-22',1250.00,500.00,1),(4,'唐僧','销售经理',8,'1981-04-02',2975.00,NULL,1),(5,'刘备','项目经理',NULL,'1981-09-28',1250.00,1400.00,3),(6,'关羽','程序员',5,'1981-05-01',2850.00,NULL,3),(7,'张飞','程序员',5,'1981-06-09',2450.00,NULL,3),(8,'观音','CEO',NULL,'1981-11-17',5000.00,NULL,1),(9,'白骨精','人事',8,'1981-09-08',1500.00,0.00,2),(10,'蜘蛛精','人事',8,'1981-12-03',950.00,NULL,2),(11,'黑熊怪','市场',8,'1981-12-03',3000.00,NULL,2);

在这里插入图片描述

一.简单查询(select)

1.1.查询字段(select)

查询所有字段

select column-name1,column-name2,column-name6 from table-name;   -- 按照字段名写
select *from table-name;                 -- 通配符 * 写法

执行结果
在这里插入图片描述

查询部分字段

select column-name1,column-name5 from table-name;           -- 写入想要查询的字段名

代码示例
select ename,job,comm from emp; – 查询姓名,职位,薪水
执行结果
在这里插入图片描述

1.2.去重记录的查询(distinct)

可以更好的辨别这个表不重复的记录个数

select distinct column-name from table-name;   

代码示例
select distinct job from emp; – 查询工作的不同类型
执行结果
在这里插入图片描述

1.3 算术运算符的查询

在这里插入图片描述
可以对表里面数值型内容进行运算(比如工资乘以2,工资扣除200等等)

select column-name*2 from table-name;

代码示例
select ename ,job ,sal+200 from emp; – 每个人的薪水都加200
执行结果
在这里插入图片描述

1.4.给字段起别名

select column-name1 as othername1,column-name2 as othername2 from table-name;

代码示例
select ename as '姓名', sal+200 as '涨资' from emp; – 将每个人的工资加200并命名为涨资,ename改为姓名
执行结果
在这里插入图片描述

1.5.数据显示格式查询(concat)

select concat(‘name1:’,column-name1,‘name2:’,column-name2,‘name3:’,column-name3) info from table-name;

代码示例
select concat('姓名:',ename,'工作:',job,'工资:',sal)info from emp;
执行结果
在这里插入图片描述

二.查询结果排序

2.1. 单字段排序

select column-name1,column-name2 from table-name order by order-name asc-- 升序(不写排序方式;默认升序)
select column-name1,column-name2 from table-name order by order-name desc-- 降序

代码示例
select ename,job,sal from emp order by sal asc; – 按照工资升序
执行结果
在这里插入图片描述

2.2.多字段排序

select column-name1,column-name2 from table-name order by order-name1 asc,order-nam2 asc-- 两个字段升序
select column-name1,column-name2 from table-name order by order-name1 asc,order-nam2 desc-- 两个字段降序

代码示例
select ename,job,sal from emp order by sal asc ,comm desc; – 按照工资升序,薪水降序排序

执行结果
在这里插入图片描述

三.条件查询

在这里插入图片描述

普通运算符

select column-name1,column-name2 from table-name where where-condition;        -- 对某个字段具体运算

代码示例
select ename,job,sal from emp where sal>1500; – 输出工资大于3000的员工姓名,职位
执行结果
在这里插入图片描述

[not]between…and…

select column-name1,column-name2 from table-name where column-name[not] between value1 and value2;  字段在这个区间的

代码示例
select ename,job,sal from emp where sal between 1000 and 3000; --输出工资大于1000小于3000员工姓名,职位
执行结果
在这里插入图片描述

[not]in

select column-name1,column-name2 from table-name where column-name[not] in (value1 , value2);      --字段包含某某内容的

代码示例
select ename,job,sal from emp where job in('销售','程序员'); – 输出所有销售和程序员成员
执行结果
在这里插入图片描述

is[not]null

select column-name1,column-name2 from table-name where column-name is [not] null;       --搜索字段为空的/非空的

代码示例
select ename,job,sal ,comm from emp where comm is null; – 输出所有没有薪水的员工姓名,职位
执行结果
在这里插入图片描述

and

select column-name1,column-name2 from table-name where where-condition1 and where-condition1;  --条件1和条件2都要满足

代码示例
select ename,job from emp where comm=500 and sal >1000; – 输出没有薪水和工资在1000以下的员工姓名,职位
执行结果
在这里插入图片描述

or

select column-name1,column-name2 from table-name where where-condition1 or where-condition1;  -- 满足条件1或者条件2

代码示例
select ename,job,sal,comm from emp where comm=0 or sal >1000; – 输出没有薪水或工资在1000以上的员工姓名,职位,工资,薪水
执行结果
在这里插入图片描述

四.模糊查询

4.1. 使用“ % ”通配符

代码示例
select *from emp where ename like'%僧'; – 输出所有姓名结尾是僧的员工的信息
执行结果
在这里插入图片描述

如果是刘%就是输出所有姓是刘的人
如果是%纲%就是输出所有姓名里面包含纲的人

4.2. 使用“ _ ” 通配符

这个_只能代替一个字符,如果要匹配多个字符就需要写多个_
代码示例
select *from emp where job like'_售%'; – 姓名中第二位为售的员工
执行结果
在这里插入图片描述

五.限制查询

5.1. 不指定初始位置的限制查询

代码示例
select *from emp where sal>1000 limit 3; – 输出工资大于1000的员工信息3条
执行结果
在这里插入图片描述

5.2. 指定初始位置的限制查询

代码示例
select *from emp where sal>10 limit 3,3; – 输出第二页的三条数据

limit x,y 
x: x= x-1*y  
y:y=y

执行结果
在这里插入图片描述

六.函数查询

6.1.单行数据查询

在这里插入图片描述
代码示例
select *from emp where length(ename)=2; – 输出长度是2的人名信息
执行结果
在这里插入图片描述

6.2 多行数据查询

在这里插入图片描述
select sum(comm),max(sal),min(sal) from emp ; – 返回员工表中薪水总数,工资最大值,最小值
select avg(sal) from emp; – 返回员工表中的工资平均数
select count(*) ,count(comm),count(sal) from emp; – 返回员工表的数量,工资数量,薪水数量

七.分组查询

group by

适用于:

当需求中出现 每一个 或者 每一种 的时候需要分组查询;比如说部门分类

代码示例:

select deptno,avg(sal) from emp group by deptno; – 查询每个部门的平均工资

结果展示:
在这里插入图片描述

八.一些查询常见的案例

 分组查询
-- 查询每个部门最高工资
select deptno,max(sal) from emp group by deptno;  
-- 查询每种职位的人数
select job ,count(job) from emp group by job;     
-- 查询每个部门工资大于1500的员工的人数
SELECT deptno,count(sal) from emp where sal>1500 group by deptno;
-- 查询出各个部门最高工资员工的所有信息
select *from emp where sal in (select max(sal) from emp group by deptno);
-- 查询每个部门工资最大值,最小值,平均值,总值
select deptno,count(*),sum(sal),max(sal),min(sal),avg(sal) from emp group by deptno;
-- 查询每个部门的人员
select deptno ,count(*),group_concat(ename) enames from emp group by (deptno);
-- 查询平均工资大于2000的部门信息
select deptno,count(*),sum(sal),max(sal),min(sal),avg(sal) from emp group by deptno having avg(sal)>=2000;
数值计算
-- 查询每一个员工的工资涨幅及之后的的工资
SELECT ename,sal,sal*5 from emp;
select sal,sal+2000 from emp;
-- 查询工资在1000-5000之间员工的信息,按照工资降序排列第三页的3条数据
select *from emp order by sal between 1000 and 5000 desc limit 6,3;
起别名
select ename '姓名' from emp;
select ename as'姓名' from emp;
-- 将6.1中的sal*5起别名为:年终奖
select sal*5 as '年终奖' from emp;
-- 将6.2中的sal+2000起别名为:涨薪后的工资
select sal+2000 as '涨薪后的工资' from emp;
-- 查询员工编号为2的人员扣除四百
select ename,sal, sal-400  as '减少300后的薪资'from emp where deptno=2;
-- 查询员工编号为五的姓名,工资,年收入
select ename as '姓名',sal as'工资' , sal + comm as'年收入' from emp  where mgr=5;
-- 子查询(嵌套查询)
select ename,job from emp where sal =(SELECT max(sal) from emp where deptno=2);   -- 2号部门最高工资的人
-- 多行子查询
SELECT *from emp where job in(select DISTINCT job from emp );
-- 统计查询
select ename from emp where HIREdate>='2000-1-1';    -- 查询2000-1-1年后入住的员工
select ename from emp where HIREdate between '1981-1-1' and '2004-1-1';    -- 1981-2004之间入住的员工

-- 函数nvl(x,0)  为null时,就被替换成为0
select empno,ename,job ,nvl(mgr,0) from emp;
select empno,ename,job,mgr from emp;
select empno as '编号',ename as '姓名',job as '职位', sal*15 +nvl(comm*15,0) as '年薪'from emp;
 聚合查询
-- 对查询的多条数据进行统计查询
-- 对平均值,最大值,最小值,求和,计数

-- 查询所有员工工资的平均值 avg()
select avg(sal) from emp;

-- 查询最大值  max()
select max(sal) from emp;

-- 查询最小值  min()
select min(sal) from emp;

-- 查询工资总和
select sum(sal) from emp;
select sum(comm) from emp where deptno=1;   -- 一号部门的奖金总和
-- 计数count
-- 查询员工表工资高于2000元的人数
select count(*) from emp where sal>2000;

-- 查询3号部门的平均工资
select avg(sal) from emp where deptno=3;
-- 查询2号部门最高工资
select ename,max(sal) from emp where deptno=2;
-- 查询1号部门最低工资
select ename,min(sal) from emp where deptno=1;
-- 查询1号部门工资总和
select sum(sal) from emp where deptno=1;
-- 查询1号部门平均工资,最大工资,最小工资,工资总和,和人数对每一个数据起别名
select avg(sal) as '平均工资',max(sal) as'最大工资',min(sal) as'最低工资',sum(sal) as'工资总和',count(*) as'人数' from emp where deptno=1;
综合案例
-- 1.查询没有上级领导的员工编号empno,姓名工资
select empno,ename,sal from emp where mgr is Null;
-- 2.查询有奖金的员工姓名和奖金
select ename,comm from emp where comm is not Null and comm !=0;
-- 3.查询名字中包含精的员工姓名和工资
select ename,sal from emp where ename like '%精%';
-- 4.查询名字中第二个字是八的员工信息
select *from emp where ename like '_八%';
-- 5.查询1号部门工资大于2000的员工信息
select *from emp where sal>2000 and deptno =1;
-- 6.查询2号部门或者工资低于1500的员工信息
select *from emp where sal<1500 or deptno=2;
-- 7.查询工资为3000,1500,5000的员工信息按照工资升序排序
select *from emp where sal in (3000,1500,5000) order by sal asc;
-- 8.查询3号部门的工资总和
select sum(sal) from emp where deptno=3; 
-- 9.查询每个部门工资大于1000的员工人数,按照人数升序排序
select deptno,count(*) from emp where sal>1000 group by deptno order  by count(*);
-- 10.查询每种工作中有领导的员工人数按照人数降序排序
select job ,count(*) from emp where mgr is not null group by job order by count(*);
-- 11.查询所有员工信息,按照部门编号升序排序,如果部门编号一致则工资降序
select *from emp order by deptno ,sal desc;
-- 12.查询有领导的员工,每个部门的编号和最高工资
select deptno,max(sal) from emp where mgr is not null group by deptno;
-- 13.查询有领导的员工,按照工资升序排序,第3页的2条数据
SELECT *from emp where mgr is not null order by sal asc limit 4,2;

猜你喜欢

转载自blog.csdn.net/weixin_51992868/article/details/124272415