select [ all | distinct ] from ,[,…]
[where ]
[group by [having]]
[order by [asc | desc]]
语句说明:
[]方括号为可选项
[group by [having]]
指将结果按的值进行分组,该值相等的记录为一组,带【having】
短语则只有满足指定条件的组才会输出。
[order by [asc | desc]]
显示结果要按值升序或降序进行排序
练习:
1:表hkb_test_sore取出成绩sore前5名的记录,
2:取第5名的记录
1,答案select a.sore_id, a.sore
from (select * from hkb_test_sore order by sore desc) a
where rownum
2,答案select a.sore_id, a.sore
from (select * from hkb_test_sore order by sore desc) a
where rownum minus
select a.sore_id, a.sore
from (select * from hkb_test_sore order by sore desc) a
where rownum 3:查询两个分数一样的记录
select *
from hkb_test_sore a
where a.sore = (select sore
from hkb_test_sore a
group by a.sore
having count(a.sore) = 2);
union,union all,intersect,minus的区别:
sql> select * from hkb_test2;
x y
---- -----
a 1
b 2
c 3
g 4
sql> select * from hkb_test3;
x y
---- -----
a 1
b 2
e 3
f 4
sql> select * from hkb_test2;
x y
---- -----
a 1
b 2
c 3
g 4
sql> select * from hkb_test3;
x y
---- -----
a 1
b 2
e 3
f 4
sql> select * from hkb_test2
2 union
3 select * from hkb_test3;
x y
---- -----
a 1
b 2
c 3
e 3
f 4
g 4
6 rows selected
sql> select * from hkb_test2
2 union all
3 select * from hkb_test3;
x y
---- -----
a 1
b 2
c 3
g 4
a 1
b 2
e 3
f 4
8 rows selected
sql> select * from hkb_test2
2 intersect
3 select * from hkb_test3;
x y
---- -----
a 1
b 2
sql> select * from hkb_test2
2 minus
3 select * from hkb_test3;
x y
---- -----
c 3
g 4
综合上面实例看个完整的实例
sql>
sql>
sql> -- create demo table
sql> create table employee(
2 id varchar2(4 byte) not null primary key,
3 first_name varchar2(10 byte),
4 last_name varchar2(10 byte),
5 start_date date,
6 end_date date,
7 salary number(8,2),
8 city varchar2(10 byte),
9 description varchar2(15 byte)
10 )
11 /
table created.
sql>
sql> -- prepare data
sql> insert into employee(id, first_name, last_name, start_date, end_date, salary, city, description)
2 values ('01','jason', 'martin', to_date('19960725','yyyymmdd'), to_date('20060725','yyyymmdd'), 1234.56, 'toronto', 'programmer')
3 /
1 row created.
sql> insert into employee(id, first_name, last_name, start_date, end_date, salary, city, description)
2 values('02','alison', 'mathews', to_date('19760321','yyyymmdd'), to_date('19860221','yyyymmdd'), 6661.78, 'vancouver','tester')
3 /
1 row created.
sql> insert into employee(id, first_name, last_name, start_date, end_date, salary, city, description)
2 values('03','james', 'smith', to_date('19781212','yyyymmdd'), to_date('19900315','yyyymmdd'), 6544.78, 'vancouver','tester')
3 /
1 row created.
sql> insert into employee(id, first_name, last_name, start_date, end_date, salary, city, description)
2 values('04','celia', 'rice', to_date('19821024','yyyymmdd'), to_date('19990421','yyyymmdd'), 2344.78, 'vancouver','manager')
3 /
1 row created.
sql> insert into employee(id, first_name, last_name, start_date, end_date, salary, city, description)
2 values('05','robert', 'black', to_date('19840115','yyyymmdd'), to_date('19980808','yyyymmdd'), 2334.78, 'vancouver','tester')
3 /
1 row created.
sql> insert into employee(id, first_name, last_name, start_date, end_date, salary, city, description)
2 values('06','linda', 'green', to_date('19870730','yyyymmdd'), to_date('19960104','yyyymmdd'), 4322.78,'new york', 'tester')
3 /
1 row created.
sql> insert into employee(id, first_name, last_name, start_date, end_date, salary, city, description)
2 values('07','david', 'larry', to_date('19901231','yyyymmdd'), to_date('19980212','yyyymmdd'), 7897.78,'new york', 'manager')
3 /
1 row created.
sql> insert into employee(id, first_name, last_name, start_date, end_date, salary, city, description)
2 values('08','james', 'cat', to_date('19960917','yyyymmdd'), to_date('20020415','yyyymmdd'), 1232.78,'vancouver', 'tester')
3 /
1 row created.
sql>
sql>
sql>
sql> -- display data in the table
sql> select * from employee
2 /
id first_name last_name start_dat end_date salary city description
---- -------------------- -------------------- --------- --------- ---------- ---------- ---------------
01 jason martin 25-jul-96 25-jul-06 1234.56 toronto programmer
02 alison mathews 21-mar-76 21-feb-86 6661.78 vancouver tester
03 james smith 12-dec-78 15-mar-90 6544.78 vancouver tester
04 celia rice 24-oct-82 21-apr-99 2344.78 vancouver manager
05 robert black 15-jan-84 08-aug-98 2334.78 vancouver tester
06 linda green 30-jul-87 04-jan-96 4322.78 new york tester
07 david larry 31-dec-90 12-feb-98 7897.78 new york manager
08 james cat 17-sep-96 15-apr-02 1232.78 vancouver tester
8 rows selected.
sql>
sql>
sql> select id, first_name, last_name from employee
2 /
id first_name last_name
---- -------------------- --------------------
01 jason martin
02 alison mathews
03 james smith
04 celia rice
05 robert black
06 linda green
07 david larry
08 james cat
8 rows selected.
在oracle中实现select top n的方法
1.在oracle中实现select top n
由于oracle不支持select top语句,所以在oracle中经常是用order by跟rownum的组合来实现select top n的查询。
简单地说,实现方法如下所示:
select 列名1...列名n from
(select 列名1...列名n from 表名 order by 列名1...列名n)
where rownum
order by rownum asc
下面举个例子简单说明一下。
顾客表customer(id,name)有如下数据:
id name
01 first
02 second
03 third
04 forth
05 fifth
06 sixth
07 seventh
08 eighth
09 ninth
10 tenth
11 last
则按name的字母顺抽出前三个顾客的sql语句如下所示:
select * from
(select * from customer order by name)
where rownum
order by rownum asc
输出结果为:
id name
08 eighth
05 fifth
01 first
2.在top n纪录中抽出第m(m
在得到了top n的数据之后,为了抽出这n条记录中的第m条记录,我们可以考虑从rownum着手。我们知道,rownum是记录表中数据编号的一个隐藏子段,所以可以在得到top n条记录的时候同时抽出记录的rownum,然后再从这n条记录中抽取记录编号为m的记录,即使我们希望得到的结果。
从上面的分析可以很容易得到下面的sql语句。
select 列名1...列名n from
(
select rownum recno, 列名1...列名nfrom
(select 列名1...列名n from 表名 order by 列名1...列名n)
where rownum
order by rownum asc
)
where recno = m(m
同样以上表的数据为基础,那么得到以name的字母顺排序的第二个顾客的信息的sql语句应该这样写:
select id, name from
(
select rownum recno, id, name from
(select * from customer order by name)
where rownum
order by rownum asc )
where recno = 2
结果则为:
id name
05 fifth
3.抽出按某种方式排序的记录集中的第n条记录
在2的说明中,当m = n的时候,即为我们的标题讲的结果。实际上,2的做法在里面n>m的部分的数据是基本上不会用到的,我们仅仅是为了说明方便而采用。
如上所述,则sql语句应为:
select 列名1...列名n from
(
select rownum recno, 列名1...列名nfrom
(select 列名1...列名n from 表名 order by 列名1...列名n)
where rownum
order by rownum asc
)
where recno = n
那么,2中的例子的sql语句则为:
select id, name from
(
select rownum recno, id, name from
(select * from customer order by name)
where rownum
order by rownum asc
)
where recno = 2
结果为:
id name
05 fifth
4.抽出按某种方式排序的记录集中的第m条记录开始的x条记录
3里所讲得仅仅是抽取一条记录的情况,当我们需要抽取多条记录的时候,此时在2中的n的取值应该是在n >= (m + x - 1)这个范围内,当让最经济的取值就是取等好的时候了的时候了。当然最后的抽取条件也不是recno = n了,应该是recno between m and (m + x - 1)了,所以随之而来的sql语句则为:
select 列名1...列名n from
(
select rownum recno, 列名1...列名nfrom
(
select 列名1...列名n from 表名 order by 列名1...列名n)
where rownum = (m + x - 1))
order by rownum asc
)
where recno between m and (m + x - 1)
同样以上面的数据为例,则抽取name的字母顺的第2条记录开始的3条记录的sql语句为:
select id, name from
(
select rownum recno, id, name from
(select * from customer order by name)
where rownum
order by rownum asc
)
where recno between 2 and (2 + 3 - 1)
注意:
sql各子句的执行顺序:
1. from
2. where
3. group by
4. having
5. select
6. order by
