Oracle数据库学习笔记(含PLSQL)
建议在PLSql Develeper 工具中查看,阅读
/*Oracle学习笔记*/
SQLPlus:所谓的SQLPlus,就是oracle数据库的一个客户端。
登录sqlplus的几种方式:
1 命令行版的sqlplus:在dos窗口中直接输入sqlplus,则需要你输入用户名和密码,进入oracle的命令行了,即进入了oracle的客户端。
2 图形版的sqlplus:开始程序处执行。
3 浏览器模式isqlplus:http://127.0.0.1:5560/isqlplus/ --5560是oracle的端口号,通过这个方式可以访问其他ip主机的oracle
4 oracle常用的客户端软件:Toad(英文意思蛤蟆)/*数据库管理的时候常用*/,PL/SQL Developer(常用)/*需要在本地的oracle客户端也装上oracle*/,
相比之下,isqlplus较为好用,在客户端不需要装任何东西,只需要一个浏览器就可访问
----------------------------------------
dos命令:
1 sqlplus sys/bjsxt AS SYSDBA; --as sysdba代表以数据库管理员的身份登录
2 ALTER USER scott ACCOUNT UNLOCK; --将用户scott解锁
------------------------------------------------------------------------------------------------------------------------------------------
SQL语言
SQL(Structured Query Language)
SQL是关系数据库的标准语言,到现在为止,有两个标准:1992年定义的SQL/92和1999年定义的SQL99,SQL在大多数的数据库上通用,
只是不同的数据库对于SQL语言都有那么一点小的改变。
----------------------------------------
学习四个语句:
1 SELECT:查询语句
2 DDL :数据定义语言
1 模式的定义
2 基本表的定义
3 索引的定义
4 视图的定义
3 DML :数据操纵语言,一般包括select语句
1 INSERT
2 UPDA TE
3 DELETE
4 DCL :数据控制语言
1 数据的安全性控制
2 grand和revoke
3 数据的完整性定义和检查
4 事务的定义
5 事务的管理:并发控制和恢复
-----------------------------
先熟悉下几个常用的基本数据类型:/*还有其他的数据类型,后面会讲到*/
1 NUMBER(n): n为数字,代表四位的数字
2 NUMBER(7,2): 七位的数字,其中两位小数
3 V ARCHAR2(n): n为数字,代表最长为n个字符的可变字符串
4 DA TE: 日期类型
-----------------------------------------------------------------------------------------------------------------------------------------
SELECT 语句查询语句SELECT * FROM emp;
DESC emp; --查看表结构
SELECT ename, sal * 12 FROM emp;
SELECT 2 * 3 FROM emp; --emp中有几条记录则就查出几行6。
SELECT 2 * 3 FROM dual; --空表,而且只有一条记录,算出来只有一个结果。计算数学表达式用
SELECT SYSDA TE FROM dual; --sysdate为系统时间
SELECT sal * 12 年薪FROM emp;
SELECT sal * 12 AS 年薪FROM emp;
---------------------------------
注意:
SELECT sal * 12 "anuual sal" FROM emp; --当别名中有特殊的字符时,则需要使用双引号,保持原来的格式不变,包括字母大小写等。
使用select进行查询时字段值出现NULL 值改如何解决?
--任何含有空值的数学表达式最后的结果都是空值
假如smith这人的津贴(https://www.360docs.net/doc/e615198058.html,m)为空,则
SELECT sal * 12 + comm FROM emp WHERE ename = 'smith'; --查出的结果则是空值。comm 为emp表中的一个字段,代表员工的津贴
可以利用nvl函数解决问题:
SELECT sal * 12 + nvl(comm, '0') FROM emp WHERE ename = 'smith';
-----------------------------
字符串连接符:
字符串都是被单引号引起来的。单引号内的单引号,两个单引号代表一个单引号。如:'我是一只''小鸟'',你信吗?'
连接字符串使用|| 进行连接
-----------------------------------------------------------
DISTINCT 的使用
1 修饰一个字段:
SELECT DISTINCT stuname FROM stu; --过滤掉stuname重复的记录
-------------
2 distinct可以修饰多个字段:
SELECT DISTINCT deptno, job FROM emp; -- 过滤掉deptno和job两字段组合重复的记录-----------------------------------------------------
WHERE 的使用
WHERE 子句为过滤条件
SELECT * FROM emp WHERE empno = 10;
-----------------------
1 不等号的使用
SELECT ename, sal FROM emp WHERE deptno <> 10; -- oracle中的不等于用<> 表示
----------------------
2 使用字符串进行比较(比较ASC码值):
SELECT ename, sal FROM emp WHERE ename > 'CBA';--数据库中比较字符串和java中比较字符串一个原理,都是比较ASC码值,字典顺序
------------------------
3 between...and...
SELECT * FROM emp WHERE sal BETWEEN 800 AND 1500;--工资位于800到1500的所有记录,包括800和1500
相当于:
SELECT * FROM emp WHERE sal >= 800 AND sal <= 1500;
相反则为:
SELECT * FROM emp WHERE sal NOT BETWEEN 800 AND 1500;
------------------------
4 空值的处理
SELECT ename, sal, comm FROM emp WHERE comm IS NULL;-- 数据库中表示为空值,使用is null,相反则为is not null。
------------------------
5 IN 的使用
表示集合
SELECT ename, sal FROM emp WHERE sal IN (800, 1000, 1500);
相当于:
SELECT ename, sal FROM emp WHERE sal = 800 OR sal = 1000 OR sal = 1500;
用于字符串:
SELECT ename, sal FROM emp WHERE ename NOT IN ('john', 'smith', 'abc');
--------------------------
6 日期的处理
--查询出所有在2011年05月20日以后入职的员工
在学习日期函数date()之前,可以这样进行处理:
SELECT SYSDA TE FROM dual;--显示系统时间的格式,如2011-05-20
SELECT ename FROM emp WHERE hiredate > '2011-05-20';--以字符串的形式进行比较,学习了日期函数后可以任意的格式进行比较
---------------------------
7 模糊查询LIKE NOT LIKE
名字中含有s的:
SELECT * FROM emp WHERE ename LIKE '%s%'; --%代表0个或多个字符
SELECT * FROM emp WHERE ename NOT LIKE '%s%';--名字中不含有s的
第二个字符是a的:
SELECT * FROM emp WHERE ename LIKE '_a%%'; --下划线代表一个字符
取出名字中含有%的(使用转义字符):
SELECT * FROM emp WHERE ename LIKE '%\%%'; -- \ 为默认的转义字符
--可指定转义字符
SELECT * FROM emp WHERE ename LIKE '%@%%' ESCAPE '@'; -- ESCAPE '@' 代表@为转义字符
------------------------------------------------------------------
数据的排序ORDER BY
1 按照工资的金额高低进行升序排列,默认是ASC 升序
SELECT * FROM emp ORDER BY sal;
-----------------
2 desc 代表为降序排列
SELECT * FROM emp ORDER BY sal DESC;
-----------------------
3 ORDER BY和WHERE 一起使用:
SELECT * FROM emp WHERE deptno <> 10 ORDER BY empno DESC;
--------------------------
4 通过两个字段或者多个字段进行排序
SELECT * FROM emp ORDER BY deptno DESC, empno DESC; --根据部门编号排序后,在同一个deptno内部再按照empno排序
---------------------------------------------------------------------------
数据库常用SQL函数
包括单行函数和多行函数
----------------------------------------------------------------------------
/*单行函数*/
处理一条记录,返回一条记录,进一出一
---------------------------------
1 字符串函数lower(), upper(), substr(), chr(), ascii()
--lower()
SELECT lower(ename) FROM emp;--查询出的所有的ename都转化为小写
SELECT ename FROM emp WHERE lower(ename) LIKE '%a%'; --名字中含有A或者a的
相当于:
SELECT ename FROM emp WHERE ename LIKE '%A%' OR ename LIKE '%a%';
--upper()
upper的用法同lower一样。
--substr()
SELECT substr(ename, 2, 3) FROM emp; --从第2个字符开始,一共截取3个字符
--chr()
SELECT chr(65) FROM dual; --输出为A,将数字ASC码值转化为对应的字符
--ascii()
SELECT ascii('A') FROM dual;--输出结果为65,将字符转化为对应的数字ASC码值
---------------------------------------
2 数字和日期处理函数round(), to_char(), to_number()
--round()
SELECT round(23.562) FROM dual; --输出结果为24,将数字四舍五入
可以指定第二个参数:
SELECT round(23.562, 2) FROM dual;--输出结果为23.65,四舍五入保留小数点后2位SELECT round(23.566, 2) FROM dual; --输出结果为23.57
SELECT round(23.562, -1) FROM dual;--输出结果为20,因为不指定第二个参数默认是0,所以-1代表四舍五入到小数点前一位
SELECT round(25.652, -1) FROM dual; --输出结果为30
--to_char()。
数字的格式:
9代表一位数字,如果小数点前边的某位没有数字则不显示;小数点后边的某位没有数字则强制显示0
0也代表一位数字,但是某位如果没有数字则强制显示为0
$代表美元符号,原样显示
L代表当地货币,比如RMB
SELECT to_char(5000, '$99,999.9999') FROM dual;--输出结果为$5,000.0000 ,格式化输出相应的数字,万位没有数字不显示,小数点后边的强制显示
SELECT to_char(5000, '$00,000.000') FROM dual;--输出结果为$05,000.000
SELECT to_char(5000, 'L99,999.9999') FROM dual;--输出结果为RMB5,000.0000
--to_char()函数对日期进行处理(重点)
SELECT SYSDA TE FROM dual; --输出结果为系统默认格式
SELECT to_char(SYSDA TE, 'YYYY-MM-DD HH24:MI:SS') FROM dual;--输出结果为2011-05-24 13:39:55。HH24代表24小时制显示,HH代表12小时制显示
SELECT to_char(SYSDA TE, 'YYYY-MM-DD HH:MI:SS') FROM dual;--输出结果为2011-05-24 01:44:00。
--to_number() 可有两个参数,第二个参数指定第一个参数的数字格式
SELECT to_number('45') FROM dual; --输出结果为45。
SELECT to_number('$145', '$999') FROM dual; --输出结果为145。
--------------------------------------
3 日期处理函数to_date(),to_char(), to_number()两个函数可相互转换
--to_date() 将日期转换成字符串
SELECT to_date('2007-12-25 23:45:12', 'YYYY-MM-DD HH24:MI:SS') FROM dual; --输出结果为2007-12-25 23:45:12
------------------------------------------
4 空值处理函数nvl()
--nvl()
有两个参数,如果第一个参数为空,则返回第二个参数
SELECT sal * 12 + nvl(comm, 0) FROM emp;--comm 为emp表中的一个字段,代表员工的津贴
--------------------------------------------------------------------------
/*组函数*/
多行函数(聚合函数),处理多条记录,返回一条记录,进多出一
1 求最大和最小值MAX(), MIN()
--max()
SELECT MAX(sal) FROM emp; --最高的工资
--min()
SELECT MIN(sal) FROM emp; --最低的工资
2 求平均值A VG()
SELECT A VG(sal) FROM emp; --平均工资
SELECT to_char(A VG(sal), '99,999.99') FROM emp; --平均工资精确到两位小数
SELECT to_char(A VG(sal), 2) FROM emp; --四舍五入到两位小数
3 求总和SUM()
--sum()
SELECT SUM(sal) FROM emp;
4 求记录总数COUNT()
--count()
SELECT COUNT(*) FROM emp; --emp表总共有多少条记录
SELECT COUNT(*) FROM emp WHERE deptno = 10; --部门编号为10的部门的员工数SELECT COUNT(comm) FROM emp; -- comm 为空值的记录不会计算在内。即count某个字段的时候,只包括不是空值的记录
SELECT COUNT(DISTINCT deptno) FROM emp; --一共有多少个部门
---------------------------------------------------------------------------
GROUP BY和HA VING 子句, 分组函数(重点)
1 根据一个字段分组
SELECT deptno, A VG(sal) FROM emp GROUP BY deptno; --每个部门的平均工资
2 根据多个字段分组
SELECT deptno, job, A VG(sal) FROM emp GROUP BY deptno, job;
--求工资最高的员工的名字
SELECT ename FROM emp WHERE sal = (SELECT MAX(sal) FROM emp);
--求每个部门里工资最高的员工的名字
SELECT a.empno, b.sal
FROM emp a, (SELECT c.deptno, MAX(c.sal) sal
FROM emp c
GROUP BY c.deptno) b
WHERE a.deptno = b.deptno
AND a.sal = b.sal;
注意:出现在select列表中的字段,如果没有出现在组函数里边,则必须出现在group by 列表中
-------------------------------------------------------
HA VING 子句
使用HA VING 对分组进行限制
--平均工资大于2000的部门
SELECT deptno, A VG(sal) avg_sal FROM emp GROUP BY deptno HA VING A VG(sal) > 2000;--having的作用对象是组,where的作用对象是单条记录
-----------------------------------------------------
到目前为止,select语句的单条查询可总结为:
SELECT ...
FROM ...
WHERE ...
GROUP BY ...
HA VING ...
ORDER BY ... --这些关键字的先后顺序不能变
--查询出每个部门中工资大于1200的所有员工的平均工资大于1500的部门编号和平均工资,并且按照查询出的平均工资的降序排列
SELECT deptno, A VG(sal) avg_sal
FROM emp
WHERE sal > 1200
GROUP BY deptno
HA VING A VG(sal) > 1500
ORDER BY avg_sal DESC;
-----------------------------------------------------------------------------------------------------------------
子查询
理解子查询的最好的办法就是将子查询当做一张表
--求哪些人的工资高于所有人的平均工资
SELECT empno, sal FROM emp WHERE sal > (SELECT A VG(sal) FROM emp);
--求每个部门里工资最高的员工
SELECT a.deptno, empno, sal
FROM emp a, (SELECT deptno, MAX(sal) max_sal FROM emp GROUP BY deptno) b WHERE a.deptno = b.deptno
AND a.sal = b.max_sal;
--求每个部门平均工资的工资等级。grade为工资等级表
SELECT b.deptno, b.avg_sal, a.gradeno
FROM grade a,
(SELECT deptno, A VG(sal) avg_sal FROM emp GROUP BY deptno) b
WHERE b.avg_sal BETWEEN xiaosal AND dasal;
-----------------------------------------------------------------------------------------
自连接
将同一张表当成两张表来用,且分别起别名,这就跟两张表进行连接一样了
--求每个员工以及他的经理人
SELECT a.ename, b.ename FROM emp a JOIN emp b ON a.managerno = b.empno
------------------------------------------------------------------------------------------
SQL1999语法
新的语法中where 子句中只包括过滤条件,没有表连接的条件
1 笛卡尔积
--cross join
SELECT ename, dname FROM emp CROSS JOIN dept;--查询出所有的笛卡尔积
相当于SQL/92的:
SELECT ename, dname FROM emp, dept;
---------------------------------------------------
2 等值连接:
--join on
SELECT ename, dname FROM emp JOIN dept ON (emp.deptno = dept.deptno); --一般情况下最好使用小括号将连接条件括起来,看得更加清晰
相当于:
SELECT ename, dname FROM emp JOIN dept USING (deptno);--当两个要连接的表的等值字段名一样时使用。一般不推荐使用,要求太多
----------------------------------------------------
3 非等值连接:
SELECT ename, grade FROM emp e JOIN grade g ON (e,sal BETWEEN g.xiaosal AND g.dasal);
---------------------------------------------------
4 多表连接:
--查询出每个员工的所在部门编号,工号和工资等级
SELECT a.deptno, a.empno, c.gradeno
FROM emp a
JOIN dept b ON (a.deptno = b.deptno)
JOIN grade c ON (a.sal BETWEEN c.xiaosal AND c.dasal)
WHERE a.ename NOT LIKE '%s%';
--用新的语法实现自连接
SELECT a.ename, b.ename FROM emp a JOIN emp b ON (a.managerno = b.empno);
----------------------------------------------------
5 外连接
--left join 左外连接。将左表不能和右表相匹配的多余的记录都查出来
SELECT a.ename, b.ename FROM emp a LEFT /*OUTER*/ JOIN emp b ON (a.managerno = b.empno);--outer可以省略
--right join 右外连接。将右表不能和左表相匹配的多余的记录都查出来
SELECT a.ename, b.dname FROM emp a RIGHT /*OUTER*/ JOIN dept b ON (a.deptno = b.deptno);--outer可以省略
--full join 全外连接。将左右两个表的记录都拿出来
SELECT a.empno, b.deptno FROM emp a FULL /*OUTER*/ JOIN deptma b ON (a.deptno = b.deptno);--outer可以省略
------------------------------------------------------
6 实例
--求部门员工工资等级的平均值
SELECT deptno, A VG(gradeno)
FROM emp a
JOIN grade b ON (a.sal BETWEEN b.xiaosal AND b.dasal)
GROUP BY deptno
--求哪些人是经理人
SELECT a.empno
FROM emp a
JOIN (SELECT DISTINCT managerno FROM emp) b ON a.empno = b.empno;
或者:
SELECT empno FROM emp WHERE empno IN (SELECT managerno FROM emp);
--求最高工资,不能用组函数(面试题)
SELECT c.empno
FROM emp c
WHERE empno NOT IN
(SELECT DISTINCT a.empno FROM emp a JOIN emp b ON (a.sal < b.sal));
或者使用伪列ROWNUM :--这个在后面的oracle数据库分页中会讲到
SELECT empno, sal
FROM (SELECT empno, sal FROM emp ORDER BY sal DESC)
WHERE ROWNUM = 1;
--求平均工资最高的部门编号和名称
SELECT deptno, deptname, avg_sal
FROM (SELECT a.deptno, b.deptname, A VG(sal) avg_sal --将这个子查询当做一张普通的表,有三个字段
FROM emp a
JOIN dept b ON (a.deptno = b.deptno)
GROUP BY a.deptno, b.deptname)
WHERE avg_sal = (SELECT MAX(avg_sal) max_sal --等号后边的子查询结果就是一个值,当做一个普通的值
FROM (SELECT a.deptno, b.deptname, A VG(sal) avg_sal
FROM emp_ma a
JOIN deptma b ON (a.deptno = b.deptno)
GROUP BY a.deptno, b.deptname))
简化一下就是:
SELECT deptno, deptname, avg_sal
FROM (SELECT a.deptno, b.deptname, A VG(sal) avg_sal --将这个子查询当做一张普通的表,有三个字段
FROM emp a
JOIN deptma b ON (a.deptno = b.deptno)
GROUP BY a.deptno, b.deptname)
WHERE avg_sal =
(SELECT MAX(avg_sal) max_sal --等号后边的子查询结果就是一个值,当做一个普通的值
FROM (SELECT A VG(sal) avg_sal FROM emp GROUP BY deptno))
--求平均工资的等级最低的部门的部门名称
SELECT deptno, deptname, gradeno
FROM (SELECT a.*, b.gradeno
FROM (SELECT b.deptno, b.deptname, A VG(sal) avg_sal
FROM emp_ma a
JOIN deptma b ON (a.deptno = b.deptno)
GROUP BY b.deptno, b.deptname) a
JOIN grade b ON (a.avg_sal BETWEEN b.xiaosal AND b.dasal))
WHERE gradeno =
(SELECT MIN(gradeno)
FROM (SELECT a.*, b.gradeno
FROM (SELECT b.deptno, b.deptname, A VG(sal) avg_sal
FROM emp_ma a
JOIN deptma b ON (a.deptno = b.deptno)
GROUP BY b.deptno, b.deptname) a
JOIN grade b ON (a.avg_sal BETWEEN b.xiaosal AND b.dasal)))
上边这个SQL语句有很多地方重复了,比如这部分:
SELECT a.*, b.gradeno
FROM (SELECT b.deptno, b.deptname, A VG(sal) avg_sal
FROM emp_ma a
JOIN deptma b ON (a.deptno = b.deptno)
GROUP BY b.deptno, b.deptname) a
JOIN grade b ON (a.avg_sal BETWEEN b.xiaosal AND b.dasal)
我们把他当成了一张表,所以出现了多次,如果将这个子查询段起一个别名的话,比如t则会报错。不过我们可以在其上建立视图来减少代码量,视图在后面将会讲到
--视图的建立:(插叙)
CREA TE VIEW v$_dept_avg_sal_info AS --视图名通常以v$开头
SELECT a.*, b.gradeno
FROM (SELECT b.deptno, b.deptname, A VG(sal) avg_sal
FROM emp_ma a
JOIN deptma b ON (a.deptno = b.deptno)
GROUP BY b.deptno, b.deptname) a
JOIN grade b ON (a.avg_sal BETWEEN b.xiaosal AND b.dasal)
SELECT * FROM v$_dept_avg_sal_info --使用视图时,就把它当做一张普通的表其实视图本身就是一个虚拟的表
--求平均工资的等级最低的部门的部门名称,使用视图
SELECT deptno, deptname, gradeno
FROM v$_dept_avg_sal_info
WHERE gradeno = (SELECT MIN(gradeno) FROM v$_dept_avg_sal_info)
--求部门经理人中平均工资最低的部门名称(思考题)
--求比普通员工的最高薪水还要高的部门经理人名称
SELECT empno, sal
FROM emp
WHERE empno IN (SELECT managerno FROM emp WHERE managerno IS NOT NULL) --公司老总的经理人为空,把他过滤掉
AND sal >
(SELECT MAX(sal)
FROM emp
WHERE empno NOT IN (SELECT DISTINCT managerno
FROM emp
WHERE managerno IS NOT NULL))
--比较下边两个SQL的效率
1 SELECT * FROM emp WHERE deptno = 10 AND ename LIKE '%A%' --比较数字比比较字符串效率较高点,把数字放在前边,如果数字条件不满足的话,
--后面的字符串就不进行比较了。这也不是绝对的,假如oracle对其优化了,
--谁快谁慢就不好说了2 SELECT * FROM emp WHERE ename LIKE '%A%' AND deptno = 10
--一道面试题
有三个表: S, C, SC
S(sno, sname); C(cno, cname, cteacher); SC(sno, cno, scgrade); --scgrade 代表课程成绩
问题:
1 --找出没有选修黎明老师课程的所有的学生姓名
SELECT S.sno, S.sname
FROM S
JOIN SC ON (SC.sno = S.sno)
JOIN C ON (https://www.360docs.net/doc/e615198058.html,o = https://www.360docs.net/doc/e615198058.html,o)
WHERE C.cteacher <> '黎明'
2 --列出两门以上(含两门)不及格学生姓名及平均成绩
SELECT S.sno, S.sname, A VG(scgrade)
FROM SC
JOIN S ON (S.sno = SC.sno)
WHERE S.sno IN (SELECT sno
FROM (SELECT sno, COUNT(scgrade)
FROM (SELECT sno, scgrade
FROM SC
WHERE scgrade < 60
GROUP BY sno, scgrade)
GROUP BY sno
HA VING COUNT(scgrade) >= 2))
GROUP BY S.sno, S.sname
3 --即学过1号课程又学过2号课程的所有的学生的姓名
三个方案:
1 SELECT SC.sno, S.sname
FROM SC
JOIN S ON (SC.sno = S.sno)
WHERE cno = 1
AND SC.sno IN
(SELECT sno FROM SC WHERE cno = 2)
2 SELECT sname
FROM S
WHERE sno IN (SELECT sno FROM scgrade WHERE cno = 1)
AND sno IN (SELECT sno FROM scgrade WHERE cno = 2)
3 SELECT sname, COUNT(sname)
FROM (SELECT S.sname
FROM S
JOIN SC ON (S.sno = SC.sno)
WHERE https://www.360docs.net/doc/e615198058.html,o = 1
OR https://www.360docs.net/doc/e615198058.html,o = 2)
GROUP BY sname
HA VING COUNT(sname) = 2
------------------------------------------------------------------------------------------------------------------------------------------
数据库分页查询(重点掌握)
在oracle数据库中若是每有进行排序则默认根据插入的顺序导出记录
Oracle数据库中有个特有的东西ROWNUM,这是个伪字段
SELECT * FROM stuma WHERE ROWNUM <= 3 /*取前三行*/
/*取得按stuno排序后的第2到第4条记录*/
SELECT *
FROM (SELECT ROWNUM num, a.*
FROM (SELECT *
FROM stuma
ORDER BY stuno
) a
)
WHERE num >= 2
AND num <= 4
/*或者*/
SELECT *
FROM (SELECT ROWNUM num, a.*
FROM (SELECT *
FROM stuma
ORDER BY stuno
) a
)
WHERE num BETWEEN 2 AND 4
/*取得按stuno排序后的除了第2条到第4条之间的记录*/
SELECT *
FROM (SELECT ROWNUM num, a.*
FROM (SELECT *
FROM stuma
ORDER BY stuno) a)
WHERE num NOT BETWEEN 2 AND 4
------------------------------------------------------------------------------------------------
三大数据库(SqlServer,MySql和Oracle)的分页SQL语句实现
我们在编写MIS系统和Web应用程序等系统时,都涉及到与数据库的交互,如果数据库中数据量很大的话,一次检索所有的记录,
会占用系统很大的资源,因此我们常常采用,需要多少数据就只从数据库中取多少条记录,即采用分页语句。根据自己使用过的内容,
把常见数据库Sql Server,Oracle和My sql的分页语句,从数据库表中的第M条数据开始取N条记录的语句总结如下:
-----------------------------------------------------------------------
/*SQL Server */
从数据库表中的第M条记录开始取N条记录,利用Top关键字:注意如果Select语句中既有top,又有order by,则是从排序好的结果集中选择:
/*SELECT *
FROM (SELECT Top N *
FROM (SELECT Top(M + N - 1) * FROM 表名称ORDER BY主键DESC) t1) t2
ORDER BY主键ASC*/
SELECT *
FROM (SELECT Top N *
FROM (SELECT Top(M + N - 1) * FROM 表名称ORDER BY主键DESC) t1
ORDER BY主键ASC) t2
ORDER BY主键DESC
例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下:SELECT *
FROM (SELECT TOP 20 *
FROM (SELECT TOP 29 * FROM Sys_option ORDER BY sys_id DESC) t1) t2
ORDER BY sys_id ASC
--------------------------------------------------------------------
/*Oralce数据库*/
从数据库表中第M条记录开始检索N条记录
SELECT *
FROM (SELECT ROWNUM r, t1.* FROM 表名称t1 WHERE rownum < M + N) t2
WHERE t2.r >= M
例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下:SELECT *
FROM (SELECT ROWNUM R, t1.* FROM Sys_option WHERE rownum < 30) t2
WHERE t2.R >= 10
如果你对Oracle数据库分页不是很熟悉的话,本页后面有专门对Oracle分页技术的讲解。
-------------------------------------------------------------------------------
/*My sql数据库*/
My sql数据库最简单,是利用mysql的LIMIT函数,LIMIT [offset,] rows从数据库表中M条记录开始检索N条记录的语句为:
SELECT * FROM 表名称LIMIT M, N
例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下:SELECT * FROM sys_option LIMIT 10, 20
---------------------------------------------------------------------------------
/********************************/
/*Oracle分页技术解惑:rownum原理和使用(分页查询)*/
/********************************/
要显示1到2行则可以通过
SELECT * FROM dangan WHERE rownum BETWEEN 1 AND 2
在Oracle中,要按特定条件查询前N条记录,用个rownum就搞定了。
SELECT * FROM emp WHERE rownum <= 5
而且书上也告诫,不能对rownum用">",这也就意味着,如果你想用
SELECT * FROM emp WHERE rownum > 5
则是失败的。要知道为什么会失败,则需要了解rownum背后的机制:
1 Oracle executes your query.
2 Oracle fetches the first row and calls it row number 1.
3 Have we gotten past row number meets the criteria? If no, then Oracle discards the row, If yes, then Oracle return the row.
4 Oracle fetches the next row and advances the row number (to 2, and then to 3, and then to 4, and so forth).
5 Go to step 3.
了解了原理,就知道rownum > 不会成功,因为在第三步的时候查询出的行已经被丢弃,第四步查出来的rownum仍然是1,这样永远也不会成功。
同样道理,rownum如果单独用=,也只有在rownum=1时才有用。
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,
这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。举例说明:
例如表:student(学生)表,表结构为:
ID char(6)--学号
name V ARCHAR2(10)--姓名
create table student (ID char(6), name V ARCHAR2(100));
INSERT INTO sale V ALUES ('200001', ‘张一’);
INSERT INTO sale V ALUES ('200002', ‘王二’);
INSERT INTO sale V ALUES ('200003', ‘李三’);
INSERT INTO sale V ALUES ('200004', ‘赵四’);
commit;
(1) rownum 对于等于某值的查询条件
如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。
因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false 条件,所以无法查到rownum = n(n>1的自然数)。
SQL> select rownum,id,name from student where rownum=1;(可以用在限制返回记录条数的地方,保证不出错,如:隐式游标)
SQL> select rownum,id,name from student where rownum=1;
ROWNUM ID NAME
---------- ------ ---------------------------------------------------
1 200001 张一
SQL> select rownum,id,name from student where rownum =2;
ROWNUM ID NAME
---------- ------ ---------------------------------------------------
(2)rownum对于大于某值的查询条件
如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,
Oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录
SQL> select rownum,id,name from student where rownum >2;
ROWNUM ID NAME
---------- ------ ---------------------------------------------------
那如何才能找到第二行以后的记录呀。可以使用以下的子查询方法来解决。注意子查询中的rownum必须要有别名,
否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。
SQL>select * from(select rownum no ,id,name from student) where no>2;
NO ID NAME
---------- ------ ---------------------------------------------------
3 200003 李三
4 200004 赵四
SQL> select * from(select rownum,id,name from student)where rownum>2;
ROWNUM ID NAME
---------- ------ ---------------------------------------------------
(3)rownum对于小于某值的查询条件
如果想找到第三条记录以前的记录,当使用rownum<3是能得到两条记录的。显然rownum 对于rownum
所以可以找到记录。
SQL> select rownum,id,name from student where rownum <3;
ROWNUM ID NAME
---------- ------ ---------------------------------------------------
1 200001 张一
2 200002 王二
综上几种情况,可能有时候需要查询rownum在某区间的数据,那怎么办呀从上可以看出rownum对小于某值的查询条件是认为true的,
rownum对于大于某值的查询条件直接认为是false的,但是可以间接的让它转为认为是true 的。那就必须使用子查询。
例如要查询rownum在第二行到第三行之间的数据,包括第二行和第三行数据,那么我们只能写以下语句,先让它返回小于等于三的记录行,
然后在主查询中判断新的rownum的别名列大于等于二的记录行。/*但是这样的操作会在大数据集中影响速度*/。
SQL> select * from (select rownum no,id,name from student where rownum<=3 ) where no >=2;
NO ID NAME
---------- ------ ---------------------------------------------------
2 200002 王二
3 200003 李三
(4)rownum和排序
Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了。
SQL> select rownum ,id,name from student order by name;
ROWNUM ID NAME
---------- ------ ---------------------------------------------------
3 200003 李三
2 200002 王二
1 200001 张一
4 200004 赵四
可以看出,rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。
为了解决这个问题,必须使用子查询
SQL> select rownum ,id,name from (select * from student order by name);
ROWNUM ID NAME
---------- ------ ---------------------------------------------------
1 200003 李三
2 200002 王二
3 200001 张一
4 200004 赵四
这样就成了按name排序,并且用rownum标出正确序号(有小到大)
*****************************************
ROWNUM使用的几个注意点
对于Oracle 的rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<、<=、!=),
并非说用>, >=,=,between..and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,
其实您只要理解好了这个rownum 伪列的意义就不应该感到惊奇,同样是伪列,rownum 与rowid 可有些不一样,下面以例子说明
假设某个表t1(c1) 有20 条记录
如果用select rownum,c1 from t1 where rownum < 10, 只要是用小于号,查出来的结果很容易地与一般理解在概念上能达成一致,
应该不会有任何疑问的。
可如果用select rownum,c1 from t1 where rownum > 10 (如果写下这样的查询语句,这时候在您的头脑中应该是想得到表中后面10条记录),
你就会发现,显示出来的结果要让您失望了,也许您还会怀疑是不谁删了一些记录,然后查看记录数,仍然是20 条啊?那问题是出在哪呢?
先好好理解rownum 的意义吧。因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列(强调:先要有结果集)。
简单的说rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值。
所以您没办法期望得到下面的结果集:
11 aaaaaaaa
12 bbbbbbb
13 ccccccc
.................
rownum >10 没有记录,因为第一条不满足去掉的话,第二条的ROWNUM又成了1,所以永远没有满足条件的记录。或者可以这样理解:
ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第
一条记录则rownum值为1,第二条为2,依次类推。
如果你用>,>=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下条,
可是它的rownum还是1,又被删除,依次类推,便没有了数据。
有了以上从不同方面建立起来的对rownum 的概念,那我们可以来认识使用rownum 的几种现像
1. select rownum,c1 from t1 where rownum != 10 为何是返回前9条数据呢?
它与select rownum,c1 from tablename where rownum < 10 返回的结果集是一样的呢?
因为是在查询到结果集后,显示完第9 条记录后,之后的记录也都是!= 10,或者>=10,所以只显示前面9条记录。也可以这样理解,
rownum 为9后的记录的rownum为10,因条件为!=10,所以去掉,其后记录补上,rownum 又是10,也去掉,如果下去也就只会显示前面9条记录了
2. 为什么rownum >1 时查不到一条记录,而rownum >0 或rownum >=1 却总显示所以的记录
因为rownum 是在查询到的结果集后加上去的,它总是从1开始
3. 为什么between 1 and 10 或者between 0 and 10 能查到结果,而用between 2 and 10 却得不到结果
原因同上一样,因为rownum 总是从 1 开始
从上可以看出,任何时候想把rownum = 1 这条记录抛弃是不对的,它在结果集中是不可或缺的,少了rownum=1 就像空中楼阁一般不能存在,
所以你的rownum 条件要包含到1
但如果就是想要用rownum > 10 这种条件的话话就要用嵌套语句,把rownum 先生成,然后对他进行查询。
SELECT * FROM (selet rownum AS rn,t1.* FROM a WHERE.. .) WHERE rn > 10
一般代码中对结果集进行分页就是这么干的。
另外:rowid 与rownum 虽都被称为伪列,但它们的存在方式是不一样的,rowid 可以说是物理存在的,表示记录在表空间中的唯一位置ID,
在DB中唯一。只要记录没被搬动过,rowid是不变的。rowid 相对于表来说又像表中的一般列,所以以rowid 为条件就不会有rownum那些
情况发生。
另外还要注意:rownum不能以任何基表的名称作为前缀。
网上的另一种解释:
/*Oracle的rownum使用*/
今天去一家公司笔试时,又遇到了一道以前曾遇到过的SQL题,是这样的:
如果想从一个表中以某一字段排序后,取得除了20-30行以外的记录,写一条SQL来实现。
想到了用rownum,oracle专用的一个伪列。当时写的有点问题,回来后试了一下,不行!
于是重新在网上查了一下,下面是基本的实现:
假设表结构如下:
Student(sid, sname, age)
SQL:以sid升序排序
SELECT *
FROM (SELECT a.*, rownum rn
FROM (SELECT *
FROM strdent
ORDER BY sid) a
)
WHERE rn < 20
OR rn > 30;
/*如果分页时,想取得第20-30条记录可以用以下的方法:*/
/*这个方法在oracle里面是最快的分页查询语句*/
SELECT *
FROM (SELECT a.*, rownum rn
FROM (SELECT *
FROM strdent
ORDER BY sid) a)
)
WHERE rn >= 20
AND rn <= 30;
/*或者*/
SELECT *
FROM (SELECT a.*, rownum rn
FROM (SELECT *
FROM strdent
ORDER BY sid) a
WHERE rownum <= 30
)
WHERE rn >= 20;
这里有一点需要说明,在最内层的查询中,因为是全部的记录,所以在这次查询排序后,每条记录的rownum已经确定,并在第二层的查询
中将它作为一个字段记录下来,在最外层的条件中使用。就是说在查询结果中,必须以第一次排序查询时的rownum为基准,
统一使用这时候的rownum值,结果才是正确的。如果在第二次加上条件后的查询结果,它还会有一个rownum,但是它的值已经变了,
如果用这个值,那么结果也就不是我们想要的了。
Oracle的rownum字段是个比较奇怪的字段。拿一张有26条记录的Test表来举例。
SELECT * FROM Test WHERE rownum >= 1;
SELECT * FROM Test WHERE rownum >= 2;
SELECT * FROM Test WHERE rownum <= 10;
第一条sql查出了26条记录,第二条sql一条记录也没查出。第三条sql查出10条记录。
导致这个的原因是因为rownum是个虚拟的字段,它是在记录输出的时候逐步产生的。
对第一条sql,第一条记录的rownum是1,满足条件被输出,因此第二条纪录的rownum 就变成2,满足条件被输出,依此类推,就把所有纪录都查出来了。
对于第二条sql,第一条记录的rownum是1,不满足条件没被输出,因此第二条记录的rownum还是1,没满足条件没被输出,依此类推,所有纪录都没能被查出来。
----------------------------------------------------------------
oracle数据库行列转换(面试常考)
题目:一个简单的表
CREA TE TABLE product_ma(
productNum V ARCHAR2(10), --产品编号
color V ARCHAR2(3), --产品颜色
qty NUMBER(10) --产品数量
);
INSERT INTO product_ma V ALUES('01', '红', 132);
INSERT INTO product_ma V ALUES('02', '蓝', 185);
INSERT INTO product_ma V ALUES('02', '红', 253);
INSERT INTO product_ma V ALUES('01', '蓝', 583);
INSERT INTO product_ma V ALUES('01', '红', null);
INSERT INTO product_ma V ALUES('03', '红', 132);
INSERT INTO product_ma V ALUES('03', '蓝', 89);
INSERT INTO product_ma V ALUES('03', '红', null);
INSERT INTO product_ma V ALUES('04', '红', 452);
INSERT INTO product_ma V ALUES('04', '蓝', 132);
INSERT INTO product_ma V ALUES('05', '红', 783);
Oracle BIEE官方文档学习笔记-创建RPD文件
Created By Benny_Zhou 仅为个人学习分享交流,请勿用作商业用途。 1.创建RPD 文件的物理层 物理层定义了BI 查询的数据来源。 建议通过导入数据库或者其他数据来源的元数据的方式产生物理层。 可以从已有的数据源中导入(部分)模型。 可以在物理层手工创建对象。 当你导入元数据后,很多数据源的属性会根据导入过程中收集的信息自动配置。导入之后,仍然可以定义物理数据源的其他属性,比如连接关系等。物理层可以存在包括数据库、平面文件(Flat File ),XML 文档等多个来源。 1.1 创建新的RPD 文件 打开BI 管理器-文件-新建-输入名称- 输入密码,点击下一步 1.2 导入元数据 选择连接类型为OCI 10g/11g ; 输入数据源名称orcl ,数据源名称与tnsnames.ora 中的Oracle 数据库实例名称一致; 输入用户名和密码,点击下一步; 接受默认元数据类型,点击下一步;(主键和外键是否需要导入?) 选择需要导入的表,下一步; Creating a Repository Using the Oracle BI 11gAdministration Tool/创 建RPD 文件 2014年7月8日 16:48
选择需要导入的表,下一步; 弹出连接池窗口,接受默认,下一步; 出现导入信息,导入完成后,展开查看表是否成功导入。 1.3 验证连接 选择工具-更新所有行;
更新完成后,鼠标悬停在表上,观察行信息中的更新时间; 展开表,右键查看数据; 1.4 创建别名 鼠标点在表上,右键选择新对象-别名;输入别名;输入描述。 1.5 创建键和连接 在物理层选择几个表,右键选择物理图表-仅限所选对象; 需要调整物理图表中的对象,可以再工具栏中使用放大、缩小、适合、全部隐藏、全部展开等等 点击工具栏中的新建连接,先点击F1 Revenue,然后点击D1 Time,物理外键窗口打开。 注意先点击哪个表是有关系的。连接产生了1:N的关系,将第一个表的主键列和第二个表的外键列连接。
PLSQL安装及配置
PL\SQL Developer的安装和使用一、软件安装 1、准备安装。 安装文件总共有三个,如下图所示: 2、安装PL\SQL Developer的软件。 双击安装文件plsqldev803.exe文件,进入安装阶段: 点击“确定”。 点击“I Agree”。 选择安装路径,点击“Next”。
选择“Create PL\SQL Developer shortcuts”,“Create shortcut on DeskTop”,点击“Next”。 选择“Template files”,“Keyword files”,点击“Finish”。 进入安装过程,会看到安装的进度条,等到安装完成,点击“Close”。
PL\SQL Developer安装完成。 3、安装中文包 双击打开chinese.exe中文包的安装文件,点击“确定”。 选择安装目录,点击右箭头,进入到下一步操作。 进行选项的设置,保持默认即可,点击绿色的钩,进入到安装过程。
软件安装以后,点击灰色的钩,安装完成。 4、注册软件 第一次使用PL\SQL Developer软件是需要注册的,打开”PLSQL注册码.txt”,将相应的内容填入到对应的注册界面,点击“注册”即可。
二、PL\SQL Developer的使用 (在使用PL\SQL Developer之前要保证oracle的远程连接数据库的配置是正确的。 如果配置正确,继续向下看; 如果oracle的连接远程数据库还没有配置,请跳过这节看后面“三、Oracle Net 配置”。) 1、进入系统。双击PL\SQL Developer图标,出现Oracle登陆界面: 填入正确的用户名和密码,选择好对应的数据库,并选择用户的角色,点击“确定”,即可登录成功,进入如下操作界面: 2、PL\SQL操作。下面就最常用的脚本执行操作进行介绍。 1)新建“SQL窗口”。方式有两种:一种是直接点击“文件”→”新建”→”SQL窗口”;
(Oracle数据库管理)玩转实战教程学习笔记最全版
(O管理)玩转实战教程(韩顺平)学习笔记
韩顺平—玩转oracle视频教程笔记 一:Oracle认证,与其它数据库比较,安装 oracle的卸载 1.停止所有与ORACLE相关的服务。 2. 使用OUI(Oracle Universal Installer)卸载Oracle软件。 “开始”->“程序”->“Oracle-OraDb110g_home1|Oracle installation product|Universal installer. 3.删除注册表内容。运行regedit命令,删除下面内容:HKEY_LOCAL_MACHINE|SOFTWARE|ORACLE注册表键,删除此键。 HKEY_LOCAL_MACHINE|SYSTEM|CurrentControlSet|Services,删除Services键下所有以oracle为首的键。 HKEY_LOCAL_MACHINE|SYSTEM|CurrentControlSet|Services|Eventlog|Application,删除此键下所有以oracle为首的键。 HKEY_CLASSES_ROOT,删除此键下所有以Ora,Oracle,Orcl,EnumOra 为前缀的键。 HKEY_CURRENT_USER|Software| Microsoft|Windows|CurrentVersion|Explorer|MenuOrder|Start Menu|Programs,删除此键下所有以oracle为首的键。 HKEY_LOCAL_MACHINE|SOFTWARE|ODBC|ODBCINST.INI注册表键,删除了
PLSQL Developer连虚拟机Linux下的Oracle
一、工作环境 1,本地机器操作系统为windows 7; 2,虚拟机为VM ware; 3,虚拟机操作系统为Linux,系统上已安装Oracle,并有一个实例(orcl) 二、所需工具 1,PL/SQL Developer; 2,VNC-Viewer; 3,XManager Enterprise; 三、具体步骤 1,测试本地机器与虚拟机之间的网络通畅 2,关闭Linux的防火墙 1)在linux的输入:vncserver,启动VNC服务 2)双击VNC Viewer软件,输入Linux的IP地址与端口号,点击“Connect”,输入密码连接Linux;
3)在VNC Viewwe程序中右击,选择“Open Terminal”,打开一个terminal,输入命令:setup,如果不是以root用户登录的Linux,在这里需要输入root用户的password,进入如下界面,选择“Firewall Configuration“,移动光标至“Run Tool”,回车。 4)选择“Disabled”,移动光标至“OK”,回车;
5)至此,Linux的防火墙已关闭; 3,启动数据库的监听(Listener)服务 1)先测试是否有Listener,并查看其状态,在VNC Viewer的terminal中输入:lsntctl status,查看Listener 上图显示Linux上已有Listenter 2)若无Listener,则需新建Listener,在VNC Viewer的terminal中输入:netca,新建一个Listener。如下图所示,然后下一步下一步。
ORACLE常用SQL语句大全
ORACLE常用SQL语句大全 一、基础 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:/mssql7backup/MyNwind_1.dat' --- 开始备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not nul l],..) 根据已有的表创建新表: A:select * into table_new from table_old (使用旧表创建新表) B:create table tab_new as select col1,col2… from tab_old definition only<仅适用于Oracle> 5、说明:删除表 drop table tablename
6、说明:增加一个列,删除一个列 A:alter table tabname add column col type B:alter table tabname drop column colname 注:DB2DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 7、添加主键: Alter table tabname add primary key(col) 删除主键: Alter table tabname drop primary key(col) 8、创建索引:create [unique] index idxname on tabname(col….) 删除索引:drop index idxname 注:索引是不可更改的,想更改必须删除重新建。 9、创建视图:create view viewname as select statement 删除视图:drop view viewname 10、几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 set field1=value1 where 范围 查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料! 排序:select * from table1 order by field1,field2 [desc] 总数:select count as totalcount from table1 求和:select sum(field1) as sumvalue from table1 平均:select avg(field1) as avgvalue from table1 最大:select max(field1) as maxvalue from table1 最小:select min(field1) as minvalue from table1 11、几个高级查询运算词 A:UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 B:EXCEPT 运算符 EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 C:INTERSECT 运算符 INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 注:使用运算词的几个查询结果行必须是一致的。 12、使用外连接
oracle的sqlplus学习笔记
使用SQLPLUS 可以用它运行SQL查询和PL/SQL代码块并接收结果信息 可以发布DBA命令并自动工作 可以启动和关闭数据库 一种创建数据库管理报告的便利方法 设置环境变量 在调用SQLplus前,必须正确设置oracle环境变量, 包括设置ORACLE_SID,ORACLE_HOME和LD_LIBBARY_PATH,有时还须设置NLS_LANG和ORA_NLS11 用CONNECT(conn)命令连接 CONNECT(conn)命令可以以一个不同的用户身份进行连接 例: SQL> conn scott/tiger 已连接。 SQL> connect scott/tiger 已连接。 SQL*Plus登录模式 C:\>sqlplus -h SQL*Plus: Release 10.2.0.1.0 - Production Copyright (c) 1982, 2005, Oracle. All rights reserved. 用法1: sqlplus -H | -V -H 显示SQL*Plus 版本和用法帮助。 -V 显示SQL*Plus 版本。
/NOLOG 选项可启动SQL*Plus 而不连接到 数据库。
plsql远程访问数据库 解决ora12541:TNS无监听程序
本机为win7 32位系统,为了学习oracle,装了个vbox虚拟机,再装了个win7虚拟机,内装oracle 11g(win7如果要装10g,要选择vista版本,win版本会安装报错).oracle11g安装完后有报了个错误,当时没注意,现在也忘了什么错了,但是不影响使用.后来想在本机安装plsql来远程连接虚win7上的oracle.查了一些资料,步骤如下: 1.下载plsql,安装. 2.下载Instant Client,点击下载,下载第一个basic就行了,下载完解压缩,以放到主win7 d盘根目录为 例:d:\instantclient_11_2 3.在d:\instantclient_11_2新建tnsnames.ora,用记事本编辑. 4.到虚win7上的oracle安装目录找到…\app\admin\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora,打开,比如数据库实例是orcl,找到如下代码,拷贝到本机d:\instantclient_11_2\tnsnames.ora里 ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 虚拟机IP)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) 5.添加一个环境变量,名为TNS_ADMIN,值为tnsnames.ora文件所在路径d:\instantclient_11_2\tnsnames.ora,plsql通过这个找到orcl连接字符串 6.添加一个环境变量NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16GBK 7.打开PLSQL,不用登陆,工具-首选项-ORACLE-连接: 勾选检查连接 Oracle主目录: d:\instantclient_11_2 OCI库: d:\instantclient_11_2\oci.dll 经过以上几步之后,重启PLSQL,问题来了,报错:ora-12541:TNS:无监听程序. ping是可以ping得通的,虚win7上的监听也开着.经过不懈的努力,多次试验终于解决了: 1.虚拟机网络选择桥接,并在虚拟机内网络连接IPV4设置静态IP IP地址:192.168.1.111 (111可修改成自己的 1-255) 子网掩码:255.255.255.0 默认风头:192.168.1.1 首选DNS服务器:192.168.1.1 修改完记得主win7上 ping 192.168.1.111 ping得通再继续往后.
Oracle数据库基本知识点
1、数据库基本语句 (1)表结构处理 创建一个表:cteate table 表名(列1 类型,列2 类型); 修改表的名字 alter table 旧表名 rename to 新表名 查看表结构 desc 表名(cmd) 添加一个字段 alter table 表名 add(列类型); 修改字段类型 alter table 表名 modify(列类型); 删除一个字段 alter table 表名 drop column列名; 删除表 drop table 表名 修改列名 alter table 表名 rename column 旧列名 to 新列名; (2)表数据处理 增加数据:insert into 表名 values(所有列的值); insert into 表名(列)values(对应的值); 更新语句:update 表 set 列=新的值,…[where 条件] 删除数据:delete from 表名 where 条件 删除所有数据,不会影响表结构,不会记录日志, 数据不能恢复--》删除很快: truncate table 表名 删除所有数据,包括表结构一并删除: drop table 表名 去除重复的显示:select distinct 列 from 表名 日期类型:to_date(字符串1,字符串2)字符串1是日期的字 符串,字符串2是格式 to_date('1990-1-1','yyyy-mm-dd')-->返回日期的 类型是1990-1-1 (3)查询语句 1)内连接 select a.*,b.* from a inner join b on a.id=b.parent_id
oracle笔记七(其他)
1.如何限定特定IP访问数据库 可以利用登录触发器、cmgw或者是在$OREACLE_HOME/network/admin下新增一个protocol.ora文件(有些os可能是. protocol.ora),9i可以直接修改sqlnet.ora: 增加如下内容: tcp.validnode_checking=yes #允许访问的ip tcp.inited_nodes=(ip1,ip2,...) #不允许访问的ip tcp.excluded_nodes=(ip1,ip2,...) 2.如何穿过防火墙连接数据库 这个问题只会在WIN平台出现,UNIX平台会自动解决。 解决方法: 在服务器端的SQLNET.ORA应类似 SQLNET.AUTHENTICATION_SERVICES= (NTS) NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME) TRACE_LEVEL_CLIENT = 16 注册表的HOME0加[HKEY_LOCAL_MACHINE] USE_SHARED_SOCKET=TRUE 3.如何利用hostname方式连接数据库 host name方式只支持tcp/ip协议的小局域网 修改listener.ora中的如下信息 (SID_DESC = (GLOBAL_DBNAME = ur_hostname) --你的机器名 (ORACLE_HOME = E:\oracle\ora92) --oracle home (SID_NAME = orcl) --sid name ) 然后在客户端 的sqlnet.ora中,确保有 NAMES.DIRECTORY_PATH= (HOSTNAME) 你就可以利用数据库服务器的名称访问数据库了 4.dbms_repcat_admin能带来什么安全隐患 如果一个用户能执行dbms_repcat_admin包,将获得极大的系统权限。 以下情况可能获得该包的执行权限: 1、在sys下grant execute on dbms_repcat_admin to public[|user_name] 2、用户拥有execute any procedure特权(仅限于9i以下,9i必须显示授权) 如果用户通过执行如下语句: exec sys.dbms_repcat_admin.grant_admin_any_schema('user_name'); 该用户将获得极大的系统特权 可以从user_sys_privs中获得详细信息
用PLSQL远程连接Oracle数据库
PL/SQL Developer 远程连接Oracle数据库 1、配置服务器tnsnames.ora文件,如果本机上没有安装oracle,可以从安 装了oracle的机上拷贝一个(tnsnames.ora文件)放在指定目录下,因为我已安装oracle,所以直接配置该文件。 # tnsnames.ora Network Configuration File: D:\Oracle11g\product\11.2.0\dbhome_1\network\admin\tnsnames.ora # Generated by Oracle configuration tools. LISTENER_ORCL = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) ORACLR_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) (CONNECT_DATA = (SID = CLRExtProc) (PRESENTATION = RO) ) ) ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.25.224)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) orcl为远程Oracle数据库的实例名,IP地址和端口也要配置正确。 2、配置完成后,Oracle客户端应该可以连接到远程Oracle 数据库上。
Oracle数据库学习笔记
Oracle数据库学习笔记 作者:高达 第一天: DBMS--数据库管理系统: Date base Manage System 数据模型: (1)层次模型类似于“倒树”型的结构 (2)网状模型 (3)关系模型RDBMS--Relation Date base System 记录和记录之间通过属性之间的关系来进行连接,保证数据独立性,并形成数据集之间的关系。 主键:关键词--PRIMARY KEY 用于行的区分,不会重复。主键可以由两列组成,叫做组合键。主键非空。如果为空则失去实体完整性。 外键:关键词--FOREIGN KEY 外键表示两个表之间的相关联系。外键的范围不能超过主键的范围,如果超过则失去引用完整性。 完整性: 是为保证数据库中数据的正确性和一致性。 (1).实体完整性: 数据行不能存在重复,也不能为空。即PK不重复不为空。
(2).引用完整性: 指建立两个关系建立联系的主外键的约束 1.要求子表中的相关项必须在主表中存在。 2.如果建立了主表和子表的关系,则:a.子表中的相关项目的数据,在主表中必须存在;b.主表中相关项的数据更改了,则子表对应的数据项也应当随之更改;c.在删除子表之前,不能够删除主表。 (3).域完整性: 保证表中数据的合理性 check 检查 default 默认 not null 不为空 unique 唯一约束 (4).自定义完整性: 根据用户需要自己定义。除了上述关键字,可以使用触发器来编写约束。 约束:关键词--CONSTRAINT 在创建表的时候添加约束。 目的: 确保表中数据的完整型 常用约束类型: 主键约束(Primary Key Constraint):要求主键列数据唯一,并且不允许为空。 唯一约束(Unique Constraint):要求该列唯一,允许为空,但只能出现一个空值。 检查约束(Check Constraint):某列取值范围限制、格式限制等,如有关年龄的约束。 默认约束(Default Constraint):某列的默认值,如我们的男性学员较多,性别默认为“男”。外键约束(Foreign Key Constraint):用于两表间建立关系,需要指定引用主表的哪列。 不为空(not null):不可以为空。
Oracle数据库远程连接设置的四种方法
Oracle数据库远程连接设置的四种方法 Oracle数据库的远程连接可以通过多种方式来实现,本文我们主要介绍四种远程连接的方法和注意事项,并通过示例来说明,接下来我们就开始介绍。 第一种情况: 若oracle服务器装在本机上,那就不多说了,连接只是用户名和密码的问题了。不过要注意环境变 量%ORACLE_HOME%/network/admin/是否设置。 第二种情况: 本机未安装oracle服务器,也未安装oracle客户端。但是安装了pl sql development、toad sql development、sql navigator等管理数据库的工具。在虚拟机或者另一台电脑上安装了oracle服务器,也就是虚拟机或者另一台电脑此时作为服务器。 这种情况下,本人以pl sql development远程连接ORACLE服务端数据库为例: 1、在安装oracle服务器的机器上搜索下列文件: ?oci.dll ?ocijdbc10.dll ?ociw32.dll ?orannzsbb10.dll ?oraocci10.dll ?oraociei10.dll ?sqlnet.ora ?tnsnames.ora ?classes12.jar ?ojdbc14.jar 把这些找到的文件复制放到一个文件夹,如 oraclient,将此文件夹复制到客户端机器上。如放置路径为 D:oraclient。 2、配置tnsnames.ora,修改其中的数据库连接串。 1.oracledata = 2. 3.(DESCRIPTION = 4. 5.(ADDRESS_LIST = 6. 7.(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.58)(PORT = 1521)) 8. 9.(CONNECT_DATA =
Oracle数据库期末复习知识点整理
基础知识 表3.2 Oracle数据类型
表3.3 XSB的表结构
操作表 创建表 CREATE TABLE [schema.] table_name ( column_namedatatype [DEFAULT expression] [column_constraint][,…n]
oracle数据库学习笔记心得
select* |字段表名 from 表名 where 布尔表达式【条件】 externalcandidate 职员相关信息 contractrecruiter 猎头公司 查看表里所有字段 describe[描述] contractrecruiter select cname,nperecentagecharge from contractrecruiter 不显示原来名字,显示现在名字【用AS】 select cname as "Recruiter Name",nperecentagecharge as "Hire Fees" from contractrecruiter 不显示原来名字,显示现在名字【可不用AS】 select cname "Recruiter Name",nperecentagecharge "Hire Fees" from contractrecruiter 【双引号是否写】 双引号是为了区分大小写 职位表 position select *from position 缺额运算:[想减] select VDESCRIPTION , nbudgetedstrength, NBUDGETEDSTRENGTH -NCURRENTSTRENGTH , NYEAR from position
select VDESCRIPTION "Potion", nbudgetedstrength "Budgeted Strength" , NBUDGETEDSTRENGTH -NCURRENTSTRENGTH "Vacancies", NYEAR "Year" from position 显示非重复运行 查询来源地的人数 describe externalcandidate 查看职员城市名字 select ccity from externalcandidate 查看职员城市名字【名字不重复,插入一个关键字:distinct】select distinct ccity,cstate from externalcandidate 运算符: 两列 select vfirstname,vlastname from externalcandidate 字段拼接 select vfirstname||vlastname from externalcandidate select vfirstname||' '||vlastname from externalcandidate 学校 describe college 查看所有学校 select *from college 查看只是加利福尼亚的学校 select * from college where cstate='California' 一个条件 select vfirstname,vlastname,dbirthdate,ntestscore from externalcandidate where dbirthdate>='01-1月-70'
PLSQL Developer连接本地Oracle11g 64位数据库无链接为
1.登录PL/SQL Developer 这里省略Oracle数据库和PL/SQL Developer的安装步骤,注意在安装PL/SQL Developer软件时,不要安装在Program Files (x86)目录下,不然无法启动PL/SQL Developer。 奇怪这里为什么选择不到数据库的TNS呢?我是先安装数据库,再安装 PL/SQL Developer。按理说安装PL/SQL Developer时,就已经识别到了Oracle Home 和OCI Libaray了。管它呢?先以非登录方式登录PL/SQL Developer,设置Oracle Home和OCI Libaray。 在Oracle Home这选项下,没有自动识别到Oracle Home目录,于是手动指定Oracle Home路径。
点击“确定”,退出PL/SQL Developer,再次登录。 还是选择不到数据库TNS,尝试无数据库登录,看看报什么错误。
终于找到问题的关键点了,安装的PL/SQL Deleloper只能识别32的oci.dll。看来是要安个64位的PL/SQL Deleloper,于是在网上搜索PL/SQL Deleloper 64位版本。然而发现PL/SQL Deleloper不区分64位和32位。那看来只能从oci.dll入手了。根据上面的报错信息来看,似乎只要安装一个32位版本的Oracle Client。 2.安装oracle Clinet 首先到Oracle官网上去下载一个Oracle 11g Client,不过需要先申请一个Oracle 帐号,才能下载。 目前下载地址: https://www.360docs.net/doc/e615198058.html,/technetwork/database/features/instant-client/index-0 97480.html 这个一个绿色版的Oracle Client,因此只要需要解压了,就可以是。将下载的Oracle Client文件instantclient-basic-win32-11.2.0.1.0.zip解压到C盘(注意啦!不能下64位的)。然后在解压后的C:\instantclient_11_2目录下新建NETWORK\ADMIN目录,在ADMIN目录下新建tnsnames.ora文件,添加数据库TNS。
Oracle数据库技术课程学习大纲详细
《现代数据库技术》教学大纲 课程名称:《现代数据库技术》 课程编号:学时数:56 学分数:3.5 适应专业:计算机与信息学院所有专业 一、本课程的地位、任务和作用 现代数据库技术是计算机在数据处理应用领域中的主要内容和坚实基础;也是今后若干年内研究和应用的最活跃的分支之一。因此,信息管理、软件开发、计算机等专业的学生,特别是以应用为目标的学生都必须学习和具备数据库原理与应用的知识。本课程通过介绍Oracle数据库基本操作、体系结构与数据库基本管理使学生初步掌握大型数据库的基本原理,了解大型数据库的管理方法。了解大型数据库的管理方法,使学生熟练掌握Oracle数据库系统下的SQL语言运用及PL/SQL程序设计。 本课程是一门理论和实践相结合的课程,要求学生在完成本课程的学习以后,能够结合自己所熟悉的某一门高级语言和Oracle,开发出一个小型的数据库应用系统。 二、本课程的相关课程 本课程的先修课程为《计算机组成原理》,《离散数学》,《数据结构》,《计算机网络》及《数据库原理》等课程。 三、本课程的基本内容及要求 教学内容: 第一章数据库概述(2学时) 1、教学内容: 1.1数据库基础知识 1.2关系数据库系统 1.3 Oracle基础知识 (1)Oracle的发展历史 (2)Oracle的特点 第二章O racle体系结构(6学时) 1、教学内容: 2.1 Oracle 体系结构概述 2.2Oracle的存储结构 (1)物理存储结构 (2)逻辑存储结构 2.3Oracle的实例 (1)Oracle内存结构
(2)Oracle进程 2.4数据字典 2、教学重点:Oracle的物理结构、oracle实例、Oracle的逻辑结构 3、教学难点:数据库实例与进程 第三章O racle11g的安装(2学时) 1、教学内容: 3.1 Oracle 11g环境介绍 3.2Oracle 11g for Windows的安装 (1)安装Oracle 11g服务器 (2)Oracle 11g与Windows (3)安装Oracle 11g客户端 3.3 Oracle 11g 的卸载 2、教学重点:学会Oracle的安装 第四章O RACLE数据库管理工具及网络配置(2学时) 1、教学内容: 4.1 SQL*Plus命令 (1)设置SQL*Plus 运行环境 (2)常用SQL*Plus命令 (3)格式化查询结果 4.2 Oracle企业管理器 4.3 数据库配置助手 4.4 启动与关闭oracle实例 2、教学重点:学会使用SQL*Plus 第五章S QL语言基础(5学时) 1、教学内容: 5.1SQL简介 5.2SQL的基本语法 5.3数据查询语言 5.4数据操纵语言 5.5数据定义语言 5.6数据控制语言 5.7常用函数 5.8 事务处理 2、教学重点:数据查询语言、数据操纵语言、数据定义语言、数据控 制语言 3、教学难点:SQL的基本语法 第六章P L/SQL编程(8学时)(课本第6,7章) 1、教学内容: 6.1PL/SQL基础 (1)变量及声明 (2)数据类型 (3)表达式 (4)PL/SQL程序块结构 6.2PL/SQL控制结构
oracle数据库工作原理
oracle工作原理 (2007-05-18 08:47:40) 转载▼ 分类:计算机技术 第一篇Oracle架构总览 先让我们来看一张图 这张就是Oracle 9i的架构全图。看上去,很繁杂。是的,是这样的。现在让我们来梳理一下: 一、数据库、表空间、数据文件 1.数据库 数据库是数据集合。Oracle是一种数据库管理系统,是一种关系型的数据库管理系统。 通常情况了我们称的“数据库”,并不仅指物理的数据集合,他包含物理数据、数据库管理系统。也即物理数据、内存、操作系统进程的组合体。 数据库的数据存储在表中。数据的关系由列来定义,即通常我们讲的字段,每个列都有一个列名。数据以行(我们通常称为记录)的方式存储在表中。表之间可以相互关联。以上就是关系模型数据库的一个最简单的描述。 当然,Oracle也是提供对面象对象型的结构数据库的最强大支持,对象既可以与其它对象建立关系,也可以包含其它对象。关于OO型数据库,以后利用专门的篇幅来讨论。一般情况下我们的讨论都基于关系模型。 2.表空间、文件 无论关系结构还是OO结构,Oracle数据库都将其数据存储在文件中。数据库结构提供对数据文件的逻辑映射,允许不同类型的数据分开存储。这些逻辑划分称作表空间。
表空间(tablespace)是数据库的逻辑划分,每个数据库至少有一个表空间(称作SYSTEM表空间)。 为了便于管理和提高运行效率,可以使用一些附加表空间来划分用户和应用程序。例如:USER表空间供一般用户使用,RBS表空间供回滚段使用。一个表空间只能属于一个数据库。 每个表空间由同一磁盘上的一个或多个文件组成,这些文件叫数据文件(datafile)。一个数据文件只能属于一个表空间。在Oracle7.2以后,数据文件创建可以改变大小。创建新的表空间需要创建新的数 据文件。 数据文件一旦加入到表空间中,就不能从这个表空间中移走,也不能与其它表空间发生联系。 如果数据库存储在多个表空间中,可以将它们各自的数据文件存放在不同磁盘上来对其进行物理分割。在规划和协调数据库I/O请求的方法中,上述的数据分割是一种很重要的方法。数据库、表空间、文件之间的关系如下图所示: 二、数据库实例 为了访问数据库中的数据,Oracle使用一组所有用户共享的后台进程。此外,还有一些存储结构(统 称为System Gloabl Area,即SGA),用来存储最近从数据库查询的数据。数据块缓存区和SQL共享池(Shared SQL Pool)是SGA的最大部分,一般占SGA内存的95%以上。通过减少对数据文件的I/O次数,这些存储区域可以改善数据库的性能。 数据库实例(instance)也称作服务器(server),是用来访问数据库文件集的存储结构及后台进程的集合。一个数据库可以被多个实例访问(这是Oracle并行服务器选项)。实例与数据库的关系如下图所示: 决定实例大小及组成的参数存储的init.ora文件中(在9i中是spfile)。实例启动时需要读这个文件,并且在运行时可以由数据库管理员修改。对该文件的任何修改都只有在下一次启动时才启作用。实例的init.ora文件件通常包含实例的名字:如果一个实例名为orcl,那么init.ora文件通常被命名为initorcl.ora。另一个配置文件config.ora用来存放在数据库创建后就不再改变的变量值(如数据库的块 大小)。实例的config.ora文件通常也包含该实例的名字:如果实例的名字为orcl,则config.ora一般 将被命名为configorcl.ora。为了便于使用config.ora文件的设置值,在实例的init.ora文件中,该文件必须通过IFILE参数作为包含文件列出。