现在的位置: 首页 > 综合 > 正文

Oracle使用sql技巧

2014年03月08日 ⁄ 综合 ⁄ 共 9610字 ⁄ 字号 评论关闭

自增主键是MySQL中的一个特性。
在Oracle中需要创建序列

CREATE SEQUENCE s_userId--s_userId自动增长列
 
      INCREMENT BY -- 每次加几个
 
      START WITH -- 从1开始计数
 
      NOMAXVALUE -- 不设置最大值
 
      NOCYCLE -- 一直累加,不循环
 
      NOCACHE -- 不建缓冲区  3.建立触发器:

create sequence seq_lu --seq_lu是序列名
start with 1         ---表示从1开始自增
increment by 1       ---表示步长为1,如果为2就每次加2
maxvalue  9999       ---表示最大值,此行可以不写,无限下去
nocycle              ----表示不循环

就按这个代码执行就可以,啥都不用加

在插入值得时候 insert into tablename values(seq_lu.nextval,'aa','bb');  


在oracle一个用户就是一个数据库

超级管理员登录:(不用输入密码)

sqlpuls  /as  sysdba

解锁用户:

alter user username account unlock;

如解锁scott用户:alter user scott
account unlock;

在解锁用户时,也可以修改该用户的密码:

alter user user_name identified by new_password account unlock;


修改密码:

alter user user_name identified by password;

如:修改scott用户的密码:alter
user scott identified by 123456;


创建新用户:(创建用户时一定要给予权限,至少也要给予一个会话权限)

create user user_nameidentified
by password;

使用如下sql语句给用户赋权限

grant create session to User_Name;(UserName是登录出错的用户名)

如创建一个lili用户,密码为123456:

create
user lili
identified by 123456;

grant
create session to lili;

给予角色权限:

grant
connect to lili;

grant
resource to lili;

grant
dba to lili;(超级管理权限)

grant
sysdba to lili;(超级管理权限)

grantconnect,resource
to lili;


不能给与用户过多的权限。例如:grant dba to user;

1.grant create session to test;--赋予create session的权限

2.grant create table,create view,create trigger, createsequence,create procedure to test;--分配创建表,视图,触发器,序列,过程权限

3.grant unlimited tablespace to test; --授权使用表空间





Oracle安装会自动的生成sys用户和system用户:

(1)      sys用户是超级用户,具有最高权限,具有sysdba角色,有create database的权限,该用户默认的密码是change_on_install

(2)      system用户是管理操作员,权限也很大。具有sysoper角色,没有create database的权限,默认的密码是manager

(3)      一般讲,对数据库维护,使用system用户登录就可以拉

也就是说syssystem这两个用户最大的区别是在于有没有createdatabase的权限。

 

二:Oracle的基本使用--基本命令

sql*plus的常用命令
连接命令

1.conn[ect]  
用法:conn 用户名/密码@网络服务名[as sysdba/sysoper]当用特权用户身份连接时,必须带上as sysdba或是as sysoper
2.disc[onnect]
说明: 该命令用来断开与当前数据库的连接
3.psssw[ord]
说明: 该命令用于修改用户的密码,如果要想修改其它用户的密码,需要用sys/system登录。
4.show user
说明: 显示当前用户名
5.exit
说明: 该命令会断开与数据库的连接,同时会退出sql*plus
文件操作命令
1.start和@

说明: 运行sql脚本
案例: sql>@ d:\a.sql或是sql>startd:\a.sql
2.edit
说明: 该命令可以编辑指定的sql脚本
案例: sql>edit d:\a.sql,这样会把d:\a.sql这个文件打开
3.spool
说明: 该命令可以将sql*plus屏幕上的内容输出到指定文件中去。
案例: sql>spool d:\b.sql 并输入sql>spool off
交互式命令
1.&

说明:可以替代变量,而该变量在执行时,需要用户输入。
select * from emp where job='&job';
2.edit
说明:该命令可以编辑指定的sql脚本
案例:SQL>edit d:\a.sql
3.spool
说明:该命令可以将sql*plus屏幕上的内容输出到指定文件中去。
spool d:\b.sql 并输入 spool off
显示和设置环境变量

概述:可以用来控制输出的各种格式,set show如果希望永久的保存相关的设置,可以去修改glogin.sql脚本

1.linesize

说明:设置显示行的宽度,默认是80个字符

show linesize

set linesize 90

2.pagesize说明:设置每页显示的行数目,默认是14

用法和linesize一样

至于其它环境参数的使用也是大同小异

 

三:oracle用户管理

oracle用户的管理
创建用户
概述:在oracle中要创建一个新的用户使用create user语句,一般是具有dba(数据库管理员)的权限才能使用。
create user 用户名 identifiedby 密码; (oracle有个毛病,密码必须以字母开头,如果以字母开头,它不会创建用户)
给用户修改密码
概述:如果给自己修改密码可以直接使用
password 用户名
如果给别人修改密码则需要具有dba的权限,或是拥有alter user的系统权限
SQL> alter user 用户名 identified by 新密码
 删除用户
概述:一般以dba的身份去删除某个用户,如果用其它用户去删除用户则需要具有drop user的权限。
比如 drop user 用户名 【cascade】
在删除用户时,注意:
如果要删除的用户,已经创建了表,那么就需要在删除的时候带一个参数cascade;
用户管理的综合案例
概述:创建的新用户是没有任何权限的,甚至连登陆的数据库的权限都没有,需要为其指定相应的权限。给一个用户赋权限使用命令grant,回收权限使用命令revoke。
为了给讲清楚用户的管理,这里我给大家举一个案例。
SQL> conn xiaoming/m12;
ERROR:
ORA-01045: user XIAOMING lacks CREATE SESSION privilege; logon denied
警告: 您不再连接到 ORACLE。
SQL> show user;
USER 为 ""
SQL> conn system/p;
已连接。
SQL> grant connect to xiaoming;
授权成功。
SQL> conn xiaoming/m12; //后面的为密码分开来输入。
已连接。
SQL>
注意:grantconnect to xiaoming;在这里,准确的讲,connect不是权限,而是角色。。 看图:

现在说下对象权限,现在要做这么件事情:
* 希望xiaoming用户可以去查询emp表
* 希望xiaoming用户可以去查询scott的emp表
  grant select on emp to xiaoming
* 希望xiaoming用户可以去修改scott的emp表
  grant update on emp to xiaoming
* 希望xiaoming用户可以去修改/删除,查询,添加scott的emp表
  grant all on emp to xiaoming
* scott希望收回xiaoming对emp表的查询权限
  revoke select on emp from xiaoming

//对权限的维护。
* 希望xiaoming用户可以去查询scott的emp表/还希望xiaoming可以把这个权限继续给别人。
--如果是对象权限,就加入with grant option
  grant select on emp to xiaoming with grant option
我的操作过程:
SQL> conn scott/tiger;
已连接。
SQL> grant select on scott.emp to xiaoming with grant option;
授权成功。
SQL> conn system/p;
已连接。
SQL> create user xiaohong identified by m123;
用户已创建。
SQL> grant connect to xiaohong;
授权成功。
SQL> conn xiaoming/m12;
已连接。
SQL> grant select on scott.emp to xiaohong;
授权成功。

 

--如果是系统权限。
system给xiaoming权限时:
grant connect to xiaoming with admin option

问题:如果scott把xiaoming对emp表的查询权限回收,那么xiaohong会怎样?
答案:被回收。

下面是我的操作过程:
SQL> conn scott/tiger;
已连接。
SQL> revoke select on emp from xiaoming;
撤销成功。
SQL> conn xiaohong/m123;
已连接。
SQL> select * from scott.emp;
select * from scott.emp
第 1 行出现错误:
ORA-00942: 表或视图不存在

结果显示:小红受到诛连了。

使用profile管理用户口令
概述:profile是口令限制,资源限制的命令集合,当建立数据库的,oracle会自动建立名称为default的profile。当建立用户没有指定profile选项,那么oracle就会将default分配给用户。
1.账户锁定
概述:指定该账户(用户)登陆时最多可以输入密码的次数,也可以指定用户锁定的时间(天)一般用dba的身份去执行该命令。
例子:指定scott这个用户最多只能尝试3次登陆,锁定时间为2天,让我们看看怎么实现。
创建profile文件
SQL> create profile lock_account limit failed_login_attempts 3password_lock_time 2;
SQL> alter user scott profile lock_account;
2.给账户(用户)解锁
SQL> alter user tea account unlock;
3.终止口令
为了让用户定期修改密码可以使用终止口令的指令来完成,同样这个命令也需要dba的身份来操作。
例子:给前面创建的用户tea创建一个profile文件,要求该用户每隔10天要修改自己的登陆密码,宽限期为2天。看看怎么做。
SQL> create profile myprofile limit password_life_time 10password_grace_time 2;
SQL> alter user tea profile myprofile;

口令历史
概述:如果希望用户在修改密码时,不能使用以前使用过的密码,可使用口令历史,这样oracle就会将口令修改的信息存放到数据字典中,这样当用户修改密码时,oracle就会对新旧密码进行比较,当发现新旧密码一样时,就提示用户重新输入密码。
例子:
1)建立profile
SQL>create profile password_history limit password_life_time 10password_grace_time 2 password_reuse_time 10
password_reuse_time //指定口令可重用时间即10天后就可以重用
2)分配给某个用户
删除profile
概述:当不需要某个profile文件时,可以删除该文件。
SQL> drop profile password_history 【casade】
注意:文件删除后,用这个文件去约束的那些用户通通也都被释放了。

加了casade,就会把级联的相关东西也给删除掉

 

四:oracle表的管理(数据类型,表创建删除,数据CRUD操作)

oracle的表的管理

表名和列的命名规则

  • 必须以字母开头
  • 长度不能超过30个字符
  • 不能使用oracle的保留字
  • 只能使用如下字符 A-Z,a-z,0-9,$,#等

oracle支持的数据类型
字符类
char
    定长 最大2000个字符。
例子:char(10) ‘小韩’前四个字符放‘小韩’,后添6个空格补全如‘小韩’
varchar2(20)  变长  最大4000个字符。
例子:varchar2(10) ‘小韩’ oracle分配四个字符。这样可以节省空间。
clob(character large object) 字符型大对象 最大4G
char 查询的速度极快浪费空间,查询比较多的数据用。
varchar 节省空间

数字型
number范围 -10的38次方 到 10的38次方
可以表示整数,也可以表示小数
number(5,2)
表示一位小数有5位有效数,2位小数
范围:-999.99到999.99
number(5)
表示一个5位整数
范围99999到-99999

日期类型
date 包含年月日和时分秒   oracle默认格式  1-1月-1999
timestamp 这是oracle9i对date数据类型的扩展。可以精确到毫秒。
图片
blob 二进制数据 可以存放图片/声音 4G   一般来讲,在真实项目中是不会把图片和声音真的往数据库里存放,一般存放图片、视频的路径,如果安全需要比较高的话,则放入数据库。

怎样创建表
 建表
--学生表
create table student (    ---表名
         xh       number(4),   --学号
          xm   varchar2(20),   --姓名
         sex      char(2),     --性别
          birthday date,        --出生日期
         sal      number(7,2)   --奖学金
);

--班级表
CREATE TABLE class(
    classId NUMBER(2),
    cName VARCHAR2(40)

);

修改表
 添加一个字段

SQL>ALTER TABLE student add (classId NUMBER(2));
修改一个字段的长度
SQL>ALTER TABLE student MODIFY (xm VARCHAR2(30));
修改字段的类型/或是名字(不能有数据) 不建议做
SQL>ALTER TABLE student modify (xm CHAR(30));
删除一个字段  不建议做(删了之后,顺序就变了。加就没问题,应为是加在后面)
SQL>ALTER TABLE student DROP COLUMN sal;
 修改表的名字  很少有这种需求
SQL>RENAME student TO stu;
 删除表
SQL>DROP TABLE student;

添加数据
所有字段都插入数据
INSERT INTO student VALUES ('A001', '张三', '男', '01-5月-05', 10);
oracle中默认的日期格式‘dd-mon-yy’ dd日子(天) mon 月份  yy  2位的年  ‘09-6月-99’ 1999年6月9日
修改日期的默认格式(临时修改,数据库重启后仍为默认;如要修改需要修改注册表)
ALTER SESSION SET NLS_DATE_FORMAT ='yyyy-mm-dd';
修改后,可以用我们熟悉的格式添加日期类型:
INSERT INTO student VALUES ('A002', 'MIKE', '男', '1905-05-06',10);
 插入部分字段
INSERT INTO student(xh, xm, sex) VALUES ('A003', 'JOHN', '女');
 插入空值
INSERT INTO student(xh, xm, sex, birthday) VALUES ('A004', 'MARTIN', '男', null);
问题来了,如果你要查询student表里birthday为null的记录,怎么写sql呢?
错误写法:select * from student where birthday = null;
正确写法:select * from student where birthday is null;
如果要查询birthday不为null,则应该这样写:
select * from student where birthday is not null;

修改数据
修改一个字段

UPDATE student SET sex = '女' WHERE xh = 'A001';
修改多个字段
UPDATE student SET sex = '男', birthday = '1984-04-01'WHERE xh = 'A001';
修改含有null值的数据
不要用 = null 而是用 is null;
SELECT * FROM student WHERE birthday IS null;

删除数据
DELETE FROM student;
删除所有记录,表结构还在,写日志,可以恢复的,速度慢。
Delete 的数据可以恢复。
savepoint a; --创建保存点
DELETE FROM student;
rollback to a;  --恢复到保存点
一个有经验的DBA,在确保完成无误的情况下要定期创建还原点。
DROP TABLE student; --删除表的结构和数据;
delete from student WHERE xh = 'A001'; --删除一条记录;
truncate TABLE student; --删除表中的所有记录,表结构还在,不写日志,无法找回删除的记录,速度快。

 

五:oracle表查询(1)

oracle表基本查询
介绍

在我们讲解的过程中我们利用scott用户存在的几张表(emp,dept)为大家演示如何使用select语句,select语句在软件编程中非常有用,希望大家好好的掌握。
emp 雇员表
clerk  普员工
salesman 销售
manager  经理
analyst 分析师
president  总裁
mgr  上级的编号
hiredate 入职时间
sal 月工资
comm 奖金
deptno 部门
dept部门表
deptno 部门编号
accounting 财务部
research  研发部
operations 业务部
loc 部门所在地点
salgrade   工资级别
grade    级别
losal    最低工资
hisal    最高工资

简单的查询语句
查看表结构

DESC emp;
查询所有列
SELECT * FROM dept;
切忌动不动就用select*
SET TIMING ON; 打开显示操作时间的开关,在下面显示查询时间。
CREATE TABLE users(userId VARCHAR2(10), uName VARCHAR2 (20), uPasswVARCHAR2(30));
INSERT INTO users VALUES('a0001', '啊啊啊啊', 'aaaaaaaaaaaaaaaaaaaaaaa');
--从自己复制,加大数据量 大概几万行就可以了  可以用来测试sql语句执行效率
INSERT INTO users (userId,UNAME,UPASSW) SELECT * FROM users;
SELECT COUNT (*) FROM users;统计行数

 查询指定列
SELECT ename, sal, job, deptno FROM emp;
 如何取消重复行DISTINCT
SELECT DISTINCT deptno, job FROM emp;
查询SMITH所在部门,工作,薪水
SELECT deptno,job,sal FROM emp WHERE ename = 'SMITH';
注意:oracle对内容的大小写是区分的,所以ename='SMITH'和ename='smith'是不同的

 使用算术表达式 nvl  null
问题:如何显示每个雇员的年工资?
SELECT sal*13+nvl(comm, 0)*13 "年薪" , ename, comm FROM emp;
 使用列的别名
SELECT ename "姓名", sal*12 AS "年收入" FROM emp;
 如何处理null值
使用nvl函数来处理
 如何连接字符串(||)
SELECT ename  || ' is a ' || job FROM emp;
 使用where子句
问题:如何显示工资高于3000的 员工?
SELECT * FROM emp WHERE sal > 3000;
问题:如何查找1982.1.1后入职的员工?

SELECT ename,hiredate FROM emp WHERE hiredate >'1-1月-1982';
问题:如何显示工资在2000到3000的员工?
SELECT ename,sal FROM emp WHERE sal >=2000 AND sal <= 3000;

 如何使用like操作符
%:表示0到多个字符  _:表示任意单个字符
问题:如何显示首字符为S的员工姓名和工资?
SELECT ename,sal FROM emp WHERE ename like 'S%';
如何显示第三个字符为大写O的所有员工的姓名和工资?
SELECT ename,sal FROM emp WHERE ename like '__O%';

 在where条件中使用in
问题:如何显示empno为7844, 7839,123,456 的雇员情况?
SELECT * FROM emp WHERE empno in (7844, 7839,123,456);
 使用is null的操作符
问题:如何显示没有上级的雇员的情况?
错误写法:select *from emp where mgr = '';
正确写法:SELECT *FROM emp WHERE mgr is null;

 

六:oracle表查询(2)

使用逻辑操作符号
问题:查询工资高于500或者是岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J?
SELECT * FROM emp WHERE (sal >500 or job = 'MANAGER') and ename LIKE 'J%';
 使用order by 字句   默认asc
问题:如何按照工资的从低到高的顺序显示雇员的信息?
SELECT * FROM emp ORDER by sal;
问题:按照部门号升序而雇员的工资降序排列
SELECT * FROM emp ORDER by deptno, sal DESC;

使用列的别名排序

问题:按年薪排序
select ename, (sal+nvl(comm,0))*12 "年薪" from emp order by "年薪" asc;
别名需要使用“”号圈中,英文不需要“”号

 分页查询
等学了子查询再说吧。。。。。。。。

Clear 清屏命令

oracle表复杂查询
 说明
在实际应用中经常需要执行复杂的数据统计,经常需要显示多张表的数据,现在我们给大家介绍较为复杂的select语句

数据分组 ——max,min, avg, sum, count
问题:如何显示所有员工中最高工资和最低工资?
SELECT MAX(sal),min(sal) F

抱歉!评论已关闭.