oracle基础知识
2012-04-01 13:34
281 查看
第一章:基础知识
sys : 超级用户,必须以sysdba身份登陆 system : 必须以normal身份登陆. scott tiger 练习:配置一个服务命名,连接邻近同学的数据库;
第二章 简单的select语句 1. 分类 1> DQL (DATA Quary LANGUAGE) - SELECT 5> TCL HR HR 2. SELECT 语句 练习:查询emp表中所有列的信息 SELECT * FROM emp; 练习:查询emp表员工的名字和工资 SELECT ename, sal FROM emp; 3. 表达式 1> 算术表达式 练习:查询emp表中员工的姓名和年薪 SELECT ename, sal * 12 FROM emp; 2> 字符串连接表达式(用 || 进行连接) -- 注意:在Oracle中字符串常量要写在单引号中 -- 在字符串中,用两个单引号来显示单引号(即用单引号来转义单引号) 练习:查询emp表中员工的名字和工资,-- XXX's salary is XXX SELECT ename || '''s salary is ' || sal FROM emp; 4. NULL -- null在Oracle SQL中是一个比较特殊的值,它既不代表空字符串,也不代表0 -- 任何数据类型都支持null -- 1〉如果null在算术表达式中出现,其结果一定是null; -- 2〉如果null在字符串连接表达式中出现,当字符串连接一个null的话,其结果还是原来的字符串; 练习:查询emp表中员工的姓名和年薪(考虑comm列) -- 空值转化的方法,以后再说 SELECT ename, (sal + comm) * 12 FROM emp; 练习:查询emp表中员工的名字和工资,-- XXX's salary is XXX SELECT ename || '''s salary is ' || sal || null FROM emp; 5. 列别名 -- 列别名中不能包含空格等特殊字符,如果包含,别名一定要写在双引号中 SELECT ename, (sal + comm) * 12 AS "Annual salary" FROM emp; 6. DISTINCT -- 重复记录只显示一次 练习:查询emp表中员工在哪些部门中工作,列出部门编号 SELECT DISTINCT deptno FROM emp;
第三章 限制数据和对数据排序 练习:查询emp表中10部门员工姓名和工资 SELECT ename, sal FROM emp WHERE deptno = 10; 1. 比较运算符 = 等于 >, <, >=, <=, <> 不等于 -- 比较运算符两端类型要一致 练习:查询emp表中工资高于3000的员工的名字和工资 SELECT ename, sal FROM emp WHERE sal > 3000; -- 关键字和对象(表,或列名等)的名字不区分大小写 -- 表中存储的字符型的数据是严格区分大小写的 -- 如果不知道表中数据如何存储,怎样进行字符串的匹配? 以后再说 练习:查询emp表中姓名是scott的员工的信息 SELECT * FROM emp WHERE ename = 'SCOTT'; -- 在oracle SQL中,日期类型的常量也要写在单引号中 -- 日期的默认格式 'DD-MON-YYYY',月份在中文环境下,要写成 4月 -- 有语言区域的限制,不建议使用,有更好的替代方法,以后再说。 练习:查询emp表中入职时间是1987-4-19号的员工的信息 SELECT * FROM emp WHERE hiredate = '19-4月-1987'; -- 汉字 月 不能忘 ALTER SESSION SET nls_language = 'AMERICAN'; -- 修改当前会话的语言环境 SELECT * FROM emp WHERE hiredate = '19-APR-1987'; -- 英文环境下应该写月份英文的缩写 ALTER SESSION SET nls_language = 'SIMPLIFIED CHINESE'; 练习:查询emp表中20部门工资小于2000的员工的姓名,工资以及部门编号 SELECT ename, sal, deptno FROM emp WHERE deptno = 20 AND sal < 2000; 练习:查询emp表中10和30部门员工的信息 SELECT * FROM emp WHERE deptno = 10 OR deptno = 30; 练习:查询emp表中工资在1250到3000之间的员工的信息(包括端点) SELECT * FROM emp WHERE sal >= 1250 AND sal <= 3000; 2. 几种特殊的比较运算符 1> BETWEEN AND -- 包括端点的,小的写前面,大的端点写后面 练习:查询emp表中工资在1250到3000之间的员工的信息(包括端点) SELECT * FROM emp WHERE sal BETWEEN 1250 AND 3000; SELECT * FROM emp WHERE sal NOT BETWEEN 1250 AND 3000; -- 加了not,不包括端点 2> IN 练习:查询emp表中10和30,20,50部门员工的信息 SELECT * FROM emp WHERE deptno IN (10, 20, 30, 50); SELECT * FROM emp WHERE deptno not IN (10, 20); 3> LIKE -- 字符串的模糊匹配 -通配符 - i. _ 代表一个字符,不包括零字符 - ii. % 代表任意长度的字符串,包括零字符 练习:查询emp表中姓名以 S开头的员工的信息 SELECT * FROM emp WHERE ename LIKE 'S%'; SELECT * FROM emp WHERE ename NOT LIKE 'S%'; 练习:查询emp表中姓名的第二个字符是O的员工的信息 SELECT * FROM emp WHERE ename LIKE '_O%'; 练习:查询emp表中姓名至少含有一个E的员工的信息 SELECT * FROM emp WHERE ename LIKE '%E%'; 练习:查询emp表中姓名的第二个字符是O,且长度是4个字符的员工的信息 SELECT * FROM emp WHERE ename LIKE '_O__'; 练习:查询emp表中姓名是5个字符的员工的信息 SELECT * FROM emp WHERE ename LIKE '_____'; CREATE TABLE emp1 AS SELECT * FROM emp; UPDATE emp1 SET job = 'M_' || job WHERE job = 'CLERK'; -- escape子句定义转义字符,对匹配字符串中的符号进行转义 练习:查询emp1表中职位以M_开头的员工的信息 SELECT * FROM emp1 WHERE job LIKE 'M+_%' ESCAPE '+'; 4> IS NULL -- Oracle中,null只有用is null或is not null来判断的时候,才会返回true或false,否则都是null 练习:查询emp表中没有补助的员工的信息 SELECT * FROM emp WHERE comm is NULL; SELECT * FROM emp WHERE comm IS NOT NULL; 3. 排序 -- order by是最后一个子句 练习:查询emp表中20部门所有员工的姓名和工资,按工资升序排序 SELECT ename, sal FROM emp WHERE deptno = 20 ORDER BY sal; 练习:查询emp表中所有员工的姓名和年薪,按照年薪进行降序排序 SELECT ename, sal * 12 FROM emp ORDER BY sal * 12 DESC; SELECT ename, sal * 12 annsal FROM emp ORDER BY annsal DESC; -- 多列排序 -- ASC或DESC只修饰前面的一列 SELECT ename, deptno, sal FROM emp ORDER BY deptno, sal DESC;
第四章 单行函数 -- 在oracle中,函数如果没有参数,调用的时候不要写括号 -- 单行函数:不同于分组函数,会对结果集中每一条记录执行一次,每一条记录返回一个结果。 一. 字符型 1. 大小写转换 -- dual: 是sys用户下的一个表,本身没有任何意义,它的作用就是用来补全SQL语句 练习:将'I love SQL'分别以全小写,全大写和首字符大写的形式输出 SELECT LOWER('I love SQL'), UPPER('I love SQL'), INITCAP('I love SQL') FROM dual; 练习:查询emp表中姓名是scott的员工的信息 SELECT * FROM emp WHERE UPPER(ename) = 'SCOTT'; 2. CONCAT -- 字符串的连接 练习:将 'I love '和'SQL'连接 SELECT CONCAT('I love ', 'SQL') FROM dual; -- 函数是可以嵌套的,单行函数理论上是可以无限嵌套; -- 函数有内向外依次执行; 练习:将 'I', ' love '和'SQL'连接 SELECT CONCAT(CONCAT('I', ' love '), 'SQL') FROM dual; 3. SUBSTR(源字符串, m [, n]) -- 从源字符串的第m个字符开始,截取n个字符(如果省略n,默认是提取到字符串的末尾) SELECT SUBSTR('I love SQL', 3, 4) FROM dual; -- 在Oracle中,所有的计数都是从1开始 练习:将'Hi, my name is Mike, i am from american, I love SQL'中的'SQL'提取出来 SELECT SUBSTR('I love SQL', 8, 3) FROM dual; SELECT SUBSTR('I love SQL', 8) FROM dual; -- 如果m为负数,那么是从右往左进行计数 SELECT SUBSTR('Hi, my name is Mike, i am from american, I love SQL', -3, 3) FROM dual; SELECT SUBSTR('Hi, my name is Mike, i am from american, I love SQL', -3) FROM dual; 4. LENGTH(字符串) -- 返回长度 SELECT LENGTH('I love SQL') FROM dual; 5. INSTR(源字符串, 子串[, m [, n]]) -- 返回一个整数,是子串在源字符串中从第m个字符开始,第n次出现的位置,m,n默认都是1 SELECT INSTR('I Love SQL', 'L') FROM dual; SELECT INSTR('I Love SQL', 'L', 1, 2) FROM dual; SELECT INSTR('I Love SQL', 'L', 5, 1) FROM dual; SELECT INSTR('I Love SQL', 'L', 5, 2) FROM dual; -- 如果没有找到,会返回0 练习:加密IP地址的SQL语句 -- 加密前 '192.168.181.75' '10.10.23.35' -- 加密后 '192.168.181.*' '10.10.23.*' SELECT CONCAT(SUBSTR('10.10.23.35', 1, INSTR('10.10.23.35', '.', 1, 3)), '*') FROM DUAL; 6. LPAD(源字符串, n, 子串), RPAD(源字符串, n, 子串) -- 将源字符串用子串在左边(右边)填充至n个长度 SELECT LPAD('SQL', 10, '*') FROM dual; 7. TRIM([BOTH|LEADING|TRAILING] 字符 FROM 源字符串) -- 截去源字符串头尾的给定字符 SELECT TRIM(BOTH 'l' FROM 'level') FROM dual; -- 头尾都去 SELECT TRIM(LEADING 'l' FROM 'level') FROM dual; -- 只去头的,不去尾的 SELECT TRIM(TRAILING 'l' FROM 'level') FROM dual; -- 只去尾的,不去头的 -- 第二种用法,去除字符串头尾的空格 -- trim(字符串) SELECT ' mike ', TRIM(' mike ') FROM dual; 8. REPLACE 练习:将'I Love SQL'中的'SQL'替换成'Oracle' SELECT REPLACE('I Love SQL', 'SQL', 'Oracle') FROM dual; 二. 数字函数 1. round(数字, n) -- 将给定的数字四舍五入到小数点后n位 SELECT ROUND(654.38, 1) FROM dual; SELECT ROUND(654.38, 0) FROM dual; SELECT ROUND(654.38, -1) FROM dual; SELECT ROUND(654.38, -2) FROM dual; SELECT ROUND(654.38, -3) FROM dual; 2. TRUNC(数字, n) -- 将给定的数字截断到小数点后n位 SELECT TRUNC(654.38, 1) FROM dual; SELECT TRUNC(654.38, 0) FROM dual; SELECT TRUNC(654.38, -3) FROM dual; 3. MOD(m, n) -- 取m/n后的余数 SELECT MOD(10, 5) FROM dual; 三. 日期函数 1. SYSDATE -- 返回oracle服务器的系统时间 SELECT SYSDATE FROM dual; SELECT SYSDATE + 1/24/60/60/1000 FROM dual; 2. months_between -- 返回两个日期之间间隔的月数 练习:计算emp表中员工工作的月数。 SELECT ename, hiredate, months_between(SYSDATE, hiredate) FROM emp; 练习:计算同学自己的年龄,结果四舍五入到小数点后三位 SELECT round(months_between(SYSDATE, '1-4月-1980')/12, 3) FROM dual; 3. add_months SELECT add_months(SYSDATE, 2) FROM dual; SELECT add_months('29-2月-2012', 1) from dual; -- 如果给定的日期是某个月的最后一天,那么返回的也是对应月的最后一天 练习:查询emp表中所有的员工的转正日期(试用期3个月) SELECT ename, add_months(hiredate, 3) FROM emp; 4. next_day(日期, '星期×'|n) -- 返回给定日期后一周内下一个星期×的日期 SELECT next_day(SYSDATE, '星期二') FROM dual; SELECT next_day(SYSDATE, '星期一') FROM dual; SELECT next_day(SYSDATE, '星期日') FROM dual; -- 注意,n=1,代表星期日 SELECT next_day(SYSDATE, 1) FROM dual; 5. last_day -- 返回给定日期当月的最后一天 SELECT last_day(SYSDATE) FROM dual; 6. ROUND(日期, '特征字符串') -- YY - 年, MM - 月, DD- 日 练习:emp表 月末发工资,上半月来的,领全月工资,下半月来的,从下个月1号开始计算工资 查询emp表中所有员工,计算工资的起始日期是那一天。 SELECT ename ,hiredate ,ROUND(hiredate, 'MM') FROM emp; 7. TRUNC(日期, '特征字符串') -- YY - 年, MM - 月, DD- 日 练习:emp表 月末发工资,不管上半月还是下半月,都发全月工资,查询emp表中所有员工,计算工资的起始日期是那一天。 SELECT ename ,hiredate ,TRUNC(hiredate, 'MM') FROM emp; 四. 类型转换 - 隐式类型转换 SELECT * FROM emp WHERE deptno = '10'; - oracle是支持隐式类型转换 - 隐式类型转换是有规则的 -- 不建议大家使用隐式类型转换 -- 1. 代码可读性很差; -- 2. 执行效率会很低; -- 3. oracle官方并没有承诺在下一个版本不改变规则。 - 显式类型转换 1. to_char(日期|数字, 'fmt') -- 特征(格式)字符串 -- 日期 --> 字符 练习:输出当前系统的日期, 2012/3/5 SELECT to_char(SYSDATE, 'fmYYYY/MM/DD') FROM dual; -- fm 去掉前导零 练习:提取当前日期中的年 SELECT to_char(SYSDATE, 'DY') FROM dual; 练习:输出当前系统的时间, 16:31:22 SELECT to_char(SYSDATE, 'HH24:MI:SS') FROM dual; 练习:输出当前系统的日期和时间 2012/3/5 16:31:22 SELECT to_char(SYSDATE, 'fmYYYY/MM/DD HH24:MI:SS DY') FROM dual; SELECT to_char(SYSDATE, 'DDSP') FROM dual; 练习:输出当前系统的日期和时间 '今天是2012年3月5日' SELECT to_char(SYSDATE, 'fm"今天是"YYYY"年"MM"月"DD"日"') FROM dual; -- 数字 --> 字符 练习:查询emp表中King工资数,并以 '$5,000.00' SELECT ename, to_char(sal, '$9,999.00') FROM emp WHERE ename = 'KING'; -- 注意,转换过程中,整数位一定要足够宽,否则结果就是 ######### 练习:查询emp表中King工资数,换算成人民币,并以 ¥5,000.00 SELECT ename, to_char(sal*6, 'L999,999.00') FROM emp WHERE ename = 'KING'; 练习:查询emp表中入职时间是1987-4-19号的员工的信息 SELECT * FROM emp WHERE hiredate = to_date('19-4-1987', 'DD-MM-YYYY'); 五. 其他函数 1. NVL 练习:查询emp表中员工的姓名和年薪(考虑comm列) SELECT ename, (sal + NVL(comm, 0)) * 12 FROM emp; 2. NVL2 练习:查询emp表中员工的姓名和年薪(考虑comm列) SELECT ename, NVL2(comm, sal + comm, sal) * 12 FROM emp; 3. COALESCE 练习:查询emp表中员工的姓名和年薪(考虑comm列) SELECT ename, COALESCE(sal+comm, sal, 0) * 12 FROM emp; 4. case表达式 CASE 列|表达式 WHEN 值1 THEN 返回值1 WHEN 值2 THEN 返回值2 ... WHEN 值N THEN 返回值N ELSE 默认返回值 END 练习:查询emp表中员工的姓名和部门(部门用汉字 10 --部门1 20 -- 部门2 30 -- 部门3) SELECT ename, CASE deptno WHEN 10 THEN '部门1' WHEN 20 THEN '部门2' ELSE '部门3' END FROM emp; 5. DECODE -- 就是case表达式的简便写法 - DECODE(列|表达式, 值1, 返回值1, 值2, 返回值2, ...值N, 返回值N, 默认返回值) 练习:查询emp表中员工的姓名和部门(部门用汉字 10 --部门1 20 -- 部门2 30 -- 部门3) SELECT ENAME, DECODE(DEPTNO, 10, '部门1', 20, '部门2', '部门3') FROM EMP; -- a代表整数 DECODE(a, 0, 1, 0) -- 逻辑取反
相关文章推荐
- Oracle基础知识(四) - 触发器的基础知识
- hylan:卸载oracle 11g时,关于计算机基础知识的思考:delete和shift+delete的区别
- Oracle、SqlServer——基础知识——oracle 与 SqlServer 的区别(未完工)
- oracle架构的基础知识
- oracle基础知识4
- oracle基础知识(3.4)
- Oracle基础知识(4)--SQL组成及Oracle运算符
- Oracle---PL/SQL 基础知识
- oracle基础知识,oracle sql练习
- Oracle 基础知识
- ORACLE SGA区基础知识与查看命令
- 温故而知新:Oracle基础知识复习(二)
- oracle基础知识
- Oracle基础知识笔记(2)SQLplus命令
- oracle基础知识
- 2. oracle学习入门系列之二 数据库基础知识
- Oracle常用基础知识详解(用户、权限、角色管理 )
- Oracle基础知识(二十四) - select for update
- Oracle基础知识(七) - 序列
- oracle架构的基础知识(入门级)