【ORACLE-学习笔记】 常用命令

//***************************** Day1:基础操作和数据库安全 ***********************************

// 基本操作

进入SQL*plus:

SQLPLUS - > user和password

查看当看的用户:

SHOW USER;

查看数据库里面的数据库表:

SELECT table_name FROM user_tables;

修改自身的密码:

PASSW

退出/断开:

EXIT/DISC

切换用户:

CONN user/password

// 用户管理

创建用户:

CREATE USER user IDENTIFIED BY password;

修改用户密码:

PASSWORD user;

修改用户:

ALTER USER user IDENTIFIED BY newpassword

删除用户:

DROP USER user [CASCADE]

// 权限管理(系统权限、对象)

授予系统权限(对系统级的操作):

GRANT system_privilege|ALL_PRIVILEGES TO user|role

授予对象权限(对表、视图操作):

GRANT object_privilege|ALL ON scheme.object TO user|role

回收授予的系统权限:

REVOKE system_privilege|ALL_PRIVILEGES FROM user|role

回收授予的对象权限:

REVOKE object_privilege|ALL ON schema.object FROM user|role

系统权限传递:

GRANT system_privilege|ALL_PRIVILEGES TO user|role [WITH ADMIN OPTION]

1)如果system给zhangsan授予CREATE SESSION时加上了WITH ADMIN OPTION,

此时zhangsan也可以给其它用户授予CREATE SESSION的权限,

如果zhangsan又给lisi授予CREATE SESSION权限,

那么lisi肯定是可以登录了。

2)如果system回收了zhangsan的权限,那么lisi还能登录吗?还是能登录

3)system可以直接回收lisi的CREATE SESSION权限

对象权限传递:

GRANT object_privilege|ALL ON scheme.object TO user|role [WITH GRANT OPTION]

1)如果scott给zhangsan授予SELECT时加上了WITH GRANT OPTION,

此时zhangsan也可以给其它用户授予SELECT的权限,

如果zhangsan又给lisi授予SELECT权限,

那么lisi肯定是可以查询了:SELECT * FROM scott.emp;

2)如果scott回收了zhangsan的SELECT权限,那么lisi还能查询吗?不能查询了

3)scott不可以直接回收lisi的SELECT权限

// 角色管理

角色分为两类:

第一类是内置角色(CREATE SSSION、CONNECT、RESOURCE、DBA)

第二类是自定角色:

1)角色创建:

CREATE ROLE role;

2)把角色授权权限

GRANT system_privilege|ALL_PRIVILEGES TO role [WITH ADMIN OPTION]

3)把角色给用户

GRANT role TO user;

4)角色删除:

DROP ROLE role;

// PROFILE

专门做口令管理(它只对用户设置,不能对角色设置)

实例:

指定scott密码只能尝试输入3次,如果超过限制就锁定2天?

1)创建PROFILE

CREATE PROFILE profile_name LIMIT FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 2;

具体的参数设置,请在网上找一下参数详解!

2)把创建好的PROFILE指定对scott

ALTER USER scott PROFILE profile_name

3) 现在scott就会使用这个PROFILE的限制(3次过后会锁2天)

4)如果要解锁

ALTER USER scott ACCOUNT UNLOCK;

5)删除PROFILE

DROP PROFILE profile_name [CASCADE];

//***************************** Day2:SQL基础 ***********************************

1、SQL分类:

DDL、DML、DQL、DCL

2、数据类型:

1)字符型

变长:VARCHAR2(0-4000)、

定长:CHAR(0-2000)

如果我们在设计数据库时,已经确定某些字符串长度是固定的,尽量使用CHAR,提高效率!

举例:二代身份证CHAR(18),MD5 CHAR(32)

2)数字型

NUMBER(1) 0-9

NUMBER(5) 0-99999

NUMBER(5, 2) 555.22

3)时间类型

date

timestamp:精确到毫秒,但是我们在一般的应用里用不上

注:可直接使用sysdate取得当前时间!

4)其他类型

blob,最大存储为4G,专存二进制

clob,最大存储为4G,专存字符串

3、DDL

a)CREATE

CREATE TABLE sys_user (

id NUMBER(10) PRIMARY KEY,

username VARCHAR2(50) NOT NULL,

password CHAR(32) NOT NULL,

birthday date,

salary NUMBER(6,2)

);

b)ALTER

添加列:

ALTER TABLE table_name ADD 列描述

修改列:

ALTER TABLE table_name MODIFY 列描述

注:如果修改时涉及到约束,如非空约束,必须要保证数据库里没有数据才可成功更改!

删除列:

ALTER TABLE table_name DROP COLUMN 列名;

修改表名:

ALTER TABLE table_name RENAME TO new_table_name;

修改列名:

ALTER TABLE table_name RENAME COLUMN column_name TO new_column_name

c)DROP

删除列:

ALTER TABLE table_name DROP COLUMN 列名;

删除表:

DROP TABLE table_name;

4)五大约束

CREATE TABLE sys_user (

id NUMBER(10) PRIMARY KEY,

username VARCHAR2(50) NOT NULL UNIQUE,

password CHAR(32) NOT NULL,

age NUMBER(3) CHECK(age>=18 AND age=120),

birthday date,

salary NUMBER(6,2)

);

CREATE TABLE sys_user (

id NUMBER(10),

username VARCHAR2(50) NOT NULL,

password CHAR(32) NOT NULL,

age NUMBER(3),

birthday date,

salary NUMBER(6,2),

CONSTRAINTS sys_user_id_pk PRIMARY KEY(id),

CONSTRAINT sys_user_username_unique UNIQUE(username),

CONSTRAINT sys_user_age_check CHECK(age>=18 AND age<=120)

);

CREATE TABLE sys_user (

id NUMBER(10),

username VARCHAR2(50) NOT NULL,

password CHAR(32) NOT NULL,

age NUMBER(3),

birthday date,

salary NUMBER(6,2)

);

ALTER TABLE sys_user ADD CONSTRAINTS sys_user_id_pk PRIMARY KEY(id);

ALTER TABLE sys_user ADD CONSTRAINT sys_user_username_unique UNIQUE(username);

ALTER TABLE sys_user ADD CONSTRAINT sys_user_age_check CHECK(age>=18 AND age<=120);

对后期添加的约束做移除:

ALTER TABLE sys_user DROP CONSTRAINT constraint_name;

特殊(Not null):

NOT NULL没有Constraint的写法,它的添加和删除如下:

添加:

ALTER TABLE table_name MODIFY column_name NOT NULL;

删除:

ALTER TABLE table_name MODIFY column_name NULL;

建议:直接在列后面追加,这样更直观!

5)外键约束

主表:

CREATE TABLE sys_role(

id NUMBER(10) PRIMARY KEY,

name VARCHAR2(10) NOT NULL

)

从表:

CREATE TABLE sys_user(

id NUMBER(10) PRIMARY KEY,

name VARCHAR2(10) NOT NULL,

role_id NUMBER(10) REFERENCES sys_role(id) [ON DELETE CASCADE]

)

CREATE TABLE sys_user(

id NUMBER(10) PRIMARY KEY,

name VARCHAR2(10) NOT NULL,

role_id NUMBER(10),

CONSTRAINT sys_user_role_id_fk FOREIGN KEY(role_id) REFERENCES sys_role(id) [ON DELETE CASCADE]

)

ALTER TABLE sys_user ADD CONSTRAINT sys_user_role_id_fk FOREIGN KEY(role_id) REFERENCES sys_role(id) [ON DELETE CASCADE];

注意:

a)创建表:先建主表,再建从表

b)新增数据:先新增主表数据,再新增从表数据

c)删除数据:

如果直接删除主表的数据,会提示我们先去删除被从表引用的记录,再删除主表的记录

如果在外键上指定了ON DELETE

CASCADE,那么我们在删除主表记录的同时会级联删除相应的子表记录,不建议使用!

注意2:要不要使用外键?

1)使用外键:

优点:使用约束,强制保持数据的一致性

缺点:后期难以维护

性能问题

2)不使用外键(推荐)

优点:解决了使用外键的缺点

缺点:数据的一致性,需要程序去控制关系,容易出错!

//*************************** Day3:简单查询和条件查询基础 ****************************

1、SQL结构(注意顺序)

SELECT

[DISTINCT|ALL] select_list

FROM table_list

[where_clause]

[group_by_clause]

[HAVING condition]

[order_by_clause]

2、简单查询

1)在数据量大时,必须指定部分字段进行查询,而不是使用*查询。

2)使用别名代替表中的字段名

SELECT ename 名称, job "工作", sal AS 工资, comm AS "补助" FROM emp;

注:

a)使用别名时不能使用单引号

b)如果要给emp(表)给别名,不能使用AS方式!

3)去除重复记录

SELECT DISTINCT job FROM emp;

SELECT DISTINCT job, sal FROM emp;

4)表达式(||+、-、*、/等等)

SELECT sal*13 + nvl(comm,0)*12 FROM emp;

5)使用函数操作查询的字段

SELECT max(sal),min(sal),avg(sal),sum(sal) FROM emp;

SELECT sysdate FROM dual;

6)排序

a)遇NULL,指定排前(NULLS FIRST,默认)还是排后(NULLS LAST)

SELECT comm FROM emp ORDER BY comm DESC NULLS LAST;

b)别名排序同直接使用列名效果一样,针对长表达式使用别名更简单!

SELECT sal as "工资" FROM emp ORDER BY "工资";

c)利用多个字段进行排序(如果第一个字段相同,再参考第二个字段)

SELECT ename,sal,empno FROM emp ORDER BY sal ASC, empno DESC;

3、条件查询

1)WHERE条件操作符

可以使用的操作符主要有关系操作符、比较操作符和逻辑操作符:

· 关系操作符:<、<=、>、>=、=、!=、<>

· 比较操作符:IS NULL、LIKE、BETWEEN...AND...、IN

· 逻辑操作符:AND、OR、NOT

2)查询值大小写敏感且字符串需用单引号(跟MySQL不同)

SELECT * FROM emp WHERE ename=‘ALLEN‘

3)查询条件中使用函数

SELECT * FROM emp WHERE nvl(comm,0)=0;

4)模糊查询

_:可以替代一个字符

%:可以替代多个字符

SELECT * FROM emp WHERE job LIKE ‘_A%‘

5)专门针对NULL值的查询

SELECT * FROM emp WHERE comm IS NULL;

6)日期比较

SELECT * FROM emp WHERE hiredate<‘01-MAY-1981‘;

SELECT ename,hiredate FROM emp WHERE hiredate>to_date(‘1982-01-01‘, ‘yyyy-mm-dd‘);

注:Oracle日期格式化:yyyy-mm-dd hh24:mi:ss

7)GROUP BY子句和HAVING子句

GROUP BY都是跟在WHERE后面,如果没有WHERE条件,就直接跟在FROM后面

HAVING,主要就是对GROUP BY的信息再进行筛选,它必须要跟在GROUP BY后面

例:按部门的平均工资分组,然后筛选出平均工资大于等于2000的部门的所有员工信息?

a)使用子查询

SELECT * FROM emp WHERE deptno in(SELECT deptno FROM emp GROUP BY deptno HAVING AVG( sal)>=2000);

b)把子查询后结果当做临时表

SELECT * FROM emp,(SELECT deptno FROM emp GROUP BY deptno HAVING AVG(sal)>=2000) temp WHERE emp.deptno=temp.deptno;

//************************* Day4:子查询、多表查询、联合查询 ****************************

1、子查询

1)几道题?

a)查询出emp表中工资最高的员工的名字和工作岗位?

SELECT ename,job FROM emp WHERE sal=(SELECT MAX(sal) FROM emp);

b)查询工资高于平均工资的员工?

SELECT * FROM emp WHERE sal>(SELECT AVG(sal) FROM emp);

c)查询部门名称里有A的员工信息?

多表:

SELECT * FROM emp e,dept d WHERE e.deptno=d.deptno AND d.dname LIKE ‘%O%‘;

子查询:

SELECT * FROM emp WHERE deptno IN(SELECT deptno FROM dept WHERE dname LIKE ‘%O%‘);

d)查询部门名称里有A的员工信息和部门名称?

多表:

SELECT e.*,d.dname FROM emp e,dept d WHERE e.deptno=d.deptno AND d.dname LIKE ‘%O%‘;

把子查询后结果当做临时表:

SELECT * FROM emp e, (SELECT * FROM dept WHERE dname LIKE ‘%O%‘) d WHERE e.deptno=d.deptno;

注:能直接使用多表就直接使用多表,子查询的使用是要看情况的!

2)返回单列和返回多列两种情况

a)返回单列,用=

b)返回多列,用in

3)分页

查询前10条的数据:

SELECT e.*,ROWNUM FROM emp e WHERE ROWNUM <= 10;

查询5到10条的数据:

SELECT * FROM (SELECT e.*,ROWNUM r FROM emp e WHERE ROWNUM <= 10) temp WHERE r>=5;

扩展:

显示比自己部门的平均工资还高的员工信息?

SELECT e.*,salary.avg_sal FROM emp e,(SELECT deptno, AVG(sal) AS avg_sal FROM emp GROUP BY deptno) salary WHERE e.deptno=salary.deptno AND e.sal>salary.avg_sal;

2、多表查询

1)传统查询

a)笛卡尔积的产生和消除

注:在消除笛卡尔积时,消除条件至少等于表的个数-1

b)多表查询时,为了区别字段,建议使用别名。

2)内连接

a)等值连接

SELECT * FROM emp e INNER JOIN dept d ON e.deptno=d.deptno;

等同于:

SELECT * FROM emp e, dept d WHERE e.deptno=d.deptno;

b)不等值连接

SELECT * FROM emp e INNER JOIN dept d ON e.deptno>d.deptno;

考虑:显示各个员工的姓名工资及其工资的级别?

SELECT e.ename,e.sal,s.grade FROM emp e,salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal;

等同于:

SELECT e.ename,e.sal,s.grade FROM emp e JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal;

注:INNER关键字可以省略!

3)自连接

考虑:显示FORD的上级领导的姓名和工资?

SELECT employee.ename,manager.ename,manager.sal

FROM emp employee JOIN emp manager

ON employee.mgr=manager.empno

WHERE employee.ename=‘SCOTT‘;

等同于:

SELECT employee.ename,manager.ename,manager.sal

FROM emp employee, emp manager

WHERE employee.mgr=manager.empno AND employee.ename=‘SCOTT‘;

4)外连接

a)左外连接

使用左外连接的查询,返回的结果不仅仅是符合连接条件的行记录,还包          含了左边表中的全部记录。也就是说,如果左表的某行记录在右表中没有          匹配项,则在返回结果中右表的所有选择列表列均为空!

SELECT e.ename,d.dname FROM emp e LEFT JOIN dept d ON e.deptno=d.deptno;

b)右外连接

右外连接跟左外连接是相反的,它以右边的表为主表。

SELECT e.ename,d.dname FROM emp e RIGHT JOIN dept d ON e.deptno=d.deptno;

c)全外连接(注:使用传统连接代替不了外连接)

SELECT e.ename,d.dname FROM emp e FULL JOIN dept d ON e.deptno=d.deptno;

d)(+),Oracle特有用法,它可以实现左外连接和右外连接,但不能实现全连接,了解即可!

5)联合查询

合并处理多个查询语句的结果!

1、UNION

用于取得两个结果集的并集,并会自动去掉结果集中的重复行。

SELECT * FROM emp e1 WHERE e1.sal>2500 UNION SELECT * FROM      emp e2 WHERE e2.job=‘MANAGER‘;

2、UION ALL

使用UNION ALL并不会自动去掉结果集中的重复行!

SELECT * FROM emp e1 WHERE e1.sal>2500 UNION ALL SELECT *      FROM emp e2 WHERE e2.job=‘MANAGER‘;

3、INTERSECT

Oracle特有操作符,用于取得两个结果集的交集。

SELECT * FROM emp e1 WHERE e1.sal>2500 INTERSECT SELECT *      FROM emp e2 WHERE e2.job=‘MANAGER‘;

4、MINUS

Oracle特有操作符,用于取得两个结果集的差集。第一个集合减去第二个集合,      相同集去除。

SELECT * FROM emp e1 WHERE e1.sal>2500 MINUS SELECT * FROM      emp e2 WHERE e2.job=‘MANAGER‘;

注:让MySQL支持INTERSECT和MINUS:http://www.jb51.net/article/51411.htm

//************************* Day5:其他常用操作 ****************************

1、序列

a)Oracle提供了Sequence对象,由系统提供自增长的序列号,通常用于生成数           据库数据记录的自增长主键或序号的地方。

b)创建Sequence

你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限。

CREATE SEQUENCE 序列名

[INCREMENT BY n] // 步长,默认为1

[START WITH n] // 开始,默认为1

[{MAXVALUE/ MINVALUE n|NOMAXVALUE}] // 最大/小值|没有最大或最小值

[{CYCLE|NOCYCLE}] // 达到限制是否循环

[{CACHE n|NOCACHE}]; // 存序列的内存块大小,默认20

例如:

CREATE SEQUENCE sys_user

INCREMENT BY 1

START WITH 1

MINVALUE 0

NOCYCLE

c)得到Sequence值

· 当前值:序列名.currval

· 下一个值:序列名.nextval

d)删除Sequence

DROP SEQUENCE 序列名

e)修改Sequence

ALTER SEQUENCE sys_user_seq MAXVALUE 999999;

// 改变序列的初始值只能通过删除序列之后重建序列的方法实现

// ALTER SEQUENCE sys_user_seq START WITH 1;

2、事务

1)要么成功,要么失败

事务在数据库中主要用于保证数据的一致性,防止出现错误数据。在事务内     的语句都会被看成一个单元,一旦有一个失败,那么所有的都会失败,转账     是一个非常典型的例子。

2)事务的常见操作:

SET TRANSACTION:设置事务属性(并发比较高时可能会用到只读事务)

SAVEPOINT:设置保存点

ROLLBACK TO SAVEPOINT:回滚至保存点

ROLLBACK:回滚事务

COMMIT:提交事务

3)事务的ACID特性

事务有4个特性,它们分别是原子性、一致性、分离性、持久性。

a)原子性(Atomicity):原子意味着不可分割,不管有多少程序,只要在同         一个事务中,那么它们就是一个整体

b)一致性(Consistency):事务执行的前后数据库都必须处于一致性状态,         只有在事务完成后才能被所有使用都看到,保证了数据的完整性。

c)分离性(Isolation):事务之间不相干扰,一个事务操作的数据不会被其         他事务看到和操作

d)持久性(Durabilily):一旦事务提交完成,那么这将是对数据永久的修改

时间: 2024-08-22 01:16:13

【ORACLE-学习笔记】 常用命令的相关文章

c/c++unix/linux基础学习笔记-常用命令和vi的使用

linux 基本命令的使用-命令在ubuntu下面执行,有些命令通用其他linux,有些不通用. 多条命令间用;号隔开,回车后可以一起执行. clear-前屏,pwd显示当前目录,cd跳转目录. sudo [命令]  -ubuntu 下以管理员身份运行命令. 一般情况下,运行当前目录下的程序,要用 ./文件名 执行. 查看当前shell名称:ps 进入另外一个shell,直接输入shell名称:ksh/tcsh/sh/bash,退出一个shell用:exit. 切换shell命令,如:exec

ORACLE学习03-SQLPLUS常用命令和数据类型

一.数据库基本操作 1,创建用户 SQL> create user 用户名 identified by 密码; 2,超级用户system给新用户权限 SQL> grant connect , resource to mike; 授权 连接权限 增删改查权限 3,新用户登录,进入新用户的空间 SQL> connect mike/m111; 4,显示当前用户 SQL>show user; 5,建表,添加数据,增删改查. 6,登录sqlplus >sqlplus 登录名/密码@12

Linux学习笔记——常用命令(一)

Linux分区的四个基本步骤: 1)分区:硬盘划分为逻辑分区 2)格式化逻辑分区(写入文件系统) 3)分区设备文件名:给每个分区定义设备文件名 4)挂载点:给每个分区分配挂载点 注意事项: 1)必须分区: /   /boot  /swap 2)一块硬盘最多4个分区,最多1个扩展分区,扩展分区又可以包含多个逻辑分区 设置密码原则: 1)复杂性 2)易记性 3)时效性 目录usr(unlix software resource) 防火墙:用来过滤,制定一系列的规则(IP.MAC.端口等) Linux

Redis学习笔记~常用命令总结

回到目录 客户端redis-cli常用的命令总结 连接到服务器 redis-cli -h 127.0.0.1 -p 6379 --连接指定的redis服务器 发布/订阅, pub/sub模式运行在redis进程中,不会被持久化过,进程挂了,信息丢失 SUBSCRIBE Lind --订阅一个管道 PUBLISH Lind "你好,大叔!" --发布一个管道 键操作,redis数据都是由key/value组件,对key操作是所有操作的基础 DEL lind --删除键 Exist lin

MongoDB学习笔记—常用命令

这里记录一下MongoDB常用的命令 数据库相关 创建数据库 use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库. 删除数据库:切换到要删除的数据库下,执行命令即可. db.dropDatabase() 查看所有数据库 show dbs 集合相关 查看所有集合 show tables 删除指定集合:把下面命令的COLLECTION_NAME替换执行即可 db.COLLECTION_NAME.drop() 文档相关 插入文档 db.COLLECTION_NAM

Linux学习笔记——常用命令(二)

++++++++++++++++++++++++++++++文件搜索命令+++++++++++++++++++++++++++++++ 19) 文件搜索:find 语法:find [搜索范围][匹配条件] 选项:-name(根据文件名搜索)     -iname(不区分大小写)     -size(根据文件大小查找\+n -n n)     -user(根据所有者查找) -cmin(根据文件属性修改时间查找) -mmin(根据文件内容修改时间查找)     -amin(根据最近访问时间来查找)

Oracle学习笔记三 SQL命令

SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)               下面是这四种SQL语言的详细笔记: Oracle学习笔记三 SQL命令(二):SQL操作语言类别 Oracle数据类型 创建表时,必须为各个列指定数据类型 以下是 Oracle 数据类型的类别: 字符数据类型 CHAR类型 当需要固定长度的字符串时,使用 CHAR 数据类型. CHAR 数据类型存储字母数字值. CH

Oracle 学习笔记 17 -- 异常处理(PL/SQL)

程序在执行过程中出现异常是正常的,在程序的编写过程中出现异常也是不可避免的.但是要有相应的异常处理的机 制,来保证程序的正常执行.PL/SQL程序执行过程中出现的错误,称为异常.一个优秀的程序都应该能够正确处理 各种出错的情况,并尽可能的从错误中恢复.PL/SQL提供了异常处理机制. 概念: 异常处理(exception)是用来处理正常执行过程中未预料的事件,程序块的异常处理定义的错误和自定义的错误, 由于PL/SQL程序块一旦产生异常而没有指出如何处理时,程序就会异常的终止. 有三种类型的错误

oracle学习笔记 存储及raid技术概述

oracle学习笔记 存储及raid技术概述 本课以oracle数据库所运行的环境,讲一下存储和raid技术. 一)oralce生产环境里的结构 先说一下oracle所在的环境. 有一种结构: 两个服务器.两个光纤存储交换机.两个存储, 它们通过网线相互连接在一起. 每个服务器接两个交换机, 每个交换机连两个服务器同时连两个存储, 每个存储和两个交换机有连接. 这是oracle数据库相对比较典型的正规的运行环境. 每个服务器上都装Linux和oracle数据库软件, oracle数据库建在存储上

【我的Oracle学习笔记(二)】----- select语句补充

一.多表查询 多表查询是指从多个有关联的表中查询数据,其语法与单表查询类似.一般来说,多表查询的表要用连接联系起来,如果没连接,则查询结果是这多个查询表的笛卡尔积(注释1). 模拟查询雇员姓名和所在部门名称: select [雇员姓名],[部门名称] from [雇员表] a,scott,[部门表] b where a.[部门编号]=b.[部门编号]; 上例中,为每一个查询表指定了别名,便于SQL语句的书写. 模拟查询在”sales“部门工作的雇员其雇员姓名 select [雇员姓名] from