ORACLE百例试炼一

Oracle系列《一》:简单SQL与单行函数

【1】EMP表内容查询

SQL> SELECT * FROM emp;

出错,原因是没有找到该表,因为该表时SCOTT用户的表,所以查询时应该加上scott.emp就可以了

【2】显示当前用户

SQL> show user

【3】查看当前用户的所有表

SQL> SELECT * FROM tab;

【4】若想重复执行上一条SQL语句,则在sqlplus命令行下输入"/"即可

【5】查询一张表的结构,例如dept表

SQL> desc dept

【6】在雇员表中查询雇员的编号、姓名、工作

SQL> SELECT empno,ename,job FROM emp;

【7】可以为列名取别名,在Linux下Oracle如果英文别名不加上双引号则会变成大写

SQL> SELECT empno 编号,ename 姓名,job 工作 FROM emp;

【8】查询所有的工作

SQL> SELECT DISTINCT job FROM emp;  工作可能会重复,加上DISTINCT关键字

【9】若要求按照以下的格式进行结果输出,如

NO:7469,Name:SMITH,Job:CLERK

SQL> SELECT ‘NO:‘||empno||‘,Name:‘||ename||‘,Job:‘||job FROM emp;

【10】要求列出每个雇员的姓名及年薪

SQL> SELECT ename,sal*12 income FROM emp; 这里年薪最好用别名进行标识,可以一眼就能明白

【11】查看每月可以得到奖金的雇员信息

SQL> SELECT * FROM emp WHERE comm is NOT NULL;

【12】要求基本工资大于1500,同时可以领取奖金的雇员信息

SQL> SELECT * FROM emp WHERE sal>1500 AND comm is NOT NULL;

【13】查询基本工资不大于1500,同时不可以领取奖金的雇员信息 -------------如果是或的是关系,则使用 OR

SQL> SELECT * FROM emp WHERE NOT (sal>1500 OR comm is NOT NULL);

SQL>SELECT * FROM emp WHEREM sal<1500 and comm is null;

【14】查询在1981年雇佣的全部雇员信息

SQL>select * from emp where to_char(hiredate,‘yyyy‘)=1981;

【15】Oracle对大小敏感,所以查询时名字要区分大小写

【16】要求查询出雇员编号不是 7369、7499的雇员信息

SQL> SELECT * FROM emp WHERE empno NOT IN(7369,7499);

SQL> select * from emp where empno   !=  all(7369,7499)

【17】SQL中LIKE语句要注意通配符 % 和 _

SQL> SELECT * FROM emp WHERE hiredate LIKE ‘%81%‘;

【18】查看雇员编号不是7369的雇员信息,使用<>或!=

SQL> SELECT * FROM emp WHERE empno<>7369;

【19】要求对雇员的工资由低到高进行排序,升序为默认(ASC),降序(DESC)

SQL> SELECT * FROM emp ORDER BY sal;

【20】查看出部门号为10的雇员信息,查询的信息按照工资从高到低,若工资相等则按雇用日期从早到晚排列

SQL> SELECT * FROM emp WHERE deptno=10 ORDER BY sal DESC,hiredate ASC;

数据库系统中,每个数据库之间区别最大的就是在函数的支持上,单行函数是最简单的函数,单行函数分为

1、字符函数:接受字符输入并且返回字符或数值

2、数值函数:接受数值输入并返回数值

3、日期函数:对日期型数据进行操作

4、转换函数:将一种数据类型转换为另一种数据类型

5、通用函数:NVL、DECODE 函数



字符函数:

【1】大小写转换 UPPER 和 LOWER

SQL> SELECT UPPER(‘smith‘) FROM dual;

【2】将雇员姓名变为开头字母大写,INITCAP

SQL> SELECT INITCAP(ename) FROM emp;

字符函数中有连接函数CONCAT,但不如 || 好用,还有字符串处理的一些函数

字符串截取:substr()

字符串长度:length()

内容替换:replace()

查找字符:instr(ename,‘A‘)=1(第一个字母为A的名字)

SQL> SELECT  substr(‘hello‘,1,3),length(‘hello‘),replace(‘hello‘,‘l‘,‘x‘) FROM dual;

这里注意的是Oracle中字符串截取从0和从1开始都是一样的,谨防面试提问

【3】要求显示所有雇员的姓名及姓名的后3个字符

SQL> SELECT ename,SUBSTR(ename,LENGTH(ename)-2) FROM emp;

以上操作显得较为麻烦,substr()函数是可以倒着截取

SQL> SELECT ename,SUBSTR(ename,-3,3) FROM emp;



数值函数:

1、四舍五入:ROUND()

2、截断小数位:TRUNC()

3、取余(取模):MOD

【1】保留1位小数,(如果是-2则对整数进行四舍五入,变为800了

SQL> SELECT ROUND(783.56,1) FROM dual;

结果是-------783.6

【2】截断小数位,

SQL> SELECT ROUND(783.56) FROM dual;

结果是-------783

【3】使用MOD()函数进行取余操作

SQL> SELECT MOD(10,3) FROM dual;

结果是--------1



日期函数:

1、日期 - 数字 = 日期

2、日期 + 数字 = 日期

3、日期 - 日期 = 数字(天数)

【1】求出当前日期

SQL> SELECT SYSDATE FROM dual;

Oracle提供了以下的日期函数支持:

1.MONTHS_BETWEEN():求出给定日期范围的月数

select months_between(to_date(‘2015-10‘,‘yyyy-mm‘),to_date(‘1997-4‘,‘yyyy-mm‘) )from dual

2.ADD_MONTHS():在指定日期上加上指定的月数

select add_months(to_date(‘2015-10-1‘,‘yyyy-mm-dd‘),1) from dual

3.求出之后的日期 NEXT_DAY():下一个的今天的日期

select next_day(sysdate,‘星期三‘) from dual

4.LAST_DAY():求出给定日期的最后一天日期

select last_day(to_date(‘2015-10‘,‘yyyy-mm‘))from dual

【2】求出从雇用日期到今天所有雇员的雇员编号、姓名和月数

SQL> SELECT empno,ename,ROUND(MONTHS_BETWEEN(SYSDATE,hiredate)) FROM emp;



转换函数:

1、TO_CHAR():  将日期或数值转换成字符串

2、TO_NUMBER():将字符串转换成数字(字符串里是数字)

3、TO_DATE():  将字符串转换成日期

【1】将年月日进行分开,要指定拆分的通配符,yyyy-mm-dd

SQL> SELECT empno,ename,TO_CHAR(hiredate,‘yyyy‘) datetime FROM emp

【2】将薪水的数字进行格式化,‘$99,999‘表示美元,‘L99,999‘表示当地货币

SQL> SELECT empno,ename,TO_CHAR(sal,‘L99,999) salary FROM emp;

【3】TO_NUMBER()验证

SQL> SELECT TO_NUMBER(‘123‘)+TO_NUMBER(‘123‘) FROM DUAL;

【4】TO_DATE

SQL> SELECT TO_DATE(‘2011-7-11‘,‘yyyy-mm-dd‘) FROM DUAL;



通用函数:

【1】求出每个雇员的年薪(应算上奖金)

SQL> SELECT empno,ename,(sal+comm)*12 FROM emp;

由于comm中有NULL,NULL值计算后还是NULL,正确如下:

SQL> SELECT empno,ename,NVL(comm,0),(sal+NVL(comm,0))*12 income FROM emp;

NVL可以理解为将NULL值转换为具体的内容,这里是0

【2】DECODE()函数,该函数类似于 IF ... ELSEIF...ELSE 语法如下:

DECODE(字段,选择1,结果1[,选择2,结果2,...,默认])

验证DECODE()函数

SQL>select  empno,ename,hiredate,DECODE

(job,‘CLERK‘,‘业务员‘,‘SALESMAN‘,‘销售人员‘,‘MANAGER‘,‘经理‘,‘ANALYST‘,‘分析员‘,‘PRESIDENT‘,‘总裁‘) 职位 FROM emp;



SQL简单语句练习:

【1】找出佣金高于薪金的60%的员工

SQL> SELECT * FROM emp WHERE comm>sal*0.6

【2】找出部门10中所有经理(MANAGER)和部门20中所有办事员(CLERK)的详细资料

SQL> SELECT * FROM emp

WHERE (deptno=10 AND job=‘MANAGER‘) OR (deptno=20 AND job=‘CLERK‘);

【3】找出既不是经理又不是办事员但其薪金大于或等于2000的所有员工的资料

SQL> SELECT * FROM emp

WHERE job NOT IN(‘MANAGER‘,‘CLERK‘) AND sal >= 2000;

【4】找出有奖金的员工的不同工作

SQL> SELECT DISTINCT job FROM emp WHERE comm IS NOT NULL;

【5】找出各月倒数第3天受雇的所有员工

SQL> SELECT * FROM emp

WHERE LAST_DAY(hiredate)-2=hiredate;

【6】找出早于30年前受雇的员工

SQL> SELECT * FROM emp

WHERE MONTHS_BETWEEN(sysdate,hiredate)/12 > 30;

【7】显示刚好为5个字符的员工的姓名

SQL> SELECT ename FROM emp WHERE length(ename)=5;

【8】显示不带有"R"的员工的姓名

SQL> SELECT ename FROM emp WHERE ename NOT LIKE ‘%R%‘;

【9】显示员工的姓名和受雇日期,将最老的员工排在最前

SQL> SELECT * FROM emp GROUP BY hiredate;

【10】显示所有员工的姓名,加入公司的年份和月份,按受雇日期所在月排序,若月份相同则按年份排序

select   ename,  to_char(hiredate,‘yyyy‘)  年份   ,  to_char(hiredate,‘mm‘)  月份 from emp  order by 月份,年份

【11】找出在2月受聘的员工

SQL> SELECT * FROM emp

WHERE TO_CHAR(hiredate,‘mm‘)=2;

【12】以年月日方式显示所有员工服务年限

SQL> SELECT ename,

TRUNC(MONTHS_BETWEEN(sysdate,hiredate)/12)year,

TRUNC(MOD(MONTHS_BETWEEN(sysdate,hiredate),12)) month,

TRUNC(MOD(sysdate-hiredate,30)) day

FROM emp;

时间: 2024-10-25 09:25:22

ORACLE百例试炼一的相关文章

ORACLE百例试炼三

Oracle系列<三>:表.(约束)索引.序列.视图的使用 一.创建.删除.修改表 建立表:Oracle中主要数据类型 VARCHAR2.NUMBER.DATE.CLOB(大量文本).BLOB(图片.音乐.电影) 如果只能复制一张表的结构,但不复制内容,则加上一个不可能成立的条件即可,例如 SQL> CREATE TABLE tmp AS (SELECT * FROM emp WHERE 1>2) 例如创建表Person如下: CREATE TABLE person( pid  V

ORACLE百例试炼四

Oracle系列<四>:数据库的设计分析 一.序列的使用 在很多数据库系统中都存在一个自动增长的列,如果在Oracle中要完成自动增长的功能,只能依靠序列完成 1.  要有创建序列的权限 create sequence 或 create any sequence 2.  创建序列的语法 CREATE SEQUENCE sequence  //创建序列名称 [INCREMENT BY n]  //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是1 [START WITH n]   

ORACLE百例试炼二

Oracle系列<二>:多表复杂查询和事务处理 多表查询应该注意去除笛卡尔积,一般多个表时会为表起个别名 [1]要求查询雇员的编号.姓名.部门编号.部门名称及部门位置 SQL> SELECT   e.empno,e.ename,d.deptno,d.dname,d.loc FROM emp e,dept d WHERE e.deptno = d.deptno; [2]要求查询每个雇员的姓名.工作.雇员的直接上级领导的姓名(表自关联) SQL> SELECT e.ename,e.jo

ORACLE百例试炼五

Oracle系列<五>:SQL综合练习 [1]列出最低薪金大于1500的各种工作及从事此工作的全部雇员人数 select  job,count(*) from emp group by job having min(sal)>1500 [2]列出在部门'SALES'工作的员工姓名 <1>先查询SALES的部门编号 SQL> SELECT deptno FROM dept WHERE dname='SALES'; <2>SELECT ename FROM em

C语言程序设计百例之第一例

题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. 2.程序源代码: #include <stdio.h> int main(void) { int nFirst, nSecond, nThird; int threeNum; int countNum = 0; for(nFirst = 1; nFirst < 5; nFirst++) for(nSe

C语言程序设计百例之第二例

题目:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高 于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提 成7.5%:20万到40万之间时,高于20万元的部分,可提成5%:40万到60万之间时高于 40万元的部分,可提成3%:60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数? 1.程序分析:请利用数轴来分界,定位.注意定义时需

C程序设计百例之第四例

题目:输入某年某月某日,判断这一天是这一年的第几天? 1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天. 2.程序源代码: #include <stdio.h> int main(void){  int day, month, year, countDay, leap; printf("\nPlease input year, month and day\n"); scanf("%

sql语句百例之Oracle

1.解锁用户 请输入用户名:sys 输入口令:sys as sysdba alter user scott accout unlock; 用户已更改. SQL> commit; SQL> conn scott/tiger 更改scott口令 新口令:tiger 重新键入新口令:tiger 增加权限 用sys登陆完 grant create table, create view to scott; conn scott/root 2.查看表结构 desc tbname 3.从表中查询数据 sel

sqlldr导入数据(以PostgreSql&gt;&gt;&gt;Oracle为例)

1.在目标数据库中创建表 1.1点击源表,复制创建语句 1.2 修改数据类型以匹配目标数据库,如: 字符串类型:character varying(20)>>>varchar2(20) 数字类型:numeric(19,2)>>>number(19,2) 时间戳:timestamp without time zone>>>timestamp或date 1.3 其他 一般字符串类型需要加长长度,不然有时会插不进去数据,不知为什么: P和O数据库的not n