DQL查询语句
使用别名
SELECT子句中可以使用函数或表达式,那么结果集中对应的该字段名就是这个函数或表达式,可读性差,为此可为这样的字段添加别名。中间可加或者不加AS关键字。
别名本身不区分大小写,而且不能含有空格。如果希望别名区分大小写或含有空格,可以使用双引号。
SELECT name,salary*12 AS "annual salary"
FROM myemp;
查询条件
使用<,>,>=,<=,<>,!=,=
查询职员表中不属于部门10的员工信息(<>等价于!=)
SELECT name,salary,job
FROM myemp
WHERE deptno<>10;
查询职员表中在2002年一月一日以后入职的职员信息,比较日期类型数据
SELECT name,salary,hiredate
FROM myemp
WHERE hiredate>to_date('1982-1-1','YYYY-MM-DD');
使用AND,OR关键字
在SQL操作中,如果希望返回的结果必须满足多个条件,应该使用AND逻辑操作符连接这些条件;如果希望满足若干条件之一即可可以使用OR逻辑操作符连接这些条件。
查询薪水大于1000并且职位为‘clerk’的职员信息
SELECT name ,salary,job
FROM myemp
WHERE salary>1000 AND job='CLERK';
查询薪水大于1000或者职位为‘clerk’的职员信息
SELECT name ,salary,job
FROM myemp
WHERE salary>1000 OR job='CLERK';
查看工资高于1000的职位是clerk或salesman
AND的优先级高于OR,可以通过括号来提高OR的优先级
SELECT name,salary,job
FROM myemp
WHERE sallary>1000
AND (job='salesman' OR job='clerk');
使用LIKE条件(模糊查询)
LIKE需要借助两个通配符
%:表示0到多个字符
_:表示单个字符
SELECT name,job
FROM myemp
WHERE name LIKE '_A%N';
IN(list)和 NOT IN(list)
判断是否在列表中或不在列表中
常用来判断子查询的结果
SELECT name,job
FROM myemp
WHERE job IN('manager','clerk');
SELECT name,job
FROM myemp
WHERE deptno
NOT IN(10,20);
BETWEEN… AND…
判断在一个区间内
工资在1500到3000之间的员工
SELECT name,salary
FROM myemp;
IS NULL和 IS NOT NULL
空值NULL是一个特殊的值,比较的时候不能用“=”
SELECT name,salary,comm
FROM myemp
WHERE comm IS NULL;
ANY和ALL条件
需配合>,<一起使用
ANY和ALL条件常用于子查询。
<ANY:小于最大 > ANY:大于最小 <ALL:小于最小>ALL:大于最大
SELECT empno,name,job,salary,deptno
FROM myemp
WHERE > ANY(3500,5000,4500);
使用函数或者表达式作为过滤条件
SELECT name,salary,job
FROM myemp
WHERE name=UPPER('scott');
SELECT name,salary,job
FROM myemp;
DISTINCT关键字
对结果集中指定字段值重复的记录进行去重
查看公司有哪些职位?
SELECT DISTINNCT job
FROM myemp;
多字段去重是对这些字段值的组合去重
SELECT DISTINCT job,deptno
FROM myemp;
ORDER BY子句
对数据按一定规则进行排序操作
ASC:升序,不写默认升序
DESC:降序
若排序的字段中含有NULL值,NULL被认为是最大值。
SELECT name,salary
FROM myemp
ORDER BY salary ASC;
多个字段排序:按照第一个字段排序,当第一个字段有重复值时才会按照第二个字段排序,以此类推。每个字段都可指定排序方式。
SELECT name,salary,deptno
FROM myemp
ORDER BY deptno ASC ,salary DESC;
聚合函数
聚合函数又叫多行函数,分组函数
聚合函数是对结果集某些字段的值进行统计的。
MAX,MIN
求给定字段的最大值与最小值
查看公司的最高工资与最低工资
SELECT MAX(salary),MIN(salary)
FROM emp;
AVG,SUM
求平均值和总和
SELECT AVG(sal),SUM(sal)
FROM emp;
COUNT函数
COUNT函数不是对给定字段的值进行统计的,而是对给定字段不为null的记录数统计的。
实际上所有的聚合函数都忽略null值统计。
SELECT COUNT(comm)
FROM myemp
SELECT COUNT(NVL(comm,0))
FROM myemp;
查看表的记录数
SELECT COUNT(*)
FROM myemp;
查看平均绩效,不忽略null
SELECT AVG(NVL(comm,0)),SUM(comm)
FROM myemp;
GROUP BY 子句
可将结果集按照其后指定的字段值相同的记录看做一组,然后配合聚合函数进行更细分的统计工作。
查看每个部门的平均工资
SELECT AVG(sal),deptno
FROM myemp
GROUP BY deptno;
GROUP BY也可以根据多个字段分组,
分组原则为这几个字段都相同的记录看做一组。
当SELECT字句中含有聚合函数时,那么凡不 在聚合函数中的其他单独字段必须出现在GROUP BY 字句中,反过来则不是必须的。
查看同部门同职位的平均工资
SELECT AVG(salary),job,deptno
FROM myemp
ORDER BY job ,deptno;
WHERE不能使用聚合函数作为过滤条件,原因是过滤时机不对。
WHERE是在数据库检索表中数据时,对数据逐条过滤以决定是否查询出该数据时使用的,所以WHERE用来确定结果集的数据。
使用聚合函数的结果作为过滤条件,那么一定是数据从表中查询完毕(WHERE在查询中发挥作用)得到结果集,并且分组完毕才进行聚合函数统计结果,得到后才可以对分组进行过滤,由此可见,这个过滤时机是在WHERE之后进行的。
聚合函数的过滤条件要在HAVING字句中使用,HAVING必须跟在GROUP BY子句之后。HAVING是用来过滤分组的。
查看平均工资高于2000的部门的平均工资
SELECT AVG(salary),deptno
FROM myemp
GROUP BY deptno
HAVING AVG(salary)>2000;
查看平均工资高于2000的部门的最高工资和最低工资
SELECT MAX(salary),MIN(salary),deptno
FROM myemp
GROUP BY deptno
HAVING AVG(salary)>2000;
查询语句的执行顺序
1、from子句
数据量较少的表尽量放在后面
2、where子句
将能过滤掉最大数量记录的条件写在where子句的最右
3、group by子句
最好在group by 前使用where将不需要的记录在group by之前过滤掉
4、having子句
having消耗资源,尽量避免使用。having会在检索出所有记录之后才对结果集进行过滤,需要排序等操作
5、select子句
少用*,尽量取字段名称
oracle在解析的过程中会现将*转换为列名,消耗时间
6、order by