Oracle数据库的安装
基础概念
数据库:能够长期保存,支持多用户共享,通过数据模型尽可能的减少冗余的数据集合。
数据库管理系统:用来创建,维护,管理,运行数据库的软件。
数据模型:
概念模型:解决存什么问题
逻辑模型:解决怎么存问题
逻辑模型
层次模型
网状模型
关系模型(主流的模型)
物理模型:解决存在哪的问题
Oracle三大文件:数据文件, 重做日志文件,控制文件
基础命令
sqlplus sys/1 as sysdba;
//登录系统管理员身份
alter user scott account unlock;
//解锁
alter user scott identified by tiger;
//设置默认密码tiger
conn scott/tiger;
//连接scott用户
show user ;
//显示用户名称
select * from tab ;
//显示当前用户下表的情况
desc tabname ;
//显示表结构
select * from tabname;
//显示表的内容
表结构
1、 部门表:dept
DEPTNO 表示部门编号,由两位数字所组成
DNAME 部门名称,最多由14个字符所组成
LOC 部门所在的位置
2、 雇员表:emp
EMPNO 雇员的编号,由四位数字所组成
ENAME 雇员的姓名,由10位字符所组成
JOB 雇员的职位
MGR 雇员对应的领导编号,领导也是雇员
HIREDATE 雇员的雇佣日期
SAL 基本工资,其中有两位小数,五倍整数,一共是七位
COMM 奖金,佣金
DEPTNO 雇员所在的部门编号
3、 工资等级表:salgrade
GRADE 工资的等级
LOSAL 此等级的最低工资
HISAL 此等级的最高工资
NSQL: not sql (大数据,内存数据库...)
SQL语句: 结构化查询语言
DQL:数据查询语言
DML: 数据操作语言(增加数据,修改数据,删除数据)
DDL: 数据定义语言
DCL: 数据控制语言(数据使用的权限)
TPL: 事务处理语言
简单的DQL语言:
select 查什么
from 从哪查
语法:
select [distinct] {*|{列名|表达式 [as] [列别名] [,...]}}
from 表名;
[]:可有可无可选项
{}:括号内自动为一组
*: 一个表的所有列
|:或者的意思
列名:列的名字
表达式:
算数表达式: 进行算数运算
字符串表达式: '||' 拼接运算符, 两个字符串可以做拼接成一个字符串的运算
as: 列别名的关键字 (默认就存在)
列别名: 给列或者表达式换一个名字 ,如果名字中有特殊符号用双引号引起来
,...: 同一组内的内容可以重复出现,中间用 逗号隔开
distinct: 唯一,去重复
空值问题:空值和任何数据进行算数运算的结果都为空
限制查询和排序
语法:
select [distinct] {*|{列名|表达式 [as] [列别名] [,...]}}
from 表名
[where 条件表达式] ;
where 作用: 限制查询
条件表达式 = 关系表达式 [逻辑运算符...]
关系表达式 = 列名 |表达式 比较运算符 列名 |表达式
变化后语法:
select [distinct] {*|{列名|表达式 [as] [列别名] [,...]}}
from 表名
[where {列名 |表达式 比较运算符 列名 |表达式} [逻辑运算符...]] ;
比较运算符 :得到的结果一定是真假
普通比较运算符:> < = >= <= !=
特殊比较运算符:is null; between and ;in ; like
isnull:
--查询没有奖金的人
select ename , job ,sal,comm from emp
where comm is null
like: 通配符:
_:一个长度的任意字符
%:任意长度的任意字符
escape:转义字符
--查询一个名字中包含S的人员信息
select * from emp
where ename like '%S%';
--查询名字中倒数第二个字母是T的人员信息
select * from emp
where ename like '%T_';
between and:
-- 查询工资在1000到2000之间的10部门人员信息
select * from emp
where deptno =10 and
sal between 1000 and 2000;
逻辑运算符: and 与 or 或 not 非
日期的比较: 语言问题?
select ename, hiredate, hiredate+1 from emp
where hiredate < '1-1月-17'
空值问题:
空值如果和任意数据进行比较运算的结果也为null值
逻辑运算:得到的结果一定是真假
and TRUE FALSE null
TRUE TRUE FALSE null
FALSE FALSE FALSE FALSE
null null FALSE null
or TRUE FALSE null
TRUE TRUE TRUE TRUE
FALSE TRUE FALSE null
null TRUE null null
排序
语法:
select [distinct] {*|{列名|表达式 [as] [列别名] [,...]}}
from 表名
[where 条件表达式]
[order by 列名|表达式|列别名 |数字 [asc] [desc] [,...]];
多表连接:当发现所查数据不再同一表内的时候,需要使用多表链接来一次查询多个表的数据
--查询smith的姓名、工资和部门名称
语法:
select [distinct] {*|{列名|表达式 [as] [列别名] [,...]}}
from 表名
[where 条件表达式]
[order by 列名|表达式|列别名 |数字 [asc] [desc] [,...]];
内部连接:不是外部连接的都是内部连接
等值连接: 连接条件只用等于号
不等值连接:连接条件不只用等于号
!!!!内部连接:
外部连接:不是内部连接的都是外部连接
+:在右边叫左外连接
+:在左边叫右外连接
N表关联最少需要n-1个条件
函数:一些提前准备好的代码(往往有固定的功能)
系统函数 + 自定义函数
系统函数:
单行函数:多行数据通过函数运算的结果还是多行数据
多行函数:多行数据通过函数运算的结果只有一行数据
单行函数:
函数语法:
使用场景:能使用列名或者表达式都可以使用函数
函数名( 入参)
入参规定数据的类型
字符函数:
字符转换:
Lower()
Upper()
initcap()
字符处理:
substr() //字符串截取
length() //字符的个数
concat()
instr() //求某一个字符串在另一个字符串中的位置
lpad() //填充
rpad()
trim() //去掉前后空格
replace()//替换字符串
--要求查询名字中含有S的人员信息 ,不允许使用substr,like
select * from emp
where instr(ename ,'S')>0;
select ename ,replace(ename,'S') from emp
where ename != replace(ename,'S')
数字函数:
abs: 绝对值
round:四舍五入
trunc:截取
ceil:向上取整
floor:向下取整
mod:取余运算
sign:判断正负数
日期函数:
sysdate:当前时间
months_between():求两个时间点之间差了几个月
add_months():指定日期过几个月后的日期
next_day():返回离当前日期最近的指定星期的日期
last_day():本月最后一天
转换函数:
通用函数:
nvl:处理空值
select ename ,sal ,comm,sal+nvl(comm,0)
from emp;
case:
decode:
例子1.:
-- 查询每个员工的姓名和部门名称
select ename,
case deptno
when 10 then
'ACCOUNTING'
when 20 then
'RESEARCH'
when 30 then
'SALES'
else
'OPERATIONS'
end
from emp;
select ename,
decode(deptno,
10,
'ACCOUNTING',
20,
'RESEARCH',
30,
'SALES',
'OPERATIONS')
from emp;
例子2.:
select ename,
case
when sal < 1000 then
'穷'
when sal between 1000 and 2000 then
'贫'
when sal > 2000 and sal <= 3000 then
'勉强能活'
else
'高富帅'
end
from emp;
select ename,
decode(sign(sal - 1000),
-1,
'穷',
0,
'贫',
1,
decode(sign(sal - 2000),
-1,
'贫',
0,
'贫',
1,
decode(sign(sal - 3000),
-1,
'勉强能活',
0,
'勉强能活',
1,
'高富帅')))
from emp;
转换函数:
to_char() ! 'yyyy-mm-dd hh24:mi:ss'
to_date() !
to_number()
多行函数:无论多少条数据,只有一个条结果,空值不参与任何统计
种类:Max,Min,Avg,Sum,Count
使用场景:select ,order by
求表内数据的行数:count(1),count(*)
函数名([distinct]列名|表达式)
分组语句:
group by
select [distinct] {*|{列名|表达式 [as] [列别名] [,...]}}
from 表名
[where 条件表达式]
[group by 列名|表达式 [,...]]
[having 条件表达式]
[order by 列名|表达式|列别名 |数字 [asc] [desc] [,...]];
子查询:把多个有关联的查询组合成一个查询,其中部分先执行的查询用括号括起来。
使用位置:除了group by 都可以
分类:
子查询结果分类:
单行子查询:
子查询返回结果为1行
多行子查询:
子查询结果超过1行
使用 any all in
多列子查询:
子查询使用的位置分类:
where子查询: 子查询的作用是提供一个条件
from子查询: 作用1:可以自定义新的数据集合,经过自己的设计,完成更复杂的查询需求
作用2:提升某些运算的优先级
select子查询:
相关子查询:
所在,自己,同
DML: 一切皆是查询
查询:
增加:insert
删除:delete
修改:update
删除:把查询语句的from保留,用delete替换掉select子句
增加:insert into
主数据插入:
insert into dept values(60,'haha',null);
insert into dept(deptno ,dname) values(70,'xixi');
业务数据插入:
insert into tabname select ...
修改:
update emp
set sal = 1000
where ename = 'SMITH'
相关update?
commit:提交
rollback:回滚
事务????
DDL:数据定义语言
create
drop
create :创造
create table Student (
name char(100),
age number(3),
sex char(2)
)
数据类型:
字符
char :固定字符 ,效率高,容易浪费
varchar2:不固定字符 ,效率慢,节省空间
数字
Number(所有数的位数,小数的位数)
日期
Date timstamp 支持毫秒
作业:oracle :5,6,7,9所有的题
能力好一点的:5章尝试用子查询, 7,9尝试多表
java:安装,配置
2的10以内次幂