Oracle 01
目录
Oracle数据库的安装步骤
搭建上课所用的数据库环境
table (二维表) *****
查看表结构 *****
数据库中常用的数据类型 *****
SQL语句 *****
where子句 *****
对于null值 如何进行判断 *****
模糊查询 ***
存储数据
学员管理系统:
内存: 存取的速度很快 数据较容易丢失 贵
文件: 便宜 , 可以永久存储! 存储速度 特别慢
**数据库:**
它不属于内存和文件之外的存储方式, 它只是数据存储时, 内存与文件结合使用的一种解决方案 !
主流数据库
Oracle: 企业级 大型数据库 甲骨文公司
oracle9i oracle10g oracle11g oracle12c
mysql: 小型数据库 开源免费
db2 : IBM数据库
SqlServer: 微软数据库
Oracle数据库的安装步骤
建议: 没事就多装两遍 ~
目前腾讯电脑管家 与 360 会禁止oracle服务器的开机自启动!
前置条件
1. 下载安装包
2. 解压到任意目录
3. 关闭防火墙和杀毒软件
安装步骤:
1. 打开解压后的文件夹, 点击setup.exe
2. 继续点击下一步
3. 选择软件安装的目录
4. 输入数据库口令(密码)
5. 下一步 , 开始安装 !
如果在后续的流程中出现了错误 , 请卸载重装 !
卸载步骤:
1. 打开控制面板 或 其他的软件管理工具
2. 选择程序, 寻找到oracle database11g
3. 将其卸载
验证数据库是否安装成功
-
通过运行(win+r)输入cmd命令 , 打开dos命令窗口
-
输入sqlplus 数据库账号/数据库密码:
sqlplus system/123456 -
如果出现了sql>页面 , 表示安装且登录成功 .
搭建上课所用的数据库环境
-
因为oracle在安装时, 会自动根据当前系统的编码格式 设置为中文编码
修改为 支持我们上课脚本的 英文环境
添加系统环境变量变量名:NLS_LANG 变量值:american_america.AL32UTF8
执行完毕 第三步后, 可以将第一步的环境变量删除掉, 更改回中文环境了!
变量名:temp_NLS_LANG 变量值:american_america.AL32UTF8
-
导入脚本
在sql>
输入@路径/脚本名称例如: SQL> @C:\Users\j\Desktop\课件\oracle\script\summit2_drop.sql
-
查看脚本是否导入成功
在sql>输入: desc s_emp;
能出现如下结构: 表示环境搭建完毕!
Name Null? Type
ID NOT NULL NUMBER(7)
LAST_NAME NOT NULL VARCHAR2(25)
FIRST_NAME VARCHAR2(25)
USERID VARCHAR2(8)
START_DATE DATE
COMMENTS VARCHAR2(255)
MANAGER_ID NUMBER(7)
TITLE VARCHAR2(25)
DEPT_ID NUMBER(7)
SALARY NUMBER(11,2)
COMMISSION_PCT NUMBER(4,2)
使用windows脚本 快速进入sql>页面
我们每一次 进入数据库, 都需要打开dos窗口, 在输入sqlplus命令. 很麻烦
在windows这个系统中, 是支持bat脚本运行的 , 编写一个脚本, 来快速的进入dos命令行, 并自动输入sqlplus指令
编写步骤:
- 新建文件 : xxx.bat
- 输入内容 : sqlplus system/123456
- 保存关闭, 双击打开
**RDB ***
关系型数据库
**RDBMS ***
关系型数据库管理系统 , 使用二维表进行数据的存储 !
DBA
数据库管理员
**table (二维表) *******
由行和列组成的表格, 我们称其为二维表
拥有以下五个元素:
- 表头: 描述了字段名称
- 一行: 一行表示一条数据
- 一列: 表示一条数据中的一部分
- 字段名: 描述在此表格中的当前列的数据的 含义
- 字段值: 描述的是当前列 的值 !
如何通过dos命令行访问数据库:
-
访问本机数据库
dos命令行下输入: sqlplus 帐号/密码
-
访问其他计算机的数据库(本机需支持sqlplus命令)
dos命令行下输入: sqlplus 帐号/密码@ip地址;也可以下载软件来连接 , 也可以自己编写软件来连接
常用的数据库命令:
清除屏幕:
host cls
有时列显示过宽 ,调整:
col 列名 for a长度;
不可设置数字列的宽度 , 并且设置只针对当前dos显示的效果有效 , 不会影响数据
**查看表结构 *******
desc 表名;
例如: desc s_emp;
员工表: s_emp
员工表表结构: 熟悉掌握, 因为后期大多的课程, 是基于这个表格的 !
Name(列字段名称) Null?(列数据可以为空?) Type(列数据的类型)
----------------------------------------- -------- -----------------------
ID(员工编号) NOT NULL NUMBER(7) |number表示数据类型,(7):表示存储的位数长度
LAST_NAME(姓) NOT NULL VARCHAR2(25)
FIRST_NAME(名) VARCHAR2(25)
USERID(用户编号) VARCHAR2(8)
START_DATE(入职日期) DATE
COMMENTS(备注) VARCHAR2(255)
MANAGER_ID(他领导的员工编号) NUMBER(7)
TITLE(职位) VARCHAR2(25)
DEPT_ID(部门编号) NUMBER(7)
SALARY(月薪) NUMBER(11,2)|number表示数据类型,(11):表示存储的位数长度 2表示的小数点后的位数
COMMISSION_PCT(奖金) NUMBER(4,2)
not null 表示不可为空 , null ? 下不出现任何的字符, 则表示允许为空
**数据库中常用的数据类型 *******
-
number: 数字类型, 类似Java中的double
-
varchar2: 变长字符串类型
varchar2 与 char(定长字符串) 类型的区别:
varchar2在声明长度后, 如果存储不满, 则自动缩小长度 ! char声明长度后, 如果存储不满, 会使用空格补足!
-
date: 日期类型
**SQL语句 *******
结构化查询语言 大多数的数据库 , 操作上基本上都一致 !
**SQL语句的五种分类: *******
DQL(Data query language): 数据查询语句 (SELECT)
DML(data manipulation language):数据操作语句
DDL(data define language):数据定义语句
TCL(transaction control language):事务控制语句
DCL(data control language):数据控制语句
DQL->Select语句
SELECT语句负责 从数据库中查询数据
From子句
-
如何查询单个列的值 ***
格式:select 列名 from 表名;案例:查询员工表格中的员工编号:
语句:select id from s_emp; -
如何查询多个列的值 ***
与查询单个列的方式基本相同, 多个列之间使用英文逗号隔开 !
格式:select 列名1,列名2…列名n from 表名;案例:查询员工表格中的员工编号以及对应的月薪:
语句:select id,salary from s_emp;练习:查询员工表格中的员工编号(id),姓(last_name),名(first_name),月薪(salary):
语句:select id,last_name,first_name,salary from s_emp;设置列显示的长度:
col 列名 for a长度; //不能设置数字列
例如: col last_name for a20;
例如: col first_name for a20; -
如何查询一个表中的所有列:*
- 表示所有(all) , 与查询单列的方式基本一致, 把列名改为*号即可
格式:select * from 表名;
案例:查询员工表格中的所有员工信息
语句:select * from s_emp;
查询时额外的操作
在查询数据时, 可以对结果进行运算 , 例如算数运算 ,字符串拼接, 直接在列名处进行运算即可!
-
算数运算 + - * / 熟悉
-
案例:计算员工的年薪 (salary16)
语句:select id,salary16 from s_emp; -
练习:计算员工的年薪salary16加奖金commission_pct
语句:select id,salary16+salary16commission_pct/100 from s_emp;
-
**- null值的运算 *****
数据库中 所有的类型的默认值为 null
oracle中null值经过运算后, 结果永远为null
使用nvl函数运算null值:
格式: nvl(参数1,参数2)
关于数据库中null值的处理, 一定要尽早进行 !
作用: 用来处理null , 如果参数1为null,则返回参数2, 如果参数1不为null则返回参数1.
例如: nvl(commission_pct,0) : 如果员工有提成, 则返回提成 , 如果没有提成则返回0
- 练习:计算员工的年薪salary*16加奖金commission_pct
语句:select id,salary*16+salary*16*nvl(commission_pct,0)/100 from s_emp;
- 练习:计算员工的日薪, 按照一月21个工作日计算
语句:select id,salary/21 from s_emp;
- 练习:计算员工的时薪, 按照一个月21天算, 一天8个小时计算
语句:select id,salary/21/8 from s_emp;
**列的别名 ****
有时我们在对表格中数据进行查询时, 数据的列名出现了变化, 我们需要 一个更见名知意的列名来表示数据 , 可以给数据添加一个别名来显示!
格式:select 列名1 别名1,列名2 别名2… 列名n 别名n from 表名;
案例:
查询年薪: select id,last_name,salary*16 y_sal from s_emp;
-
特殊的别名:
有时我们在别名中 可能会存在一些特殊字符, 例如空格 !那么这时编写的语句 会出现错误: 因为如下的语法, 就像是在给年薪添加两个别名
select salary*16 y sal from s_emp;如果要解决这个错误, 应让数据库清晰的认识到 ,y sal 是一个别名, 那么通过双引号将其引住即可!
此解决方案 又叫别名的原样显示:
之前的 别名无论是否大写, 在显示时都展示为大写, 通过双引号引住的别名, 会原样显示(大小写敏感)例如:select id,last_name,salary*16 “y sal” from s_emp;
**SQL中的字符串 ****
-
Oracle中关于大小写的规则:
在sql中, 只有字符串是大小写敏感的 !
String text = “你好”;
syso(text); 你好
Java中:
定义形式: 使用双引号引住: “你好”
表现形式: 表现形式中 引号是不存在的: 你好
Oracle中:
定义形式: 使用英文单引号引住: ‘你好’
表现形式与Java一致:你好
-
字符串的拼接
在oracle中 字符串拼接符: ||
练习: 查询员工表格(s_emp)中的员工姓 ’||first_name name from s_emp;
-
如何在字符串中拼接一个单引号
字符串单引号在oracle中编写方式为: ‘’’’练习: 查询员工表格中的姓’名:
语句: select last_name||’’’’||first_name name from s_emp;
数据的排重显示 熟悉
排重关键字: distinct , 在查询时编写到字段的前面加空格即可 !
-
单字段排重
在查询时, 如果指定排重的单个字段产生了重复, 则忽略掉此行数据!-
查询员工的薪资
select salary from s_emp; -
查询员工的薪资, 并对薪资进行排重显示
select distinct salary from s_emp;
-
-
多字段排重
在查询时, 如果指定的多个字段出现了重复, 则忽略掉此行数据- 查询员工的薪资 与 领导编号, 并对这两个数据进行排重操作 !
select distinct salary,manager_id from s_emp;
- 查询员工的薪资 与 领导编号, 并对这两个数据进行排重操作 !
错误
未选定行: 表示查询不到数据!
**where子句 *******
对查询进行条件的添加, 对产生的结果集进行过滤 , 匹配条件的将被查询到, 不匹配的将不会出现在结果集中!
常用的比较运算符: = != > < >= <=
字符串在比较相等时, 一样使用等号 !
格式: select 列名 from 表名 where 查询条件;
案例:查询员工的信息(id,last_name,salary), 要求id等于10
语句:select id,last_name,salary from s_emp where id=10;
练习:查询员工的信息(id,last_name,salary),要求 id大于10;
语句:select id,last_name,salary from s_emp where id>10;
练习:查询员工的信息(id,last_name,salary),要求 领导编号(manager_id)为1;
语句:select id,last_name,salary,manager_id from s_emp where manager_id=1;
练习:查询员工的信息(id,last_name,salary),要求月薪在1300以下
select id,last_name,salary from s_emp where salary<1300;
特殊的条件:
极限条件: 永真条件 , 永假条件
永真条件:
select * from s_emp where 1=1;
永假条件:
select * from s_emp where 1!=1;
对于字符串进行比较时, 需要注意的地方:
1. 在oracle数据库中 字符串需要使用单引号 引住 !
2. 在oracle中 字符串是大小写敏感的, 也就是比较时区分大小写
案例:查询员工的信息(id,last_name,salary), 条件: last_name等于Chang
语句:select id,last_name,salary from s_emp where last_name='Chang';
练习: 查询员工的日薪(salary/21),一个月按21天算, 条件为 last_name为Dancs
语句: select salary/21 from s_emp where last_name='Dancs';
特殊的运算符(关键字) (熟练)
between: 表示一个闭区间 (包含开始和结尾)
使用方式: ... where 字段 between 初始范围 and 最大范围;
案例: 查询员工的信息(id,last_name,salary) , 条件为: 工资在800到1000以内的员工
语句: select id,last_name,salary from s_emp where salary between 800 and 1000;
练习:查询员工的信息, 要求薪资在 1000-1450之间
语句:select id,last_name,salary from s_emp where salary between 1000 and 1450;
in: 表示从某个取值列表中匹配 !
使用方式: ... where 字段 in(取值1,取值2,取值3...取值n);
案例: 查询领导编号(manager_id)为1或2或3的员工的信息(id,last_name,salary)!
语句: select id,last_name,salary,manager_id from s_emp where manager_id in(1,2,3);
练习:查询员工的信息, 要求id为1或2或3或4或5的员工
语句:select id,last_name,salary,manager_id from s_emp where id in(1,2,3,4,5);
**对于null值 如何进行判断 *******
通过查询领导编号, 来观察问题:
1. 查询所有的领导编号等于1的用户
select id from s_emp where manager_id=1;
2. 查询所有的领导编号不等于1的用户
select id from s_emp where manager_id!=1;
上面的两个案例 ,只查询到24的结果, 少了id为1的员工 . 我们发现 id为1的员工是没有领导编号的,也就是说领导编号为null;
上面学习的判断逻辑符号 , 无法应用在null值上 !
对于null值的判断, 需要使用 is null 来判断
格式: … where 字段 is null;
案例: 查询领导编号为null的员工:
语句: select id from s_emp where manager_id is null;
练习: 查询员工表格中 , 没有奖金(commission_pct)的员工
语句: select id from s_emp where commission_pct is null;
**模糊查询 *****
-
董飞充气版娃娃
-
高帆版仿真会旋转版
-
董飞/高帆 娃娃变脸版
-
晓阳养成版
关键字: like
使用方式: … where 字段名 like ‘模糊格式文本’;
文本中可以存在两种特殊含义的符号(通配符):
-
_ :表示一个任意的文本字符
-
% :表示0-n个任意的文本字符
-
查询以晓阳开头的文本:
… where 字段名 like ‘晓阳%’;
-
查询包含娃娃的文本
… where 字段名 like ‘%娃娃%’; -
查询倒数第三个字 为 旋 的文本
… where 字段名 like ‘%旋__’; -
查询第二个字符为飞的文本
… where 字段名 like ‘_飞%’;
练习:
- 查询s_emp表格中 last_name中包含a的员工的信息(id,last_name,salary) ,
select id,last_name,salary from s_emp where last_name like '%a%';
- 查询s_emp表格中 last_name中开头为N的员工的信息(id,last_name,salary) ,
select id,last_name,salary from s_emp where last_name like 'N%';
- 查询s_emp表格中 last_name中第二个字符为o的员工的信息(id,last_name,salary) ,
select id,last_name,salary from s_emp where last_name like '_o%';
- 查询s_emp表格中 last_name中倒数第二个字符为e的员工的信息(id,last_name,salary) ,
select id,last_name,salary from s_emp where last_name like '%e_';
疑问:
如果要模糊查询的文本中包含_怎么办? (了解)
例如:
查询user_tables表格中 table_name 中以S_开头的数据 !
select table_name from user_tables where table_name like 'S_%';
使用转义字符 , escape
select table_name from user_tables where table_name like 'S\_%' escape '\';
逻辑条件连接符
用于连接多个条件
与: and *****
案例:查询员工的id为6 , 并且 领导编号为2的员工的 信息 (id,last_name.salary)
语句:select id,last_name,salary from s_emp where id=6 and manager_id=2;
练习:查询员工的id为3 , 且 工资(salary)为1400的员工的信息(id,last_name.salary)
select id,last_name,salary from s_emp where id=3 and salary=1400;
或: or *****
练习: 查询员工的薪资为1400 或者 1450的员工的信息(id,last_name.salary)
select salary,id,last_name from s_emp where salary=1400 or salary=1450;
非: not *
闭区间的not使用, 得到不属于闭区间的内容:
格式: ...where 字段名称 not between 最小范围 and 最大范围;
案例: 获取员工的信息(id,last_name,salary) ,条件为 薪资不再1000-1300之间的员工
语句: select id,last_name,salary from s_emp where salary not between 1000 and 1300;
in的使用: 从结果集中忽略 列表中的值 !
格式:where 字段名称 not in(值1,值2...值n);
案例: 获取员工薪资 不是1400和1450的员工信息(id,last_name,salary)
语句: select id,last_name,salary from s_emp where salary not in(1400,1450);
is null的not使用: ***
格式:where 字段名称 is not null : 取出不为null的数据航
案例:获取员工的信息, 条件为manager_id不为null!
语句:select id,last_name,salary from s_emp where manager_id is not null;
**条件的优先级: ***
练习: 获取员工的信息(id,last_name.salary) 条件为: 员工工资小于1000 且部门编号为31或42
语句: select id,last_name,salary from s_emp where salary<1000 and (dept_id=31 or dept_id=42);