1.简单的查询语句(DQL)
语法格式:select 字段名1,字段名2… from 表名;
注意:
(1)任何一条sql语句以“;”结尾。
(2)sql语句不区分大小写。
(3)字段可以参与数据运算。如:select ename,sal*12 as ‘年薪’ from emp;
(4)标准sql语句中要求字符串使用单引号括起来,虽然mysql支持双引号,但尽量别用。
(5)取别名时,as关键字可以省略。如:select ename,sal*12 ‘年薪’ from emp;
(6)select * from emp; //实际开发中不建议使用*,效率较低。
2.条件查询
语法格式:select 字段名1,字段名2… from 表名 where 条件;
支持如下运算符:
注意:
(1)between…and…是闭区间,且在使用的时候必须左小右大。
(2)between…and…还可以用在字符串方面,此时它属于左闭右开区间。如:select ename from emp where ename between ‘A’ and ‘D’;
(3)在数据库中,NULL不是一个值,代表什么也没有,为空,其不等于0,不能用等号衡量,必须使用is null或者is not null。
(4)and的优先级大于or,当运算符的优先级不确定的时候加小括号。
(5)in等同于or,in后面的值不是区间,是具体的值。如:select ename,job from emp where job=‘SALESMAN’ or job=‘MANAGER’;等同于select ename,job from emp where job in(‘SALESMAN’,‘MANAGER’);
3.模糊查询like
在模糊查询中,必须掌握两个特殊的符号,一个是‘%’,一个是‘_’。
‘%’代表任意多个字符,‘_’代表1个字符。
如:
(1)找出名字中第三个字母是A的?
select ename from emp where ename like ‘__A%’;
(2)找出名字中带下划线的?
select ename from emp where ename like ‘%\_%’; //使用了转义字符
4.排序(升序、降序)
asc表示升序,desc表示降序。order by默认升序。
(1)按照工资升序,找出员工名和薪资?
select ename,sal from emp order by sal; //order by默认升序
(2)按照工资降序,找出员工名和薪资?
select ename,sal from emp order by sal desc;
(3)按照工资降序排列,当工资相同时再按照名字的升序排列?
select ename,sal from emp order by sal desc,ename asc; //越靠前的字段越能起到主导作用,只有当前面的字段无法完成排序的时候(相等的时候),才会启用后面的字段。
(4)找出工作岗位是SALESMAN的员工,并且要求按照薪资的降序排列?
select ename,job,sal from emp where job=‘SALESMAN’ order by sal desc; //先from,后where,再select,最后order
5.分组函数(多行处理函数)
分组函数一共只有五个:
记住:(1)所有的分组函数都是对“某一组”数据进行操作的。如:
找出工资总和?
select sum(sal) from emp;
找出工资总和总人数?
select count() from emp;
select count(ename) from emp;
(2)分组函数自动忽略NULL。如:count不将值为NULL的计算在内,count()和count(某个字段)得到的结果可能不一样。
(3)多行处理函数:输入多行,输出一行;单行处理函数:输入一行,输出一行。
(4)sql语句中有一语法规则,分组函数不可直接使用在where子句当中。如:select ename,sal from emp where sal>avg(sal);这是错误的。改正:select ename,sal from emp where sal>(select avg(sal) from emp);
6.单行处理函数
ifnull()函数:可能为NULL的数据,被当做什么处理。
如:计算每个员工的年薪?
select ename,(sal+comm)*12 as yearsal from emp; //这是不当的,因为comm可能为NULL,所有数据库都是这样规定的:只要有NULL参与的运算结果一定是NULL。
改正:select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;
7.分组查询group by、having
group by:按照某个字段或者某些字段进行分组。having:对分组之后的数据进行再次过滤。
(1)分组函数一般都会和group by联合使用,这也是为什么被称为分组函数的原因,并且任何一个分组函数都是在group by语句执行结束之后才会执行的,这也是为什么分组函数不能用在where中使用的原因(没有group by的sql语句中实际上存在一个缺省的group by语句)。当一条sql语句没有group by的话,整张表的数据会自成一组。如:找出每个工作岗位的最高薪资?
select max(sal) from emp group by job;
上图表示SQL语句中各子句的执行顺序。
(2)select ename,max(sal),job from emp group by job;这条sql语句在MySQL当中查询结果是有的,但是结果没有意义,ename结果是乱的,在Oracle数据库中会报错;Oracle的语法规则比MySQL语法规则严谨。记住:当一条语句中有group by的时候,select后面只能跟分组函数和参与分组的字段。
(3) 多个字段可以联合起来一起分组。如:select max(sal),deptno,job from emp group by deptno,job;
(4)having的使用,having不能单独使用,必须跟着group by一起使用。建议:能够使用where过滤的尽量使用where,where的效率比较高。select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;这是不得不用having过滤的例子。
8.关于查询结果集的去重
(1)select distinct job from emp;
(2)select ename,distinct job from emp; //错误,distinct只能出现在所有字段的最前面
(3)select distinct deptno,job from emp; //deptno与job联合起来去重
(4)统计岗位的数量?
select count(distinct job) from emp;