Oracle体系划分
Oracle有
数据库--->数据库实例--->表空间--->数据文件
通常情况下Oracle数据库只会有一个实例就是ORCL
Oracle新建一个项目跟MySQL比较
MySQL :首先要创建一个数据库,再去创建相应的表
ORACLE:首先要创建一个表空间,再创建用户,再使用用户去创建表
不同点:ORACLE是多用户的,MYSQL是多数据库的
Oracle和MYSQL差别
相同点:
遵循SQL标准
不同点:
ORACLE是多用户的,MYSQL是多数据库的
不同厂商不同数据库产品,但是有自己的方言
使用自己的方言也能够完成相同的功能
Oracle安全级别比较高,MYSQL是开源免费的
SQL的分类以及每类常见的操作符
SQL:结构化查询语言
分类:有四类
DDL: 数据定义语言 create alter drop truncate
DML: 数据操纵语言 insert update delete
DCL: 数据控制语言 安全 授权 grant revoke
DQL: 数据查询语言 select from 子句 where字句
查询语句的结构:
select [列名] [*] from 表名 [where 条件] [group by 分组条件] [having 过滤] [order by 排序]
虚表和伪表的概念
SELECT 1+1;
这句SQL在ORACLE中会报错
在MYSQL中显示的是 如图所示不会报错
dual: oracle中的虚表 ,伪表 主要是用来补其语法结构的
所以上面的语句在Oracle 中应该这样写 SELECT 1+1 FROM dual;
查询SQL
统计一个emp表的数据总数
select count(*) from emp;// 第一种方式
select count(1) from emp;//第二种方式
注:直接写一个常量比 写 * 要高效
别名查询
注意: 别名查询 在Oracle as 关键字 可以省略
别名中不能有特殊字符或者关键字 如果有就加双引号
select ename 姓名, sal 工资 from emp;
去重复数据 distinct
注意:
select distinct from emp; //单列去重复
多列去重复数据
select distinct job,deptno from emp;
查询中的四则运算
select 1+1 from dual
--查询员工年薪
select sal*12 from emp;
-- 查询员工年薪 +奖金
select sal*12 + comm from emp; --- 这个返回有空值
--nvl 函数 : 如果参数1 为null 就返回参数2
select sal*12 + nvl(comm,0) from emp;
注意: null 值 代表不确定的 不可预知的内容,不可以做四则运算
字符串拼接
字符串拼接: java: +号拼接
Oracle: || 拼接
注意: 在Oracle 中,双引号主要是别名的时候使用 单引号是使用的值,是字符
--使用拼接符
select '姓名:' || ename from emp;
--使用函数拼接
select concat('姓名:',ename) from emp;
查询图:
条件查询
条件查询:【where 后面的写法】
关系运算符 > < = != >= <= <>
逻辑运算符:and or not
其他运算符:
like 模糊查询
in(set) 在某个集合内
between ... and ...在某个区间内
is null 判断为空
is not null 判断不为空
--查询每月能得到奖金的员工信息
select * from emp where comm is null;
--查询工资在1500 - 3000之间的员工信息
select * from emp where sal between 1500 and 3000
select * from emp where sal >= 1500 and <= 3000
--查询名字在某个范围的员工信息 ('JONES','SCOTT','FORD') in
select * from emp where ename in ('JONES','SCOTT','FORD');
--就是名字在这个范围内
查询图:
模糊查询 : like
% 匹配多个字符
_ 匹配单个字符 下划线
如果有特殊字符 需要使用 escape 转义
--查询员工姓名第三个字符是O的员工信息
select * from emp where ename like '__O%';
显示图:
--查询员工姓名中包含%的员工信息 escape 告诉系统那个是转义字符后面
select * from emp ename like '%\%%' escape '\' 告诉系统\后面的一个是转义字符
select * from emp ename like '%#%%' escaoe '\' 告诉系统#后面的一个是转义字符
显示图:
排序:order by
升序: asc
降序: desc 由高到低
排序注意null 问题 : nulls first | last
如果同时排列多列,用逗号,隔开
--查询员工信息 按照奖金由高到低排序
select * from emp order by comm desc nulls last; // 将空值放到最后面
显示图:
--查询部门编号和工资 按照部门升序排序 工资降序排序
select deptno, sal from emp order by depno asc,sal desc;
显示图:
函数
函数:必须有返回值
单行函数: 对某一行中的某个值进行处理
常用的单行函数:
数值函数
字符函数
日期函数
转换函数
通用函数
多行函数: max() min() count() sum avg
/**
avg统计空值的时候要注意
**/
---统计员工工资总和
select sum(sal) from emp;
--统计工员工奖金综合
select sum(comm) from emp;
--统计员工人数
select count(1) from emp;
--统计员工的平均奖金
select sum(comm)/count(1) from emp;
平均奖金忽略掉小数使用 ceil函数
select ceil(sum(comm)/count) from emp; --正确写计算奖金的算法
select avg(comm) from emp --这种计算会把奖金为空值的没有计算,不是平均值
显示图:
数值函数:
-- 四舍五入
select ceil(45.56) from dual ; --46
select floor(45.56) from dual ; -- 45
select round(45.5689,2) from dual; -- 45.57
select round(45.5689,1) from dual; -- 45.6
select round(45.5689,-1) from dual; -- 50
select round(45.56,-2) from dual; --- 0 -- 4<5没有进位了,所以为0
select round(65.6,-2) from dual; --- 100 -- 注意
-- 截断
select trunc(45.5689,2) from dual; -- 45.56
select trunc(45.5689,1) from dual; -- 45.5
select trunc(45.5689,-1) from dual; -- 40 --注意个位还存在
select trunc(45.56,-2) from dual; --- 0
select trunc(65.6,-2) from dual; --- 0
-- 求余
select mod(9,3) from dual; -- 0
select mod(9,4) from dual; -- 1
字符函数
-- 截取函数 subsrt(str1,起始索引,长度)
select substr('leeue@foxmail.com',0,3) from dual; --
显示图:
-- 获取字符串长度
select length('leeue@foxmail.com') from dual;
-- 去除字符两把的空格
select trim(' hhh ') from dual;
-- 替换字符串
select replace('hello','l','a') from dual ;
日期函数
--查询今天的日期
select sysdate from dual;
--查询3个月后的今天的日期
select add_months(sysdate,3) from dual; -- sysmdate 是服务器
---查询3天后的日期
select sysdate + 3 from dual;
-- 查询员工入职的天数‘
select sysdate - hiredate from emp;
select ceil(sysdate - hiredate) from emp;
-- 查询员工入职的周数
select ceil(sysdate - hiredate)/7 from emp;
-- 查询员工入职的月数
select months_between(sysdate,hiredate) from emp;
-- 查询员工入职的年份
select months_between(sysdate,hiredate)/12 from emp;
转换函数
-- 字符转换数值
select 100 + '10' from dual ;
-- 数值转字符
select to_char(sal,'$99999.99') from emp;
select to_char(sal,'$99,999.99') from emp;
日期转字符
-- 日期转字符 to_char()
select to_char(sysdate,'yyyy-mm-dd hh:mm:ss') from dual;
-- 只想要年
select to_char(sysdate,'yyyy') from dual;
字符转日期
select to_date('2017-04-10','yyyy-mm-dd') from dual;
-- 查询1981年 1985年入职的员工信息
select * from emp where hiredate between to_date('1981','yyyy') and to_date('1985','yyyy');
通用函数
nvl(参数1,参数2) 如果参数 1 == null 就返回参数2
select nvl2(null,5,6) from dual;
nvl2(参数1,参数2,参数3)如果参数1 == null 就返回参数3 否则返回参数 2
select nvl2(null,5,6) from dual; -- 返回 6
select nvl2(1,5,6) from dual; -- 返回 5
coalesce : 返回第一个不为null函数
select coalesce(null,bull,3,5,5,6) from dual; -- 返回 3
条件表达式
case 字段:
when 值1 then 值
when 值2 then 值
else
默认值
end
-- 给表英文姓名取一个中文名字
select
case ename
when 'SMITH' then '嘻嘻'
when 'ALLEN' then '诸葛留存'
else
'路人甲'
end
from emp; --这种写法Oracle 和 MySql都通用
显示出现:
Oracle特有的写法:decode(字段,if1,then1,if2,then2)
-- 给表中的姓名取一个中文名 Oracle 特有的写法
select decode(ename,'SMITH','哈哈','ALLEN','嘻嘻','路人甲乙丙丁') "中文名" from emp;
分组表达式 group by
select 分组的条件,分组之后的操作 from 表名 group by 分组的条件 having 条件过滤
-- 分组统计所有部门的平均工资,找出平均工资大于过滤大于2000的部门
select deptno,avg(sal) from emp group by deptno;
-- 过滤大于2000的部门
select deptno,avg(sal) from emp group by deptno having avg(sal) > 2000
--
注意
SQL 编写顺序
select ... from .... where ... group by .. having ... order by
SQL 的执行顺序
from ... where ... group by .. having ...select ... order by
上面分组这样写会出错
select deptno,avg(sal) avgsal from emp group by deptno having bb > 2000
注意: where 和 having 的区别
where 后面是不能接聚合函数,可以接单行函数
having 是在group by 之后执行,可以接聚合函数