时间:2021-07-01 10:21:17 帮助过:22人阅读
1.2 创建一个自己的用户(比如 vip/vip)
create user vip identified by vip; -- 注意,新创建的用户,什么权限都没有,需要授权后才能使用 grant create session to vip; -- 授予登录的权限 grant connect to vip; -- 角色是很多权限的打包,connect 是一种角色,它包含了连接查看数据的一些基本权限 grant dba to vip; -- dba 是绝大多数权限的集合,它基本能做所有事情,所以很少单独授予用户。但在测试环境中,这样,很爽。 -- 上面的创建用户、授予权限两步操作,可以简化为下面一步: grant dba to vip identified by vip; -- 注意,使用分号结尾
1.3 切换到用户
sqlplus vip/vip -- 在 cmd 下 conn vip/vip -- 在 sqlplus 中
1.4 使用
create table aaa (id int);
1.5 激活内置的测试账号,这里面有几张示例库,可以用它们练习下查询
alter user scott account unlock; conn scott/tiger
1.6 修改密码
alter user scott identified by [newpassword];
select count(*) from emp where sal >= 2500 and sal <= 4000; -- vs. select count(*) from emp where sal between 2500 and 4000;
-- 初始化数据 create table salgrade as select * from scott.salgrade; -- 分别查看数据 select * from emp; select * from salgrade; -- 杂交 select * from emp, salgrade; -- 过滤掉不合适的 select ename, grade from emp e, salgrade s where e.sal between s.losal and s.hisal;
-- 分析题目 -- 1. 需要先查询出每个部门的平均工资 -- 2. 根据 salgrade 表中的数据,获取每个部门平均工资的等级 -- 这是所有的人 select * from emp; -- 按照部门分组 select deptno, avg(sal) from emp group by deptno; -- 结果: -- | DEPTNO | AVG(SAL) | -- | 30 | 1566.66667 | -- | 20 | 2258.33333 | -- | 10 | 2916.66667 | -- 跟 salgrade 表,杂交,总共 15 条结果 select * from (select deptno, avg(sal) sal from emp group by deptno) t, salgrade s; -- 过滤掉工资范围不合适的数据 select * from (select deptno, avg(sal) sal from emp group by deptno) t, salgrade s where t.sal between s.losal and s.hisal; -- 结果就是这样,就对了 -- | DEPTNO | SAL | GRADE | LOSAL | HISAL | -- | 10 | 2916.66667 | 4 | 2001 | 3000 | -- | 20 | 2258.33333 | 4 | 2001 | 3000 | -- | 30 | 1566.66667 | 3 | 1401 | 2000 | -- 需要将部门名称显示出来,再杂交->过滤一次就可以了 select * from (select deptno, avg(sal) sal from emp group by deptno) t, salgrade s, dept d where t.deptno = d.deptno and t.sal between s.losal and s.hisal; -- 最后的最后,设置显示字段 select dname, grade from (select deptno, avg(sal) sal from emp group by deptno) t, salgrade s, dept d where t.deptno = d.deptno and t.sal between s.losal and s.hisal; -- 最终结果,完美 --| DNAME | GRADE | --| ACCOUNTING | 4 | --| RESEARCH | 4 | --| SALES | 3 |
gender | number |
---|---|
男 | 46 |
女 | 10 |
条件 | 加多少 |
---|---|
1000元以下 | 50% |
2000元以下 | 30% |
3000元以下 | 20% |
其他 | 5% |
1981/5/1
之后来的所有人,只加 2%
, 请写出语句。看到最低、最大、平均之类的题目,首先想到的是分组函数的使用。
也就是 group by, having。
select job, min(sal) from emp group by job;
[题目] 从 scott 用户的 emp/dept 表中,找到 “来自芝加哥最有钱的那个人” 。
首先,我们需要理清思路。
这里总共有两个条件:
我们可以看出,第二个条件是依赖第一个条件的。
所以,分两步查询:
---- 第一步:找到来自芝加哥的所有人。下面两种写法等价: select e.* from emp e join dept d on (e.deptno=d.deptno) where d.loc=‘CHICAGO‘; select e.* from emp e, dept d where d.deptno = e.deptno and d.loc=‘CHICAGO‘; ---- 第二步,基于上面结果,筛选出最有钱的那个 -- 可以通过 max 函数 select e.* from emp e, dept d where e.deptno = d.deptno and d.loc=‘CHICAGO‘ and sal = (select max(sal) from emp e, dept d where e.deptno = d.deptno and d.loc=‘CHICAGO‘); -- 可以通过 order by 方式 select ename from (select e.*, d.* from emp e, dept d where e.deptno = d.deptno and d.loc=‘CHICAGO‘ order by sal desc) where rownum = 1;
注意,实现的方式,不止上面的那些。但总体 思路 是一样的。
所以,思路永远是最重要的。
最核心的问题: 查询出符合条件的部门编号。
1.查询出所有的部门编号
select * from emp;
2.查询出所有工资少于 1000 的人, 我们要把它所在的部门,从上面的结果中排除掉。
select deptno from emp where sal < 1000;
3.将上面查询出的不符合条件的部门排除掉
select distinct deptno from emp where deptno not in (select deptno from emp where sal < 1000);
4.修改上面语句,增加最终的条件,查询所有的其他信息
select d.dname, e.* from emp e join dept d on(e.deptno = d.deptno) where e.deptno not in (select deptno from emp where sal < 1000)
使用分组函数(group by / having)
分组函数主要用来统计分析。
一个完整的查询语句如下,其中 group by 和 having 是用来分组和筛选分组。
select [字段] from [表名] where [条件] group by [分组字段] having [对分组结果进行筛选] order by [字段]
示例:
select deptno, -- 分组字段 count(*), -- 人数 sum(sal), -- 工资总和 avg(sal), -- 平均工资 max(sal), -- 最高工资 min(sal) -- 最低工资 from emp group by deptno -- 按照部门分组,进行统计 having avg(sal) > 2000; -- 只显示平均工资大于 2000 的分组
1.按照部门分组
select deptno from emp group by deptno;
2.筛选,排除最低工资小于 1000 的部门。 即:得到符合条件的部门的编号。
select deptno from emp group by deptno having min(sal) > 1000;
3.完善最终语句,得到最终结果。
select * from emp e, dept d where e.deptno = d.deptno and e.deptno in (select deptno from emp group by deptno having min(sal) > 1000);
得到有 n 条记录的虚表:
select rownum from dba_objects where rownum < 32; select level from dual connect by level < 32;
将虚表转化为我们需要的日期表:
select trunc(sysdate, ‘MON‘) + rownum - 1 from dba_objects where rownum < 32; select trunc(sysdate, ‘MON‘) + level - 1 from dual connect by level < 32;
-- 1. select * from (select trunc(sysdate, ‘MON‘) + rownum - 1 d from dba_objects where rownum < 32) where to_char(d, ‘day‘) = ‘星期五‘ and d <= last_day(sysdate); -- 2. select * from (select trunc(sysdate, ‘MON‘) + level - 1 d from dual connect by level < 32) where to_char(d, ‘day‘) = ‘星期五‘ and d <= last_day(sysdate);
当然,你也可以将 last_day 这一段放到里面:
select * from (select trunc(sysdate, ‘MON‘) + level - 1 d from dual connect by level <= extract(day from last_day(sysdate))) where to_char(d, ‘d‘) = 6;
根据我们学校的实际情况,请帮助设计一个学生管理系统。
比如, 学生,老师,班级,课程。按照你自己的设计,酌情增加。
基本步骤:
这样的图能帮助我们理清思路,并能帮助团队间的有效交流。
一定在图画好之后再去着手数据库表的创建。要秉承先设计后实现的思路。
你可以用一些知名的工具(如 visio)去画,也可以手动在纸上画。
需求分析 -> *概要设计* -> 详细实现。
首先,设计一个博客表(blog
), 至少有下面字段
用 Java 完成基本的 =CRUD=,并掌握使用 PL/SQL 操作 blob/clob 的技巧。
Oracle 采取的是 Client/Server 架构。
客户端(client)操作数据库的请求发送后,服务端的监听器(TNSListener)接收到请求,并将其转发给相应的数据库实例(Instance),再由实例(Instance)去操纵数据库(Database)。 返回操作结果,是一个相反的过程。下面是个简陋的图示:
这是一个轻量级的功能强大的客户端, 是 dba 必须掌握的工具。
用 sqlplus 连接数据库的语法为:
# Usage: # sqlplus 用户名/密码@主机名:端口号/实例名 # 参数个数不是固定的 sqlplus # 会要求你输入用户名密码,默认连接本地 ORACLE_SID 变量指定的数据库 sqlplus vip # 会要求你输入密码 sqlplus vip/vip # 连接本地 ORACLE_SID 变量指定的数据库 sqlplus sys/hello as sysdba # sys 用户必须用 sysdba 或 sysoper 的身份登录 sqlplus vip@192.168.0.111/orcl # 连接 192.168.0.111 机器上的 orcl 数据库,用户名为 vip sqlplus vip@192db # 连接 别名 为 192db 的数据库
我们可以配置 sqlplus 的一些行为,两个命令:
比如:
show all -- 显示所有配置参数 show lines -- 显示 lines 的配置信息 show errors -- 显示错误 set lines[ize] 333 -- 将行宽设置为 333 set pages[ize] 444 -- 将每页的记录数设置为 444 set echo off/on -- 导入外部文件,是否要显示原始 sql 语句 set feedback on/off -- 是否显示“查询到xx数据”等信息 set timing on/off -- 是否显示语句的执行时间 set autocommit on/off -- 是否启用自动提交 set autotrace on/off -- 是否输出执行计划 set serveroutput on/off-- 是否显示来自服务端的信息 column aaa format a22 -- 将列 ‘aaa‘ 的宽度限制为 22 个字幕‘a‘的大小。column 命令很强大,语句也复杂,此处不提。
在 sqlplus 中有缓冲区的概念:
缓冲区是用来记录上一次执行的命令语句的空间。
我们可以通过一些列简单命令,对上一次输入的语句进行一些控制:
append/insert
delete
change
list
run
或者 /
例子:
list -- 显示完整的缓存区 list 3 -- 显示并定位到第三行 list 3 5 -- 显示第三行到第五行的内容 list last -- 定位到最后一行
list 3 del -- 删除第三行
list 3 append order by sal -- 定位到第三行,然后追加 order by sal insert order by sal -- 开启新的一行,插入 order by sal
还有其他一些命令:
get D:\aaa.sql -- 将文件加载到缓冲区,但不执行 start D:\aaa.sql -- 将文件加载到缓冲区,并且执行 @D:\aaa.sql -- 是上面一条语句的简写形式 save D:\bbb.sql -- 将缓冲区的内容保存到文件中 edit -- 调用外部编辑器,编辑缓冲区 clear screen -- 清空缓冲区
show user -- 显示当前用户 show parameters -- 显示 oracle 的配置参数 show parameters nls -- 显示 oracle 中所有跟语言配置相关的一些参数 describe emp -- 显示 emp 表的结构信息
用 Java 连接数据库,需要用到 jdbc 驱动,它们可以在下面目录中找到:
主目录\product\12.1.0\dbhome_1\jdbc\lib\*.jar
比如 ojdbc7_g.jar
, 7
表示适用于 JDK 版本 1.7, g
表示自带更多调试信息。
TNSListener,是用来监听来自客户端的请求,并将其转发给相对应的服务端实例的一种后台服务。
它是沟通客户端与服务端的一个桥梁。
比如,下面用 sqlplus
客户端将会连接 localhost
上的 orcl
数据库:
sqlplus vip/vip@localhost/orcl
请求会发送到 localhost 主机的 1521 号端口, 作为监听的 TNSListener 收到这个请求后,再把请求转发给对应的 orcl 数据库实例。
所以必须开启监听服务,并且配置正确,才能连接操作数据库。
注:如果用 sqlplus vip/vip 的方式连接数据库,即没有指定连接的机器,那么默认连接的是本机数据库 这种连接是不需要监听服务的,因为为了增加连接速度,这样的本地连接 oracle 会使用一个专用的进程直接连接实例
我们可以使用 Oracle 提供的 lsnrctl
命令操纵监听服务的开启或关闭:
lsnrctl status # 查看状态
lsnrctl stop # 停止监听服务
lsnrctl start # 开启监听服务
lsnrctl reload # 重启监听服务
lsnrctl services # 查看监听的连接情况
我们可以使用 Oracle 的 Net Manager 工具来配置自己的监听器。
实质上,用 Net Manager 配置跟直接修改下面文件的作用是一样的:
主目录\product\12.1.0\dbhome_1\network\admin\listener.ora
我们在 Net Manager 中对 listener 的配置对应的是这一段代码:
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) ) ... )
只要修改其中的 host/port 等,重启监听服务即可。
Oracle 服务端分为两部分:
Instance
实例Database
数据库实例, 又称为数据库引擎,由 SGA(System Global Area, 系统全局区)
和 一系列后台进程
组成。 它需要启动才会生成,用来加载并管理一个数据库。
$ORABASE/admin/xxoo
和 $ORA_HOME/database/SPFILEXXOO.ora
等位置加载相关配置文件。配置文件的名字是根据 sid 来定义的。内存空间(SGA)
和 相关进程
。可以通过查看启动过程协助理解:
-- 首先,登录 sys 用户,只有管理员才有完全操纵数据库的权力 -- shutdown 用来关闭。如果不带参数,默认为 normal ---- immediate 表示立即关闭,如果有未处理完操作,回滚并断开 ---- normal 表示等待所有连接断开才关闭数据库 ---- 其他参数,略 shutdown immediate; -- 启动数据库,分解为三个动作: ---- 启动实例 ---- 利用启动的实例去挂载数据库 ---- 校验并打开数据库 -- 只有完全打开,才能进行完全的数据操作 -- 也可以指定参数,启动到某个阶段。这是在维护数据库中使用的命令。 startup -- 如果不加参数, startup nomount -- 启动到 nomount 阶段 startup mount -- 启动到 mount 阶段 -- 当然,也可以这样分步启动: startup nomount alter database mount alter database open
数据库, 是保存在硬盘上的文件集合,它是数据的主要载体。
$OracleBase\oradata\[数据库名字]
可以从不同的角度去认识数据库,比如物理/逻辑角度:
数据库是保存在操作系统的一系列文件。
默认安装情况下,这些文件都在 $ORACLE_BASE/oradata
文件夹下:
oradata/ └── orcl [数据库的名字] ├── CONTROL01.CTL ├── CONTROL02.CTL ├── EXAMPLE01.DBF ├── REDO01.LOG ├── REDO02.LOG ├── REDO03.LOG ├── SYSAUX01.DBF ├── SYSTEM01.DBF ├── TEMP01.DBF ├── UNDOTBS01.DBF └── USERS01.DBF
从文件角度分析,一个数据库包含下面几类(组件):
select * from v$controlfile;
select name, status, enabled from v$datafile;
-- 需要理解 Oracle 日志的思路: -- 它采取了【多个分组,轮流循环写入;每组多成员,互为镜像;保存更多信息,使用归档模式】的方式,保证了记录安全性。 -- 在生产环境中,需要日志调整到不同的磁盘中,这样,即使某个文件损坏,或某块磁盘损坏,都可以通过镜像的日志文件对数据进行恢复。 -- 查看 redo log 日志组 select * from v$log; select * from v$logfile; -- 增加/删除 日志组 alter database add logfile ‘d:/sss.rlog‘ size 100m; alter database drop logfile ‘d:/sss.rlog‘; -- 清空日志组 alter database clear logfile group 1; alter database clear unarchived logfile group 1; -- 为日志组 增加/删除 成员 alter database add logfile member ‘d:/ssss.log‘ to group 1; alter database drop logfile member ‘d:/ssss.log‘; -- 重命名文件 -- 首先,在文件夹管理器里,将文件改名,比如,改为 ssss.redolog -- 其次,重启数据库到 mount 状态,然后执行重命名命令 alter database rename file ‘d:/ssss.log‘ to ‘d:/ssss.redolog‘; -- 日志组一般是在写满的时候自动切换。 -- 我们也可以手动切换 alter system switch logfile;
-- Oracle 的归档模式默认是关闭的 -- 归档模式会占用大量空间 -- 但他们用更多的空间,保存更多的历史记录,保障更大的安全性 -- 查看状态 archive log list; -- 切换数据库到归档模式 alter database archivelog; -- 启动 archive log start; -- 查看状态 archive log list;
https://docs.oracle.com/cd/B28359_01/server.111/b28318/physical.htm#CNCPT1082
从 Oracle 内部管理数据的角度,可以将 Oracle 分为4个组件:
-- 内置的各种表空间 ---- system/sysaux 系统表空间/系统辅助表空间,用来保存系统字典表和其他信息,数据库创建完会自动生成 ---- users 用户表空间,创建新用户时,默认使用的表空间 ---- temp 临时表空间 ---- undo 回滚表空间 -- 查看表空间信息 select * from v$tablespace; -- 查看所有表空间跟文件对应关系 SELECT FILE_NAME, BLOCKS, TABLESPACE_NAME from dba_data_files; -- 创建表空间 create tablespace xxx datafile ‘D:/sss.dbf‘ size 50m autoextend on next 50m maxsize 1024m; -- 创建临时表空间 create temporary tablespace yyy tempfile ‘D:/ANOTHER_TMP.dbf‘ size 5m; -- 删除表空间 drop tablespace xxx;
show parameters block;
安装完 Oracle,缺省有两个用户:
SYS
用户,又叫数据库系统管理员、特权用户,数据库中至高无上的存在。
SYSTEM
用户,数据库管理员,它拥有 DBA 角色,主要负责对数据库中各种对象,各种资源的管理。SCOTT
用户,一个示例用户,默认是锁定的,需要解锁使用。新创建的用户,是不能做任何事情的(甚至不能登录)。 必须要为用户授予权限,才能做相应的事情。 可以说,用户是权限的容器。
权限分为两种:
用户是用于 资源管理 和 权限控制 的一个概念。
-- 创建用户的语法 CREATE USER name IDENTIFIED BY password -- 一个用户,至少拥有用户名和密码 [DEFAULT TABLESPACE users] -- 指定此用户下数据默认保存位置,如果不指定,默认为 Users 表空间 [TEMPORARY TABLESPACE temp] -- 指定临时表空间,默认为 temp 表空间 [QUOTA 100M/unlimited ON USERS] -- 在表空间上有多少空间的使用权力,默认为 0, unlimited 表示无上限 [ACCOUNT LOCK/UNLOCK] -- 账号的初始状态:锁定/未锁定,默认为未锁定 [PASSWORD EXPIRE] -- 账号的初始状态:强制要求重设密码,默认不强制 [PROFILE DEFAULT] -- 指定使用的资源文件,默认是 default ; -- 修改用户的语法 ALTER USER name [跟创建用户的参数是一样的]; -- 删除用户的语法 DROP USER name [cascade];
为了对用户行为有更精细的控制,需要使用 资源文件 (profile
)。 资源文件是口令限制、资源限制的命名集合。
-- 增加<