Oracle概念及常用语句(一)
目录
- ORACLE
- 1. 概念
- 2. 数据库范式
- 2.1 概念
- 2.2 总结
- 3. Oracle数据库及PL/SQL安装
- 4. oracle语句
- 4.1 前置环境
- 4.2 简单查询 SELECT
- 4.2.1 语法
- 4.2.2 示例
- 4.2.3 算数运算
- 4.2.3(1) 语法
- 4.2.3(2) 示例
- 4.2.4 列别名
- 4.2.4(1) 语法
- 4.2.4(2) 示例
- 4.2.5 连接符 ||
- 4.2.5(1) 语法
- 4.2.5(2) 示例
- 4.2.6 去除重复记录distinct
- 4.2.6(1) 语法
- 4.2.6(2) 示例
- 4.3 where 子句
- 4.3.1 语法
- 4.3.2 比较运算符
- 4.3.2(1) 示例
- 4.3.3 通配符 LIKE
- 4.3.4(1) 示例
- 4.3.4 逻辑运算符
- 4.3.4(1) 示例
- 4.4 排序 ORDER BY
- 4.4.1 语法
- 4.4.2 示例
- 4.5 SQL语句执行顺序
- 4.6 单组函数
- 4.6.1 字符函数
- 4.6.2 数字函数
- 4.6.3 日期函数
- to_date()
- to_char()
- 4.6.4 分组函数(聚合函数、多行函数)
- 4.6.5 分组 group by 子句
- 4.6.5(1) 语法
- 4.6.5(2) 示例
- 4.6.6 过滤筛选 having 子句
- 4.6.6(1) 语法
- 4.6.6(2) 示例
ORACLE
1. 概念
1、Oracle是⼀个关系型(表)数据库,Oracle(甲⻣⽂公司)也是⼀个公司的名称
2、Oracle数据库的市场份额是最多的,Mysql数据库也是甲⻣⽂公司的
3、Oracle数据库价格昂贵,主要在电信、银⾏、证券、国企领域使⽤,Mysql主要是⼩公司、 互联⽹⾏业应⽤⽐较多
4、数据(data):数字、⽂字、图形、视频等
5、数据库(database):管理数据的仓库
6、数据库管理系统(DBMS):Oracle、Mysql
7、属性–字段–列
8、元组–记录–⾏
9、域-值域:属性的取值范围
10、主键:能够唯⼀的标识⼀条记录的属性或属性组(联合主键)
11:外键:在A表中不是主键,但是在B表中是主键,这⼀列就叫做A表的外键
12:Oracle版本:Oracle 9i–Internet、Oracle 10g–grid、Oracle 11g、Oracle 12c–cloud
13、Oracle默认端⼝是1521
14、表空间(TABLESPACE):存储表的⽂件,相当于Mysql⼀个数据库
2. 数据库范式
2.1 概念
数据库创建和存在是满⾜⼀定程度的规则的。⽽这些规则,我们称为范式。
- 第⼀范式(1NF):每⼀列都是不可再分的(即所有字段值都是不可分解的)
- 第⼆范式(2NF):确保数据库表中的每⼀列都和主键相关,⽽不能只与主键的某⼀部分相关 (主要针对联合主键⽽⾔)
- 第三范式(3NF):两个表之间除了可以使⽤主键当做关联字段外,不能有重叠部分(即表中不能包含在其它表中已包含的⾮主关键字信息),否则就会造成数据冗余)
2.2 总结
- 第一范式和第二范式是针对单个数据表的结构提出基本要求,范式是针对表与表之间的关系的
- 随着范式等级的提高,数据表属性之间的依赖关系越来越小,数据冗余越来越低,但数据关系也会越来越复杂
- 范式具有包含关系,一个数据库的设计如果满足第二范式,则一定符合第一范式,如果符合第三范式,则也一定符合第二范式
3. Oracle数据库及PL/SQL安装
参考:https://blog.csdn.net/weixin_56214452/article/details/116232978
4. oracle语句
4.1 前置环境
假设数据库中有以下三种类型的表
- 第一列Name:表示数据库中表的每一列的名称
- 第二列Type:表示该列的取值范围
- 常用类型:
- varchar2(n):可变字符串,最长为n位
- number[(n)]:数字,最长为n位
- date:日期
- 第三列Nullable:表示该列中的数据能否为空
- 第四列Default:表示是否有默认值
- 第五列Comments:表示该列是否有注释
- emp表
Name | Type | Nullable | Default | Comments | |
---|---|---|---|---|---|
EMPNO | NUMBER(4) | 工号 | |||
ENAME | VARCHAR2(10) | Y | 姓名 | ||
JOB | VARCHAR2(9) | Y | 职位 | ||
MGR | NUMBER(4) | Y | 经理的工号 | ||
HIREDATE | DATE | Y | 入职时间 | ||
SAL | NUMBER(7,2) | Y | 工资 | ||
COMM | NUMBER(7,2) | Y | 奖金 | ||
DEPTNO | NUMBER(2) | Y | 部门号 |
- dept表
Name | Type | Nullable | Default | Comments | |
---|---|---|---|---|---|
DEPTNO | NUMBER(2) | 部门号 | |||
DNAME | VARCHAR2(14) | Y | 部门名 | ||
LOC | VARCHAR2(13) | Y | 地址 |
- salgrade表
Name | Type | Nullable | Default | Comments | |
---|---|---|---|---|---|
GRADE | NUMBER | Y | 级别 | ||
LOSAL | NUMBER | Y | 最低工资 | ||
HISAL | NUMBER | Y | 最高工资 |
4.2 简单查询 SELECT
- SQL查询注意事项
- SQL关键字及列名、表名不区分⼤小写
- SQL语句可以换⾏,但是关键字不能换⾏
- SQL语句以分号结尾
4.2.1 语法
select 列名,列名,...|* from 表名
|:或者
4.2.2 示例
-- 简单查询
-- 查询指定的列
-- 查询员工姓名
select ename from emp;
-- 查询员工姓名、工资、部门号
select ename,sal,deptno from emp;
-- 查询员工全部信息
-- 星号表示查询所有列
select * from emp;
--:表示注释
4.2.3 算数运算
包含空值null的算数运算结果也为空
简单查询可以对某些列(NUMBER类型、DATE型)进行算术运算
4.2.3(1) 语法
select 列名(+—*/)数值 from 表名
4.2.3(2) 示例
-- 查询员工姓名、工资及工资加500后情况
select ename,sal,sal+500 from emp;
-- 查询员工姓名及年薪(不算奖金)
select ename,sal*12 from emp;
-- 获取当前时间函数 sysdate
select sysdate from dual;
-- 查询员工姓名及工作年限(当前时间-入职时间)/365
select ename,(sysdate-hiredate)/365 from emp;
-- 空值(null)是指不可用,不知道,不适用的值
-- 空值不等于零或空格
-- 查询员工姓名及年薪(包含奖金)
-- 包括空值的算法表达式等于空
select ename,sal*12+comm from emp;
dual表(虚表)
- oracle中dual表是一个单行单列的表,任何用户可读取
- dual表真实存在,但不是用来存取主题数据的
- dual表只有一行一列,只有一条数据
- dual表支持增删改查,也可以drop,但不要drop,会报错,导致数据库不能使用
4.2.4 列别名
- 给列取名,别名中有特殊符号或者空格,需要加双引号
4.2.4(1) 语法
select 列名 [as] 别名1, 列名(+—*/)数值 别名2,... from 表名
4.2.4(2) 示例
-- 使用as关键字 格式: 列名(表达式)as 别名
select ename as 姓名,sal*12 as 年薪 from emp;
-- as 可以省略不写 格式: 列名(表达式) 别名
select ename 姓名,sal*12 年薪 from emp;
-- 当别名中有特殊符号如空格,或者想区分大小写,需要将别名放在双引号中
select ename 姓名,sal*12 "年 薪" from emp;
select ename,sal*12 "totalsal" from emp;
4.2.5 连接符 ||
4.2.5(1) 语法
select 列名 || '可添加内容' || 列名 from 表名
4.2.5(2) 示例
select ename || ' is a '||job from emp;
4.2.6 去除重复记录distinct
4.2.6(1) 语法
select distinct 列名 from 表名;
4.2.6(2) 示例
-- 从员工表中查询部门号
select deptno from emp;
-- 去除重复的部门号
select distinct deptno from emp;
4.3 where 子句
4.3.1 语法
-- where后面的条件 将所有使得条件为true的记录查询出来
-- 如果条件永远为true,会将表中所有的记录全部查询出来
SELECT [DISTINCT] {*, column [alias], ...}
FROM table [WHERE condition(s)]
4.3.2 比较运算符
>:大于
≥:大于等于
<:小于
≤:小于等于
=:等于
<>或!=:不等于
between A and B:在两者之间,大于等于A并且小于等于B
in(list):in(A,B,C...):等于A或者等于B或者等于C...
is null:查询空值
is not null:查询内容不含空值
4.3.2(1) 示例
-- 查询部门号10的员工信息
select * from emp where deptno = 10;
-- 查询工资大于1500的员工信息
select * from emp where sal > 1500;
-- 查询工资小于3000的员工信息
select * from emp where sal <3000;
-- 查询工资大于等于1500的员工信息
select * from emp where sal >= 1500;
-- 查询工资小于等于3000的员工信息
select * from emp where sal <= 3000;
-- 查询部门号不是10的员工信息
select * from emp where deptno <> 10;
select * from emp where deptno != 10;
-- 查询工资在1500和3000之间的员工信息
select * from emp where sal between 1500 and 3000;
-- 查询工资为1500或3000的员工信息
select * from emp where sal in (1500,3000);
-- 查询部门10和部门20的员工信息
select * from emp where deptno in (10,20);
-- 查询奖金为空的员工信息
select * from emp where comm is null;
-- 查询奖金不为空的员工信息
select * from emp where comm is not null;
4.3.3 通配符 LIKE
%:表示0个或多个字符,例如张% 可以标识以张开头的所有人
_:表示1个字符,例如张_代表姓张的且姓名一共只有两个字的
\:转义符,%可以标识任意字符,\%这样就可以表示%本身
4.3.4(1) 示例
-- 查询姓名以S开头的员工
select * from emp where ename like 'S%';
-- 查询姓名第二个字符是A的员工
select * from emp where ename like '_A%';
-- 查询名字最后1个字是%的学生
select * from student where sname like '%\%' escape '\';
4.3.4 逻辑运算符
- AND:多个条件都要同时满足
- OR:只要满足其中1个条件
- NOT:对条件取反
- 优先级: not>and>or,使用括号可以提升优先级
4.3.4(1) 示例
-- 查询部门10中工资大于1500的员工信息
select * from emp where deptno=10 and sal>1500;
-- 查询工资在1500和3000之间且职位是SALESMAN的员工
select * from emp where sal between 1500 and 3000 and job = 'SALESMAN';
-- 查询部门10的员工信息或者工资大于1500的员工信息
select * from emp where deptno=10 or sal>1500;
-- 查询部门10和20的员工信息
select * from emp where deptno in (10,20);
select * from emp where deptno =10 or deptno =20;
-- 查询不是部门10和20的员工信息
select * from emp where deptno not in (10,20);
-- 查询emp表,显示奖金为空并且部门号为20或30的雇员信息
select * from emp where comm is null and deptno in (20,30);
select * from emp where comm is null and (deptno =20 or deptno=30);
4.4 排序 ORDER BY
使⽤ORDER BY ⼦句将记录排序
- ASC:升序,默认,可省略
- DESC:降序
4.4.1 语法
select * from 表名 order by 列名 [asc]|desc[,列名 asc|desc..];
4.4.2 示例
-- 查询部门30的员工信息,按照工资降序排
select * from emp where deptno =30 order by sal desc;
-- 查询部门20的员工信息,按照工资升序排
select * from emp where deptno =20 order by sal asc;
select * from emp where deptno =20 order by sal;
--多列排序
--查询员工信息,按照部门号升序,工资降序排
select * from emp order by deptno asc,sal desc;
--使用列别名排序
--查询姓名和年薪,按照别名年薪降序排
select ename,sal*12 年薪 from emp order by 年薪 desc;
--错误的,where执行的时候年薪还没有定义
select ename,sal*12 年薪 from emp where 年薪>30000;
--正确的
select ename,sal*12 年薪 from emp where sal*12>30000;
4.5 SQL语句执行顺序
1.from子句
2.where子句
3.group by子句
4.having子句
5.select子句
6.order by子句
4.6 单组函数
4.6.1 字符函数
-- UPPER('x') 将x中字符转换为大写
select upper('abcd') from dual;
-- 查询名字为SMITH的员工信息
select * from emp where ename = upper('smith');
-- lower('x'),将x中字符转换为小写
select lower('ABCD') from dual;
-- 查询名字为SMITH的员工信息
select * from emp where lower(ename) = 'smith';
select ename,lower(ename) from emp;
-- length('x') 返回字符串个数
select length('abcdef') from dual;
-- 查询姓名是5个字符员工
select * from emp where length(ename) =5
-- nvl(x,value) 如果x为null,返回value,否则返回x
-- nvl()函数中x和value的数据类型必须匹配
select nvl(1,100) from dual;
-- 查询员工姓名,年薪(包含奖金)
select ename,sal*12+nvl(comm,0) from emp;
-- substr(x,start,length) 截取字符串,从start开始,截取length个
select substr('abcdefgh',3,4) from dual;
-- replace(x,old,new) 将x中的old替换成new
select replace('123test456test','test','oracle') from dual;
4.6.2 数字函数
- ROUND(x,[y]):返回对x的取整结果,相当于四舍五入,x为被取整的数,y为保留几位小数,可取负值
- ROUND(5.73)=6
- ROUND(5.75,1)=5.8
- TRUNC(x,[y]):返回对x的截断结果
- TRUNC(5.73)=5,TRUNC(5.75,[1])=5.7
-- 查询员工姓名,日工资,保留1位小数
select ename,trunc(sal/22,1) from emp;
4.6.3 日期函数
Oracle以内部数字格式存储⽇期:世纪,年,⽉,⽇,⼩时,分钟,秒
缺省的⽇期格式是 DD-MON-YY
DD 2位天
MON ⽉简写 英语 JAN FEB 中⽂ 1⽉
YY 年的后2位 21
SYSDATE 是返回⽇期和时间的函数
DUAL是⽤来执⾏函数的虚表
⽇期必须⽤单引号括起来
to_date()
将字符串转换成⽇期类型
-- 查询1980年12月17号入职的员工
-- 第一种方式 Oracle认为满足DD-MON-YY这种格式的字符串是时间,其他字符串不是时间
-- 不推荐使用 因为DD-MON-YY格式是可以修改的
select * from emp where hiredate = '17-12月-80';
-- 第二种方式 to_date(日期,格式)
-- 推荐使用
select * from emp where hiredate = to_date('1980-12-17','YYYY-MM-DD');
to_char()
将⽇期转换成字符串类型
-- 查询1981年入职的员工
select * from emp where to_char(hiredate,'YYYY') = '1981'
select ename,hiredate,to_char(hiredate,'YYYY'),to_char(hiredate,'MM'), to_char(hiredate,'DD') from emp;
4.6.4 分组函数(聚合函数、多行函数)
求平均数:avg([distinct|all]列名),不计算空值
求和:sum([distinct|all]列名)
计数:count({*|[distinct|all]列名}
求最大值:max([distinct|all]列名)
求最小值:min([distinct|all]列名)
-- 查询公司平均工资,工资和,最低工资和最高工资
select avg(sal),sum(sal),min(sal),max(sal) from emp;
-- MIN 和 MAX函数适用于任何数据类型
-- 查询最早入职时间和最晚入职时间
select min(hiredate),max(hiredate) from emp;
-- count()函数,count()不统计空值
select count(empno),count(mgr) ,count(distinct mgr)from emp;
-- COUNT(*)返回表中的记录数
-- emp表有多少记录/员工
select count(*) from emp;
-- avg()函数,不计算空值
select avg(nvl(comm,0)) from emp;
select sum(comm)/count(*) from emp;
4.6.5 分组 group by 子句
使⽤GROUP BY⼦句将表分成⼩组
4.6.5(1) 语法
SELECT column, group_function FROM table [WHERE condition] [GROUP BY group_by_expression] [ORDER BY column];
select 后面的列,一定要出现在 group by 里面
出现在 group by 后面的列不一定要出现在select 后面
4.6.5(2) 示例
-- 查询每个部门的平均工资
select deptno, avg(sal) from emp group by deptno;
-- 查询每一种职位的平均工资、最低工资、最高工资
select job,avg(sal),min(sal),max(sal) from emp group by job;
-- 多列分组
-- 查询每个部门每种职位的平均工资
select deptno,job, avg(sal) from emp group by deptno,job order by deptno
-- 查询每个年龄段的男生女生数量
select sage,ssex,count(*) from student group by ssex,sage order by sage;
4.6.6 过滤筛选 having 子句
Having⼦句的作⽤是对⾏分组进⾏过滤,where⼦句的作⽤是对⾏进⾏过滤
4.6.6(1) 语法
SELECT column, group_function FROM table [WHERE condition] [GROUP BY group_by_expression] [HAVING group_condition] [ORDER BY column];
4.6.6(2) 示例
-- 查询每个部门平均工资,只显示大于2000的
select deptno, avg(sal) from emp group by deptno having avg(sal)>2000
-- 查询除了SALESMAN之外其他职位的平均工资
select job,avg(sal) from emp group by job having job <>'SALESMAN';
select job,avg(sal) from emp where job<>'SALESMAN' group by job;
-- 嵌套组函数
-- 查询三个部门平均工资中最高的
select max(avg(sal)) from emp group by deptno
Oracle概念及常用语句(一)相关推荐
- oracle运维常用语句,oracle运维个人常用检查语句整理
1.查找排序最多的SQL SQL> SELECT HASH_VALUE, SQL_TEXT, SORTS, EXECUTIONS FROM V$SQLAREA ORDER BY SORTS DE ...
- Oracle学习:常用语句
一.select语句 Select 语句的整体形式: select col1, col2- // 要查找的列名from table_name // 要搜索哪张表 where condition // ...
- Oracle SQL注入常用语句
解析IP select utl_inaddr.get_host_address('google.com') from dual; 获取本机IP地址 select utl_inaddr.get_host ...
- oracle配置话清单,oracle 几个常用话语
oracle 几个常用语句 1.复制表结构 create table table_name as (select * from table_name where 1 = 2 ) 2.插入表的数据 in ...
- Oracle常用语句:分页查询语句的写法
Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看. Oracle分页查询语句基本上可以按照本文给出的格式来进行套用. ...
- Oracle数据库数据查询语句示例(包含大部分常用语句)
Oracle数据库数据查询语句示例(包含大部分常用语句) 目标 本文用到的关系模式 语句示例 1.在创建的s,p,j和spj表中完成以下查询 (1)查询零件重量在10-20之间(包括10和20)的零件 ...
- Oracle数据库的数据更新语句与视图操作示例(包含大部分常用语句)
Oracle数据库的数据更新语句与视图操作(包含大部分常用语句) 目标 本文用到的关系模式 语句示例 1.在创建的student, course, teacher, sc, tc表中用SQL语句完成以 ...
- Oracle常用语句总结(后期续更)
Oracle常用语句总结 一.查看表空间占用情况 1. 查看表空间占用情况 2. 创建表空间 二.数据库情况查询 1. 查询数据库版本 2. 查询连接数 2.1 数据库连接数 2.1.1 查询数据库当 ...
- 怎么解锁oracle数据库表,Oracle数据库表解锁语句
--表解锁 select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_ ...
最新文章
- 那些没出现在近几年顶会上重要论文
- Lightoj 1281 New Traffic System (记忆化Dijkstra)
- 【Java】Integer.valueOf()
- Python字典中setdefault和update用法区别
- linux选择最短路径sdn,基于网络流量的SDN最短路径转发应用
- 设计模式(Design Patterns)详解
- Django(part31)--admin后台数据库管理
- node.js之打包工具webpack
- quartz和应用的集群问题
- linux nona怎么用_Linux nano编辑器命令常用方法
- 博客园使用攻略之如何添加自己的js文件
- base64-图片传输
- Golang学习日志 ━━ Gin-Vue-Admin按步骤手动创建api及router、service
- OpenCV——图像矩
- OpenCV-细化算法(thinning algorithm)描绘出轮廓的中心线
- OO ALV中的data_changed、data_changed_finished事件介绍
- 使用高德地图 地址一经纬度 之间相互转化的实例代码 python
- java wtc_java通过wtc调用tuxedo服务超时
- mysql 设置密码出现ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
- eNSP之防火墙简单实验(一)
热门文章
- ui动效 unity_Unity - UIWidgets 6. 显示列表
- 常用的一些子域名,旁站等查询网站
- Efficient RANSAC for Point-Cloud Shape Detection 点云形状检测的高效RANSAC法
- linux usb gadget驱动详解(三)
- 云服务HCIE变题当天一把过!分享下学习备考和考试经验
- 1万人同时在线的游戏服务器需要多少钱?
- 2019年互联网女皇趋势报告:小程序创新创业商业模式引领全球
- android 定位蓝牙,Android开发-蓝牙RSSI定位
- [计算机组成原理(唐朔飞 第2版)]第三章 系统总线(学习复习笔记)
- M209.长度最小的子数组