Oracle: 数据库,
1,认识数据库
数据库:数据的仓库,保存大量数据的地方,有利于对数据的维护。增删改查很方便。
数据库分类:
层次型数据库:现实世界中很多事物是按层次组织起来的。层次数据模型的提出,首先是为了模拟这种按层次组织起来的事物。
网状型数据库:处理以记录类型为结点的网状数据模型的数据库。处理方法是将网状结构分解成若干棵二级树结构,称为系。
关系型数据库:mysql SQLserver oracle
分布式数据库:是指数据分存在计算机网络中的各台计算机上的数据库
oracle 数据库
oracle :甲骨文公司 全球第一大数据库厂商
2 关系型数据库概念
a,由 E.F.Codd博士在1970年提出关系型数据库系统模型
b,它是关系型数据库管理系统的基础
c,关系型数据库模型包含以下3部分内容
i 包含一系列【关系】和【对象】
ii 包含一系列对于关系的操作-->增删改查
iii 包含数据完整性约束
【规范保存到数据库中的数据】
* 关系型数据库中的关系是指:
把实际问题的数据分别归成若干个简单的二元关系,
一个二元关系都可以建一个满足一定条件的二维表格
关系 : 二维表格
3 关系型数据库是由一系列二维表组成
二维表:每张表由行和列组成
可以通过Structured Query Language 操作数据库表中的数据
二维表:一行 一条数据
一列(字段) 一类数据
Primary Key:主键
主键:表中的一个列,随便是什么列
要求:非空且唯一
主要用于 唯一的表示一条数据
Foreign Key:外键
为了表结构的优化,所产生的操作,
使用外键进行表和表的关联
外键:值可以为空,可以重复,
如果有值必须是关联表主键中的值.
4 完整性约束条件
【不满足 完整性,数据不能保存到数据库中】
关系完整性是为保证数据库中数据的正确性和相容性,对关系模型提出的某种约束条件或规则
在关系模型中,关系完整性主要是指以下三方面:
a、实体完整性(主键约束):所谓的实体完整性就是指关系(所谓的关系就是表)的主键不能取空值;
比如学生表通常是取学号为主键
b、参照完整性(外键约束):是指参照关系中每个元素的外码要么为空(NULL),要么等于被参照关系中某个元素的主码;
比如今天是9月2日是开学日,大学新生刚来报道,在学生表里,有的学生可能还没来得及分配具体的班,所以这些还未来得及分班的学生教务处可以在学生表里的班级属性取空值NULL(空值代表“不确定”),而哪些已分了班的学生就必须取班级表里的某些属性,比如班级类别,即学生属于哪个班。比如取“软件工程”,”计算机技术应用“等等。参照关系也称为外键表,被参照关系也称为主键表。
c、用户定义的完整性(自定义约束):指对关系中每个属性的取值作一个限制(或称为约束)的具体定义。比如 性别属性只能取”男“或”女“ ,再就是年龄的取值范围,可以取值0-130 ,但不能取负数,因为年龄不可能是负数
横着看:就是看行,是一条数据。
竖着看:就是看列,是某一类数据。
看数据库:
圆饼累加的圆柱都代表数据库,
在关系型数据中都是一张一张表存放的。
每一张表放大都是一个二维表
oracle数据库是不区分大小写的
字段/属性
Table Name:S_customer Table Name:s_emp
id name phone emp_id id name
201 tom 151000 12 10 市场部
202 jak 152000 14 11 教管部
203 tom 159000 11 12 mis部
204 sport 153000 14 14 教学部
解释:
id(Primary key)---主键列(非空且唯一):以后每一个表都有一个id列,因为每一条数据需要一个特殊标示,这个id就是唯一的标示了一条数据。
name:标示这一列都是代表姓名信息
phone:标示这一列都是代表电话信息
rep_id:外键(Foreign key),这样是另一个表的主键(id),表与表之间就是通过这样的外键关联起来。
学习oracle需要了解:
Oracle中的对象
table:表 。重点学习的对象。
view:视图。在表的基础上,以后可能是一个结果作为一个视图
sequence:序列。将来这个序列就是用来产生id主键,主键要求唯一不重复
index:索引,提高我们的检索速度
Program unit:程序单元 在PL/SQL中声明的 存储过程,函数,包Program unit
oracle的组成:
oracle 10g:
9I:internet
10G:网格grid
11G
12C:云计算
内 ------------------> 外
Data-------------->operation System --> oracle10g --------->sql,pl/sql----->tools
电脑内存中的数据 打开操作系统 安装oracle软件 执行sql命令 使用各种工具
sql和sqlplus以及plsql区别:
sql:structured query language
有结构的 查询 语言 ---->结构化查询语言
第三代: 高级编程语言
第四代: 有结构的查询语言
只关心做什么 不关心怎么做
sql 命令 需要 ; 结尾,标示一条sql语句结尾
需求 : 得到名字叫张三的学生 所有信息
查询 张三
sqlplus:我们在登录oracle的时候提供一种登入oracle的方式
sqlplus 工具 用于执行 sql语句
sqlplus工具 可以完成的事情:
1,可以登入oracle数据库
2,执行输入的sql语句并且显示结果。
3,提供部分命令
sqlplus:有一些内置的命令,当使用这些命令的时候不需要 ; 结尾, 但是有 ; 也不会错
pl/sql:在存储过程中,在sql语言的基础上增加了逻辑控制功能。
BEGIN
IF c_id <= 0 THEN
RAISE ex_invalid_id;
ELSE
SELECT name, address INTO c_name, c_addr
FROM customers
WHERE id = c_id;
DBMS_OUTPUT.PUT_LINE ('Name: '|| c_name);
DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr);
END
oralce主要操作:
1.select语句
2.数据操纵语言(DML语句)data manipulation language
insert, update, delete
插入 更新 删除
有事务概念-->commit;
3.数据定义语言(DDL语句)data definition language
create(创建), alter(修改), drop(删除), rename(重命名), truncate(删除表中的数据)
会提交事务
4.事务控制语句(TCL语句)transction control language
commit(提交), rollback(回滚), savepoint(记录点,用来回滚)
5.数据控制语言(DCL语句)data control language
grant【授权】, revoke【回收】
安装数据库:
1521端口号 oracle的主服务端口号:使用oracle必须开启oracle主服务
8080端口号 oracle监听端口号:使用网页oracle或者使用工具连接oracle需要开启监听服务
localhost:8080/apex--->网页版oracle
oracle基础前导操作:
1.以管理员方式登录oracle
sqlplus system/密码
show user:显示当前登录的用户名字
2.创建新用户briup,密码briup
create user briup identified by briup;
3.给新用户briup授权
grant connect,resource to briup;
使用网页版oracle 创建用户:
不推荐
推荐:sqlplus:sql命令创建oracle数据库
3.激活用户:
alter user briup account unlock;
4.切换至briup用户
conn briup/briup
5.设置当前会话(session)的日期语言格式
alter session set nls_date_language=english;
6.执行sql文件
start e:/table.txt
@路径
7.查询当前用户下有哪些表?
select table_name from user_tables;
查看表有哪些列?
desc 表名
学习阶段主要涉及表:
S_EMP :员工表
id id
last_name 后名字 姓
first_name 前名字 名
userid 员工内部编号,没用
start_date 入职日期
comments 注释:记录员工的特点
manager_id 经理的id
title 职称
dept_id 所在部门id外键
salary 工资
commission_pct 提成
S_DEPT:部门表
id id
name 部门名称
region_id 所在地区id的外键
S_REGION :区域表
id id
name 区域名
三张表 主键 外键 关系需要很清楚
oracle二维表中列的数据类型:
1,NUMBER[(p,s)] 数值类型
p代表有效位数 精度(总长度),
s代表小数点后位数 刻度
eg:
NUMBER(6,2):
123456.00
1234.123
1234.12
123.123
NUMBER(3):
123
12.3
0.123
123.00
2,字符类型:
2.1:CHAR(8) 定长字符类型:占用空间固定
00000tom
0000lisi
hello world 不能保存
2.2:VARCHAR(8) mysql 变长字符类型:占用空间 跟着输入有关
2.3:VARCHAR2(8) oracle 变长字符类型:占用空间 跟着输入有关
tom
lisi
hello world 不能保存
oracle中字符串用 ''表示
oracle关键字不区分大小写,但是字符串区分大小写
3,日期类型:DATE
默认:04-9月-17
3.1:日期类型,世纪年月日时分秒都会保存
3.2:中文语言环境:
系统默认:'DD-MM-YY'
eg:'16-7月-17' ---> 2017/7/16
3.3:修改当前语言环境:
alter session set nls_date_language=english;
3.4:英文语言环境
系统默认:'DD-MM-YY'
eg:'16-JULY-17' ---> 2017/7/16
3.5:修改日期显示格式
alter session set nls_date_format='yyyy-mm-dd';
eg:select sysdate from dual;
【写一个长得和日期一样的字符串】
4,CLOB:超级长字符,整本小说的所有字符串 可以保存
5,BLOB:字节数组:可以用于保存文件的二进制字节数组.
字节数组: byte[]
select 语句 :作用:查询数据
1:distinct :消除重复行,有多条重复数据就只会显示一条
语法:
select [distinct] {*|(列名1,列名2...)}
from table;
* : 所有的列
样例:
(1)查询s_dept表中的所有信息
eg:
select * from s_dept;
(2)查询s_emp表中的last_name,salary
eg:
SeleCT LAst_NaME,Salary
from S_emP;
(3)查看s_emp表id,last_name,salary字段信息(列)
eg:
select id,last_name,salary
from s_emp;
(5) 查询所有部门名
eg:
select name
from s_dept;
(5.1) 去除重复的行
select distinct name
from s_dept;
2,起别名:给某一个列 起别名
语法:
select 列1 as 新列名字,列2 as 新列名字...
from 表
a.使用as
b.空格后直接跟别名
select 列1 别名1,列2 别名2...
from 表
c.使用双引号区分大小写
3, 算术运算符 + - * /
查询出来的列是可以运算的
当月工资 加 100;
eg:查询 s_emp 中last_name 列和年薪
4,nvl(参数一,参数二):空值函数
参数一 : 可能为空的列,
参数二 : 如果参数一的列为空 就使用参数二的值代替
单纯查工资和提成:
egs:
select salary,commission_pct
from s_emp;
eg: 查询当月工资:
使用nvl空值函数 进行操作
select salary*(1+ nvl(commission_pct,0) )
from s_emp
5,连接符||:可以将多个字符串或者多个字符串列的值进行拼接
作用:可以将多个列的值或者字符串进行拼接
注意:oracle中字符串使用的是单引号
oracle中单引号表示字符串.
语法:
select 列||'你好' from s_emp;
eg:1字符串拼接:
hello world
select 'hello'||'world' from dual;
dual表:哑表-->同义词
任何用户都可以使用,
一般使用做测试.
eg:2字符串拼接列:
姓:last_name
eg:3列拼接列:
名:三 姓 :张
sqlplus 命令特点:
运送sql语句)
把sql语句的结果集展示
: 缓存机制:
1.1:sqlplus会保存最近执行过的一条sql语句(可能是多行)
1.2:每次执行的sql语句都会保存在buffer中,但是会覆盖掉之前的sql语句
:命令 l : 显示刚才执行过的sql语句,并且写到缓存中。
语法: l
:命令 / : 执行缓存中的sql语句
语法: /
4 :命令 n : 直接输入一个数字 就是选中某一行--->下面用到的[定位]。
语法: n
:命令 a[ppend] : 在【定位】的那一行后面追加新的内容
语法: 先定位
a 被追加的字符串
6 :命令 c[hange] : 在【定位】的那一行修改指定的字符串内容
语法: 先定位
c /old/new
:命令 cl[ear] buff[er] : 清除缓存区中的sql语句
语法: cl buff 或 clear buffer
:命令 del : 删除【定位】的那一行
语法: 先定位
del
9 :命令 i[nput] : 在【定位】的那一行的后一行插入新的一行
语法: 先定位
i 把字符串插入下面一行
0 :命令 l[ist] n : 显示第n行内容
语法: l 4 显示第4行内容
11 :命令 n sql语句 : 重写那一行
语法: 2 from s_dept; //重写第二行
总结:
1,需要已经执行过一条sql语句。就是sqlplus缓存中有一条sql语句
2,需要先选中有问题的那一行, 输入n 定位某一行
3,使用下面相应的关键字 操作
2 :命令 SAVE filename : 将缓存中sql语句保存到本地文件
语法: SAVE 文件名
默认位置:C:UsersAdministrator
3 :命令 GET filename : 将文件中sql语句加载到缓存中,但是不执行sql语句
语法: get 文件名
4 :命令 START filename : 将文件中sql语句加载到缓存中,并且执行sql语句
语法: start 文件全路径+文件名
5 :命令 @ filename : 将文件中sql语句加载到缓存中,并且执行sql语句
语法: @ 文件全路径+文件名
6 :命令 edit filename : 以记事本形式打开文件,编辑sql语句, Ctrl+s保存,关闭。
语法: edit 文件全路径+文件名
7 :命令 ed : 将缓存中sql写到文件afiedt.buf并且打开文件
语法: ed
8 :命令 spool filename : 开始保存 sqlplus输入的任何结果,(录控制台)
语法: spool startPlus.text
9 :命令 spool off : 结束
语法: spool off
注意:spool 和spool off必须要一起使用
作用:记录sqlplus中sql操作
20: :命令 col [{column] [option] : 修改列在sqlplus中的显示格式(样式)
option : 取值: cle for hea jus
语法: col name for a15;//修改name列在sqlplus显示的长度为15
20.1:for操作字符串和日期:col 列名 for a12; 把这一列的长度定成12字符
20.2:for操作数字类型: col 列名 for 占位符;
补充: 占位符,用来占数字的位置
1) 9 :不强制补全 ,就是数字占位符一个9占一个数字位,如果数据数字长度大于9占位符长度就还会显示###,
col salary for 99999 就是这一列变成5个长度,因为用了5个9来占位
2) 0 :强制补全
col salary for 00099 就是这一列变成5个长度,因为用了三个0个两个9来占位,但是0是自动补全的,所有会在前面补0直到满足5个长度
3) $ :西方的货币符号 货币符号在一列数据中只能出现一个
col salary for $9999 就是用四个9占位,但是在显示的时候回在前面加一个$号
col salary for $0000
4) L :本地货币符号
同上,但是加的是本地的货币符号
5) . :小数点
就是小数点的意思
col salary for 9999.9999 就是一个四位数精确到小数点后四位。
6) , :分隔符
col salary for 9,999.99 在那个地方输出一个,号
20.3: col cle : 清除某一个列的格式
语法: col name cle
20.3: clear columns : 清除所有列的格式
使用:
L : 查看缓存sql
/ : 执行缓存sql
n sql : 重写缓存第n行的sql语句
c /old/new : 替换当前选中行的值
save 文件名 : 把缓存中是sql保存到某一个文件
get 文件名
@ 文件名
start 文件名
-----------------------------day1------------------------------
排序 Order by
1,语法:order by 列名 排序,列名 排序;
升序:asc 如果不写 默认为asc
降序:desc
eg:
select id,last_name,salary,commission_pct
from s_emp
order by commission_pct;
null 最大
2,特点:
2.1 : order by放在select语句最后一行,最后,最后,最后
2.2 : 默认升序(asc),降序(desc)
2.3 : order by后面可以跟列名、别名、select后面字段名的序号
不写排序规则就是默认升序排序
eg:
select id s_id ,salary a
from s_emp
order by s_id;
显示升序排序
eg:
显示降序排序
eg:
select id,salary,commission_pct
from s_emp
order by commission_pct desc;
字符串排序是按照ASCII值排序
eg:
按照多个列排序
eg:
select id,last_name,salary
from s_emp
order by salary desc,id;
注意:如果按照多个列进行排序,多个列之间逗号隔开,先按照第一个列的值进行排序,如果第一个列的值相同,那么会按照第二个列的值进行排序。.......以此类推
按照commission_pct进行排序
select last_name,commission_pct
from s_emp
order by commission_pct asc;
2.4 : null 表示无限大
where子句
作用:过滤(筛选)要查询的数据
书写位置:放置在from子句的后面 紧跟着from
书写组成:可以由字段名(列名)、常量、比较符、表达式等组成。
1, 基本操作符
逻辑比较操作符
= > < >= <=
select id,last_name,salary
from s_emp
where id = 10;
select id,last_name,salary//选列进行显示
from s_emp
where id < 5;//对行约束
不等于:三个都表示不等于的意思(经常用的是!=)
!= <> ^=
eg:查询 id last_name salary
from s_emp 需要查询的
条件是 工资大于1000
select id,last_name,salay
from s_emp
where salary > 1000
NGao
select salary
from s_emp
where last_name = 'Ngao'
eg:查询不是41部门的员工信息
select id,last_name,dept_id,salary
from s_emp
where dept_id != 41
2, (not) between 一 and 二
在某一个区间 [一,二]
select id,last_name
from s_emp
where id between 20 and 50;
eg:工资不在1000-2000之间的员工信息
select id,last_name,salary
from s_emp
where salary not between 1000 and 2000;
where salary between 100 and 1000;
where salary not between 100 and 1000;
eg:
select id,last_name,salary
from s_emp
where id between 4 and 10;
[4,10]
eg:
select id,last_name,salary
from s_emp
where salary not between 1000 and 2000;
3, 列名 (not) in(41,42,43)某一列的值只能是括号里的数据
eg:where 列名 in(41,42,10)
select id,last_name,salary
from s_emp
where id in (1,2,3,4,5);
工资1250|1000|1200
select id,last_name,salary
from s_emp
where salary in(1250,1000,1200);
4, and 且
需要连接多个条件
语法:where 条件一 and 条件二 当条件一和条件二都满足的数据才会被查询出来
eg:工资不在1000-2000之间的员工信息
from s_emp
where salary < 1000 or salary > 2000 and id = 10 or last_name = 'Ngao'
5, or 或
需要连接多个条件
eg: where 条件一 or 条件二 or 条件三 当条件一或者条件二满足一个就可以出来
select id,last_name,salary
from s_emp
where id < 10 or salary>1000;
6, (not) like:模糊匹配
_ :占位符 占一个符号位
% : 占位符 占0-多个位子
语法: where last_name like 'tom';
where last_name like '_om';
where last_name like '%o%';
escape : 定义转义符号。将特殊含义的字符串 转义为普通字符串
语法: where last_name like '/_briup' escape '/';
eg:last_name N开头员工信息
select id,last_name,salary
from s_emp
where last_name like 'N%'
eg:last_name 第二个字符 是 g
select id,last_name
from s_emp
where last_name like '_g%';
eg:包含g
select id,last_name,salary
from s_emp
where last_name like '%g%'
插入一条sql语句
insert into s_emp(id,last_name) values(99,'_briup');
commit;
eg:查询下划线开头的用户信息
select id,last_name
from s_emp
where last_name like '#_%' escape '#';
7, is (not) null : 判断那一列是null;
语法: where commission_pct is null;
select id,salary * commission_pct
from s_emp
where commission_pct is not null;
注意:oracle中字符串使用单引号,单引号中的字符区分大小写
eg:41号部门,salary 大于1500 salary降序
select dept_id,salary
from s_emp
where dept_id = 41 and salary < 1500
order by salary desc;
优先级:
(1)算术运算符
(2)连接符 ||
(3)比较符
(4)列名 [not]in 列名 [not]like
(5)列名 [not]between 1 and 2
(6)not
(7)and
(8)or
(函数)...
*使用括号改变优先级