创建数据库表

创建 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));

​学习视频​