oracle
1.常用的关系型数据库;
什么是关系数据库?
关系型数据库就是根据关系模型建立起来的数据库,关系模式就是通过相互联系的二维表格的方式存储数据
一个oracle数据库是由多个oracle实例组成的.
表属于用户,而用户属于数据库
2.oracle安装
解锁scott和hr用户
登录管理员账号sys
使用命令:
alter user scott account unlock
;解锁scott
alter user scott identified by tiger;
改令牌
conn hr 切换用户
3.dual表
Oracle提供的最小的表,不论进行何种操作(不要删除记录),它都只有一条记录——‘X’。 例如:执行select * from dual,里面只有一条记录;执行insert into dual values(‘Y’)后,再次查询dual表,仍然显示一条记录。
是sys用户下的一张内部表,所有用户都可以使用DUAL名称访问,无论什么时候这个表总是存在。 例如:执行一个查看当前日期的语句 select sysdate from
dual,这条语句在放在放在任何一个oracle数据库当中都不会报错,所以一般做一些特定查询的时候用这个表是最稳妥的。
4.sql中的空值
空值是无效的,未指定的,未知的或不可预知的值,空值不是空格或者0或""
- 包含null的表达式都为null
滤空函数nvl(a,b),如果 a 为 null 则返回 b - null != null
–查询奖金为null的员工
sql select * from emp where comm=null;
×
sql select * from emp where comm is null;
√ is / is not
5.基本查询
–当前用户 Show user
–当用户下的表 Select *from tab;
–员工的结构 Desc emp
–查询所有的员工信息 Select * from emp;
–查看行宽 Show linesize
–设置行宽 Set linesize 120
–通过列名查询 Select empno,ename,job.mgr.hiredate,.sal,comm,deptno from emp;
-DISTINCT去掉重复记录
Select deptno from emp;
Select distinct deptno from emp;
Select distinct deptno,job from emp;
distinct作用域后面的所有的列,只要组合起来不重复就可以
-连接符||
select ename||’的薪水是’||sal from emp;
-concat函数
select concat(‘NiHao’,’Oracle’); concat(str1, str2,...)
返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。
Select 3+2 from dual;
字符串:
是可以是select列表中的一个字符,数字,日期
日期和字符只能在单引号中出现
每当返回一行是,字符串被输出一次
字符大小写敏感
日期格式敏感
默认的日期根式是DD-MON-RR 21-6月-81='1981-6-21'
修改日期格式Alter session set NLS_DATE_FORMAT=’yyyy-mm-dd’; 仅当前窗口有效
其他比较运算符:
between..and...在两个之间(包含边界) 小在前大在后 包含边界值
in(set) 等于值类名的一个 如果集合中含有null,不能使用 not in ,可以使用in
like 模糊查询(‘%’,,’_’) 转义 \
查询名中含有下划线的员工
sqlselect * from emp where ename like ‘%\_%’ escape ‘\’;
is null 空值
逻辑运算
and 逻辑并 or逻辑或 not 逻辑否
Order by
Asc :升序 (默认) Desc:降序
select * from emp order by deptno,sal desc;
order by作用与后面的所有列,先按照第一个列表排序,再后面的列进行排序
desc只作用域离他最近的列
当order后会生成一个新的表,就不是原来的表了
null的排序,null值最大 使用滤空函数或者 最后面加上 nulls last;
6.函数
-
单行函数
字符函数: Select lower(‘NiHao java’),upper(‘NiHao java’ ) from dual; --substr(a,b)从a中,第b位开始取 Select substr(‘NIhao java’,4) from dual; --substr(a,b,c)从a中,第b位开始取,取C位 Select substr(‘NIhao java’,4,3) form dual; --length 字符数 lengthb字节数 Select length(‘nihao’),lengthb(‘nihao’) from dual; Select length(‘你好),lengthb(‘你好’) from dual; --replace Select replace(‘nihao java’,’a’,’*’)from dual; --trim去掉前后指定的字符 Select trim(‘H’ from ‘HelHlo WordH’) from dual; 数值函数 round四舍五入 trunc截断 select round(45.926,2),round(45.926,1),round(45.926,0),round(45.926,-1),round(45.926,-2) from dual; 45.93 45.9 46 50 0 select trunc(45.926,2),trunc(45.926,1),trunc(45.926,0),trunc(45.926,-1),trunc(45.926,-2) from dual; 45.92 45.9 45 40 0 假设 sysdate=’25-JUL-95’ round(sysdate,’month’)--01-AUG-95 round(sysdate,’year’)------01-JAN-96 日期函数 oracl中的日期数据时间含有两个值:日期和时间 默认的日期格式是: DD-MON-RR months_between 两个日期的相差的月数 add_months(date,1) 向指定日期加上若干约束 加1个月 next_day(date,char)指定日期的下一个日期 char:为1-7或星期日-星期六 last_day 本月的最后一天 --当前时间 select sysdate from dual; 格式转换 to_char 2021-04-03 15:48:20今天是星期六 Select to_char(sysdate,’yyyy-mm-dd hh24:mi:ss”今天是”day’) from dual; 字符串需要双引号 to_char 函数对数字的转换 格式: 9数字 0零 $美元符号 L本地货币符号 .小数点 ,千位符 查询员工的薪资 :两位小数,千位符,本地货币代码 select to_char(sal,’L9,999.99’) from emp;
-
通用函数
nvl滤空函数
条件表达式:在 sql中使用if-then-else
case表达式:
语法:
CASE expr WHEN comparison_exp1 then return_expr1
[WHEN comparison_exp2 then return_expr2
WHEN comparison_expn then return_exprn
ELSE else_expr]
END
–给员工涨工资,总裁1000,经理800,其他400
select ename,job,sal 涨前,
case job when ‘PRESIDENT’ then sal+1000
Whe ‘MANAGER’ then sal+800
else sal+400
end 涨后 from emp;decode函数:oracle自己的语法 ,类似java 语法: DECODE (col|expression,search1,resut1 [,search2,result2,...,] [,default] ) Select ename,job,sal涨前, Decode(job,’PRESIDENT’ ,sal+1000,’MANAGER’ ,sal+800,sal+400)涨后 From emp;
-
多行函数
组函数会忽略空值,组函数会自动缕空
常用的多行函数
Avg Count Max Min Sum
–工资总额
select sum(sal) from emp;
–人数
select count(*) from emp;select a,组函数(x) from emp group by a; 在select列表中,所有未包含在组函数中的列都应该包含在group by 子句中 包含在group by 子句中的列不必包含在select列表中 select a,b,c组函数(x) from emp group by a,b,c; 非法使用组函数 select deptno,count(ename) from emp; 多个列的分组:先按照第一个列分组,如果相同,再第二个列分组,以此类推 group by增强 Select deptno,job,sum(sal) from emp group by deptno,job; + select deptno,sum(sal) from emp group by deptno; + select sum(sal) from emp = select deptno,job,sum(sal) from emp group by rollup(deptno,job); group by rollup(a,b) 抽象 = group by a,b + group by a + 没有group by