0
点赞
收藏
分享

微信扫一扫

Oracle简单命令

心智的年轮 2022-02-13 阅读 103

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)

  1. SQL(Structured Query Language),结构化查询语言,是专门操作关系型数据库的一种语言

  2. SQL语言属于第四代编程语言

3) SQL语句的分类:

  • DQL(数据查询语言),检索数据库数据,主要语句:SELETE
  • DML(数据操作语言),改变数据库数据,主要语句:INSERT,UPDATE,DELETE
  • DDL(数据定义语言),建立、修改、删除数据库对象,主要语句:CREATE,ALTER,DROP,TRUNCATE
  • TCL(事务控制语言),维护数据一致性,主要语句:COMMIT,ROLLBACK,SAVEPOINT
  • DCL(数据控制语言),权限授予和权限收回,主要语句:GRANT,REVOKE
  1. 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)]

​ 如: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;

  1. 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;

  1. 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;

  1. 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组函数能够出现的位置:

  1. select后面

  2. having后面

  3. 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语句执行顺序

  1. from子句,组装来自表的数据,有可能是多张表

  2. where子句,基于指定的条件对记录行进行筛选

  3. group by子句,将数据划分为多个分组

  4. 使用聚合函数对每个小组中的数据进行计算

  5. having子句,进行条件筛选,这里可以使用聚合函数的计算结果

  6. 计算所有的运算表达式,主要是select部分

  7. 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查询数据字典

  1. 查看用户定义的表

select table_name from user_tables;

  1. 查看用户定义的各种数据库对象

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;

  1. 在更新语句中加入子查询

题目:调整与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事务的开始及结束

  1. 以第一个 DML 语句的执行作为开始

  2. 以下面的其中之一作为结束:

    –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;
举报

相关推荐

0 条评论