• oracle 相关


    Oracle安装配置

    设置四个账户及对应的密码

    No.

    用户名

    口令

    1

    sys

    change_on_install

    2

    system

    manager

    3

    scott

    tiget

    4

    sh

    sh

    上面的口令(密码)是Oracle官方最早的初始密码,为了以后学习中不会忘记密码,我们进行统一的设置。

    SqlPlus命令

    在oracle中我们使用sqlplus命令来操作数据库。

    首先在windows下打开cmd命令窗口。

    示例:sqlplus命令使用

    sqlplus回车

    输入用户和口令

    示例:切换到scott用户

    conn scott/tiger

    在scott用户下默认提供有一张emp雇员表,我们使用select语句查询一下。

    select * from emp;

    为了格式化显示我们使用一下命令:

    set linesize 300 –表示设置行的尺寸

    set pagesize 30 –表示设置每页显示多少记录

    服务的配置

    在win的服务中,把Oracle相关的服务自动设置为手动。

    oracle服务的开启

    监听服务OracleOraDb11g_home1TNSListener

    实例服务OracleServiceORAC

    开启监听和实例服务之后我们就可以正常使用sqlplus来操作oracle了。

    基本的SQL语句示例(增删改查)

    select * from emp;

    select * from dept;

    示例:查询所有雇员的雇员编号、雇员姓名、薪资、职位。

    select empno,ename,sal,job

    from emp;

    示例:查询所有雇员的雇员编号、雇员姓名、年薪。

    select empno,ename,sal*12

    from emp;

    示例:列出emp表中所有的部门编号(dis)。

    select distinct deptno

    from emp;

    示例:列出emp表中所有的职位及对应的部门编号。

    select distinct job,deptno

    from emp;

    切换用户、虚拟表dual

    切换用户时,sys用户必须使用dba身份登录

    conn sys/change_on_install as sysdba

    conn system/manager

    conn scott/tiger

    conn sh/sh

    虚拟表dual

    now() –MySQL日期(函数)

    sysdate –Oracle日期(伪列)

    select sysdate from emp;(不用虚拟表,不方便)

    select sysdate from dual;

    接下来的内容要求有MySql基础。

    练习题目:

    题目1:查询每个部门的平均薪水,之后显示部门平均薪水>2000的部门编号和其平均薪水。

    select avg(sal) from emp group by deptno;

    select deptno,avg(sal) 

    from emp 

    group by deptno having avg(sal)>2000;

    题目2:描述SQL语句:select deptno,avg(sal) from emp where sal>2000 group by deptno;

    用文字描述,注意:薪资大于2000的雇员筛选出,对筛选出的数据再分组。

    题目2扩展:查询在平均薪水大于2000的部门中,薪水大于三千的员工所在部门的部门编号,部门平均薪水。

    select deptno,avg(sal)

    from emp

    group by deptno having avg(sal)>2000;

    select deptno,avg(sal) 

    from emp

    where deptno in(select deptno

    from emp

    group by deptno having avg(sal)>2000) 

    and sal >3000

    group by deptno;

    其实与以下语句是等价的

    select deptno,avg(sal) 

    from emp 

    where sal>3000 

    group by deptno having avg(sal)>2000;

    题目3:查询每个部门的薪水和,再计算出所有部门的薪水的平均值。

    select sum(sal)

    from emp

    group by deptno;

    select deptno,sum(sal),avg(sal)

    from emp

    group by deptno;

    单行函数

    整个SQL的精髓:select语句+单行函数(背)。

    函数形式:返回值 函数名(参数列表)

    字符串函数

    常用的处理字符串的函数有如下:

    No.

    函数名

    含义

    1

    字符串 upper(列 | 字符串)

    将传入的字符串全部转为大写

    2

    字符串 lower(列 | 字符串)

    将传入的字符串全部转为小写

    3

    字符串 initcap(列 | 字符串)

    将传入的字符串的首字母转为大写,其他字母全部转为小写

    4

    数字 length(列 | 字符串)

    返回字符串的长度

    5

    字符串 substr(列 | 字符串,开始索引,[长度])

    进行字符串截取,如果没有指定长度,则从开始索引截取的结尾

    6

    字符串 replace(列 | 字符串,旧内容,新内容)

    对字符串的数据,以新的的子符内容替换旧的的子串内容

    题目1:将字符串“WelcomeToZiBo”转换为大写。

    select upper('welcomeToZiBo') from dual;

    题目2:将emp表的雇员姓名全部转换为小写。

    select lower(ename) from emp;

    注意:Oracle数据库是区分大小写的。

    SqlPlus命令接收用户输入语法:

    select &input from dual;

    注意:数字直接写,字符串单引号。

    一般用户输入时不会写单引号,也不会考虑大小写问题。

    select '&input' from dual;

    select upper('&input') from dual;

    题目3:由用户输入雇员姓名,然后显示雇员所有信息。

    select * from emp where ename=upper('&in');

    题目4:查询emp表所有的雇员姓名,返回的姓名首字母大写。

    select initcap(ename) from emp;

    题目5:查询雇员姓名长度为5的所有雇员的雇员编号、雇员姓名、职位。

    select empno,ename,job from emp where length(ename)=5;

    题目6:取得字符串'WelcomeToZiBo'的子串'ZiBo'。

    select substr('welcomeToZiBo',10,4) from dual;

    题目7:取得字符串'WelcomeToZiBo'的子串'come'。

    select substr('welcomeToZiBo',4,4) from dual;

    注意:Oracle的索引是从1开始的,及时设置了0也会从1开始。

    题目8:取得emp表每位雇员的雇员姓名、雇员姓名的前两位。

    select ename,substr(ename,1,2) from emp;

    题目9:取得emp表每位雇员的雇员姓名、雇员姓名的后两位。

    select ename,substr(ename,length(ename)-1,2) from emp;

    题目10:取得emp表每位雇员的雇员姓名、雇员姓名的前两位+后两位作为密码。

    select ename,substr(ename,1,2) || substr(ename,length(ename)-1,2) as password from emp;

    注意:Oracle的函数有几十万个,不可能全部记住,但是此次的函数都是极度通用和高度归纳的,要求必须记下。

    数值函数

    常用的处理数值的函数有如下:

    No.

    函数名

    含义

    1

    数字 round(列 | 数字[.小数位])

    返回数据四舍五入后的值

    2

    数字 trunc(列 | 数字[.小数位])

    数据截取,即不会进位

    3

    数字 mod(列 | 数字, 列 | 数字)

    求余数

    日期函数

    之前用过一个伪列sysdate,还有一个时间戳systimestamp。

    日期有三个操作公式:

    日期 + 数字 = 日期(n天之后的日期)

    日期 – 数字 = 日期(n天之前的日期)

    日期 – 日期 = 数字(日期之间的天数)

    示例1:显示三周前(21天)的日期。

    select sysdate-21 from dual;

    示例2:显示两周后(17天)的日期。

    select sysdate+14 from dual;

    示例3:查询每位雇员已经被雇佣的天数。

    select sysdate-hiredate from emp;

    select trunc(sysdate-hiredate) from emp;

    示例4:查询每位雇员已经被雇佣的月份和年份。

    select trunc(sysdate-hiredate)/30,trunc(sysdate-hiredate)/365 from emp;

    使用天使实现年或月的计算一定是不准确的。Oracle提供有以下日期函数:

    No.

    函数名

    含义

    1

    日期 add_months(列 | 日期,月数)

    返回增加若干月之后的日期

    2

    数字 months_between(列 | 日期, 列 | 日期)

    返回两个日期之间的月数

    3

    日期 last_day(列 | 日期)

    返回日期所在月的最后一天

    4

    日期 next_day(列 | 日期,星期X)

    返回日期在下周,星期X的日期

    题目1:实现4个月之后是哪一天。

    select add_months(sysdate,4) from dual;

    题目2:查询emp所有雇员到现在为止的雇佣月数。

    select empno,ename,trunc(months_between(sysdate,hiredate)) from emp;

    题目3:查询当前所在月的最后一天。

    select last_day(sysdate) from dual;

    题目4:查询所有雇员到现在为止的雇佣年份。

    方式1:(日期 - 日期 = 天数)/365    --(无法去除闰年)

    方式2:months_between(sysdate,hiredate)/12

    select empno,ename,trunc(trunc(months_between(sysdate,hiredate))/12) from emp;

    题目5:查询出所有雇员到现在为止的雇佣了多少年、多少月、多少天(较难)。

    转换函数

    字符串、数值和日期三类数据之间是可以实现转换的。

    No.

    函数名

    含义

    1

    字符串 to_char(列 | 日期,格式)

    将日期或数字按格式转为字符串

    2

    日期 to_date(列 | 字符串,格式)

    将字符串按格式转为日期

    3

    数字 to_number(列 | 字符串)

    将字符串转为数字

    to_char()

    一、日期变为字符串,必须指定转换的格式。

    日期:年yyyy月mm日dd

    时间:时hh hh24分mi秒ss

    数字:任意数字9,货币L

    示例1:将日期显示格式化。

    select to_char(sysdate,'yyyy-mm-dd') from dual;

    select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

    示例2:查询所有在4月份雇佣的雇员。

    select * from emp where to_char(hiredate,'mm')='04';

    select * from emp where to_char(hiredate,'mm')=4; --自动转型

    示例3:将数字格式化显示,使用货币格式化显示。

    select to_char('4758475847583','9,9999,9999,9999') from dual;

    select to_char('4758475847583','L9,999,999,999,999') from dual;

    二、将字符串变为日期

    示例4:将指定字符串按照格式转化为日期

    select to_date('2017-11-21','yyyy-mm-dd') from dual;

    三、将字符串转化为数字。

    示例5:to_number()演示。

    select to_number('12')+to_number('1') from dual;

    select '12'+'1' from dual;

    题目1:date char number之间经常进行转换,请描述下列SQL语句。

    select to_date('2017-07-14','yyyy-MM-dd') from dual;

    select to_date('2017-07-14','yyyy-MM-dd') as one_day from dual;

    select to_char(sysdate,'yyyy-MM-dd') as today from dual;

    select to_timestamp('2017-07-14 20:42:32.11','yyyy-MM-dd hh24:mi:ss:ff') as one_day from dual;

    select to_char(systimestamp,'yyyy-MM-dd hh24:mi:ss:ff') as today from dual;

    to_char(sysdate,'yyyy-MM-dd')

    select to_number(replace(to_char(sysdate,'yyyy-MM-dd'),'-')) from dual;

    select to_number(replace(to_char(sysdate,'yyyy-MM-dd'),'-')) as one_number from dual;

    其他函数

    有以下函数不便进行分类,开发之中会经常使用:

    No.

    函数名

    含义

    1

    数字 nvl (列 | null, 默认值)

    空值置换。如果传入的数据时null,则使用默认值,如果不是null,则使用原始数据。

    2

    数据类型 decode(列 | 字符串 | 数值,比较内容1,显示内容1, 比较内容2,显示内容2,…[,默认显示内容])

    条件取值。设置的内容会与每一个比较内容进行比较,如果内容相同,则使用显示内容进行输出,如果都不行同,使用默认内容输出。

    示例1:查询emp表所有雇员的雇员编号,姓名,薪资,佣金,年薪。

    select empno,ename,sal,comm,(sal+nvl(comm,0))*12 from emp;

    null与所有数据计算后还是null

    示例2:将emp表中的职位(办事员、经理)置换为中文。

    select empno,ename,job,decode(job,'CLERK','办事员','MANAGER','经理') from emp;

    多表查询、分组统计查询、子查询、数据伪列、表及约束、数据库对象、触发器、游标、存储过程PL/SQL

    这些知识的学习是开发和DBA都需要重点掌握的。

    面试经常会被问到的问题:

    在业界,大体可分为三类软件公司

    1、互联网行业(电商、P2P、O2O、互联网金融)

    2、传统领域软件行业(交通、电信、银行、电网)

    3、产品软件行业(医疗、军工、OA、企业级管理系统、第三方软件需求)

    数据库语言

    数据操作语言DML(data manipulation language)->(select insert update delete merge)

    数据定义语言DDL(data definition language)(create alter drop truncate)

    事务控制语言TCL(transation control language)->(commit rollback savepoint)

    数据控制语言DCL(data control language)->(grant revoke)

    decode函数 VS case表达式

    select empno,decode(deptno,10,'财务部',20,'研发部',30,'其他部门') from emp;

    select empno,case when deptno=10 then '财务部' when deptno=20 then '研发部' else '其他部门' end from emp;

    inexists

    “existsxxx就表示括号里的语句能不能查出记录,它要查的记录是否存在。

    in是全表扫描

    exists是做是否存在,非全表扫描

    示例1:查询属于领导(大小领导都包括)的员工。

    select * from emp where empno in(select mgr from emp);

    示例2:查询不存在员工的部门信息

    select * from dept t1 where not exists(select * from emp t2 where t1.deptno=t2.deptno);

    事务的开始和结束

    事务特性:事务必须具备ACID四个属性。

    原子性(Atomicity)事务是一个完整的操作,事务的各步操作是不可分的(原子的);要么一起成功,要么一起失败。

    一致性(Consistency)一个查询的结果必须与数据库在查询开始的状态一致(读不等待写,写不等待读)。

    隔离性(Isolaton)对于其他会话来说,未完成的(未提交)事务必须不可见。

    持久性(Durability)事务一旦提交完成,数据库就不可以丢失这个事务的结果,数据库通过日志能够保持事务的持久性。

    事务采用隐式的方式,起始于session的第一条DML语句

    查看事务

    select * from v$transaction;

    事务结束于

    (1)commit提交或rollback回滚;

    (2)DDL语句被执行(提交);

    (3)DCL语句被执行(提交);

    (4)用户退出SqlPlus(正常退出是提交,非正常退出时回滚);

    (5)机器故障或系统崩溃(回滚);

  • 相关阅读:
    css 字体相关属性的设置
    flex 三列布局
    python shelve模块
    python collections模块
    Python shutil模块,高级文件管理
    python中os模块的常用
    python中hashlib加密模块和sys系统模块
    logging日志模块
    random模块常用方法
    序列化json和pickle模块
  • 原文地址:https://www.cnblogs.com/zkzkzk/p/7877484.html
Copyright © 2020-2023  润新知