Oracle笔记1-数据库概念
数据库:
基本的概念:
数据库管理系统(Database Management System,DBMS):管理数据的一个软件系统
关系型数据库管理系统(RDBMS)
数据库(Database):存放数据的磁盘,是RDBMS的一部分
市面上常见的数据库管理系统有哪些?
ORACLE,Mysql,Sql Server, Sqlite(手机数据库), DB2, Access, ,sybase,h2...
SQL(Structure Query Language)结构化查询语言,
它是操作数据库管理系统的一个标准:主要对数据库进行CRUD的操作,
数据库的运算都是通过SQL来完成的;
create:创建
delete:删除
update:修改
retrieve:检索
市面上的主流数据库都遵守SQL规范:
注:不同的数据库对SQL的支持又有些不同;
sql根据命令功能的不同分为5个部分:
1.DCL(Data Control Language)数据控制语句:grant,revoke
2.DDL(Data Definition Language)数据定义语句:
create,alter,drop,truncate,comment on,rename to...
3.DML(Data Manipulating Language)数据操纵语句:insert,update,delete
4.DQL(Date Query Language)数据查询语句:select
5.DTL(Data Transaction Language)数据事务语句:commit,rollback,savepoint
-----------------------------------------------------------------------------
Oracle www.oracle.com
...8i,9i,10g,11g,12c
安装注意点: 目录中不能由中文,建议把防火墙和360一些安全软件关闭;
oracle 数据库有服务端和客户端组成:
服务端:由一堆的数据库后台进程与监听器以及数据库所组成
最重要的两个服务:
OracleServiceXE,Oracle数据库主服务(XE表示当前数据库的实例名,如果是企业版,则
实例名为Orcl)
OracleXETNSListener,Oracle数据库监听器,用来监听第三方软件对数据库的连接
客户端:有多种
1.Oracle自带一个客户端:sqlplus -- 命令行工具
启动:运行cmd 打开cmd命令窗口输入sqlplus
2.Navicat 第三方,图形界面
ctrl+q 开启查询
ctrl+r 运行所有语句
ctrl+shift+r 运行选中语句
3.PL/SQL Developer 第三方,图形界面
4.Sql Developer,有oracle自己开发的使用的是java语言,需要JDK的支持
5.在ORACLE9i~10g中,提供了一个基于浏览器访问的服务 isqlplus
也就是说,不需要专门的客户端软件了。通过浏览器就可以访问,
目前已经废除.
如:打开浏览器,输入:http://127.0.0.1:8080/apex
-----------------------------------------------------------------------------
创建用户2步骤:
1.创建一个(普通)用户:
语法:create user 用户名 identified by 密码;
例如:
create user jsd1510 identified by jsd1510;
2.授权给一个用户:
角色:oracle中内置了3个角色:
DBA: 系统管理权限;
connect: 创建会话连接权限;
resource: 操作基本数据库对象的权限;
语法:grant 权限,权限... to 用户名;
例如:给JSD1510帐号赋予连接,基本操作权限
grant connect,resource to jsd1510;
修改密码: alter user 用户名 identified by 新密码;
删除用户: drop user 用户名;(删除时注意权限问题)
账户解锁: alter user 用户名 account unlock;
-----------------------------------------------------------------------------
sqlplus中常用命令:
1.切换用户:
conn 用户名/密码;
2.显示当前登录的用户名:
show user;
3.执行数据库脚本:
start 或者 @ *.sql(可以直接把脚本拖到命令窗口中)
例如:start D:/oralce_cn.sql;
数据库脚本:用于创建数据库对象的语句集合
目的:在数据库中创建储存数据的表格并且在表格中初始化数据
4.查看表的结构:这是sqlplus的命令,不是sql的命令
desc 表的名字;
5.清屏:
clear screen;
6.回忆记录:
方向键上下
7.编辑多行sql语句:
edit
-------------------------------------------------------------------------
基本查询:
表格(table):它是由行(rows)和列(column)组成的二维空间
它是数据库存贮数据的基本单位,将来我们的数据就是存贮在表中;
查询的本质:
1.要查什么
2.去哪里查
语法: select 列名,列名,... from 表格名;
如果查询的是所有信息,则可以使用*代替所有列
select * from 表名;
例如:
-- 找出员工的所有的信息;
select * from s_emp;
-- 从s_emp表中查询出员工的名字,薪水,职位;
select first_name,salary,title from s_emp;
-- 从s_emp表中查出员工的姓氏,名字;
select first_name,last_name from s_emp;
-- 找出本公司的所有的职称(title);
排重: distinct
select distinct title from s_emp;
select * from s_title;
-- 找出所有员工的姓名、工资、入职日期
select first_name,salary,start_date from s_emp;
-- 找出所有的客户名及他的电话号码
select name,phone from s_customer;
-- 找出员工姓名及他的职称
select first_name,title from s_emp;
-- 找出每个订单的费用、支付方式、出货日期
select total,payment_type,date_shipped from s_ord;
--------------------------------------------------------------------------
列的数据类型:
1.数字类型,可以做所有的数学运算
number number(4) 代表整数 最大能存9999
number(7,2) 代表double类型 整数长度为5 小数位为2.
2.字符型,可以做拼接的运算
注:字符串在数据库中用'';
varchar2(20) 代表字符串最长为20;
char(20) 代表定长20;
3.日期类型,可以做加减运算
Date 年月日时分秒
Time 时分秒
Timestamp 年月日时分秒,还有小数位,如3.2秒
4.大数据类型
clob character large object 大字符型对象 最大可存4G
blob binary large object 大二进制对象 最大可存4G
注:大数据类型不支持查看结果
如:
sql具有运算的能力
--从员工表中查询出员工名字和他的年薪
select first_name,salary*12 from s_emp;
select first_name 姓名,salary*12 年薪 from s_emp;
select first_name "姓 名",salary*12 "年 薪" from s_emp;
注意:Oracle可以给查询的列取别名,别名可以直接书写,也可以用""修饰,
""还可以控制格式以及区分大小写
sql具有字符串拼接能力
-- 从s_emp表中查出员工的姓名;
select first_name||' '||last_name 全名 from s_emp;
--字符串拼接(***是**入职的,工资是***,职称是***)
select first_name||' '||last_name||'是'||start_date||'入职的,工资是'||
salary||',职称是'||title 员工概述 from s_emp;
select first_name||' '||last_name||'是'||to_char(start_date,'yyyy-mm-dd')||'入职的,工资是'||
salary||',职称是'||title 员工概述 from s_emp;
-----------------------------------------------------------------------------
空值置换函数
--查询所有员工的名字,年薪(不考虑提成)
select first_name,salary*12 from s_emp;
--查询所有员工的名字,年薪(考虑提成)
--错误
select first_name,salary *12 * (1 + commission_pct/100) from s_emp;
原因:
null和所有的值进行运算最后都为null;
空值置换函数nvl(commission_pct/100,0)
如果commission_pct/100的值为null 则表达式的值为0
如果commission_pct/100的值不为null 则表达式的值为commission_pct/100
--正确
select first_name,salary * 12 * (1 + nvl(commission_pct/100,0)) from s_emp;
注:nvl()中的两个值要为同一数据类型
---------------------------------------------------------------------------
条件查询:
where字句用来过滤查询的数据,它对字面量大小写是敏感的
出现在where后面的运算符有:
1.比较运算符:
> , < , >= , <= , = , != ^= <>
--查出在41部门的员工名字,工资;
select first_name,salary from s_emp where dept_id=41;
--查出工资高于1500的员工的信息;
select * from s_emp where salary>1500;
--找出工资大于1200元的员工全名、工资、职称
select first_name||' '||last_name,salary,title from s_emp
where salary>1200;
2.逻辑运算符:
and,or,not
--查出41部门工资高于1200的员工名字,工资;
select first_name,salary from s_emp where dept_id=41 and salary>1200;
--查出在41,50,42部门的员工名,薪水;
select first_name,salary from s_emp
where dept_id=41 or dept_id=42 or dept_id=50;
3.其他运算符:
in(list) list是一个列表,多个值使用逗号隔开
not in()
between ? and ? 在指定的范围之内,是全闭空间
is null
is not null
模糊匹配:like
通配符:
_ 通配任意单个字符
% 通配任意多个字符
--查出在41,42,50部门的员工名,薪水;
select first_name,salary from s_emp where dept_id in(41,42,50);
--找出工资在1200到1500之间的员工名(包括两端,不包括两端2个答案)
select first_name,salary from s_emp where salary between 1200 and 1500;
select first_name,salary from s_emp where salary>1200 and salary<1500;
--找出工资大于1500并且没有提成的员工;
select * from s_emp where salary>1500 and commission_pct is null;
注意:查询数据时条件是否为null,我们使用关键字is或者is not null,千万不能使用=/!=
--查出名字是以M打头的员工;
select * from s_emp where first_name like 'M%';
--查出姓名中第三个字母是e的员工;
select * from s_emp where first_name like '__e%';
如果我们要通配的字符中本身就有_或%,则需要通过关键字escape来转义;
select * from s_emp where first_name like '\_t%' escape '\';
-- 找出没有提成率的员工
select * from s_emp where commission_pct is null;
-- 找出有提成率的员工
select * from s_emp where commission_pct is not null;
-- 找出费用超过10000元的订单编号及支付方式
select id,payment_type from s_ord where total>10000;
-- 找出工资在950(含)至1200(含)元的员工姓名、职称
select first_name,title from s_emp where salary between 950 and 1200;
-- 找出名字中含有字母a的员工
select * from s_emp where first_name like '%a%';
-- 找出名字中第二个字母是a的员工
select * from s_emp where first_name like '_a%';
-- 找出2月份入职的员工名、入职时间、工资
select first_name,start_date,salary from s_emp
where start_date like '%2月%';
select first_name,start_date,salary from s_emp
where to_char(start_date,'mm')=2;
-- 查询出职称是Stock Clerk的员工全名、工资,并按工资的降序排序
select first_name||' '||last_name,salary from s_emp
where title='Stock Clerk' order by salary desc;
--------------------------------------------------------------------------
排序字句:
order by 列名 asc(升序,默认可不写) | desc (降序)
--找出6月份入职的员工全名,工资,职称,并按工资降序排序
select first_name||' '||last_name,salary,title from s_emp
where to_char(start_date,'mm')=6 order by salary desc;
--查询出职称中带VP的员工名字,工资,并按工资的降序排序
select first_name,salary,title from s_emp where title like '%VP%'
order by salary desc;
--查询出年薪低于25000的员工名,职称,并按年薪升序排序
select first_name,title,salary*12*(1+nvl(commission_pct/100,0)) 年薪
from s_emp
where salary*12*(1+nvl(commission_pct/100,0))<25000
order by 3;
注意:order by 3表示按照查询结果的第3列进行排序,
即,order by后面可以根据列名(别名)或者列号进行排序.
--------------------------------------------------------------------------
dual是一张虚拟的表格,没有任何的意义,只是为了充当构建完整的select语句
如:查询当前数据库系统时间
select sysdate from dual;
单行函数(single function):
多行函数(组函数)
oracle中提供了大量的函数
处理方式的不同分为:
1.数字函数:
round(列|值|表达式,有效位数); 四舍五入
trunc(列|值|表达式,有效位数); 直接截取
mod(列|值,列|值); 求模(余)
abs(列|值) 求绝对值
select round(3.1415926,3) from dual;
select trunc(3.1415926,3) from dual;
select mod(10,3) from dual;
--查询出订单表中总金额(取整)
select id,round(total,0) from s_ord;
2.字符函数
length(列|值|表达式); 求长度
--获取员工表中每个员工的姓氏长度
select first_name,length(first_name) from s_emp;
--查看'HelloWorld'字符串的长度
select length('HelloWorld') from dual;
upper(列|值|表达式); 转大写字母
lower(列|值|表达式); 转小写字母
initcap(列|值|表达式); 每个单词首字母大写
select name,score from s_student where lower(name)='tom';
select upper('abc') from dual;
select lower('ABC') from dual;
select initcap('hello world') from dual;
lpad(列|值,宽度,填充字符); 从左边补满宽度个填充字符
rpad(列|值,宽度,填充字符); 从右边补满宽度个填充字符
select rpad('abc',10,'de') from dual;//abcdededed
select lpad('abc',10,'de') from dual;//dedededabc
ltrim(列|值,截取字符); 从左边截取字符
rtrim(列|值,截取字符); 从右边截取字符
select rtrim('abcdededededede','de') from dual;//abc
select rtrim('abcdededeededeee','de') from dual;//abc
select rtrim('abcdededeadedede','de') from dual;//abcdededea
replace(列|值,被置换的字符,置换的字符) 置换指定字符
select replace('hello world!','o','*') from dual;
translate(参数一,参数二,参数三) 转换指定字符
参数一:要处理的内容,列|值.
参数二:需要检索的内容
参数三:与检索内容一一对应替换的内容
select translate('I l6o9ve y8o7u!',
'abcdefghijklmnopqrstuvwxyz0123456789',
'abcdefghijklmnopqrstuvwxyz')
from dual;
select replace('abcdededeadedede','de','') from dual;//abca
或者
select translate('abcdededeadedede','abcde','abc') from dual;//abca
instr()查找指定字符串在长字符串中所在的位置
select instr('go,go,quickly!','go') from dual;//1
select instr('go,go,quickly!','go',2) from dual;//4
select instr('go,go,quickly!','go',-1) from dual;//4
select instr('go,go,quickly!','go',-1,2) from dual;//1
注意:数据库字符串下标从1开始计数!!!
substr()
select substr('hello world!', 3) from dual;//llo world!
select substr('hello world!',3,4) from dual;//llo
//从3号下标开始切割,保留4个字符
decode()
a.类似一个三目运算符
比较第一和第二个参数,如果相等取第三个参数,如果不相等取第四个参数
select decode('A','A','B','C') from dual;
b.if else if else
case when 可以把它看成switch功能:
select name "部门名",
case region_id
when 1 then '北美'
when 2 then '南美'
when 3 then '中东/非洲'
when 4 then '亚洲'
when 5 then '欧洲'
else '未知区域'
end "区域名"
from s_dept;
练习:
--查出客户表(s_customer)中phone列最后一个-线后面的部分;
select phone,substr(phone,instr(phone,'-',-1)+1) from s_customer;
--把图片表(s_image)中文件名(filename)列中后缀给查出来;
select distinct substr(filename,instr(filename,'.',-1)+1) from s_image;
--模拟向银行中只显示姓名的第一个字符(奥巴马变成奥**):
select first_name,rpad(substr(first_name,1,1),length(first_name),'*')
from s_emp;
select first_name,
replace(first_name,substr(first_name,2),rpad('*',length(substr(first_name,2))-1,'*'))
from s_emp;
--找出名字长度超过5的员工
select * from s_emp where length(first_name)>5;
--找出职称是stock clerk的员工
select * from s_emp where lower(title)=lower('stock clerk');
--请把员工的工资分为3等,超过2000元的为高等在1500和2000之间的为中等
低于1500的为低等
select first_name 员工名,
case
when salary<1500 then '低等'
when salary>=1500 and salary<2000 then '中等'
when salary>=2000 then '高等'
end 工资等级
from s_emp;
注意:case 后面是否出现列名,取决于when后面条件中是否出现比较的列,
如果when后面已经出现列名,则case后面务必不能写列名,
如果when后面是值,那么必须在case后面指定列名,否则无法确定所给定的值
真正的含义.
--输出每个订单编号及支付方式,支付方式要么是现金,
要么是信用卡,否则就是未知
select id,
decode(payment_type,'CASH','现金','CREDIT','信用卡','未知')
from s_ord;
--输出区域表(s_region)中每个地区的对应的中文
select name,
decode(name,'North America','北美','South America','南美','Africa / Middle East','非洲/中东','Asia','亚洲','Europe','欧洲','未知区域')
from s_region;
3.日期函数
oracle 默认的日期格式为 dd-MON-yy
dd 表示2位数的日
mon/month 代表月份,如:6月
mm 代表2位数的月,如:06
yyyy 代表4位数年份
HH24/HH 代表小时
mi 代表分钟
ss 代表秒
fm 表示去掉前面的0,如:fm 06,以后值6
day 表示星期几
日期函数:
sysdate 当前日期
months_between(date1,date2) 2个日期之间的月数
add_months(date1,n) 在date1的基础上加上几个月
next_day(date1,'星期几') 在date1的基础上下个星期几是什么时候
last_day(date) date日期所在月的最后一天是什么时候
例如:
--查询2014年11月1号和2015年12月9号之间的间隔月数
select
months_between
(
to_date('2015-12-9','yyyy-mm-dd'),to_date('2014-11-1','yyyy-mm-dd')
) from dual;
--半年后的日期是?
select add_months(sysdate,6) from dual;
--半年前的日期是?
select add_months(sysdate,-6) from dual;
--查询当前日期下一个星期五是几号?
select next_day(sysdate,'星期五') from dual;
--查询当前月的最后一天是什么时候?
select last_day(sysdate) from dual;
练习:
--找出员工的工作月数
select months_between(sysdate,start_date) from s_emp;
--查询员工的工作天数
select first_name,sysdate-start_date from s_emp;
注意:
Oracle中日期类型是可以进行减法运算的,结果是两个日期的天数!!!
--计算一年前,当前,一年后的时间
select add_months(sysdate,-12),sysdate,add_months(sysdate,12) from dual;
--当前日期前六个月的最后一天
select last_day(add_months(sysdate,-6)) from dual;
补充:
修改当前会话语言环境:
alter session set nls_language = 'american';//改为英文
alter session set nls_language = 'simplified chinese';//改为简体中文
修改当前会话日期的格式:
alter session set nls_date_format='yyyy-mm-dd HH24:mi:ss';
4.转换函数
to_number(char), 把字符转换成数字
to_date(char[,fmt]),
把字符串转换成日期,如果不传fmt参数,则采用默认格式(DD-MON-YY)来解析
to_char 把数字或日期格式化为字符串
1.to_char(number,fmt); 格式化数字
2.to_char(date, fmt); 格式化日期
把数字格式化为字符串的时候可以用的一些符号:
9 代表任意的数据
L 代表本地的货币符号
$ 代表美元
0 代表0
. 代表.
, 代表,
--把123字符串转换成123数字
select to_number('123') from dual;
--把1986-04-13字符串按照模板yyyy-mm-dd转换成日期
select to_date('1986-04-13','yyyy-mm-dd') from dual;
--格式化输出员工的工资($1,500.00)
select to_char(salary,'L999,999,999,999.99') from s_emp;
练习:
--把员工的入职日期格式化为年/月/日
select first_name,to_char(start_date,'yyyy/mm/dd') from s_emp;
--找出5月份入职的员工
select * from s_emp where to_char(start_date,'fmmm')=5;
--找出当月入职的员工
select * from s_emp where to_char(start_date,'fmmm')=to_char(sysdate,'fmmm');
--查询出员工的姓名,入职日期,并按日的升序排序
select first_name,start_date from s_emp
order by to_number(to_char(start_date,'fmdd'));
--找出每个员工的名字和它的薪水(如:$2,500.00)
select first_name,to_char(salary,'$999,999,999,999.99') from s_emp;
Oracle笔记1-数据库概念的更多相关文章
- oracle实例名,数据库名,服务名等概念差别与联系
数据库名.实例名.数据库域名.全局数据库名.服务名 这是几个令非常多刚開始学习的人easy混淆的概念.相信非常多刚開始学习的人都与我一样被标题上这些个概念搞得一头雾水.我们如今就来把它们弄个明确. 一 ...
- Oracle笔记(六) 多表查询
最近看了李兴华的oracle视频,这是网上别人做的笔记非常细致,分享给大家,第六篇 原创地址:http://www.cnblogs.com/mchina/archive/2012/09/07/2651 ...
- Oracle笔记(1) 简单查询、限定查询、数据的排序
Oracle笔记(四) 简单查询.限定查询.数据的排序 一.简单查询 SQL(Structured Query Language) 结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及 ...
- 韩顺平Oracle笔记
韩顺平Oracle笔记 分类: DataBase2011-09-07 10:24 3009人阅读 评论(0) 收藏 举报 oracle数据库sqljdbcsystemstring 目录(?)[-] ...
- Oracle笔记 多表查询
Oracle笔记 多表查询 本次预计讲解的知识点 1. 多表查询的操作.限制.笛卡尔积的问题: 2. 统计函数及分组统计的操作: 3. 子查询的操作,并且结合限定查询.数据排序.多表查询.统计查 ...
- oracle 笔记
1.Oracle认证,与其它数据库比较,安装 Oracle安装会自动的生成sys用户和system用户: (1)sys用户是超级用户,具有最高权限,具有sysdba角色,有create databas ...
- Oracle 免费的数据库
Oracle 免费的数据库--Database 快捷版 11g 安装使用与"SOD框架"对Oracle的CodeFirst支持 一.Oracle XE 数据库与连接工具安装使用 O ...
- oracle 与其他数据库如mysql的区别
想明白一个问题:(1)oracle是以数据库为中心,一个数据库就是一个域(可以看作是一个文件夹的概念),一个数据库可以有多个用户,创建用户是在登陆数据库之后进行的,但是有表空间的概念(2)而mysql ...
- Oracle,SQL Server 数据库较MySql数据库,Sql语句差异
原文:Oracle,SQL Server 数据库较MySql数据库,Sql语句差异 Oracle,SQL Server 数据库较MySql数据库,Sql语句差异 1.关系型数据库 百度百科 关系数据库 ...
- Oracle实例和数据库区别
什么是数据库,其实很简单,数据库就是存储数据的一种媒介.比如常用的文件就是一种,在Oracle10G中,数据的存储有好几种.第一种是文件形式,也就是在你的磁盘中创建一批文件,然后在这些文件 ...
随机推荐
- Android中的自定义视图控件
简介 当现有控件不能满足需求时,就需要自定义控件. 自定义控件属性 自定义控件首先要继承自View,重写两个构造函数. 第一个是代码中使用的: public MyRect(Context contex ...
- java打jar包,引用其他.jar文件
大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个jar包的程序入口. 具体的方法是修改jar包内目录META-INF下的MANIF ...
- 【学习笔记】python 简单创建新建一个网络客户端,并返回相关的信息
#导入socket包 import socket #使用socket.socket创建socket连接 #AF_INET表示通信类型,与IPv4对应 #SOCK_STREAM对应TCP通信 print ...
- GoLang 通过http Post获取数据
func GetPostResponse(url, bodyType string, body *[]byte) (rdata []byte, err error) { b := bytes.NewB ...
- centos 6 安装 gitlib
安装gitlab-----------1. 下载 gitlabcurl -O https://downloads-packages.s3.amazonaws.com/centos-6.5/gitlab ...
- linux 常用操作指令(随时更新)
ls: 查看当前目录下文件列表 -l 列出文件详细信息l(list) -a 列出当前目录下所有文件及目录,包括隐藏的a(all) mkdir 创建目录 -p ...
- Sprint 2(第一天)
Sprint 2计划会议: 目标: 1.实现用户模块的权限控制,能够进行用户登录的功能 2.对菜单模块实现增加菜单列表详情,修改菜单列表详情,删除菜单列表详情,查询菜单列表详情的功能 3.实现菜品分类 ...
- 《2---关于JDBC编程过程中驱动配置问题》
说明:我在Editplus中编写了一个简单的JDBC程序,用来测试是否和数据库连接正确.读者如有其它疑问,可以留言交流. [1]程序如下: import java.sql.*; public clas ...
- 移动安全初探:窃取微信聊天记录、Hacking Android with Metasploit
在这篇文章中我们将讨论如何获取安卓.苹果设备中的微信聊天记录,并演示如何利用后门通过Metasploit对安卓设备进行控制.文章比较基础.可动手性强,有设备的童鞋不妨边阅读文章边操作,希望能激发大家对 ...
- BZOJ 3176 Sort
先一遍reverse+逆序对个数. 要开long long啊. #include<iostream> #include<cstdio> #include<cstring& ...