一, 环境安装
1. 登录: 以管理员身份登录
sqlplus 登录名 / 密码
管理员身份登录: sqlplus system/123456
2. 登录后, 导入案例. 下载 scott.sql 文件, 执行下面一行的命令
SQL>@"E:\ 兄弟连文档 \ oracle\java 19\day01\script\scott.sql";
此时我们拥有非管理员的用户: scott
3. 激活 scott 的账号, 激活用 scott 可登录
alter user scott identified by tiger;
alter user 登录 identified by 登录密码;
此时如果成功:
SQL> show user
显示: USER 为 "SCOTT"
4. 退出 system 管理登录, 重新以 scott/tiger 登录
C:\..\sqlplus scott/tiger
登录成功
SQL> desc dept;
如成功
名称 是否为空? 类型
- ----------------------------------------- -------- ------------------
- DEPTNO NOT NULL NUMBER(2)
- DNAME VARCHAR2(14)
- LOC VARCHAR2(13)
- ---------------------------------------------------------------------------------------------
二, sql 命令
0. 在 Oracle 环境下清空屏幕
SQL> host cls;
1. 查看表结构
SQL> desc 表名;
例如: desc dept; 查看 dept 部门表的表结构
desc emp; 查看 emp 员工表的表结构
2. 专业词汇
数据库: 存储数据的仓库.
数据存储经历的阶段
人工阶段 -- 很久很久以前... 有一个屋子放置一台 (巨大个的) 计算机, 用于实现科学计算.
文件阶段 -- 用文件实现[永久存储]
数据库阶段 -- 用数据库实现存储
常见关系型数据库
DB2 -- IBM
Oracle -- Oracle 公司(甲骨文)
Sql Server -- 微软
MySQL -- Oracle 公司
java 程序猿必备关系数据库: Oracle\MySql
数据库分类
非关系型数据库: 后续课程有说
关系型: 层次结构, 网状结构, 关系型数据库
数据库系统
DB -- 数据库
RDB -- 关系型数据库
RDBMS -- 关系型数据库管理系统
数据库存储的基本单位
表(实体描述) -- class Student{... ...}
字段(列) -- 属性
值(行) -- 实体对象值
dept 表 列
行 DEPTNO DNAME LOC
------- ---------------------------- --------------------------
10 ACCOUNTING NEW YORK
- 20 RESEARCH DALLAS
- 30 SALES CHICAGO
- 40 OPERATIONS BOSTON
Oracle 常见数据类型:
数值型 number(有效长度, 小数点保留位数); 举栗: number(10,2) 12345678.12
字符
可变长度字符 varchar2(有效长度) 举栗: varchar2(5) 'ab' 实际存'ab'
varchar2(5) 'abcde' 最多存 5 个
不可变长度字符 char(有效长度) 举栗: char(5) 'ab' 实际存'ab'
char(5) 'abcde' 最多存 5 个
char 当实际存储字符不足时补空格, varchar2 按实际字符长度存储不补空格
日期 date ... 月 / 日 / 年 小时: 分钟: 秒 ...
3. 查询一个表的内容: from 子句
前导条件: 登录名 scott 密码 tiger
3.1 查询 dept 部门表的所有字段信息
select * from dept;
* 表示所有的列字段: deptNo,dName,loc
3.2 查询显示 emp 员工表中: 员工编号, 员工姓名, 工资, 奖金, 部门编号
语法: select 列名 1, 列名 2,..., 列名 N from 表名;
练习: select empNo,eName,sal,comm,deptNo from emp;
3.3 查询显示 dept 部门的: 部门编号, 部门名称, 所在地区
select deptNo,dName,loc from dept;
--[总结] from 子句 -------------------------------------------------------------------------------------
查询一个表的所有字段: 字段名可用 * 代替.
select 列名 1, 列名 2,... ... , 列名 N from 表名;
select * from 表名;
4. from 子句进阶
4.1 别称, 给当前字段或这个表起外号: 显示部门时统一部门字段标题 dXxx 的格式.
语法: select 列名 1 别称 1, 列名 2 别称 2,... , 列名 N 别称 N from 表名;
默认: select deptNo,dName,loc from dept;
练习: select deptNo dNo,dName,loc dLoc from dept;
思考:
员工表 emp 里有字段: empNo,eName...deptNo(部门编号)
部门表 dept 里有字段: deptNo(部门编号),dName,loc
列字段同名了, 此时必须用别称来区分
4.2 数学运算:+ - */ 求当前员工的年薪(忽略奖金) = 月薪 * 12. 显示员工姓名, 月薪, 年薪
select eName,sal, sal*12 from emp; 显示标题 eName,sal,sal*12
select eName,sal, sal*12 yearSal from emp; 显示标题 eName,sal,yearSal
思考: 员工当月实发工资 = 工资 sal + 提成 comm , 显示员工姓名和实发工资
select eName,sal,comm,sal+comm from emp; 此时没奖金的人没有实发工资,
oracle 中 运算数 1 + 运算数 2 任何 1 个是 null 结果是 null
当某个员工没有绩效奖金 comm 是, 工资 sal + 奖金 comm 显示结果是 null
没有控制处理时: select eName,sal,comm,sal+comm money from emp;
ENAME SAL COMM MONEY
- -------------------- ---------- ---------- ----------
- SMITH 800
- ... ...
4.3 null 值的处理, 查询奖金是 null 时依然计算实发工资
语法: nvl(字段, 新值) 功能: 将字段里时 null 的内容替换成新值
s
练习: 将奖金是 null 的显示 0
select eName,nvl(comm,0) from emp;
练习: 当奖金是 Null 时依然计算实发工资(sal+comm)
select eName,sal,nvl(comm,0) cm, sal+nvl(comm,0) money from emp;
显示结果:
ENAME SAL CM MONEY
- -------------------- ---------- ---------- ----------
- SMITH 800 0 800
- ... ...
练习: 查询所有员工年薪和年度提成(显示员工姓名, 年薪 yearSal, 年度提成 yearComm)
ename sal*12 nvl(comm,0)*12== 对
select eName, sal*12 , nvl(comm,0)*12 from emp;
完美要求可加入别称
select eName, sal*12 yearSal, nvl(comm,0)*12 yearComm from emp;
4.4 字符链接. 当需要有显示前缀, 后缀, 中间链接赋的时候可用
练习: 显示 部门名_所在地区
java 的字符链接: "abc"+"123" 结果是 "abc123"
oracle 的字符链接:'abc'||'123' 结果是'abc123' select 'abc'||'123' from dual;
答: select dName||'_'||loc from dept;
练习: 要求姓名以 Mr. 开头
答: select 'Mr.'||eName,sal from emp;
思考: 显示 abc 成'abc' 即显示结果中有'号, 特殊符号的处理
思考答 1:select '''abc''' from dual;
思考答 2:select ''''||'abc'||'''' from dual;
5,where 子句 : 有条件查询 , 表达满足什么条件显示数据. 结合 from 使用
5.1 查工资大于 1000 的员工
select * from emp where sal>=1000; -- 显示当前工资在 1000 及以上员工的所有字段
select eName,sal from emp where sal>=1000; -- 查询工资大于 1000 及以上员工的姓名和工资
5.2 姓名是 WARD 的员工
select * from emp where eName = 'WARD';
select * from emp where eName = 'Ward'; 还能出来结果吗? 答不出,'值'区分大小写
5.3 查询部门所在地区纽约的部门信息是什么?
select * from dept where loc='NEW YORK';
5.4 查没奖金的员工信息.
你们认为: select eName,comm from emp where comm = null;
答案 1:select eName,comm from emp where nvl(comm,0) = 0 ;
6,order by 子句: 排序, 按指定规则排序
6.1 按部门编号从大到写显示部门信息
思路: 排序依据是部门编号, 排序规则是从大到小
答: select * from dept order by deptNo desc; --desc 降序从大到小的排序规则. asc 升序
6.2 按部门名称升序排列显示
答: select * from dept order by dname asc;
来源: http://www.bubuko.com/infodetail-2607395.html