Oracle第一天
一学习目标
二、Oracle介绍
mysql关系型的数据库 , 表于表的关系:外键 , 端口号:3306
redis:非关系型数据库 ,key - value , 端口号:6379
Oracle :关系型的数据库 , 端口号:1521
收费:19万左右, 每年交服务费
效率高, 安全
Oracle的版本:8I 9I 10G 11G 12C
职位:DBA(数据库管理员) , javaEE开发工程师
三、Oracle安装
1) 安装虚拟机: 解压到没有中文的路径之下
解压到没有中文的路径下 -- xxx.vmx 文件,双击打开
2) 在虚拟中安装oracle数据库
数据库的口令: orcl, 此口令是为 sys ,system
3)配置虚拟网卡:必须配置静态的ip地址
选择是仅主机模式, 如果改变了ip地址:修改配置文件,重启服务()
4)安装plsql工具
安装路径绝对不能有:小括号,空格,特殊符号
5) 解决中文乱码的问题
-- 环境变量的名称: NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
-- 查询服务端的密码
select userenv('language') from dual;
四、Oracle体系结构
数据库:只有一个数据库
实例:后台运行的一个进程
表空间:逻辑存储单位
数据文件:物理存储单位
用户:面向用户管理,都会对应一个表空间,向表空间中添加数据,都是保存到数据文件中
五、介绍scott用户和scott用户下的表
Oracle公司(甲骨文):埃里森, 软件开发实验室
scott的第一位程序员, pointbase
scott用户,密码:tiger
– 解锁用户
– alter user 用户名 account unlock;
alter user scott account unlock
— 重置密码
– alter user 用户名 identified by 密码;
alter user scott identified by tiger;
六、基本查询
-- dual :是一张虚表, 为了完善查询的语法结构,只有一行一列
-- 别名:如果是数字开头或者纯数字必须加双引号
-- 字符串使用单引号,别名使用双引号
select
length('abc') "长度",
length('abc') as "长度",
length('abc') as 长度,
length('abc') as '123' from dual;
-- 消除重复的记录
select distinct job from emp;
-- 四则运算:+ - * / -- 连接符号:||
select concat('a' , 'b') from dual;
select concat(concat('a' , 'b'),'c') from dual;
select 'a' || 'b'|| 'c' from dual;
select '1' + 1 from dual;
-- 查询员工的年薪: nvl(comm,0)
select sal * 12 + nvl(comm,0),nvl(comm,0) from emp;
七、条件查询
-- 查询有奖金的员工
select * from emp where comm > 0;
select * from emp where comm is not null and comm != 0;
-- 查询没有奖金的员工
select * from emp where comm is null or comm = 0;
-- not 取反
select * from emp where not(comm is not null and comm != 0);
-- 查询1981年入职的员工
select * from emp where to_char(hiredate,'yyyy') = '1981';
select * from emp where hiredate >= to_date('1981-01-01','yyyy-mm-dd')
and hiredate <= to_date('1981-12-31','yyyy-mm-dd');
select * from emp where hiredate between to_date('1981-01-01','yyyy-mm-dd')
and to_date('1981-12-31','yyyy-mm-dd') ;
--- 函数:to_char to_date
-- to_char (p1,p2):将日期转换为字符串
-- p1:要转换的日期
-- p2:转换的格式
select sysdate,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss day') from dual;
-- to_date(p1,p2):将字符串转换为日期
-- p1:要转换的字符串
-- p2:转换的格式
select '2018-07-06 11:11:11' ,
to_date('2018-07-06 11:11:11' ,'yyyy-mm-dd hh24:mi:ss') from dual;
-- upper: 转换为大写 lower :转换为小写
select * from emp where upper(ename) like upper('%M%');
-- 排序
-- 查询所有员工按照工资升序
select * from emp order by sal asc;
-- 查询所有员工按照工资降序
select * from emp order by sal desc;
-- 查询所有员工按照奖金升序排序(null值放到前面)
select * from emp order by nvl(comm,0) asc;
select * from emp order by comm asc nulls first;
-- 查询所有员工按照奖金降序排序(null值放到后面)
select * from emp order by comm desc nulls last;
八、单行函数
-- 单行函数
select length(ename) from emp;
--字符串函数
-- concat
-- length
-- substr(str, p1 ,p2): str:截取的字符串 ,p1:开始的索引 ,p2:截取的长度
-- 起始索引用0和1是一样的
select substr('abcjavadef' , 4, 4 ) from dual;
select substr('abcjavadef' , 1, 3 ) from dual;
select substr('abcjavadef' , 0, 3 ) from dual;
-- replace(str ,p1,p2) : 替换 str:要替换的字符串 p1:被替换的 p2:替换成的
select replace('abcdefa' , 'a' ,'z') from dual;
-- trim() 去除两侧的空白
select trim(' abc '),ltrim(' abc '),rtrim(' abc ') from dual;
-- upper lower
--日期函数
-- 两个日期相减 == 天数
select sysdate - hiredate from emp;
-- 周数
select (sysdate - hiredate) / 7 from emp;
-- 月数:months_between
select months_between(sysdate , hiredate) from emp;
-- 修改月份: add_months
select add_months(sysdate ,-12) from dual;
--数值函数
-- round () 四舍五入
select round(2.666) from dual;
-- trunc() 截取
select trunc(2.666,1) from dual;
-- mod() 模运算符(求余)
select mod(3,10) from dual;
--转换函数
-- to_char to_date
-- to_char to_number
select 1 ,to_char(1),'1',to_number('1') from dual;
select 1 + '1' from dual;
--通用函数
-- nvl
九、多行函数
-- 多行函数(聚合函数,分组函数)(count, avg, max ,min ,sum)
-- 分组后能显示的列:分组函数和在group by语句中出现的列
select
count(1),deptno, avg(sal),max(sal) ,min(sal) ,sum(sal)
from emp group by deptno;
-- 查询大于4个人的部门
-- 在where中不能加分组函数,where 必须放到group by前面
-- having 在分组的基础上进一步的筛选
select count(1),deptno from emp group by deptno having count(1) > 4;
练习
1. 查询和smith相同部门的员工姓名和雇用日期
select ename,hiredate from emp where deptno=(select deptno from emp where ename=upper('smith'))
2. 查询工资比公司平均工资高的员工的员工号,姓名和工资。
select empno,ename,sal from emp where sal> (select avg(sal) from emp)
3. 查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资
select empno,ename,sal,deptno from emp where sal>(select avg(sal) from emp where deptno=20)and deptno!=20
4. 查询和姓名中包含字母U的员工在相同部门的员工的员工号和姓名
select empno,ename from emp where deptno=(select deptno from emp where ename like '%U%')
5. 查询领导是King的员工姓名和工资
select ename,sal from emp where mgr= (select empno from emp where ename='KING')