字段查询
字段查询
查询一个字段
格式:select 字段名 from 表名;
例: 查询员工姓名
注意:
- 任何一个SQL语句以分号结尾;
- SQL语句不区分大小写
查询多个字段
格式:select 字段名1,字段名2,...... from 表名;
例:查询员工的编号和姓名
查询全部字段
格式:select * from 表名;
一般开发中不会用到该语句,*号不是很明确,建议写明字段,这样可读性强。
例:查询emp表所有内容
查询上的运算
格式:select 字段名1,字段名2[+,-,*,/等运算],...... from 表名;
例:列出员工的编号,姓名和年薪
字段别名
格式:select 字段名1 as 别名1,字段名2 as 别名2,...... from 表名;
例:列出员工的编号,姓名和年薪,将查询出来的字段显示为中文
注意:
- SQL中所有的字符串用单引号括起来,在MySQL中可以用双引号,但其他数据库只能用单引号,所以我们统一用单引号
- 字段别名命名时,as是可以省略用空格代替的。
条件查询
语法格式:
select 字段名[,字段名2,字段名3,...]
from 表名
where 条件;
执行顺序:from------->where------->select
等号操作符
例1:查询薪水为5000的员工
例2:查询job为MANAGER的员工
注意:
-
MySQL在windows下是不区分大小写的,将script文件导入MySQL后表名也会自动转化为小写,结果再 想要将数据库导出放到linux服务器中使用时就出错了。因为在linux下表名区分大小写而找不到表,查了很多都是说在linux下更改MySQL的设置使其也不区分大小写,但是有没有办法反过来让windows 下大小写敏感呢。其实方法是一样的,相应的更改windows中MySQL的设置就行了。
-
无论查名字还是工作岗位等信息,其都属于数据表里的内容。mysql语句虽不区分大小写,但数据该大写还是得大写,虽然mysql语句如果写成小写可以运行,但是,在orcale中是不行的,尽量还是写规范。
!=,<>操作符
例1:查询薪水不等于5000的员工
between...and...操作符
例1:查询薪水为1600到3000的员工(第一种方式,采用>=和<=)
注意:between...and...的区间闭区间,必须左小右大。除了可以是数字外,也可以是字符串(但基本不用)
select ename,sal from emp where sal between 1600 and 3000;
is null操作符
例1:查询津贴为空的员工
注意:为空和为零不是一个概念。
select ename,comm from emp where comm is null;
and,or,表达式优先级
例1:工作岗位为MANAGER,薪水大于2500的员工;
select ename,job,sal
from emp
where job='MANAGER' and sal >2500;
例2:查询出job为manager或者job为salesman的员工;
select ename,job
from emp
where job='MANAGER' or job ='SALESMAN';
例3:查询薪水大于1800,并且部门代码为20或30的
select ename,deptno,sal
from emp
where sal>1800 and (deptno = 20 or deptno =30);
注意:and的优先级要大于or,所以,如果不加括号,其查询结果为薪资大于1800的20部门员工,或者30部门员工的信息,和所要求的的有出入。
in
概念:查找属性值属于指定集合的元组。
例:查询出job为manager或者job为salesman的员工
select ename,job
from emp
where job in ('manager','salesman');
not
例1:查询出薪水不包含1600和薪水不包含3000的员工
select ename ,sal
from emp
where sal not in (1600,3000);
例2:查询出薪水不在1600和3000区间的员工
select ename ,sal
from emp
where sal not between 1600 and 3000;
例3:查询出津贴不为null的所有员工
select ename,comm
from emp
where comm is not null;
模糊查询(like)
例1:查询姓名以M开头所有的员工
select ename from emp where ename like 'M%';
例2:查询姓名以N结尾的所有的员工
select ename from emp where ename like '%N';
例3:查询姓名中包含O的所有的员工
select ename from emp where ename like '%O%';
例4:查询姓名中第二个字符为A的所有员工
select ename from emp where ename like '_A%';
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;
注意:默认首先按照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;
使用字段的位置来排序
例:按照薪水升序(即表中第六行)
select * from emp order by 6;
不建议使用:采用数字含义不明确,程序不健壮。
MySQL分组函数
单行处理函数
特点:输入一行,输出一行
常见的有ifnull()空值处理函数。
ifnull()空值处理函数
格式:ifnull(可能为null的数据,被当做什么来处理);
特点:属于单行处理函数
例:计算每位员工的年薪
分析:年薪=(月薪+补助)*12
即:select ename,(sal+comm)*12 as '年薪' from emp;
可见许多人年薪为null,实际他们只是补助为空,所以结果不准确。
注意:在数据库中,只要有null参与的运算,最后结果一定为空(所有数据库通用)。
故,要使用ifnull()函数,来避免该情况的发生。
即:select ename,(sal+ifnull(comm,0))*12 as '年薪' from emp;
分组函数(多行处理函数)
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;
方法二: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.升序还是降序