您的位置:首页 > 数据库 > Oracle

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) -- 逻辑取反
  

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息