1.数据
--创建职员表
create table tbEmp
(
eID number primary key, --职员编号
eName varchar2(20) not null, --职员姓名
eSex varchar2(2) not null --职员性别
check(esex in (\'男\',\'女\')),
eAge number not null check(eage>=18), --职员年龄
eAddr varchar2(50) not null, --职员地址
eTel varchar2(30) not null, --职员电话
eEmail varchar2(30) null, --职员邮箱
eJoinTime date not null --入职时间
);
insert into tbemp
(eID,ename,esex,eage,eaddr,etel,eemail,ejointime)
values
(1,\'赵龙\',\'男\',25,\'湖南省长沙市伍家岭江南苑9栋203号\',\'0731-4230123\',\'zl@163.net\',\'5-10月-2005\');
insert into tbemp
(eID,ename,esex,eage,eaddr,etel,eemail,ejointime)
values
(2,\'李云\',\'女\',23,\'湖南省长沙市东风路东风新村21栋502号\',\'0731-4145268\',\'ly@163.net\',\'3-7月-2003\');
insert into tbemp
(eID,ename,esex,eage,eaddr,etel,eemail,ejointime)
values
(3,\'孙一成\',\'男\',24,\'湖南省株洲市601厂宿舍15栋308号\',\'0732-8342567\',\'syc@163.net\',\'2-11月-2002\');
insert into tbemp
(eID,ename,esex,eage,eaddr,etel,eemail,ejointime)
values
(4,\'林笑\',\'男\',27,\'湖南省郴洲市人民医院20栋301号\',\'0735-2245214\',\'lx@163.net\',\'5-1月-2006\');
insert into tbemp
(eID,ename,esex,eage,eaddr,etel,eemail,ejointime)
values
(5,\'卫晴\',\'女\',23,\'湖南省长沙市望月湖12栋403号\',\'0731-8325124\',\'wq@163.net\',\'5-3月-2007\');
commit;
2.习题
--1. 查询所有职员的所有信息
select * from tbemp;
--2. 查询所有职员的姓名,电话,地址
select ename,etel,eaddr from tbemp;
--3. 查询所有女职员的详细信息
select * from tbemp where esex = \'女\'
--4. 查询年龄在24到26岁之间的职员的姓名,性别
select ename,esex from tbemp where eage between 24 and 26
--5. 查询家住长沙的女职员的姓名,电话,地址
select ename,etel,eaddr from tbemp where esex = \'女\' and eaddr like \'%长沙市%\'
--6. 查询李云,孙一成,林笑的电话,地址
select ename,etel,eaddr from tbemp where ename in (\'李云\',\'孙一成\',\'林笑\');
--7. 查询郴洲和株洲的职员的姓名,性别,年龄
select ename,esex,eage from tbemp where eaddr like \'%郴洲%\' or eaddr like \'%株洲%\';
--8. 查询家住长沙,年龄在25到28岁之间的男职员的姓名
select ename from tbemp where eaddr like \'%长沙%\' and (eage between 25 and 28) and esex = \'男\';
--9. 查询邮件地址为空的职员
select * from tbemp where eemail is null;
--10.查询入职时间超过两年的员工 ----这里涉及日期的运算,当前时间-入职时间---------------------------
select * from tbemp where months_between(sysdate,ejointime)/12 > 2
--11.查出1月份入职的员工
select * from tbemp where Extract(month from ejointime) = 1;
--12.将所有email为163.net的邮箱改为126.com ----修改查询出来的结果,字符串替换函数-------------------
select * from tbemp where eemail like \'%163.net%\'
--13.找出年龄最小的两位长沙员工------------分页查询--------------------
--1.分页写法 三层嵌套,上两层是分页处理,最里面一层是解决rownum分页和order by在一起导致排序错误
select a1.* from
(select a2.*,rownum as rn from
(select * from tbemp order by eage) a2
where rownum <= 2) a1
where rn >= 1;
--14.查找员工信息,要求结果集表达方式为
--字段名:个人信息
--内容描述:\'员工1,赵龙,今年25岁,家住湖南省长沙市伍家岭江南苑9栋203号\'
select \'员工\'||eid||\',\'||ename||\',今年\'||eage||\'岁,家住\'||eaddr as 员工介绍 from tbemp;
--15.求所有员工的年龄总和
select sum(eage) as 年龄总和 from tbemp;
--16.分别求男,女员工年龄总和
select esex as 性别,sum(eage) as 年龄总和 from tbemp group by esex;
3.总结
1.基本SQL格式
2.日期的运算
a.日期运算:
后面时间-前面时间
日期相减默认结果是相差天数
months_between(后面时间-前面时间)
months_between默认返回结果是相差月数
b.取日期的值
Extract函数
Extract(year from sysdate)
3.分页查询
rownum:oracle特有关键字,用于分页
a.嵌套实现分页查询
分页查询采用两条查询嵌套,内部查询用来指定上界,且结果集返回rownum,外部查询指定下界
b.排序和分页联合使用的问题
rownum分页与order by在一起使用分页排序,会导致排序错误,解决方法:多嵌套一层select
select a1.* from
(select a2.*,rownum as rn from
(select * from tbemp order by eage) a2
where rownum <= 2) a1
where rn >= 1;