Loading

Oracle基本使用

创建数据库表

创建 scott 数据库中的 dept 表
create table dept(
    -- 部门编号
    deptno      int unsigned auto_increment primary key,
    -- 部门名称
    dname       varchar(15)     ,
    -- 部门所在位置
    loc         varchar(50)    
)engine = InnoDB;

创建 scott 数据库中的 emp 表
 create table emp(
    -- 雇员编号
    empno           int unsigned auto_increment primary key,
    -- 雇员姓名
    ename           varchar(15)     ,
    -- 雇员职位
    job             varchar(10)     ,
    -- 雇员对应的领导的编号
    mgr             int unsigned    ,
    -- 雇员的雇佣日期
    hiredate        date            ,
    -- 雇员的基本工资
    sal             decimal(7,2)    ,
    -- 奖金
    comm            decimal(7,2)    ,
    -- 所在部门
    deptno          int unsigned    ,
    foreign key(deptno) references dept(deptno)
)engine = innodb;

创建数据库 scott 中的 salgrade 表,工资等级表
create table salgrade(
    -- 工资等级
    grade       int unsigned    ,
    -- 此等级的最低工资
    losal       int unsigned    ,
    -- 此等级的最高工资
    hisal       int unsigned   
)engine=innodb;


创建数据库 scott 的 bonus 表,工资表
create table bonus(
    -- 雇员姓名
    ename       varchar(10),
    -- 雇员职位
    job         varchar(9),
    -- 雇员工资
    sal         decimal(7,2),
    -- 雇员资金
    comm        decimal(7,2)
)engine=innodb;


dept表中的数据
INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK'); 
INSERT INTO dept VALUES (20,'RESEARCH','DALLAS'); 
INSERT INTO dept VALUES (30,'SALES','CHICAGO'); 
INSERT INTO dept VALUES (40,'OPERATIONS','BOSTON'); 


salgrade表中的数据
INSERT INTO salgrade VALUES (1,700,1200); 
INSERT INTO salgrade VALUES (2,1201,1400); 
INSERT INTO salgrade VALUES (3,1401,2000); 
INSERT INTO salgrade VALUES (4,2001,3000); 
INSERT INTO salgrade VALUES (5,3001,9999);


emp表中的数据
INSERT INTO emp VALUES    (7369,'SMITH','CLERK',7902,to_date('1980-12-17','yyyy-mm-dd'),800,NULL,20); 
INSERT INTO emp VALUES    (7499,'ALLEN','SALESMAN',7698,to_date('1981-2-20','yyyy-mm-dd'),1600,300,30);
INSERT INTO emp VALUES    (7521,'WARD','SALESMAN',7698,to_date('1981-2-22','yyyy-mm-dd'),1250,500,30);
INSERT INTO emp VALUES    (7566,'JONES','MANAGER',7839,to_date('1981-4-2','yyyy-mm-dd'),2975,NULL,20);
INSERT INTO emp VALUES    (7654,'MARTIN','SALESMAN',7698,to_date('1981-9-28','yyyy-mm-dd'),1250,1400,30);
INSERT INTO emp VALUES    (7698,'BLAKE','MANAGER',7839,to_date('1981-5-1','yyyy-mm-dd'),2850,NULL,30);
INSERT INTO emp VALUES    (7782,'CLARK','MANAGER',7839,to_date('1981-6-9','yyyy-mm-dd'),2450,NULL,10);
INSERT INTO emp VALUES    (7788,'SCOTT','ANALYST',7566,to_date('87-7-13','yyyy-mm-dd'),3000,NULL,20);
INSERT INTO emp VALUES    (7839,'KING','PRESIDENT',NULL,to_date('1981-11-17','yyyy-mm-dd'),5000,NULL,10);
INSERT INTO emp VALUES    (7844,'TURNER','SALESMAN',7698,to_date('1981-9-8','yyyy-mm-dd'),1500,0,30);
INSERT INTO emp VALUES    (7876,'ADAMS','CLERK',7788,to_date('87-7-13','yyyy-mm-dd'),1100,NULL,20);
INSERT INTO emp VALUES    (7900,'JAMES','CLERK',7698,to_date('1981-12-3','yyyy-mm-dd'),950,NULL,30);
INSERT INTO emp VALUES    (7902,'FORD','ANALYST',7566,to_date('1981-12-3','yyyy-mm-dd'),3000,NULL,20);
INSERT INTO emp VALUES    (7934,'MILLER','CLERK',7782,to_date('1982-1-23','yyyy-mm-dd'),1300,NULL,10);

伪列

简介:它不属于任何一张表,但是会被所有的表共享

rownum:逻辑序列 1 2 3 4 5 6 7 8

rowid:物理序列(18)真实的存放位置

例子

select rowid,rownum,e.* from emp e where mgr>7800;
相同 rownum:不同SQL语句在执行时,rownum的值不一致
不同 rownum:在相同SQL语句在执行时,rownum的值不变

查询工资最高的前3条员工信息

有问题的sql语句:

select ename,sal 
from emp 
where rownum <=3
order by sal desc

使用子查询

select rownum ,empno,ename,mgr,sal,deptno from  -- 然后按伪列标记查出
(select * from emp order by sal desc) -- 先查出emp的倒序出来
where rownum <=3 -- 把伪列的前三个取出

创建一张表

create table mystudent(
    stuno number,
    stuname varchar2(10),
    stuage number
);
insert into mystudent values(1,'ls',12);
insert into mystudent values(2,'2s',12);
insert into mystudent values(3,'ws',12);
insert into mystudent values(4,'ss',12);

-- 使用伪列查看
 select rownum,s.* from mystudent s;
-- 使用伪列删除
 delete  from mystudent where rowid='AAAWl2AABAAAbXBAAD'

如何删除重复的数据

rowid:根据插入的顺序 一次递增

rownum:逻辑伪列

rowid: 物理伪列

思路

根据编号分组(将重复的数据 放到一组),然后在每组中只保留一个

-- 先查询
select  .... from mystudent 
group by stuno
delete from mystudent 
where rowid 
not in(
select min(rowid)  -- 查询最大的
from mystudent 
group by stuno
)

查看

SQL> select * from mystudent;

 STUNO STUNAME        STUAGE
     1 ls                 12
     2 ls                 12
     3 xs                 22
     1 ls                 12
     2 ls                 12
     3 ws                 32

已选择6行。

SQL> select * from mystudent;

 STUNO STUNAME        STUAGE
     1 ls                 12
     2 ls                 12
     3 xs                 22
  • 对查询出的结果集去重:distinct
-- 把查询出来的null值,变为0
select ename,comm,nvl(comm,0),nvl2(comm,comm,0) from  emp 

修改字段长度

alter table 表名 modify (字段名 长度);

alter table user modify (password varchar2(32));

学习视频

posted @ 2020-07-08 11:17  Rzk  阅读(111)  评论(0编辑  收藏  举报