学习笔记之数据操作

上一篇 / 下一篇  2015-01-03 21:32:58 / 个人分类:PL/SQL(Oracle)

简单查询

一般简单查询需要使用三个保留字:SELECT、FROM、WHERE,为了便于理解查询语句的结构,可以将保留字作为每一行的开头。
举例:
SELECT Personnalname,age
  FROM Table1
  WHERE Sex = '1';

子查询与聚集函数

1)子查询也称嵌套查询,是指一个SELECT-FROM-WHERE查询块可以嵌入到另一个查询块之中,在SQL中允许多重嵌套。
举例:
SELECT Sno,Sname
  FROM Table2
  WHERE Sno IN(SELECT Sno
                 FROM Table3
                 WHERE Cno In(SELECT Cno
                                FROM Table4
                                WHERE Name = 'A'));
2)聚集函数
聚集函数是一个值得集合为输入,返回单个值得函数。

COUNT(*):统计元组的个数
select count(*)
  from table1;

COUNT(DISTINCT|ALL)<列名>:统计某一列中去掉重复值得个数
select count(distict name)
  from table1;

SUM(DISTINCT|ALL)<列名>:计算一列(该列应为数值型)中值得总和
select sum(金额)
  from bill;---所有记录的金额之和
select sum(distinct 金额)
  from bill;---去除重复记录后的金额之和

AVG(DISTINCT|ALL)<列名>:计算一列(该列应为数值型)值得平均值
select avg(金额)
  from bill;---所有金额的平均值
select avg(distinct 金额)
  from bill;---去除重复记录后的平均值

MAX(DISTINCT|ALL)<列名>:求一列的最大值
select max(金额)
  from bill;---求金额列的最大值
select max(distinct 金额)
  from bill;---去除重复记录后的最大值

MIN(DISTINCT|ALL)<列名>:求一列的最小值
select min(金额)
  from bill;---求金额的最小值
select min(distinct 金额)
  from bill;---去除重复记录后的最小值

分组查询


1)GROUP BY子句
在where子句后加上group by子句,可以对元组进行分组,保留在group by 后面跟着一个分组属性列表。
举例:
select hoscode,sum(amount)
  from bill
  group by hoscode;---以机构代码进行分组,求和
分组标准:不能以text,ntext,image类型的字段作为分组依据;
在select 统计函数中的字段,不能和普通的字段放在一起。

2)HAVING子句
作用为:在分组前按照某种方式加上权限
举例:
select hoscode,round(avg(amount),2)
  from bill
  group by hoscode
  having count(hoscode)>5
  order by hoscode desc;
查询结果,按照hoscode分组并降序排列,并且hoscode的个数大于5的金额的平均值;


引申函数

1)去除重复记录
select distinct hoscode
  from bill
  where amount<'60';

2)ASC升序排列,DESC降序排列
select 姓名,年龄
  from table1
  where sex='女'
  order by 年龄 desc,姓名 asc;

3)左关联查询
left outer join :左外关联,最终显示结果为左表的所有记录,右表与关联条件相匹配的记录,不匹配的记录NULL字符填充。

select a.personid,a.unitid,b.unitname
  from personbaseinfo a
  left outer join unitbaseinfo b on (a.unitid = b.unitid);

等价于

select a.personid,a.unitid,b.unitname
  from personbaseinfo a,
       unitbaseinfo b
  where a.unitid = b.unitid(+);
查询结果为:所有人员ID,单位ID及对应的单位名称,包括没有单位名称的人员信息;此查询,以第一个表为基准,如果有单位名称,则显示单位名称,如果没有对应的单位名称,则显示为空。

4)右外关联
right outer join:右外关联,最终显示的结果为:右表的所有记录,如果右表的某些行在左表中没有匹配行,则以NULL字符填充。

select a.personid,a.unitid,b.unitname
  from personbaseinfo a
  right outer join unitbaseinfo b on (a.unitid=b.unitid);

等价于:

select a.personid,a.unitid,b.unitname
  from personbaseinfo a
       unitbaseinfo b
  where a.unitid(+)=b.unitid;
查询结果为:此语句,以第二个表为基准,如果单位下有人员信息,则显示人员信息,如果没有人员信息,则只显示单位信息,人员信息以NULL字符填充。

TAG:

 

评分:0

我来说两句

Open Toolbar