1. null
如果一个数据行的某个特定的列缺少数据值,那么这种值叫做null,或者说是包含空值,
空值是指一种无效的,未赋值,未知的或者不可用的值。
空值不同于零或者空格
Select ename , job , sal , comm. From emp;
任何包含空值的算术表达式运算后的结果都为空值null。
Select ename , sal , comm , 12 * sal b from emp;
2. where)
使用where 子句限定返回的数据行(过滤记录)
Select ename, job, deptno from emp where job=’CLERK’;
注意:字符串和日期类型数值都要用单引号引起来
单引号中的数值区分大小写
日期型数值是区分日期表达形式的
默认的日期形式是DD-MON-YY(第三方数据的默认格式和oracle数据库的默认格式是不一样的,这个是oracle数据库的默认格式)
3. 比较操作符
Select ename, sal, comm from emp where sal <= comm;
比较操作符两边的数值数据类型必须一致。
1. 逻辑运算符
与 AND
或 OR
非 NOT
优先级:非—〉与—〉或
1. 其他比较运算符
Between…and… 两个值之间
IN(list) 和多个值任何一个匹配
LIKE 字形匹配
IS NULL 是空值
使用like运算符:
使用like来执行字符串通配符查找
查找条件可以包含字符串和数字:
-%表示零或任意更多的字符
-_代表一个字符
例:select ename from emp where ename like ‘S%’;(表示ename是以大写’S’开头的)
select ename from emp where ename like '_A%';(表示ename是以任意字符开头的第二个字符是大写’A’的值)
6.等价连接(等值连接)
SQL〉select emp.empno, emp.ename, emp.deptno, dept.deptno, dept.loc
2 from emp, dept
3 where emp.deptno = dept.deptno;
执行过程:先从emp表中取出一个deptno然后和dept表中的deptno比较,如果比较结果相同,就将dept表中的对应的这行记录连接到emp表对应的行后面,然后再执行select操作。
注意:在用到多个表时使用表名作前缀来限定列;
通过使用表前缀可以提高性能
通过表名.列名来select。
6. 不等价连接(等值连接)
SQL> select e.ename,e.sal,s.grade
3 where e.sal between s.losal and s.hisal;
7. 组函数
Oracle常用组函数:
--AVG 平均值
--Count 统计
--Max 最大值
--Min 最小值
--Sum 合计
AVG和SUM用法:
SQL> select AVG(sal),SUM(sal)
2 from emp
3 where job like 'SALES%';
Max和Min的用法:
SQL> select min(hiredate),max(hiredate)
2 from emp
3 ;
COUNT的用法:
SQL> select count(*)/*这里可以用count(*),效率低,也可以用count(列名)*/
2 from emp
3 where deptno=30;
8. Group By子句
SQL> select 列名,组函数(列名)
2 from 表名
3 [where 条件]
4 [Group By 分组列]
5 [Group By 分组列]
组函数忽略空值,可以使用NVL,NVL2,COALESCE函数处理空值
求每个部门的总工资:
SQL> select deptno, sum(sal)
2 from emp
3 group by deptno;
DEPTNO SUM(SAL)
------ ----------
30 9400
20 10875
10 8750
相同职位且经理相同的员工平均工资。
SQL> select job, mgr, avg(sal)
2 from emp
3 group by job,mgr
4 order by job;
JOB MGR AVG(SAL)
--------- ----- ----------
ANALYST 7566 3000
CLERK 7698 950
CLERK 7782 1300
CLERK 7788 1100
CLERK 7902 800
MANAGER 7839 2758.33333
PRESIDENT
SALESMAN 7698 1400
Group by子句注意问题:
--group by 子句后的列可以不在select语句中出现
--select字居中出现的非分组函数列必须在group by子句中出现
查询公司每个职位的平均工资,职位列不显示,同时结果按照平均工资排序
9.HAVING子句
部门员工工资最高大于3000的部门(组函数筛选事例):
SQL> select deptno,max(sal)
2 from emp
3 group by deptno
4 having max(sal)>=3000;
DEPTNO MAX(SAL)
------ ----------
20 3000
10 5000
错误的写法:
SQL> select deptno,max(sal)
2 from emp
3 where max(sal)>=3000
4 group by deptno;
提示出错信息:where后不允许使用分组函数
Having不能直接使用,只能和group by一起使用,但是group by可以单独使用
10.总结select语句执行过程:
--通过from子句找到需要查询的表;
--通过where子句进行非分组函数筛选判断;
--通过group by子句完成分组操作;
--通过having子句完成组函数筛选判断;
--通过select子句选择现实的列或表达式及组函数;
--通过order by子句进行排序操作。
11.练习
1.查询部门平均工资在2000元以上的部门名称及平均工资:
SQL> select emp.deptno,dept.dname,avg(sal)
2 from emp,dept
3 where dept.deptno=emp.deptno
4 group by emp.deptno,dept.dname
5 having avg(sal)>=2000;
DEPTNO DNAME AVG(SAL)
------ -------------- ----------
10 ACCOUNTING 2916.66666
20 RESEARCH 2175
2.查询部门人数在4人以上的部门的部门名称及最低工资和最高工资:
SQL> select dept.dname,min(sal),max(sal)
2 from emp,dept
3 where emp.deptno = dept.deptno
4 group by dept.dname
5 having count(empno)>4;
DNAME
-------------- ---------- ----------
RESEARCH
SALES