ETL复习--2020年3月24日--数据类型、数据增删改

 

--2020年3月24日 AM

 

1、DDL 数据定义语言
创建对象

 

1.1
Oracle数据类型主要有:字符串、数值、日期

 

mssql:float、medical、int(bight,int,smallint,tinyint)

 

char(18):固定字长,例如性别、身份证号

 

varchar(10):可变字长,按实际存储长度计算字长,可存空字符串

 

varchar2(10):可变字长,不可存储空字符串,Oracle中常用

 

SQL中每个汉字占2-3个字节,英文、数值占1个字节,空格占空间,但不占字节

 

varchar2 和 nvarchar2 的区别:
varchar2 最多存放4000字节的数据,最多可以可以存入4000个字母,或最多存入2000个汉字
(数据库字符集编码是GBK时,varchar2最多能存放2000个汉字,数据库字符集编码是UTF-8时,那就最多只能存放1333个汉字)
nvarchar2(size),size最大值为2000,单位是字符,而且不管是汉字还是字母,每个字符的长度都是2个字节。
所以nvarchar2类型的数据最多能存放2000个汉字,也最多只能存放2000个字母。并且NVARCHAR2不受数据库字符集的影响。

 

1.2
字符串转换日期

 

select to_date('2020-02-02','yyyy-mm-dd') from dual;
select to_date('2020-02-02152526','yyyy-mm-ddhh24miss') from dual;

 

sqlsever对于时间分类较多:date smalldate time smalltime timestamp

 

day 也可表示星期
select to_char(hiredate,'day') from emp;

 

1.3 大对象类型

lob:用于存储大对象类型。例如文本信息长度超过4000、二进制文件等,
最大容量为4GB,
lob 分类:
clob:用于存储大型文本数据。(例如:备注信息);
blob:用于存储二进制数据。(例如:图片文件);
bfile:作为独立文件存在的二进制数据。

 

1.4
null:字符串与 is null、is not null 做判断

 

Oracle中没有布尔型,可利用字符串或数值 (1/0) 进行替代表示

 

1.5
建表

 

create table t_1 (
id number,
numid number,
name varchar2(30),
"sex" char(2),
--sqlsever中使用 [ ] 进行强制转换
fdate date
);

 

1.6
约束
1) 主键约束 (primary key [PK]) 不能重复,不能为 null。
联合主键 多个字段一同控制,不完全相同即不触发联合主键约束
2) 外键约束 (foreign key [FK]) 可以为 null。
3) 唯一约束 (unique [UK]) 不能重复的,但是可以为null。
4) 非空约束 (not null ) 只能在列级定义。
5) 检查约束 (check [CK]) (condition) ) 。

 

create table t_1 (
id number primary key,
numid number not null,
name varchar2(30) unique,
sex char(2) check (sex in ('男','女')),
fdate date
);

 

insert into t_1 values (1,1,1,'男',null);

 

1.7
修改表结构

 

alter table t_1 modify name not null;

 

drop table t_1;

 

练习题:
1.创建student表,要求列与emp表相同,EMPNO主键约束,ENAME非空约束,SAL检查约束大于零。

 

create table student (
EMPNO number primary key,
ENAME varchar2(30) not null,
JOB varchar2(30),
MGR varchar2(30),
HIREDATE date,
SAL number check (sal>0),
COMM number,
DEPTNO number
);

 

2.修改deptno列属性为字符串类型。

 

alter table student modify deptno varchar2(10);

 

3.删除emp表。

 

drop table emp;

 

--PM

 

2、DML 数据操作语言
行级处理

 

create table emp1 as select * from emp;

 

2.1 insert

 

insert into emp1 (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7799, mike, uiou, 3211, null, 12320, null, 80);

 

insert into emp1 (EMPNO, ENAME)
values (7799, mike);

 

insert into emp1
values (7799, mike, uiou, 3211, null, 12320, null, 80);

 

insert into emp1 select * from emp;--插入结果集,Oracle中如此写

 

2.2 update

 

update emp1 set ename = 'xxx' where empno=7369;
--update基于select,select无结果,update也无法执行

 

update emp1 set ename = 'xxx',comm=950 where deptno=20;
--一条update语句可对一条数据的多个字段同时更新

 

2.3 delete

 

delete from emp1;--有事务控制,可回滚找回

 

delete from emp1 where comm is null;

 

truncate table emp1;--较delete更为直接,无法回滚找回,但耗时有优势

 

练习题:
1.列出至少有一个员工的部门编号和员工人数。

 

select deptno,count(ename) from emp group by deptno having count(ename)>=1;

 

2.列出最低薪金大于1500的所有工作。

 

select job from emp where sal>1500;

 

5.列出在每个部门工作的员工数量、平均工资。

 

select deptno,count(ename),avg(sal) from emp group by deptno;

 

6.列出各个部门的MANAGER(经理)的最低薪金。

 

select deptno,min(sal) from emp where job='MANAGER' group by deptno;

 

7.列出所有员工的年工资,按年薪从低到高排序。

 

select ename,sal*12 from emp order by 2;

 

8.查询出emp表中职位是经理(MANAGER),部门平均薪水在2000以上的部门编号和员工人数。

 

select deptno,count(ename) from emp where job='MANAGER' group by deptno having avg(sal)>2000;

 

9.查询部门总工资在4000以上的部门最高和最低薪水。

 

select deptno,max(sal),min(sal),sum(sal) from emp group by deptno having sum(sal)>4000;

 

10.查询部门20的员工,每个月的工资总和及平均工资。

 

select ename,sum(sal),avg(sal) from emp where deptno=20 group by ename;

 

11.查询每个部门每个岗位的工资总和。

 

select deptno,job,sum(sal) from emp group by deptno,job;

 

12.查询部门人数大于2的部门编号,最低工资、最高工资,部门人数。

 

select deptno,min(sal),max(sal),count(ename) from emp group by deptno having count(ename)>2

 

13.查询部门平均工资大于2000,且人数大于2的部门编号,部门人数,部门平均工资,并按照部门人数升序排序。

 

select deptno,count(ename),avg(sal) from emp group by deptno having count(ename)>2 and avg(sal)>2000 order by count(ename);

 

14.查询部门平均工资在2500元以上的部门编号及平均工资。

 

select deptno,avg(sal) from emp group by deptno having avg(sal)>2500;

 

15.查询员工岗位中平均工资在2500元以上的岗位及平均工资,并按平均工资降序排序。

 

select job,avg(sal) from emp group by job having avg(sal)>2500 order by avg(sal) desc;

 

16.查询岗位不为SALESMAN,工资和大于等于2500的岗位及 每种岗位的工资和。

 

select job,sum(sal) from emp where job!='SALESMAN' group by job having sum(sal)>=2500;

 

17.写一个查询,显示每个部门最高工资和最低工资的差额。

 

select max(sal)-min(sal) from emp group by deptno;

 

18.求出每个部门中相同职位的员工人数 和平均工资。

 

select deptno,count(job),avg(sal) from emp group by deptno,job having count(job)>1;

 

posted @ 2020-06-04 23:07  George_King  阅读(224)  评论(0编辑  收藏  举报