数据的存储形式:
内存
文件
数据库
4种SQL语句:
DDL(定义):对象(表)create table alert table ..
DML(操作):记录 insert update delete..
DCL(控制):事物
DQL(查询): select
DB & DBMS
DB:数据库
DBMS:数据库管理系统
访问Oracle数据库:
sqlplus
方式一:
windows+r –>sqlplus
方式二:
windows+r –>cmd–>sqlplus 用户名/密码
上下左右键可以使用
sqlplus 用户名/密码 [as sysdba]
sqlplusw :
windows+r –>sqlplusw
上下左右键可以使用
isqlplus:浏览器
http://ip地址:端口号/isqlplus
http://localhost:5560/isqlplus
http://localhost:1158/em
Oracle服务:
sqlplus OracleServiceOrcl服务…
isqlplus Oracle.. isqlplus
注释:两个减号–
Oracle的角色:
超级管理员(sysdba): sys
管理员: system
普通用户: scott
Oracle默认以任意用户名和密码都可以以超级管理员的身份登录。
修改:可以在配置文件中进行修改
Oracle以超级管理员的身份登录时,需要添加” as sysdba”
切换用户:
conn 用户名/密码
退出:
exit
创建新用户
语法格式:
create user username identified by password
说明:username和password分别是用户名和用户口令,要求必须是一个标识符。
举例:
创建一个用户John。
创建新用户必须以具有create user权限的用户登录,一般情况下适于system用户登录。
SQL>connect system/manager;
SQL>create user John identified by johnpsw;
解锁并修改修改用户口令:
conn / as sysdba;–用dba权限登录系统
alter user 用户名 account unlock [identified by 密码];
锁定某个用户:
alter user 用户名 account lock;
授予权限
语法格式:
grant privileges [ON object_name] TO username;
说明:privileges表示系统权限或对象权限。
当创建好用户后,必须给用户授权,用户才能连接到数据库,并对数据库中的对象进行操作。只有拥有create session权限的用户才能连接到数据库,在建立新用户之后,通常会需要使用grant语句为它授予create session系统权限,使之具有连接到数据库中的能力,或者为新用户直接授予oracle中预定义的connect角色。
例如,可用下列语句给John授权。
SQL>grant create session to John;
也可使用下面的语句为用户授予connect角色:
SQL>grant connect to John;
以新用户的帐号和口令登录SQL*Plus,帐号和口令正确,就可成功进入SQL*Plus窗口使用Oracle和访问数据。 除了给用户授予系统权限外,还可以为用户授予操作对象的权限,如对某些数据对象进行查询、修改、增加、删除权限等。
为用户John授予scott用户的emp表的查询、更新和删除操作权限。
SQL>connect scott/tiger;
SQL>grant select on emp to John;
SQL>grant update on emp to John;
SQL>grant delete on emp to John;
如果将scott用户的emp表的所有权限授予John,则可以使用下面的命令。
SQL>grant all on emp to John;
验证用户John对scott用户的emp表进行查询的权限。
SQL>conn John/ johnpsw;
SQL>select * from scott.emp; –此处需要使用属主用户.对象名
收回权限:
使用REVOKE语句可以收回已经授予用户的对象权限。
语法格式: REVOKE privileges [ON object_name] TO username;
收回已经授予用户John的SCOTT用户下EMP表的SELECT和UPDATE对象权限。
SQL>REVOKE SELECT,UPDATE ON EMP FROM John; 在收回对象权限时,可以使用关键字ALL将某个对象的所有对象权限全部收回。
举例:收回已经授予用户John的SCOTT用户下EMP表的所有权限。
SQL>REVOKE ALL on EMP FROM John;
修改密码:
在创建了用户之后,可以使用Alter user语句对用户信息进行修改。Alter user语句最常用的情况是用来修改用户自己的口令。任何用户都可以使用Alter user identified by语句来修改自己的口令,而不需要具有其他权限。但是如果要修改其他用户的口令,则必须具有Alter user系统权限。
举例:修改用户John的认证密码。
SQL>Alter user John identified by newpsw;
删除用户:
使用drop user语句可以删除已有的用户,执行该语句的用户必须具有drop user系统权限。当删除一个用户时,该用户帐户以及用户模式的信息将被从数据字典中删除,同时该用户模式中所有的模式对象也将被全部删除。 如果要删除的用户模式中包含数据对象,则必须在drop user子句中指定cascade关键字,否则Oracle将返回错误信息。
举例:删除用户John,并且同时删除他所拥有的所有表、索引等对象。
SQL>drop user John cascade;
为什么conn / as sysdba 可以登录?
ORACLE的默认设置是这样的,只要你后面有加这个,不管你用户存不存在他都能登陆。
如果不想这样的话,你可以在
oracle\product\10.2.0\db_1\NETWORK\ADMIN\sqlnet.ora 里面的
SQLNET.AUTHENTICATION_SERVICES= (NTS)前面加上#号(注释)。
这时,除了原有的SYS用户和你自己授权的具有SYSDBA权限的用户
外,其他的用户加上AS SYSDBA就不能登陆了。
注意的地方
1.数值类型 字符串类型(”) 日期类型
Java:
1 + “2” = “12” 结果是字符串类型
Oracle
1 + ‘2’ = 3 结果是数值类型
字符串 –> 数值
字符串 –> 日期类型
日期类型格式: ‘1-1月-81’
2.双引号使用:
1.列别名中有空格,则列别名只能用双引号
2.格式转换, ‘yyyy”年”MM”月”dd”日”’
3.Oracle特有:
虚表:dual 一行一列
1 + 1 ?
select 1+1 from dual;
获得系统当前时间:
select sysdate from dual;
伪列:rownum
4.注意空值
null 不等于 null
= null × is null √
空值参与运算,结果只能为null 解决方法:nvl(a,b) 如果a为空,则使用b,否则使用a
Select语句执行顺序
select 5
from 1
where 2
group by 3
having 4
order by 6
表:table
行:row record 记录
列:column field 域
scott用户自带三张表:
emp:员工表
deptno:部门表
salgrade:薪水等级表
SCOTT用户的三张表
emp:
empno:编号
ename:姓名
job:工作名称
mgr:领导者的编号。如果是最高领导,此字段为null
hiredate:入职时间
sal:薪水
comm:奖金
deptno:部门编号
dept:部门表
deptno:部门编号
dname:部门名称
loc:位置
salgrade:薪水等级表
grade:等级
losal:最低薪水
hisal:最高薪水
操作:
desc 表名:查看表结构
show user:查看当前登录的用户
set linesize 500; 设置不折行
set pagesize 100;
edit 文件路径
@ 文件路径
列别名: where后不能使用 order by后可以使用
SQL语句不区分大小写:
select ename from emp;
SELECT ENAME FROM EMP;
字符串区分大小写:
select * from emp where ename = ‘a’;
select * from emp where ename = ‘A’;
连接查询:当select后的字段来自于多张表的时候使用连接查询
内连接:
连接的两张表都必须满足条件
等值连接 非等值连接 自连接
查询所有员工的员工编码,员工姓名,部门编号,直接领导姓名
select e1.empno,e1.ename,e1.deptno,e2.ename
from emp e1 join emp e2 on e1.mgr = e2.empno;
问题:最高领导的信息没有出现在结果集里
外链接:
左外 右外 全外
查询所有员工的员工编码,员工姓名,部门编号,直接领导姓名
select e1.empno,e1.ename,e1.deptno,e2.ename
from emp e1 left join emp e2 on e1.mgr = e2.empno;
select emp.*,
from emp e join dept d on e.deptno = d.deptno
join salgrade on e.sal between losal and hisal;
子查询:
查找各部门薪水最高的员工信息
select * from emp where (deptno,sal) in (
select deptno,max(sal) from emp group by deptno
);
不相关子查询
内层查询不需要依靠外层查询,内层查询执行一次
查找SALES部门的所有员工信息
1。查找SALES部门的部门编号
select deptno from dept where dname = ‘SALES’;
2.查询部门编号是…的员工信息
select * from emp where deptno = (select deptno from dept where dname = ‘SALES’);
相关子查询
内层查询需要依靠外层查询,内层查询执行n次
查找薪水大于该部门平均薪水的员工信息
select * from emp e1 where sal > (
select avg(sal) from emp e2 where e2.deptno = e1.deptno
);
分组查询:
带有统计功能
查找各部门的部门编号,最高薪水,员工姓名
分组函数: max min avg conut sum
查找各部门最高薪水 分组查询
select deptno,max(sal) from emp group by deptno;
查找最高薪水 不需要用分组查询
select max(sal) from emp;
查询平均奖金:
select avg(comm) from emp; ×
select avg(nvl(comm,0)) from emp;
特点:
1.count和avg函数统计的是非空的个数
avg(comm) 等价于 sum(comm)/count(comm)
2.分组函数是把全公司分成一个组
3.查询公司中最高薪水及ename 错误的
如果select中出现分组函数,则不能再出现非分组函数|列名
select ename,max(sal) from emp;
分组查询和分组函数的区别:
分组查询可以随意分组,分组函数是将所有满足条件的数据分成一个组
条件:
where:不允许出现分组函数
having:允许出现分组函数
on:连接查询
伪列:
分页****
每页:perPage 页数:page
select rownum,temp.* from (
select rownum rn,t1.* from (
select * from 表名 order by sal desc
) t1 where rownum <= perPage*page
) temp where rn > perPage*(page-1);
rownum: 每张表都有 默认从1开始递增
只能使用 < <= 不能使用 > >=
每页显示5条:
emp表中第一页的记录:
select rownum,emp.* from emp where rownum <= 5;
emp表中第二页的记录:
select rownum,emp.* from emp
where rownum <= 10 and rownum > 5; ×
select rownum,temp.* from (
select rownum rn,emp.* from emp where rownum <= 10
) temp where rn > 5;
emp表中按照薪水降序排列,查询第二页的内容
select rownum,temp.* from (
select rownum rn,emp.* from emp where rownum <= 10
) temp where rn > 5 order by sal desc; ×
select rownum,temp.* from (
select rownum rn,t1.* from (
select * from emp order by sal desc
) t1 where rownum <= 10
) temp where rn > 5;
数据的导出
owner:导出哪个用户下得所有对象 tables:导出指定的表中的所有数据。owner和tables不能连用
将用户scott下得所有对象导出到文件scott.dmp
set oracle_sid=orcl
exp scott/tiger owner=scott file=d:\scott.dmp
导出scott、system下得所有对象导出到文件inf.dmp
exp system/oracle owner=(scott,system) file=d:\inf.dmp
导出soctt下得emp,dept,salgrade表到文件scott.dmp
exp scott/tiger file=d:\scott.dmp tables=(emp,dept,salgrade)
将数据库中的表t1中的字段f1包含S的数据导出
exp 用户名/密码 file=D:\daochu.dmp tables=(t1) query=\”where f1 like ‘%S%’\”
在windows命令行下完成以下导入命令
导入d:\daochu.dmp中的数据导入到zhangsan用户下
先给zhangsan用户授予dba的权力:
grant dba to zhangsan;
set oracle_sid=orcl
imp zhangsan/aaa file=d:\daochu.dmp fromuser=scott touser=zhangsan
如果导入的表已经存在,则会报错,并且不对该表进行导入 可以使用ignore=y解决
查看当前用户下的所有表;
select table_name from user_tables;
查看当前用户下的所有序列;
select sequence_name from user_sequences;
事物:
特性:
原子性:最小
一致性:事物操作前后,结果是一致的
隔离性:事物操作互不相干
持久性:一旦提交,影响是永久的
隔离级别:
脏读 幻读 不可重复读 …
select 不涉及到事物
DDL: create 。。。 一条DDL语句就是一个事物
DML:insert 。。。 若干条DML语句是一个事物
commit/rollback/DDL语句
commit:提交
rollback:回滚
savepoint:
缓存:DML操作是在缓存中进行的,只有当提交事物的时候才会把缓存中修改了的内容真正写入到数据库中