资源
1)OracleXE112_Win64.zip 数据库服务管理平台
2)plsqldeveloper_x64.rar 第三方客户端
Oracle是一家软件公司。这家1977成立于加利福尼亚的软件公司是世界上第一个推出关系型数据管理系统(RDBMS)的公司。
现在,他们的RDBMS被广泛应用于各种操作环境:Windows NT、基于UNIX系统的小型机、IBM大型机以及一些专用硬件操作系统平台。事实上,Oracle已经成为世界上最大的RDBMS供应商,并且是世界上最主要的信息处理软件供应商。
Oracle Database 11g Express 是 Oracle 数据库的免费版本,支持标准版的大部分功能,占用内存小,很不错。值得推荐。
oracle是基于服务数据库系统,只有启动服务后才能使用Oracle数据库
启动OracleServiceXE和OracleXETNSListener就可以正常使用Oracle数据库了。
net start OracleServiceXE
net stop OracleServiceXE
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-udiZ6rhv-1634730510516)(https://i.loli.net/2021/10/18/sfWUHzIhgJ2CQnE.png)]
Oracle安装后,自带了一个控制台的客户端,叫sqlplus,有了这个客户端,在你维护服务器时至少有可用的客户端了,虽然不好用,但比没有强。
使用sqlplus需要两步
在控制台中输入sqlplus /nolog 启动客户端,注意此时只是启动了客户端,还没有登录到Oracle。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WLt2oHor-1634730510517)(https://i.loli.net/2021/10/17/aI7cvYzr4yW8Owe.png)]
第二步:登录到Oracle
在客户端输入conn system/manager as sysdba;登录到oracle
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JY3mtduY-1634730510520)(https://i.loli.net/2021/10/17/N2anpQcm9gWIBvZ.png)]
在sqlplus中练习几个常见的命令
select * from all_users; -- 查看所有用户 select * from dba_roles; -- 查看所有角色
plsqldeveloper是可视化界面。
select * from all_users; --查看所有用户 select * from dba_roles; --查看所有角色
ed
命令打开缓存【可以编辑】系统权限是指执行特定类型的SQL命令的权力,用于控制用户执行的一个或一类数据库操作
系统权限 | 作用 |
---|---|
CREATE SESSION | 连接到数据库 |
CREATE TABLE | 建表 |
CREATE TABLESPACE | 建立表空间 |
CREATE VIEW | 建立视图 |
CREATE SEQUENCE | 建立序列 |
CREATE USER | 建立用户 |
如果多个用户需要相同的多个权限,那么为每个用户分别赋予多个权限是繁琐的。为此可以将多个权限组合为一个角色,将角色赋予多个用户,就使得每个用户都有了相同的权限。
角色是一组相关权限的集合,使用角色最主要的目的是简化权限管理。
即数据库操作员,权限包括:打开数据库服务器、关闭数据库服务器、备份数据库、恢复数据库、日志归档、会话限制。
即数据库管理员,权限包括:打开数据库服务器、关闭数据库服务器、备份数据库、恢复数据库、日志归档、会话限制、管理功能、创建数据库。sys用户必须用sysdba身份才能登录,system用户可以用普通身份登录。
即普通用户,权限只有查询某些数据表的数据。默认的身份是normal用户。
虽然一个Oracle数据库服务器中可以安装多个数据库,但是一个数据库需要占用非常大的内存空间,因此一般一个服务器只安装一个数据库。每一个数据库可以有很多用户,不同的用户拥有自己的数据库对象(比如:数据库表),一个用户如果访问其他用户的数据库对象,必须由对方用户授予一定的权限。不同的用户创建的表,只能被当前用户访问。因此在Oracle开发中,不同的应用程序只需使用不同的用户访问即可。
推荐使用system用户
思考:如果一个公司的数据库账户的密码丢失了,怎么办?
答:登录本机可以任意密码,然后修改用户密码【本机上可以输入任意密码去登录数据库,但是远程不可以】
同时Oracle为程序测试提供了一个普通用户scott,XE版本默认没有附带scott用户,可自行导入scott用户到oracle中
前提条件:使用system用户登录
第一步:找到scott.sql脚本
在oracle
安装路径下找到scott.sql
脚本文件,该文件位于oracle\product\11.2.0\server\rdbms\admin
目录下
第二步:使用@导入scott脚本
@C:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin\scott.sql
第三步:重置密码和登录状态
alter user scott identified by tiger; alter user scott account unlock;
用户:scott,密码:tiger
desc dept; --查看dept表结构
№ | 名称 | 类型 | 描述 |
---|---|---|---|
1 | DEPTNO | NUMBER(2) | 表示部门编号,由两位数字所组成 |
2 | DNAME | VARCHAR2(14) | 部门名称,最多由14个字符所组成 |
3 | LOC | VARCHAR2(13) | 部门所在的位置 |
select * from dept;
desc emp; --查看emp表结构
№ | 名称 | 类型 | 描述 |
---|---|---|---|
1 | EMPNO | NUMBER(4) | 雇员的编号,由四位数字所组成 |
2 | ENAME | VARCHAR2(10) | 雇员的姓名,由10位字符所组成 |
3 | JOB | VARCHAR2(9) | 雇员的职位 |
4 | MGR | NUMBER(4) | 雇员对应的领导编号,领导也是雇员 |
5 | HIREDATE | DATE | 雇员的雇佣日期 |
6 | SAL | NUMBER(7,2) | 基本工资,其中有两位小数,五倍整数,一共是七位 |
7 | COMM | NUMBER(7,2) | 奖金,佣金 |
8 | DEPTNO | NUMBER(2) | 雇员所在的部门编号 |
select * from emp;
desc salgrade; --查看salgrade表结构
№ | 名称 | 类型 | 描述 |
---|---|---|---|
1 | GRADE | NUMBER | 工资的等级 |
2 | LOSAL | NUMBER | 此等级的最低工资 |
3 | HISAL | NUMBER | 此等级的最高工资 |
select * from salgrade;
desc bonus; --查看bonus表结构
№ | 名称 | 类型 | 描述 |
---|---|---|---|
1 | ENAME | VARCHAR2(10) | 雇员姓名 |
2 | JOB | VARCHAR2(9) | 雇员职位 |
3 | SAL | NUMBER | 雇员的工资 |
4 | COMM | NUMBER | 雇员的奖金 |
select * from bonus;
在开发项目时,需要为项目创建用户
语法:CREATE USER 用户名 IDENTIFIED BY 密码(口令) [ACCOUNT LOCK/UNLOCK]
CREATE USER GPB IDENTIFIED BY 123 ACCOUNT LOCK; -- 账户不能数字什么的开头
语法:ALTER USER 用户名 ACCOUNT LOCK/UNLOCK;
ALTER USER GPB ACCOUNT UNLOCK;
语法:ALTER USER 用户名 IDENTIFIED BY 新密码(新口令);
ALTER USER GPB IDENTIFIED BY 123456;
语法:DROP USER 用户名
DROP USER GPB;
尽管用户成功创建,但是还不能正常的登录Oracle数据库系统,因为该用户还没有任何权限。如果用户能够正常登录,至少需要CREATE SESSION系统权限。一般情况下,一个普通的用户(如scott),拥有CONNECT和RESOURCE两个角色即可进行常规的数据库开发工作。
语法:GRANT角色|权限 TO 用户(角色)
GRANT CONNECT TO TOM;
GRANT RESOURCE TO TOM;
赋予TOM
用户Connect
角色和Resource
角色后,jerry用户就可以正常开发工作了。
REVOKE 角色|权限 FROM 用户(角色)
REVOKE CONNECT FROM TOM;
REVOKE RESOURCE FROM TOM;
-- 写一起 GRANT CONNECT, RESOURCE,DBA TO TOM; REVOKE DBA FROM TOM;
语法:grant 权限 on 表 to 用户
eg:scott用户的dept表授权给kaifamiao
用户
grant all on dept to kaifamiao;
eg:kaifamiao
用户查看scott用户的dept表
select * from scott.dept;
提示:必须写用户.表名,例如本例中的scott.dept;
请输入用户名: SYSTEM 输入口令: 连接到: Oracle Database 11g Express Edition Release SQL> grant all on kaifamiao.infos to scott; 授权成功。 SQL> exit; 从 Oracle Database 11g Express Edition Relea D:\Tool\cmder>sqlplus SQL*Plus: Release 11.2.0.2.0 Production on Copyright (c) 1982, 2014, Oracle. All righ 请输入用户名: scott 输入口令: 连接到: Oracle Database 11g Express Edition Release SQL> select * from infos; select * from infos * 第 1 行出现错误: ORA-00942: 表或视图不存在 SQL> select * from scott.infos; select * from scott.infos * 第 1 行出现错误: ORA-00942: 表或视图不存在 SQL> select * from kaifamiao.infos; 未选定行 SQL>
-- 查看数据库的版本 SQL> select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production PL/SQL Release 11.2.0.2.0 - Production CORE 11.2.0.2.0 Production TNS for 64-bit Windows: Version 11.2.0.2.0 - Production NLSRTL Version 11.2.0.2.0 - Production -- 单行注释 /** 多行注释 */ -- 创建用户 语法:CREATE USER 用户名 IDENTIFIED BY 口令 [ACCOUNT LOCK|UNLOCK] eg: CREATE USER LZY IDENTIFIED BY 123 ACCOUNT UNLOCK; -- 赋于用户数据库角色(CONNECT角色|RESOURCE角色|DBA角色) 语法:GRANT 角色|权限 TO 用户 eg: GRANT CONNECT, RESOURCE, DBA TO LZY; -- 回收权限的语法 语法:REVOKE 角色|权限 FROM 用户 eg: REVOKE DBA FROM LZY; -- 修改密码 语法:ALTER USER 用户名 IDENTIFIED BY 新密码 eg: ALTER USER LZY IDENTIFIED BY 456; -- 修改用户处于锁定(非锁定)状态 eg: ALTER USER LZY ACCOUNT LOCK; -- dual虚拟表(dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录。我们可以用它来做很多事情。) SELECT SYSDATE,SYSTIMESTAMP FROM dual; -- 获得系统时间 SELECT SYS_CONTEXT('USERENV','TERMINAL') FROM dual;-- 获得主机名 select * from all_tables where owner='SCOTT';-- TEST为用户名,用户名必须是大写。 -- 查看当前登录的用户的表: select table_name from user_tables;
类型 | 含义 |
---|---|
CHAR(length) | 存储固定长度的字符串。参数length指定了长度,如果存储的字符串长度小于length,用空格填充。默认长度是1,最长不超过2000字节。 |
VARCHAR2(length) | 存储可变长度的字符串。length指定了该字符串的最大长度。默认长度是1,最长不超过4000字符。 |
NUMBER(p,s) | 既可以存储浮点数,也可以存储整数,p表示数字的最大位数(如果是小数包括整数部分和小数部分和小数点,p默认是38位),s是指小数位数。 |
DATE | 存储日期和时间,存储纪元、4位年、月、日、时、分、秒,存储时间从公元前4712年1月1日到公元后4712年12月31日。 |
TIMESTAMP | 不但存储日期的年月日,时分秒,以及秒后6位,同时包含时区。 |
CLOB | 存储大的文本,比如存储非结构化的XML文档 |
BLOB | 存储二进制对象,如图形、视频、声音等。 |
小贴士:
MySql的DATE:年月日
DATETIME:年月日时分秒
MySQL字符串:varchar类型
Oracle字符串:varchar2:类型
格式 | 输入的数字 | 实际的存储 |
---|---|---|
NUMBER | 1234.567 | 1234.567 |
NUMBER(6,2) | 123.4567 | 123.46 |
NUMBER(4,2) | 12345.67 | 输入的数字超过了所指定的精度,数据库不能存储 |
对于日期类型,可以使用sysdate
内置函数可以获取当前的系统日期和时间,返回DATE
类型,用systimestamp
函数可以返回当前日期、时间和时区。
CREATE TABLE INFOS ( STUID VARCHAR2(7) NOT NULL, --学号 学号=‘S’+班号+2位序号 STUNAME VARCHAR2(10) NOT NULL, --姓名 GENDER VARCHAR2(4) NOT NULL, --性别 AGE NUMBER(2) NOT NULL, --年龄 SEAT NUMBER(2) NOT NULL, --座号 ENROLLDATE DATE, --入学时间 STUADDRESS VARCHAR2(50) DEFAULT '地址不详', --住址 CLASSNO VARCHAR2(4) NOT NULL --班号 班号=学期序号+班级序号 ) / ALTER TABLE INFOS ADD CONSTRAINT PK_INFOS PRIMARY KEY(STUID) / ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_GENDER CHECK(GENDER = '男' OR GENDER = '女') / ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_SEAT CHECK(SEAT >=0 AND SEAT <=50) / ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_AGE CHECK(AGE >=0 AND AGE<=100) / ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_CLASSNO CHECK((CLASSNO >='1001' AND CLASSNO<='1999') OR (CLASSNO >='2001' AND CLASSNO<='2999')) / ALTER TABLE INFOS ADD CONSTRAINT UN_STUNAME UNIQUE(STUNAME) /
解析:
CREATE TABLE SCORES ( ID NUMBER , --ID TERM VARCHAR2(2), --学期 S1或S2 STUID VARCHAR2(7) NOT NULL, --学号 EXAMNO VARCHAR2(7) NOT NULL, --考号 E+班号+序号 WRITTENSCORE NUMBER(4,1) NOT NULL, --笔试成绩 LABSCORE NUMBER(4,1) NOT NULL --机试成绩 ) / ALTER TABLE SCORES ADD CONSTRAINT CK_SCORES_TERM CHECK(TERM = 'S1' OR TERM ='S2') / ALTER TABLE SCORES ADD CONSTRAINT FK_SCORES_INFOS_STUID FOREIGN KEY(STUID) REFERENCES INFOS(STUID) /
解析:
创建 emp和dept表:
D:\Tool\cmder>sqlplus SQL*Plus: Release 11.2.0.2.0 Production on 星期一 10月 18 20:26:17 2021 Copyright (c) 1982, 2014, Oracle. All rights reserved. 请输入用户名: kaifamiao 输入口令: 连接到: Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production SQL> CREATE TABLE DEPT(deptid int, deptname varchar2(20), deptaddr varchar2(13), datetime date); 表已创建。 SQL> ALTER TABLE DEPT ADD CONSTRAINT pk_deptid PRIMARY KEY(deptid); 表已更改。 SQL> CREATE TABLE EMP(empid int, deptid int, empname varchar2(20), job varchar2(20), manager int, entrydate date, salary float, bonus float); 表已创建。 SQL> ALTER TABLE EMP ADD CONSTRAINT pk_empid PRIMARY KEY(empid); 表已更改。 SQL> ALTER TABLE EMP ADD CONSTRAINT fk_deptid FOREIGN KEY(deptid) REFERENCES DEPT(deptid); 表已更改。 SQL>
1、数据操纵语言(DML):用来操纵数据库中数据的命令。包括:select、insert、update、delete。 2、数据定义语言(DDL):用来建立数据库、数据库对象和定义列的命令。包括:create、alter、drop。 3、数据控制语言(DCL):用来控制数据库组件的存取许可、权限等的命令。包括:grant、deny、revoke。 4、其他语言元素:如流程控制语言、内嵌函数、批处理语句等。
insert into tablename (date) values('2021-10-10'), values('2000-10-01');
insert into tablename (date) values(to_date(‘2021-10-10 13:13:13’,’YYYY-MM-DD HH24:MI:SS’));
MySql:自带 auto_increment
自增约束
Oracle:得自定义一个序列(Sequence)来定义自增长
CREATE SEQUENCE myseq; SELECT myseq.nextval from dual;-- 自增的序号【序号加一】 select myseq.currval from dual;-- 当前的序号【序号不变】
INSERT INTO "INFOS" VALUES ('s100102', '林冲', '男', '22', '2', TO_DATE('2009-08-09 06:30:10', 'YYYY-MM-DD HH24:MI:SS'), '西安', '1001'); INSERT INTO "INFOS" VALUES ('s100104', '阮小二', '男', '26', '3', TO_DATE('2021-10-18 21:16:10', 'YYYY-MM-DD HH24:MI:SS'), '', '1001');
解析:
SELECT STUNAME,GENDER,AGE,STUADDRESS FROM INFOS WHERE GENDER='男' ORDER BY AGE
尝试一下分页查询
SELECT * FROM ( select rownum as r ,t.* from dept t where rownum<=4 ) where r > 2
SQL> UPDATE INFOS SET CLASSNO='1002',STUADDRESS='山东莱芜' WHERE STUNAME='阮小二'; 1 rows updated SQL> commit;
SQL> DELETE FROM INFOS WHERE STUID='s100102'; 1 ROW DELETED SQL> COMMIT;
除了Delete语句删除数据外,truncate语句也可以删除语句
truncate table infos;
TRUNCATE
命令可以把表中的所有数据一次性全部删除。
TRUNCATE
和DELETE
都能把表中的数据全部删除,他们的区别是:
TRUNCATE
是DDL命令,删除的数据不能恢复;DELETE
命令是DML命令,删除后的数据可以通过日志文件恢复。TRUNCATE
相对DELETE
速度快。TRUNCATE
命令比较危险,因此在实际开发中,TRUNCATE
命令慎用。尝试一下分页查询
SELECT * FROM ( select rownum as r ,t.* from dept t where rownum<=4 ) where r > 2
SQL> UPDATE INFOS SET CLASSNO='1002',STUADDRESS='山东莱芜' WHERE STUNAME='阮小二'; 1 rows updated SQL> commit;
SQL> DELETE FROM INFOS WHERE STUID='s100102'; 1 ROW DELETED SQL> COMMIT;
除了Delete语句删除数据外,truncate语句也可以删除语句
truncate table infos;
TRUNCATE
命令可以把表中的所有数据一次性全部删除。
TRUNCATE
和DELETE
都能把表中的数据全部删除,他们的区别是:
TRUNCATE
是DDL命令,删除的数据不能恢复;DELETE
命令是DML命令,删除后的数据可以通过日志文件恢复。TRUNCATE
相对DELETE
速度快。TRUNCATE
命令比较危险,因此在实际开发中,TRUNCATE
命令慎用。