1.1获取唯一记录——distinct
获取员工唯一工资状况的SQL语句如下所示。
SQL> select distinct e.employee_name, s.salary
from employees e, salary s
where e.employee_id = s.employee_id;
1.2分组——group by子句
在数据库查询中,分组是一个非常重要的应用。分组是指将数据表中所有记录中,以某个或者某些列为标准,划分为一组。
进行分组查询应该使用group by子句。group by子句指定分组标准,并将数据源按照该标准进行划分,然后循环处理每组数据。
1.3 过滤分组——having子句
where子句可以过滤from子句所指定的数据源,但是对于group by子句所产生的分组无效。为了将分组按照一定条件进行过滤,应该使用having子句。
为了获得工资总额大于10000的记录,应该使用如下SQL语句。
select e.employee_id, e.employee_name, sum(s.salary) total_salary
from employees e, salary s
where e.employee_id = s.employee_id
group by e.employee_id, e.employee_name
having (sum(s.salary))>10000
1.4 排序——order by子句
order by子句用于排序结果集。order by子句在使用时需要指定排序标准和排序方式。排序标准是指按照结果集中哪个或哪些列进行排序;order by有两种排序方式——升序(asc,同时也是默认排序方式)和降序(desc)。
对该搜寻结果按照工资水平由高到低的顺序排列,SQL语句如下所示。
SQL> select distinct e.employee_name, s.salary
from employees e, salary s
where e.employee_id = s.employee_id
order by s.salary desc;
1.5 order by与group by子句
order by子句所指定的排序列,必须出现在select表达式中。
获得员工工资总额状况,并按照工资总额由高到低的顺序进行排列。
SQL> select e.employee_name, sum(s.salary) total_salary
from employees e, salary s
where e.employee_id = s.employee_id
group by e.employee_name
order by total_salary desc;
1.6 order by与distinct
order by子句与distinct关键字同时使用时,也必须遵循这样一个
规则——order by子句所指定的排序列,必须出现在select表达式中。
获得所有员工姓名,并按工资进行升序排列。
SQL> select e.employee_name,s.salary
from employees e, salary s
where e.employee_id = s.employee_id
order by s.salary desc;
2 子查询
子查询是指在查询语句的内部嵌入查询,以获得临时的结果集。
Oracle总是自动优化带有子查询的查询语句。如果子查询中的数
据源与父查询中的数据可以实现连接操作,那么将转化为连接操
作;否则,将首先执行子查询,然后执行父查询。
2.1 查询条件中的子查询
例如,在表employees中存储了员工信息。但是其中某些员工并未领取过工资。
那么可以利用子查询作为查询条件来获得所有领取过工资的员工信息。
SQL> select * from employees
where employee_id in (select employee_id from salary);
2.2 建表语句中的子查询
子查询的另外一个应用场景用于建表语句中。
例如,Oralce的内置视图user_objects描述了当前用户所有对象信息。
现欲创建一个与该视图具有相同结构的空数据表,则可以利用如下SQL语句。
SQL> create table tmp_user_objects
as select * from user_objects where 1<>1;
2.3 插入语句中的子查询
我们也可以在插入语句中使用子查询。这相当于向表中批量插入数据。
创建的数据表为空表,我们可以利用子查询向其中插入数据。
SQL> insert into tmp_user_objects
select * from user_objects
where object_type='TABLE';
select * from user_objects where object_type='TABLE'
用于获得视图user_objects中object_type为“TABLE”的所有记录。
该子查询的所有记录,将被插入表tmp_user_objects中。
3 联合语句
联合语句是指对于多个查询所获得结果集进行集合操作。
这些集合操作包括:union、union all、intersect和minus。
这些集合运算都是二元运算,运算结果仍然是一个记录集合。
3.1 求并集(记录唯一)——union运算
union运算实际是合并两个结果集中的所有记录,并将其中重复记录剔除(保证结果集中的记录唯一)。
实例:数据库中存在着两个表a_students和b_students,
分别存储了参加了a培训班和b培训班的学生信息。
select student_id, student_name from a_students
union
select student_id, student_name from b_students;
3.2 求并集——union all运算
union all运算与union运算都可看做并集运算。
但是union all只是将两个运算结果集进行简单整合,并不剔除其中的重复数据。
这是与union运算的最大区别。
只需在上例union后加上all即可
3.3 求交集——intersect运算
interseect运算是指交集运算。
该运算可以获得两个结果集的交集——即同时存在于两个结果集中的记录。
在表a_students和表b_students中均存在着学生信息。
现欲获得既参加了a班,又参加了b班的学生姓名。
即同时存在于两个表中的学生姓名,则可以使用intersect运算。
相应的SQL语句如下所示。
SQL> select student_name from a_students
intersect
select s