Oracle数据库的基本操作(二)

数据库查询

一、SQL语言

  • 数据定义语言(DDL):CREATE、ALTER、DROP、MERGE;
  • 数据查询语言(DQL):SELECT;
  • 数据操纵语言(DML):INSERT、UPDATE、DELETE;
  • 事务控制语言(TCL):COMMIT、SAVEPOINT、ROLLBACK;
  • 数据控制语言(DCL):GRANT、REVOKE、DENY;

二、Oracle中SQL语言

  • 关键字不区分大小写;字符串区分大小写;SQL语句以分号结束。

三、查询

1.查询全体学生的学号和姓名

select Sno,Sname from Student;

在这里插入图片描述

2.查询全体学生的学号和姓名,并将列名分别改为“学号”和“姓名”

select Sname as 姓名,Sno 学号 from Student;

在这里插入图片描述

3.查询全体学生的姓名及其出生年份

select Sname,TO_NUMBER(TO_CHAR(SYSDATE,'YYYY'))-Sage as 出生年份 from Student;

在这里插入图片描述
注:在SQL Server中的语句为

Select Sname;Year(GetDate())-Sage as 出生年份 from Student

四、伪列

(1)定义

  • 伪列就像表中的列一样,但是在表中并不存储。可查询表中伪列的值,但不能插入、修改和删除伪列的值。

(2)伪列ROWID

  • 表中的每一行在数据文件中都有一个物理地址,ROWID伪列返回该行的物理地址;
  • 使用ROWID可以快速的定位表中的某一行;
  • Oracle会自动为每一个表建立一个名称为ROWID的字段;
  • ROWID的字段是隐含的,即查看表的信息时看不到ROWID字段;如:desc Student
  • ROWID的扩展格式由18个字符组成;如:select rowid, Sno, Sname from Student;
  • 前6个字符:数据库对象编号;
  • 第7到9个字符:表空间中的数据文件的编号;
  • 第10到15个字符:存储记录的数据块的编号;
  • 第16到18个字符:标识同一个数据块中不同的记录的行编号。
1.使用伪列ROWID删除表中的重复的元组
  • 创建表

    create table SC1 as select * from SC;

  • 查看SC1表

    select * from SC1;

在这里插入图片描述

  • 向SC1表中插入重复数据

    insert into SC1 values('2017001','1',92);
    insert into SC1 values('2017002','3',50);
    insert into SC1 values('2017001','1',80);
    
  • 查看SC1表

    select rowid,Sno,Cno,Grade from SC1;
    

在这里插入图片描述

  • 利用rowid删除指定行

    delete from SC1 where rowid = 'AAASSVAAEAAAAJbAAD';
    

在这里插入图片描述

  • 使用rowid删除重复元组

    delete from SC1 where rowid not in (select min(rowid) from SC1 group by Sno,Cno,Grade);
    

在这里插入图片描述

(3)伪列ROWNUM

  • 在查询的结果集中,ROWNUM为结果集中每一行标识一个行号,以此类推;
  • 通过ROWNUM伪列可以限制查询结果集中返回的行数;
  • ROWID是插入记录时生成的,ROWNUM是查询数据时生成的;
  • ROWID标识的是行的物理地址,ROWNUM标识的是查询结果中的行的次序。
1.查询Student表中前3名学生的学号、姓名和专业。
select rownum Sno,Sname,Sdept 
from Student
where rownum <= 3;

在这里插入图片描述

2. 查询Student表中第1名学生的学号、姓名和专业。
select rownum Sno,Sname,Sdept 
from Student
where rownum = 1;

在这里插入图片描述

3.查询选课成绩最高的前3名学生的学号、课程号和成绩
  • 错误代码

    select * from SC
    where rownum <= 3
    order by Grade desc;
    

在这里插入图片描述

  • 正确代码

    select rownum,A.* from (select * from SC order by Grade desc) A
    where rownum <= 3;
    

在这里插入图片描述

  • 可以看出错误代码虽然可以运行,但是结果错误,因为错误代码选出的结果是先按ROWNUM选出前3名学生的信息,再按这三名学生的成绩进行排序。

五、分页查询

(1)第一种语法

select *
from (select A.*,rownum rn from (select * from 表名)A where rownum <= 到第几行)
where rn >= 从第几行;

(2)第二种语法

select * 
from (select A.*,rownum rn from (select * from 表名) A)
where rn between 从第几行 and 到第几行;

1.查询Student表从第2行到第4行的记录

  • 第一种

    select *
    from (select A.*,rownum rn from (select * from Student)A where rownum <= 4)
    where rn >= 2;
    

在这里插入图片描述

  • 第二种

    select * 
    from (select A.*,rownum rn from (select * from Student) A)
    where rn between 2 and 4;
    

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值