使用oracle之前,先打开两个服务。计算机-》管理-》服务
OracleOraDb11g_home1TNSListener、OracleServiceORCL
打开
· 运行——》cmd——》sqlplus
· win+R -> sqlplus
格式化指令 (命令不区分大小写)
· set pagesize 30;//设置每页长度。
· set linesize 300;//设置每行长度。
oracle命令创建记事本文件: ed+空格+文件名
· (如果不写后缀,默认为*.sql 找不到文件时就创建新的*.sql文件) 文件默认的路径:C:\Users\Administrator
· 保存文件后必须关闭才可以继续使用。
· 随后要想执行文件中的命令,使用“@文件名称”(默认找到*.sql的后缀)
用户切换语法:" conn 用户名/密码 [as sysdba] "
· 如果是使用sys登录,必须加上as sysdba,否则无法登录。
共有四个用户 ·超级管理员: sys/change_on_install
·普通管理员: system/manager
·普通用户: scott/tiger
·大数据用户 :sh/sh
" show user "命令,输出当前的登录的管理用户。emp表属于scott用户.
严格来讲,emp表的名称是“模式名称.表名称”,(用户名.表名称),即:scott.emp
在sqlplus命令里面,除了可以使用Oracle自己定义的命令之外,也可以使用host指令调用本机操作系统命令
·调用"echo" 命令:"host echo helloworld"
·调用"copy" 命令:"copy 源文件路径 拷贝文件路径 " 如: host copy e:\a.txt e:\b.txt
·DML:数据操作语言。主要是数据库的查询与更新。开发中使用的语言。
·DDL:数据定义语言。主要是指对象的创建。开发前的设计。
·DCL:数据控制语言。主要进行权限的管理操作。系统人员的工作。
select* from tab; 查询一个用户下所有的数据表。
desc 表名称; 查询一个表的结构。
根据每一列单独进行格式化操作。
例如: · col ename for a10;
· col job for a10;
简单查询基本语法:(首先执行的是from子句,确定数据来源)
select [distinct]* | 列名称 [别名],列名称 [别名],...
from 表名称 [别名];
eg: select job,empno from emp;
("*"指的是全部记录,所有的行和列,distinct关键字用于消除重复内容,distinct只能放在select后面)
(如果查询的数据是多个列,只有当多个列的数据都相同的情况下才可以消除)
可以对查询的结果进行四则运算,eg:select sal*12 from emp;
加别名:select sal*12 income from emp;(别名不建议使用中文)
在使用SELECT子句查询数据的时候,除了查询还可以设置一些常量:
·如果常量是字符串,使用单引号声明,例如'hello',别名不需要引号:
·如果常量是数字,则直接编写;
·如果常量是日期,则按照日期风格格式编写,"xx日-xx月-xx年".
·eg: select '雇员'ename from emp;
select子句中使用||可将两个列合并为一个列进行显示:
·eg1: select empno||ename from emp;
·eg2; select '雇员编号:'|| empno || ',姓名:'|| ename from emp;
在Oracle数据库中,所有的数据是要区分大小写的,
·eg: select * from emp where ename='SMITH';和小写的smith不一样,只有大写有查询结果。
空的操作只能是IS NULL 或者IS NOT NULL;
·eg: 查询所有领取佣金的雇员信息(佣金存在,不为空)
select * from emp where comm is not null;
select * from emp where not comm is null;
select句子要落后与where子句执行
·关系运算符:>、<、>=、<>(!=);
·逻辑运算符:AND、OR、NOT;
·范围运算符:BETWEEN...AND;
·谓词判断:IN、NOT IN;
·空判断:IS NULL、IS NOT NULL;
·模糊查询:LIKE;
使用LIKE模糊查询时,如果不设置关键字(%%"),则表示查询全部。
LIKE可以应用在各种数据类型上,不一定是字符串。
·eg: select * from emp where sal like '%9%';
使用NOT IN 查询时,查询范围里面不允许出现NULL,否则不会有任何查询结果。
· eg: select * from emp where empno not in(7369,7788,null); 结果未选定行
SECLECT子句落后于WHERE子句执行,所以在SELECT定义的别名,无法在WHERE中使用。
在整个的SQL查询结构之中,只有ORDER BY可以调用SELECT中定义的别名。
ORDER BY 子句是在SELECT子句之后执行,则order by可以使用在SELECT之中定义的别名:
eg: 查询每个雇员的编号,姓名,年薪,按照年薪由低到高排序:
select empno,ename,sal*12 as 年薪 from emp order by 年薪;
·ASC (默认,不写也是ASC):按照升序排列
·DESC : 降序。
同时设置多个排序字段:
按照工资由高到低,如果工资相同,则按照雇佣日期由早到晚:
·eg: SELECT * from emp ORDER BY sal DESC,hiredate ASC; (ASC是默认的)
···字符串函数:
返回值 函数(参数列表) 函数功能描述
·字符串 UPPER(列 | 字符串) 将传入的字符串变为大写字母形式
·字符串 LOWER(列 | 字符串) 将传入的字符串变为小写字母形式
·字符串 INITCAP(列 | 字符串) 开头首字母大写,其他字母全部小写
·字符串 LENGTH(列 | 字符串) 取得字符串的长度
·字符串 SUBSTR(列|字符串,开始索引,[长度]) 进行字符串的截取,如果没有设置长度,表示从开始索引一直截取到结尾
·字符串 REPLACE(列|字符串,旧内容,新内容) 将指定字符串数据由新内容替代旧内容
~在Oracle里面,所有额函数如果要进行验证,也必须编写sql语句,为了方便,专门提供了一个dual虚拟表。
eg:
SELECT upper('hello') from dual;
~在程序之中,所有字符串的首字母索引都是0,但是在Oracle里面,所有字符串首字母索引设置为1,如果写的0,那么也会按照1的方式进行处理。
~范例:取每位雇员姓名的后三位字母:SELECT ename,substr(ename,-3) FROM emp;
长度可以设置为负数,表示后面第几位索引,此类设置方式只有Oracle数据库才有。
···数值函数:
返回值 函数(参数列表) 函数功能描述
·数字 round(列 | 数字 [,小数位]) 实现数据的四舍五入.没有设置小数点的保留位数,默认不保留小数位进行进位;设置为负数,表示进行整数位的四舍五入
·数字 trunc(列 | 数字 [,小数位]) 实现小数位数据的截取,截取时不进位。
·数字 mod(列 | 数字,列 | 数字) 求模(计算余数)
··日期公式:
日期 + 数字 = 日期(表示若干天之后的日期)
日期 - 数字 = 日期(表示若干天之前的日期)
日期 - 日期 = 数字(天数)
若果直接使用天数来进行年或者月的计算,最终的结果不准确。所以Oacle提供了以下准确计算日期的操作函数:
···日期函数:
select next_day(sysdate,'星期三') from dual;数功能描述
·日期 add_months(列 | 日期,月数) 返回在指定日期上增加月数后的日期
·数字 month_between(列 | 日期,列 | 日期) 返回两个日期之间的天数
·日期 last_day(列 | 日期) 取得指定日期所在月份的最后一天
·日期 next_day(列 | 日期,'星期X') 返回下一个指定的一周时间数对应的日期
Oracle里面提供了2个伪列 "sysdate" 和 "systimestamp" 来获得当前的日期。SELECT sysdate from dual;
eg:
查询所有在雇佣所在月倒数第三天雇佣的雇员信息:
SELECT empno,hiredate,last_day(hiredate)-2 from emp where hiredate=last_day(hiredate)-2;
查询当前日期的下一个星期三:select next_day(sysdate,'星期三') from dual;
···转换函数:
返回值 函数(参数列表) 函数功能描述
·字符串 to_char(列 | 日期 | 数字,转换格式) 将日期或数字格式化为指定结构的字符串
·日期 to_date(列 | 字符串,转换格式) 按照指定的转换格式编写字符串或将其变为日期型数据
·数字 to_number(列 | 字符串) 将字符串变为数字
eg一1:
·select to_char(sysdate,'yyyy-mm-dd') from dual; 年-月-日
·select to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual; 年-月-日 时:分:秒
·select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;表示按照24小时显示
to_char()函数可以实现日期的拆分:·select to_char(sysdate,'yyyy'),to_char(sysdate,'mm'),to_char(sysdate,'dd') from dual;
: 查询2月份雇佣的雇员:select* from emp where to_char(hiredate,'mm')='02';
或者select* from emp where to_char(hiredate,'mm')=2; oracle提供有自动转型操作,自动完成类型匹配。
eg一2:
·select to_char(187816257272672,'L999,999,999,999,999,999') from dual; L表示货币,9表示任意数字。
eg二1:
·select to_date('1888-12-3','yyyy-mm-dd') from dual;一般意义不大
eg三1:
·select to_number('1')+to_number('2') from dual;和select '1'+'2' from dual;结果一样,因为Oracle里面有自动转型操作。
···通用函数(Oracle特色函数):
返回值 函数(参数列表) 函数功能描述
·数字 nvl(列 | NULL,默认值) 如果传入的是null,则使用默认数值处理,否则使用原始数值处理。
·数据类型 decode(列|字符串|数值,比较内容1,显示内容1,比较内容2,显示内容2,...[,默认显示内容])
(设置的内容会与每一个比较内容进行比较,如果内容相同,则使用显示内容进行输出,如果都不相同,则使用最后的默认信息输出)
eg1: select empno,ename,sal,comm,(sal+nvl(comm,0))*12 as 年薪 from emp;
alter table Student modify Sage int;修改列定义
一次性插入多条记录,直接拷贝多条信息:
insert into SC values(9512101,'c01',90);
insert into SC values(9512101,'c02',86);
insert into SC values(9512101,'c06',null);
insert into SC values(9512102,'c02',78);
insert into SC values(9512102,'c04',66);
insert into SC values(9521102,'c01',82);
insert into SC values(9521102,'c02',75);
delect from myemp where EMPNO in (
select myemp.EMPNO
from myemp join mydept on mydept.DEPTNO = myemp.DEPTNO
where JOB = 'MANAGER'
and sal<1000
);
delect from myemp1 where EMPNO in (select EMPNO from mydept where JOB = 'MANAGER') and sal<1000;