温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

oracle 数据库有服务端和客户端组成

发布时间:2020-06-25 08:04:34 来源:网络 阅读:499 作者:WZM3558862 栏目:数据库

数据库:


基本的概念:

数据库管理系统(Database Management System,DBMS):

管理(存储+操作(CRUD))数据的一个软件系统


关系型数据库管理系统(RDBMS):

数据库(Database):存放数据的磁盘,是RDBMS的一部分


市面上常见的数据库管理系统有哪些?

ORACLE, Sql Server, Sqlite(手机数据库), DB2, Access, mysql,sybase,h3...


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(Data Query Language)数据查询语句:select


5.DTL(Data Transaction Language)数据事务语句:commit,rollback,savepoint

-----------------------------------------------------------------------------

Oracle www.oracle.com  


...8i,9i,10g,11g,12c


安装注意点: 目录中不能由中文:建议把防火墙和360一些安全软件关闭;


oracle 数据库有服务端和客户端组成:

服务端:由一堆的数据库后台进程与监听器以及数据库所组成


最主要的两个服务:

OracleServiceXE Oracle数据库服务主服务(数据库实例名,仓库名)


OracleXETNSListener Oracle数据库监听器,监听客户端对数据库的访问连接



客户端:有多种

1.oracle自带一个命令行客户端:sqlplus

  启动:运行cmd 打开cmd命令窗口输入sqlplus


2.PL/SQL Developer 第三方图形界面


3.Navicat 第三方图形界面

-----------------------------------------------------------------------------


创建用户2步骤:

1.创建一个(普通)用户:

语法:create user 用户名 identified by 密码;


2.授权给一个用户:

角色:oracle中内置了3个角色:

DBA:  系统管理权限;

connect:  创建会话连接权限;

resource: 操作基本数据库对象的权限;

 grant 权限,权限... to 用户名;


修改密码: 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 s_emp;


-- 从s_emp表中查询出员工的名字,薪水,职位;

select first_name,salary,title from s_emp;


-- 从s_emp表中查出员工的姓氏,名字;

select first_name,last_name from s_emp;


-- 找出本公司的所有的职称(title);

select title from s_title;

select distinct title from s_emp;


-- 找出所有员工的姓名、工资、入职日期

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;


排重: distinct

      select distinct title from s_emp;

--------------------------------------------------------------------------


列的数据类型:

1.数字类型,可以做所有的数学运算

  number     

  number(4) 代表整数 最大能存9999

  number(7,2) 代表double类型  整数长度为5 小数位为2.


2.字符型,可以做拼接的运算

  注:字符串在数据库中用''

  varchar2(20) 代表字符串最长为20;

  char(20) 代表定长20;


3.日期类型,可以做加减运算

  Date 年月日时分秒

  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;


sql具有字符串拼接能力并且可以给列取名

-- 从s_emp表中查出员工的姓名;

select first_name||' '||last_name 全名 from s_emp;


--字符串拼接(***是**入职的,工资是***,职称是***)

select first_name||' '||last_name||'是'||start_date||'入职的,工资是'||salary||',职称是'||title  描述 from s_emp;


注意:

oralce数据库中:字符串使用''包裹,""可以取别名,以及用来保存格式,还可以区分大小写



""的作用给我们的查询出的列起个别名 并保持格式

 别名不一定需要"";如果要保持格式必须有""

-----------------------------------------------------------------------------


空值置换函数(nvl)


--查询所有员工的名字,年薪(不考虑提成)

select first_name,salalry*12 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之间的员工名

select * from s_emp where salary>=1200 and salary<=1500;

select * from s_emp where salary between 1200 and 1500;


--找出工资大于1500并且没有提成的员工;

select * from s_emp where salary>1500 and commission_pct is null;


注意:查询数据时条件是否为null,我们使用关键字is或者is 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 '/_A%' 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月%';


-- 查询出职称是Stock Clerk的员工全名、工资,并按工资的降序排序

select first_name||' '||last_name,salary from s_emp where

title='Stock Clerk' order by salary desc;


select first_name||' '||last_name,salary from s_emp where

title='Stock Clerk' order by 2 desc;


注意:order by 2表示按照查询结果的第二列来排序!

--------------------------------------------------------------------------


排序字句:

order by 列名 asc(升序,默认可不写) | desc (降序)


--找出6月份入职的员工全名,工资,职称,并按工资降序排序

select first_name||' '||last_name 全名,salary,title from s_emp where start_date like '%6月%' order by 2 desc;


--查询出职称中带VP的员工名字,工资,并按工资的降序排序

select first_name,salary,title from s_emp where title like '%VP%' order by 2 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;


--------------------------------------------------------------------------


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 abs(-10) from dual;


--查询出订单表中总金额(取整)

select round(total,0) from s_ord;



2.字符函数

length(列|值|表达式); 求长度

例如:

select length('abc') from dual;

select first_name,length(first_name) from s_emp;



upper(列|值|表达式); 转大写字母

lower(列|值|表达式); 转小写字母

initcap(列|值|表达式); 每个单词首字母大写

例如:

select upper('abc') from dual;

select lower('ABC') from dual;

select initcap('hello world') from dual;



lpad(列|值,宽度,填充字符);  从左边补不足宽度个填充字符

rpad(列|值,宽度,填充字符);  从右边补不足宽度个填充字符

例如:

select lpad('abc',10,'de') from dual;



ltrim(列|值,截取字符); 从左边截取字符 

rtrim(列|值,截取字符); 从右边截取字符

例如:

select rtrim('abcdededededede','de') from dual;

select rtrim('abcdededeedede','de') from dual;

select rtrim('abcdededeadedede','de') from dual;



replace(列|值,被置换的字符,置换的字符) 置换指定字符

select replace('hello world!','o','*') from dual;


translate()转换指定字符

select translate(

'I l6o9ve y8o7u!',

'abcdefghijklmnopqrstuvwxyz0123456789',

'abcdefghijklmnopqrstuvwxyz'

) from dual;


select replace('abcdededeadedede','de','') from dual;

或者

select translate('abcdededeadedede','abcde','abc') from dual;



instr()查找指定字符串在长字符串中所在的位置

--select instr('go,go,quickly!','go') from dual;

--select instr('go,go,quickly!','go',2) from dual;

--select instr('go,go,quickly!','go',-1) from dual;

--select instr('go,go,quickly!','go',-1,2) from dual;


注意:数据库字符串下标从1开始计数



substr()

select substr('hello world!', 3) from dual;

select length(substr('hello world!',3,4)) from dual;

//从3号下标开始切割,保留4个字符



decode(),类似一个三目运算符

比较第一和第二个参数,如果相等取第三个参数,如果不相等取第四个参数

select decode('A','A','B','C') from dual;//B

select decode(1,1,2,3) from dual;//2

select decode(1,2,2,3) from dual;//3



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_p_w_picpath)中文件名(filename)列中后缀给查出来;

select distinct substr(filename,instr(filename,'.',-1)+1) from s_p_w_picpath;


--模拟向银行中只显示姓名的第一个字符(奥巴马变成奥**):

--常规拼接

select substr(first_name,1,1)||rpad('*',length(first_name)-1,'*')

from s_emp;


--replace

select replace(first_name,substr(first_name,2),

rpad('*',length(first_name)-1,'*')) from s_emp;


--translate

select translate(first_name,substr(first_name,2),

rpad('*',length(first_name),'*')) from s_emp;


--找出名字长度超过5的员工

select * from s_emp where length(first_name)>5;


--找出职称是 stock clerk的员工

select * from s_emp where title=initcap('stock clerk');


--请把员工的工资分为3等,超过2000元的为高等在1500和2000之间的为中等

低于1500的为低等

select first_name 姓名,

case

when salary<1500 then '低等'

when salary between 1500 and 2000 then '中等'

when salary>2000 then '高等'

else '未分等级'

end 工资等级

from s_emp;


特别注意:当when后面出现要比较的列,则case后面就千万不能再添加了!!!



--输出每个订单编号及支付方式,支付方式要么是现金,

要么是信用卡,否则就是未知。

select id,

decode(payment_type,'CASH','现金','CREDIT','信用卡','未知') 

from s_ord;


select id,

case payment_type

when 'CASH' then '现金'

when 'CREDIT' then '信用卡'

else '未知'

end

from s_ord;



3.日期函数


oracle 默认的日期格式为:dd-mm-yy


dd 表示2位数的日

mm 代表2位数的月,如:06

yy 代表2位数年份

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日期所在月的最后一天是什么时候



修改当前会话语言环境:

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 day';



例如:

--查询当前日期下一个星期四是几号?

select next_day(sysdate,'星期四') from dual;


--找出员工的工作月数:

select months_between(sysdate,start_date) from s_emp;


--查询员工的工作天数:

select first_name,sysdate-start_date from s_emp;


--计算一年前,当前,一年后的时间:

select add_months(sysdate,-12),sysdate,add_months(sysdate,12) from dual;


--当前日期前六个月的最后一天;

select last_day(add_months(sysdate,-6)) from dual;


--显示下个星期五是什么日期:

select next_day(sysdate,'星期五') from dual;



4.转换函数


to_number(char), 把字符转换成数字


to_date(char[,fmt]), 

把字符串转换成日期,如果不传fmt参数,则采用默认格式(dd-mm-yy)来解析

to_char 把数字或日期格式化为字符串

  1.to_char(number,fmt); 格式化数字

  2.to_char(date, fmt); 格式化日期


--把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;


--把数字格式化为字符串的时候可以用的一些符号:

 9  代表任意的数据

 L  代表本地的货币符号

 $  代表美元

 0  代表0

 .   代表.

 ,   代表,


--格式化输出员工的工资($1,500.00)

select to_char(salary,'$999,999.99') from s_emp;



练习:

--把员工的入职日期格式化为年/月/日

select 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(sysdate,'fmmm')=to_char(start_date,'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.99') from s_emp;


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI