SQL语句练习

  • 显示员工的姓名和雇佣时间,要求中文时间格式,即“2012 年 9 月 26 日”这样的形式(要求不出现 09 月,把 0 去掉)
1
select to_char(HIREDATE,'yyyy"年"fmmm"月"dd"日"'),ENAME from emp;
image-20220304142332474
  • 显示员工的姓名和总收入,总收入以美元符号$开头,带小数点后两位
1
select ENAME,to_char(NVL(COMM,0)+SAL,'$99999.99') from emp;
image-20220304142612112
  • 假设每位员工在进入公司满 10 年后的第一个 4 月 1 日,会给他发放“优质服务奖”,请列出每位员工的获奖时间
1
select to_char(case when extract(month   from (ADD_MONTHS(HIREDATE,120))) < 4 then ADD_MONTHS(trunc(ADD_MONTHS(HIREDATE,120),'yyyy'),3) else ADD_MONTHS(trunc(ADD_MONTHS(HIREDATE,120),'yyyy'),15) end,'yyyy-fmmm-dd') ,ename from emp;
image-20220304165000952
  • 列出员工号和姓名,所属部门名称,要求员工号用中文大写,例如“1234”输出为”壹贰叁肆 "

​ 构造函数:

1
select translate(rownum,'0123456789','零壹贰叁肆伍陆柒捌玖') ID,ENAME,DNAME from emp,dept where dept.deptno=emp.deptno;
image-20220304155948380

问题解答

  • To_date如果没有指定时分秒,缺省的时分秒是?
1
select to_char(HIREDATE,'yyyy-fmmm-dd hh:mi:ss') from emp;
image-20220304152119031

​ 可以观察到,缺失默认值为12:00:00

  • 如果指定的年份是45,那产生1945年还是2045年?
1
SELECT TO_CHAR(TO_DATE('45-01-01','YY-MM-DD'),'YYYY-MM-DD') FROM dual;
image-20220304152704096
  • 中文字符有多长?
1
select length('李') from dual;
image-20220304152824042

​ 中文字符长度为1,中文(UTF-8)占3个字节。

1
select lengthb('李') from dual;
image-20220304153454649
  • 中英混合的字符串,substr会乱套吗?
1
2
3
select substr('124abd数据库',1,1)from dual;
select substr('124abd数据库',5,1)from dual;
select substr('124abd数据库',7,1)from dual;
image-20220304153202957
  • Varchar2(10)的字段,可以放5个中文字符还是10个
1
2
CREATE TABLE simuhw3(name varchar2(10));
insert into simuhw3(name) values ('数据库真难啊')
image-20220304153912929
image-20220304154531354

​ 因为采用了UTF-8编码,只能容纳3个中文字符,若采用GBK编码,可以容纳5个。

数据泵

利用 Oracle 的“数据泵”功能 expdp/impdp 将上周创建的 500 万行的表转移到另外一台服务器上。

先对原主机使用sys用户进行登录sqlplus,输入:

1
Select * from dba_directories; 

查看可以访问目录对象,并创建scott可以访问对象

1
2
CREATE OR REPLACE DIRECTORY test_dir AS '/u01/app/oracle/oradata/';
GRANT READ, WRITE ON DIRECTORY test_dir TO scott;
image-20220304135034529
1
expdp scott/tiger@Xe tables=simuhw2 directory=TEST_DIR dumpfile=simuhw2.dmp logfile=expdpsimuhw2.log
image-20220304135045366

​ 可以看到,在/u01/app/oracle/oradata/目录中,已经存储了导出的文件

image-20220304135158962

​ 将其复制出来,拷贝到另一台机子

​ 同理,在拷贝对象机子同样执行上述操作

1
2
CREATE OR REPLACE DIRECTORY test_dir AS '/u01/app/oracle/oradata/';
GRANT READ, WRITE ON DIRECTORY test_dir TO scott;

​ 执行

1
impdp scott/tiger@Xe tables=simuhw2 directory=TEST_DIR dumpfile=simuhw2.dmp logfile=impdpsimuhw2.log
image-20220304140341011

检查是否成功导入

1
2
conn scott/tiger
select count(*) from simuhw2;
image-20220304140447712

​ 成功导入

参考

  • https://oracle-base.com/articles/10g/oracle-data-pump-10g