创建数据库表
创建 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