1 语法格式:
select
字段,字段...
from
表名
where
条件;
执行顺序:先from,然后where,最后select
1. 查询工资等于5000的员工姓名?
select enamel from emp where sal = 5000 ;
2. 查询Smith的工资
select enamel from emp where ename = 'Smith' ;字符串使用单引号括起来
注意:
在数据库中 null 不是一个值,代表什么也没有,为空
空不是一个值,不能用等号衡量
必须使用 is null 或者 is not null
and 和 or 连起来使用
注意:当运算符的优先级不确定的时候加小括号。
in等同于 or:找出工作岗位是m 或 n的员工
select ename,job from emp where job = 'm' or job = 'n';
select ename,job from emp where job in('m','n');
select ename,job from emp where job in('1000,'5000') in后面的值不是区间,是具体的值
not in:不在这几个值之间
模糊查询 like
找出名字中含有o的?
(在模糊查询当中,必须掌握两个特殊的符号,一个是%,另一个是_)
%代表多个字符,_代表任意一个字符。
排序:(升序、降序)
select ename,sal from emp order by sal;//升序(默认)
select ename,sal from emp order by sal asc ;//升序
select ename,sal from emp order by sal desc; //降序
按照工资的降序排序,当工资相同的时候在按照名字的升序排列。
select ename,asl from emp order by sal sesc,ename asc;
注意:越靠前的字段越能起到主导作用。只有当前面的字段无法完成排序的时候,才会启用后面的字段。
注意:排序的时候可以用排序的字段by 2 (第二列) 但是不能在实战用使用,必须要将字段名写死。
找出工作岗位是SALESMAN的 员工,并且要求按照薪资的降序排列。
select
ename,job,sal
from
emp
where
job='SALESMAN'
order by
sal desc;
+--------+----------+---------+
| ename | job | sal |
+--------+----------+---------+
| ALLEN | SALESMAN | 1600.00 |
| TURNER | SALESMAN | 1500.00 |
| WARD | SALESMAN | 1250.00 |
| MARTIN | SALESMAN | 1250.00 |
+--------+----------+---------+select
字段 3
from
表名 1
where
条件 2
order by
。。。 4
分组函数? where后面不能直接使用分组函数
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
注意:所有的分组函数都是对“某一组”数据进行操作的。
找出工资总和?
select sum(sal)from emp;
找出总人数?
select count(*)from emp;
select count(ename) from emp;
分组函数一共是5个。
分组函数还有另一个名字:多行处理函数。
多行处理函数的特点:输入多行,最终输出的结果是1行。
分组函数自动忽略null。
select count(comm) from emp;
找出比平均工资高的员工?
第一步:select avg(sal) from emp; //平均工资
+-------------+
| avg(sal) |
+-------------+
| 2073.214286 |
+-------------+
第二步:select avg(sal) from emp where sal > 2073.214286
总结:select avg(sal) from emp where sal >(select avg(sal) from emp)
select ename,sal from emp where sal > avg(sal);
思考以上的错误信息:无效的使用了分组函数?
原因:SQL语句当中有一个语法规则,分组函数不可直接使用在where字句当中。 why???
怎么解释?
回答:group by是在 where之后运行
select 5
。。。
from 1
。。。。
where 2
。。。
group by 3
。。。
having 4
。。
order by 6
count(*)和count(具体的某个字段),他们有什么区别?
1. count(*):不是统计某个字段中数据的个数,而是统计总记录的条数。(和某个字段无关)
2. count(comm):表示统计comm字段中不为null的数据总数量。
单行处理函数
什么是单行处理函数?
输入一行,输出一行。
计算每个员工的年薪?
select ename,(sal+comm)+ 12 as yearsal from emp;
使用ifnull函数:
select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;
重点:只要数据库中有null 进行运算,那最终的结果一定是null
ifbull()空处理函数?
ifnull(可能为NULL的数据,被当做什么处理)
group by 和 having
group by:按照某个字段或某些字段进行分组。
having:having是对分组之后的数据再次过滤
案例:找出每个工作岗位的最高薪资。
select max(sal),job from emp group by job;
注意:分组函数一般都会和group by联合使用,这也是为什么他被称为分组函数的原因。并且任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的。当一条sql语句没有group by的话,整张表的数据会自称一组。
select ename,max(sal),job from emp group by job;
以上在mysql当中,查询结果是有的,但是结果没有意义,在Oracle数据库中会报错。语法错误。
Oracle的语法规则会比mysql语法规则严谨。
记住一个规则:当一条语句中有group by 的话,select后面只能跟分组函数和参与分组的字段。
多个字段能不能联合起来一块分组?
案例:找出每个部分不同岗位的最高薪资。
select
deptno,job,max(sal)
from
emp
group by
deptno,job;
找出每个部门的最高薪资,要求显示薪资大于2900的数据。
第一步:找出每个部门的最高薪资
select max(sal),deptno from emp group by deptno;
+----------+--------+
| max(sal) | deptno |
+----------+--------+
| 5000.00 | 10 |
| 3000.00 | 20 |
| 2850.00 | 30 |
+----------+--------+
第二步:找出薪资大于2900
select max(sal),deptno from emp where sal > 2900 group by deptno //效率较高
建议:能使用where过滤的尽量使用where过滤
找出每个部门的平均薪资,要求显示薪资大于2000的数据。
第一步:找出每个部门的平均薪资
select deptno,avg(sal) from emp group by deptno;
+--------+-------------+
| deptno | avg(sal) |
+--------+-------------+
| 10 | 2916.666667 |
| 20 | 2175.000000 |
| 30 | 1566.666667 |
+--------+-------------+
第二步:显示薪资大于2000的数据。
select deptno,avg(sal) from emp group by deptno having max(sal) > 2900;
+--------+-------------+
| deptno | avg(sal) |
+--------+-------------+
| 10 | 2916.666667 |
| 20 | 2175.000000 |
+--------+-------------+
where 后面不能使用分组函数。
总结:一个完整的DQL语句怎么写?
select
from
where
group by
having
order by