Oracle学习
一、数据库的历史
1.1 数据库的发展
人工管理阶段---------->文件系统阶段------------------>数据库系统阶段
数据库的核心:数据模型
数据库系统阶段发展:
一代数据库:层级网状数据库管理系统
二代数据库:关系数据库管理系统(RDBMS)
三代数据库:有待发展
1.2 数据库特点
1) 数据共享
2) 减少数据冗余度
3) 数据独立
4) 数据集中控制
5) 数据一致性和可维护性,确保数据安全可靠
- 安全性控制:防止数据丢失、错误更新和越权使用
- 完整性控制:确保数据正确性、有效性和相容性
- 并发控制:同一时间周期内,允许数据实现多路存取,防止用户间不正常交互
- 故障的发现和恢复
6) 故障恢复
1.3 数据库对象
- 用户(user)
- 表(table)
- 视图(view)
- 索引(index)
- 触发器(trigger)
- 存储过程(procedure)
- 同义词(synonym)
- 序列(sequence)
1.4 SQL(Structured Query Language)
-
SQL(Structured Query Language),结构化查询语言,是专门操作关系型数据库的一种语言
-
SQL语言属于第四代编程语言
3) SQL语句的分类:
- DQL(数据查询语言),检索数据库数据,主要语句:SELETE
- DML(数据操作语言),改变数据库数据,主要语句:INSERT,UPDATE,DELETE
- DDL(数据定义语言),建立、修改、删除数据库对象,主要语句:CREATE,ALTER,DROP,TRUNCATE
- TCL(事务控制语言),维护数据一致性,主要语句:COMMIT,ROLLBACK,SAVEPOINT
- DCL(数据控制语言),权限授予和权限收回,主要语句:GRANT,REVOKE
- sql、sqlplus、pl/sql的区别:
- sql,结构化的查询语句,操作关系型数据库的语言
- sqlplus,oracle数据库软件自带工具,可以接收用户输入的sql语句,然后将sql执行结果显示出来
- pl/sql,程序化的sql语句,在sql语句的基础上加入一定的逻辑操作,如 if for 等
二、对Oracle的操作
1.数据查询select
1.1 对所有列进行查询![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-57XefKpW-1644742193241)(H:\笔记\java笔记\Oracle学习.assets\image-20210426101032235.png)]](https://file.cfanz.cn/uploads/png/2022/02/13/9/IWa7fOdbd1.png)
如:SELECT * FROM departments;
1.2 对特定列进行查询
如:SELECT dept_id FROM employees;
tip:
- SQL语言大小写不敏感
- SQL可以写一行或多行
- 关键字不能缩写和分行
- 子句一般分行和缩进,提高语句可读性
1.3 查询中加入算术运算符(+ - * /)
可对数字和日期使用
提出需求:这个月比上个月多发300工资
SELECT last_name,salary+300
FROM employees;
操作符优先级和数学运算符一致
提出需求:年薪多发10000工资
SELECT last_name,salary*12+300
FROM employees;
提出需求:每月补贴1000,计算一年薪资
SELECT last_name,(salary+1000)*12
FROM employees;
1.4 对表格中空值的理解
- 空值是无效的,未指定的,未知的或不可预知的值
- 空值不是空格或者0
- 包含空值的数学表达式的值都为空值
如查询提成,没有提出为控制:
SELECT last_name,12*salary*commission_pct
FROM employees;
1.5 对别名的使用(关键字 AS)
关键字as可写可不写,如:
SELECT last_name AS name,commission_pct comm
FROM employees;
(其中name和comm为别名)
tip:当别名是多个单词组成或指定了大小写时,应用双引号括起来(只有在此处出现双引号)
SELECT last_name AS “Name”,commission_pct “comm pct”
FROM employees;
1.6 连接符的使用(||)
用于列的合并,把两列的字符连接在一起。如:
SELECT last_name||first_name FROM employees;
select last_name||’`s job_id is’||job_id details
from employees;
1.7 字符串的使用
-
字符串可以是列表中的字符、数字、日期
-
日期和字符只能在单引号中出现
-
每返回一行时,字符串被输出一次
如:
SELECT last_name || ’ is a '||job_id
AS “Employee Details”
FROM employees;
1.8 行重复问题(distinct)
引子:
SELECT department_id FROM employees;
多个员工同属一个部门,出现重复行
去重复行使用关键字distinct,如:
SELECT DISTINCT department_id
FROM employees;
错误例子:
SELECT last_name,DISTINCT department_id FROM employees;
两个字段的列数不匹配,所以出错。
1.9注释
sql里边的注释是 –
例题:
1.sql*plus命令可以控制数据库吗? 不可以。
2.找错误? 标点符号需要英文格式下!!
select employee_id,last_name “name” from employees;
3.显示表结构,查询全部数据?
desc employees; --desc 是sql*plus命令
select * from employees;
2.过滤和排序
2.1过滤(关键字 where)
需要查询部门id为90的员工
select employees_id,last_name,department_id
from employees
where department_id=90;
2.2字符和日期
- 字符和日期要包含在单引号中
- 字符大小写敏感,日期格式敏感
- 默认日期格式是DD-MON月-RR
查询员工名为Whalen的工资
select last_name,salary
from employees
where last_name=‘Whalen’;
查询入职时间为1994年6月7号的员工
select last_name
from employees
where hire_date=‘7-6月-1994’;
2.3数据运算
查询工资大于3000的员工
select last_name,salary
from employees
where salary >3000;
2.4其他比较运算
1)between…and…的使用
查询工资在2000到3000之间的员工信息
select last_name,salary
from employees
where salary between 2000 and 3000;
- in 的使用
查询部门编号为1和3的员工信息
select last_name,department_id
from employees
where department_id in(1,3);
3)like 的使用
- % 代表零个或多个字符
- _代表一个字符
查找名字以S开头的员工
select last_name
from employees
where last_name like ‘s%’;
如果匹配的数据包含特殊符号该怎么办??
使用关键字escape定义转义字符
查询job_id中以IT_开头的job_id
select job_id
from jobs
where job_id like ‘IT\_%’ escape ‘\’;
4)is null 的使用
查找管理者id为null的员工
select last_name,manager_id
from employees
where manager id is null;
2.5逻辑运算
1)and 的 使用
查询1号部门工资大于2000的员工
select last_name
from employees
where department_id=1 and salary>2000;
2)or 的使用
查询在1号部门工作的员工和在3号部门工作的员工
select last_name,department_id
from employees
where department_id=1 or department_id=3;
- not 的使用
查询除了1号部门和3号部门的所有员工信息
select last_name
from employees
where department_id not in(1,3);
2.6关于运算符的优先级
- 可以使用括号改变优先级顺序
2.7排序(关键字 ORDER BY)
- -ORDER BY子句在select语句结尾
- ASC:升序 (默认) DESC:降序
1)单列排序
查询所有员工信息按入职先后排序
select last_name,hire_date
from employees
order by hire_date;
2)多列排序(当第一列相同时,使用第二列的排序)
查询所有员工信息,以部门和工资降序排序
select last_name,department_id,salary
from employees
order by department_id,salary desc;
3.单行函数
只对一行进行变换,每行返回一个结果
3.1字符函数
3.2数字函数
3.3日期函数
sysdate ,是Oracle中用来表示当前时间的关键字,并且可以使用它来参与时间运算 。日期的加减操作单位是天。
日期的操作在不同的会话环境有所不同,如下改变会话环境。
alter session set nls_language=english;
3.4转换函数
3.4.1隐式转换
3.4.2显示转化
1)TO_CHAR函数对日期转换
TO_CHAR(date,‘format_model’)
格式化输出日期 格式为 四位数的年 月 日 年第几天 月第几天 周第几天
select to_char(sysdate,‘yyyy-mm-DD DDD DD D’) from dual;
2)TO_DATE对字符的转换
select to_date(‘2012年10月29日’,‘yyyy"年"mm"月"dd"日"’) from dual;
3)使用TO_CHAR对数字转换
select to_char(salary,‘L99,999.00’) from employees;
- TO_NUMBER函数
将字符转换为数字
select to_number(‘123’) from dual;
tip: 当字符不是数字类型时出错。
3.5通用函数
这些函数适用于任何数据类型,同时也适用于空值:
-
NVL (expr1, expr2) 将空值转换成一个已知的值
-
NVL2 (expr1, expr2, expr3) expr1不为NULL,返回expr2;为NULL,返回expr3。
-
NULLIF (expr1, expr2) 相等返回NULL,不等返回expr1
4.多表查询
内连接
等值连接 =
非等值连接 between and
外连接(+)
左外连接
右外连接
自然连接 nature join
1999语法连接
join using()表中列名及列数据类型相同时可用
join on e.dept_id=d.id;
多表 join on 完再次join on
实现左外连接 在表后加left outer
实现右外连接 在表后加right outer
满外连接 在表后加full outer
自连接(自己连自己)
select emp.last_name,manager.last_name,emp.salary,emp.email
from employees emp,employees manager
where emp.manager_id = manager.employee_id and lower(emp.last_name)=‘chen’;
5.分组函数(聚合函数)
group…by… 经常搭配 having…
5.1组函数能够出现的位置:
-
select后面
-
having后面
-
order by后面
tip: where后面不能出现组函数,所以使用having添加组函数的筛选语句
5.2常用组函数
- avg ,求平均值
- count ,计算有多少条数据
- max ,求最大值
- min ,求最小值
- sum ,求和
5.3需要注意
如果select、having语句后面出现了组函数,那么select、having后面没有被组函数修饰的列,就必须出现在group by 后面 。
5.4select语句写的顺序
select 字段1,字段2
from 表
where 条件
group by 分组条件
having 分组筛选条件
order by 排序条件
如:
select department_id,avg(salary)
from employees
where department_id in(1,3,4)
group by department_id
having avg(salary)>2000
order by avg(salary) desc;
5.5select语句执行顺序
-
from子句,组装来自表的数据,有可能是多张表
-
where子句,基于指定的条件对记录行进行筛选
-
group by子句,将数据划分为多个分组
-
使用聚合函数对每个小组中的数据进行计算
-
having子句,进行条件筛选,这里可以使用聚合函数的计算结果
-
计算所有的运算表达式,主要是select部分
-
order by子句,对结果集进行排序
5.6子查询
子查询,也称嵌套查询,即一个select语句中嵌套了另外的一个或者多个select语句 。
如:查询工资比Smith工资高的员工信息
select last_name,salary
from employees
where salary>(
select salary
from employees
where last_name='Smith');
5.7分页查询
5.7.1 伪列rownum
rownum表示为一个查询的结果的行号,从1开始,连续不断
5.7.2分页查询的实现
例如,查询employees表中,前10条数据
select rownum rn,id,last_name,dept_id
from employees
where rownum<=10
查询employees表中,第3~7条数据
select t.id,t.last_name,t.dept_id
from (
select rownum rn,id,last_name,dept_id
from s_emp
where rownum<=7
) t
where t.rn>=3;
6.创建和管理表(DDL)
6.1常见的数据库对象
6.2查询数据字典
- 查看用户定义的表
select table_name from user_tables;
- 查看用户定义的各种数据库对象
SELECT DISTINCT object_type FROM user_objects ;
3)查看用户定义的表,视图,同义词和序列
select * from user_catalog;
6.3表名和列明的命名规则
- 必须以字母开头
- 必须在 1–30 个字符之间
- 必须只能包含 A–Z, a–z, 0–9, _, $, 和 #
- 必须不能和用户定义的其他对象重名
- 必须不能是Oracle 的保留字
6.4sql数据类型
6.5表的创建、改名、清空和删除
1)表的创建create
方式一:(白手起家)
create table emp(
id number(7) ,
name varchar2(20),
salary number(10,2)
)
方式二:(依托于现有的表)带数据
create table emp2
as
select last_name name,salary
from employees;
在其后添加以下条件可创建空表,加其他筛选条件可以筛选数据
where 1=2
2)表的改名
rename emp1 to employees1;
3)表的清空truncate
–删除表中所有的数据
–释放表的存储空间,不可回滚
truncate table employees;
4)表达删除drop
drop table employees;
6.6管理表
1)添加一列
alter table emp1
add(email varchar2(20))
2)修改一列(修改为其他类型需要本列没有数据,修改默认值时已有数据不变,还是之前的默认值)
alter table emp1
modify(email number(20))
3)删除一列
alter table emp1
drop column email;
4)列名重命名
alter table emp1
rename column salary to sal;
tip: DDL命令不可回滚
7.DML语言
7.1插入数据
方式一:单条数据插入
insert into emp1 values(1,‘chang’,1000.00);
如果有某列数值为空时:
insert into emp1 values(1,‘chang’,null);
或者时:
insert into(id,name) values(1,‘chang’);
方式二:从其他表中导入数据
导入全部列:
insert into emp1
select *
from employees
where department_id=1;
导入特定列:
insert into sales(id,name,salary,commission_pct)
select employee_id,last_name,salary,commission_pct
from employees
where manager _id in (1,3);
7.2更新数据
1)修改单条数据
update emp1
set salary = 12000
where employee_id = 10;
2)修改全部数据
update emp1
set salary = 12000;
- 在更新语句中加入子查询
题目:调整与employee_id为200的员工job_id相同的员工的department_id为employee_id为100的员工的department_id。
update copy_emp
set department_id=(select department_id
from employees
where employee_id=100)
where job_id=_id=(select job_id
from employees
where employee_id=100)
4)更新的完整性错误问题
更新表外键时在另一个表中没有这个数据时不可更新
7.3删除数据
1)题目:从emp1表中删除dept1部门名称中含Public字符的部门id
delete from employees1
where department_id={
select department_id
from dept1
where department_name like ‘%Public’}
2)删除数据的完整性错误问题
该表为另一个表的外联表当主表中有应用到此外联表中的数据时该数据不可删除。
8. 数据库事务
8.1什么是事务?
事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。
8.2事务的组成
- 一个或多个DML 语句
- 一个 DDL(Data Definition Language – 数据定义语言) 语句
- 一个 DCL(Data Control Language – 数据控制语言) 语句
8.3事务的开始及结束
-
以第一个 DML 语句的执行作为开始
-
以下面的其中之一作为结束:
–COMMIT或 ROLLBACK 语句
–DDL 语句(自动提交)
–用户会话正常结束
–系统异常终止
8.4事务控制
9.约束
。。。
oracle中批量插入数据:
1.多个inset放在begin - end中
begin
insert into employees values(1,"dfs","gsdf","dsf");
insert into employees values(1,"dfs","gsdf","dsf");
end;