//***************************** Day1:基础操做和数据库安全 ***********************************数据库
// 基本操做安全
进入SQL*plus: 并发
SQLPLUS - > user和password函数
查看当看的用户: 性能
SHOW USER;spa
查看数据库里面的数据库表: .net
SELECT table_name FROM user_tables;设计
修改自身的密码: htm
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基础 ***********************************
一、SQL分类:
DDL、DML、DQL、DCL
二、数据类型:
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,专存字符串
三、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:简单查询和条件查询基础 ****************************
一、SQL结构(注意顺序)
SELECT
[DISTINCT|ALL] select_list
FROM table_list
[where_clause]
[group_by_clause]
[HAVING condition]
[order_by_clause]
二、简单查询
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;
三、条件查询
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)几道题?
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;
二、多表查询
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)联合查询
合并处理多个查询语句的结果!
一、UNION
用于取得两个结果集的并集,并会自动去掉结果集中的重复行。
SELECT * FROM emp e1 WHERE e1.sal>2500 UNION SELECT * FROM emp e2 WHERE e2.job='MANAGER';
二、UION ALL
使用UNION ALL并不会自动去掉结果集中的重复行!
SELECT * FROM emp e1 WHERE e1.sal>2500 UNION ALL SELECT * FROM emp e2 WHERE e2.job='MANAGER';
三、INTERSECT
Oracle特有操做符,用于取得两个结果集的交集。
SELECT * FROM emp e1 WHERE e1.sal>2500 INTERSECT SELECT * FROM emp e2 WHERE e2.job='MANAGER';
四、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:其余经常使用操做 ****************************
一、序列
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;
二、事务
1)要么成功,要么失败
事务在数据库中主要用于保证数据的一致性,防止出现错误数据。在事务内 的语句都会被当作一个单元,一旦有一个失败,那么全部的都会失败,转帐 是一个很是典型的例子。
2)事务的常见操做:
SET TRANSACTION:设置事务属性(并发比较高时可能会用到只读事务)
SAVEPOINT:设置保存点
ROLLBACK TO SAVEPOINT:回滚至保存点
ROLLBACK:回滚事务
COMMIT:提交事务
3)事务的ACID特性
事务有4个特性,它们分别是原子性、一致性、分离性、持久性。
a)原子性(Atomicity):原子意味着不可分割,无论有多少程序,只要在同 一个事务中,那么它们就是一个总体
b)一致性(Consistency):事务执行的先后数据库都必须处于一致性状态, 只有在事务完成后才能被全部使用都看到,保证了数据的完整性。
c)分离性(Isolation):事务之间不相干扰,一个事务操做的数据不会被其 他事务看到和操做
d)持久性(Durabilily):一旦事务提交完成,那么这将是对数据永久的修改