02-单表查询语句

2021/5/9 10:29:44

本文主要是介绍02-单表查询语句,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

字段查询

字段查询

查询一个字段

格式:select 字段名 from 表名;

例: 查询员工姓名

image-20210417174235806

注意:

  1. 任何一个SQL语句以分号结尾;
  2. SQL语句不区分大小写

查询多个字段

格式:select 字段名1,字段名2,...... from 表名;

例:查询员工的编号和姓名

image-20210417174352691

查询全部字段

格式:select * from 表名;

一般开发中不会用到该语句,*号不是很明确,建议写明字段,这样可读性强。

例:查询emp表所有内容

image-20210417174553714

查询上的运算

格式:select 字段名1,字段名2[+,-,*,/等运算],...... from 表名;

例:列出员工的编号,姓名和年薪

image-20210417174949310

字段别名

格式:select 字段名1 as 别名1,字段名2 as 别名2,...... from 表名;

例:列出员工的编号,姓名和年薪,将查询出来的字段显示为中文

image-20210417175324654

注意:

  1. SQL中所有的字符串用单引号括起来,在MySQL中可以用双引号,但其他数据库只能用单引号,所以我们统一用单引号
  2. 字段别名命名时,as是可以省略用空格代替的。

条件查询

语法格式:

select 字段名[,字段名2,字段名3,...]

from 表名

where 条件;

执行顺序:from------->where------->select

等号操作符

例1:查询薪水为5000的员工

image-20210418105304325

例2:查询job为MANAGER的员工

image-20210418105417630

注意:

  1. MySQL在windows下是不区分大小写的,将script文件导入MySQL后表名也会自动转化为小写,结果再 想要将数据库导出放到linux服务器中使用时就出错了。因为在linux下表名区分大小写而找不到表,查了很多都是说在linux下更改MySQL的设置使其也不区分大小写,但是有没有办法反过来让windows 下大小写敏感呢。其实方法是一样的,相应的更改windows中MySQL的设置就行了。

  2. 无论查名字还是工作岗位等信息,其都属于数据表里的内容。mysql语句虽不区分大小写,但数据该大写还是得大写,虽然mysql语句如果写成小写可以运行,但是,在orcale中是不行的,尽量还是写规范。

!=,<>操作符

例1:查询薪水不等于5000的员工

image-20210418105536054

between...and...操作符

例1:查询薪水为1600到3000的员工(第一种方式,采用>=和<=)

注意:between...and...的区间闭区间,必须左小右大。除了可以是数字外,也可以是字符串(但基本不用)

​ select ename,sal from emp where sal between 1600 and 3000;

image-20210418110505180

is null操作符

例1:查询津贴为空的员工

注意:为空和为零不是一个概念。

select ename,comm from emp where comm is null;

image-20210418110813328

and,or,表达式优先级

例1:工作岗位为MANAGER,薪水大于2500的员工;

select ename,job,sal

from emp

where job='MANAGER' and sal >2500;

image-20210418111712867

例2:查询出job为manager或者job为salesman的员工;

select ename,job

from emp

where job='MANAGER' or job ='SALESMAN';

image-20210418112040648

例3:查询薪水大于1800,并且部门代码为20或30的

select ename,deptno,sal

from emp

where sal>1800 and (deptno = 20 or deptno =30);

image-20210418112156839

注意:and的优先级要大于or,所以,如果不加括号,其查询结果为薪资大于1800的20部门员工,或者30部门员工的信息,和所要求的的有出入。

in

概念:查找属性值属于指定集合的元组。

例:查询出job为manager或者job为salesman的员工

select ename,job

from emp

where job in ('manager','salesman');

image-20210418112542257

not

例1:查询出薪水不包含1600和薪水不包含3000的员工

select ename ,sal

from emp

where sal not in (1600,3000);

image-20210418113358148

例2:查询出薪水不在1600和3000区间的员工

select ename ,sal

from emp

where sal not between 1600 and 3000;

image-20210418113720078

例3:查询出津贴不为null的所有员工

select ename,comm

from emp

where comm is not null;

image-20210418113521578

模糊查询(like)

例1:查询姓名以M开头所有的员工

select ename from emp where ename like 'M%';

image-20210418113931362

例2:查询姓名以N结尾的所有的员工

select ename from emp where ename like '%N';

image-20210418114314147

例3:查询姓名中包含O的所有的员工

select ename from emp where ename like '%O%';

image-20210418114430680

例4:查询姓名中第二个字符为A的所有员工

select ename from emp where ename like '_A%';

image-20210418114455075

MySQL排序

关键字:

升序ASC,降序DESC;

概念:

排序采用order by子句,order by后面跟上排序字段,排序字段可以放多个,多个采用逗号间隔,order by默认采用升序,如果存在where子句那么order by必须放到where语句的后面。

分类:

单一字段排序

例:按照薪水由小到大排序(系统默认由小到大)

select * from emp order by sal;

例:取得job为MANAGER的员工,按照薪水由小到大排序(系统默认由小到大)

select ename,job,sal from emp where job='MANAGER' order by sal;

注意:order by 子句要放在where子句之后。

例:按照多个字段排序,如:首先按照job排序,再按照sal排序

select ename,job,sal from emp order by job,sal;

image-20210419073830137

注意:默认首先按照job排序,若是job相等,再根据sal进行排序。即job具有主导地位。

手动指定排序顺序

ASC升序(系统默认)

例:手动指定按照薪水由小到大排序

select ename,sal from emp order by sal asc;

DESC降序

例:手动指定按照薪水由大到小排序

select ename,sal from emp order by sal desc;

多个字段排序

多个字段排序徐,第一个字段占主导地位。若第一个字段相等,才会进行第二个字段的排序,以此类推。

例:按照job和薪水倒序

select ename,job,sal from emp order by job desc,sal desc;

z

使用字段的位置来排序

例:按照薪水升序(即表中第六行)

select * from emp order by 6;

不建议使用:采用数字含义不明确,程序不健壮。

MySQL分组函数

单行处理函数

特点:输入一行,输出一行

常见的有ifnull()空值处理函数。

ifnull()空值处理函数

格式:ifnull(可能为null的数据,被当做什么来处理);

特点:属于单行处理函数

例:计算每位员工的年薪

分析:年薪=(月薪+补助)*12

即:select ename,(sal+comm)*12 as '年薪' from emp;

8

可见许多人年薪为null,实际他们只是补助为空,所以结果不准确。

注意:在数据库中,只要有null参与的运算,最后结果一定为空(所有数据库通用)。

故,要使用ifnull()函数,来避免该情况的发生。

即:select ename,(sal+ifnull(comm,0))*12 as '年薪' from emp;

9

分组函数(多行处理函数)

MySQL COUNT函数与MySQL聚合函数

count 取得记录数
sum 求和
avg 取平均
max 取最大的数
min 取最小的数

注意:分组函数自动忽略空值,不需要手动的加where条件排除空值。

select count(*) from emp where xxx; 符合条件的所有记录总数。

select count(comm) from emp; comm这个字段中不为空的元素总数。

注意:分组函数不能直接使用在where关键字后面。

mysql> select ename,sal from emp where sal > avg(sal);

ERROR 1111 (HY000): Invalid use of group function

MySQL COUNT函数

例:取得所有的员工数

例:取得津贴不为null员工数

例:取得工作岗位的个数

MySQL聚合函数

MySQL SUM函数

Sum可以取得某一个列的和,null会被忽略

例1:取得薪水的合计

例2:取得津贴的合计

例3:取得薪水的合计(sal+comm)

问题:由例1,例2知,例3的计算结果不是上述数字。原因:薪资(sal)和津贴(comm)先进行运算,运算时因为有null值,所以所得结果为null。而分组函数会自动忽略null值。
解决办法:使用空值处理函数。

MySQL AVG函数

取得某一列的平均值

例:取得平均薪水

MySQL Max()函数

取得某个一列的最大值

例:取得最高薪水

例:取得最晚入职得员工

解析:首先,需要把员工表中的日期字符串转成日期,使用str_to_date函数。

使用规则:str_to_date(字符串,要转成的日期类型),例str_to_date('02-20-1981','%m-%d-%Y')

select max(str_to_date(hiredate,'%Y-%m-%d')) from emp;

MySQL MIN函数

取得某个一列的最小值

例:取得最低薪水

例:取得最早入职得员工(可以不使用str_to_date转换)

MySQL分组查询

分组查询主要涉及到两个子句,分别是:group by和having。

注意:分组函数一般都会和group by联合使用。这也是为什么它被称为分组函数的原因,并且每个分组函数都是在group by分完组后再执行。当一条SQL语句没有group by,则默认该表的数据自成一组。

当一条语句中有group by 时,select后面只能跟分组函数或参与分组的字段。否则就会报错,mysql当中是可以查出来没有意义的,但是Oracle 就会直接报错。

group by

例:取得每个工作岗位的工资合计,要求显示岗位名称和工资合计,并按降序排列

例:按照工作岗位和部门编码分组,取得的工资合计

select job,deptno,sum(sal) from emp group by job,deptno;

having

如果想对分组数据再进行过滤需要使用having子句;

注意:只有涉及到分组函数要有进行条件比较,再用having。

例:取得每个岗位的平均工资大于2000;

select job,avg(sal) from emp group by job having avg(sal)>2000;

having和where的选择

例:找出每个部门的最高薪资,要求显示薪资大于2900的数据。

方法一:having

select deptno,max(sal) from emp group by deptno having max(sal)>2900;

image

方法二:where

select deptno,max(sal) from emp where sal>2900 group by deptno;

虽然两种方法都可行,但是第二种方法的效率更高。

DQL执行顺序总结

select...   //5.那几个字段
from...   //1.哪个表
where...   //2.什么条件
group by...   //3.按什么分组
having...   //4.分完组后有啥过滤条件
order by...   //6.升序还是降序


这篇关于02-单表查询语句的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程