千家信息网

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

发表于:2024-10-24 作者:千家信息网编辑
千家信息网最后更新 2024年10月24日,数据库:基本的概念:数据库管理系统(Database Management System,DBMS):管理(存储+操作(CRUD))数据的一个软件系统关系型数据库管理系统(RDBMS):数据库(Dat
千家信息网最后更新 2024年10月24日oracle 数据库有服务端和客户端组成

数据库:


基本的概念:

数据库管理系统(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;


数据 员工 字符 数据库 工资 查询 日期 代表 名字 字符串 格式 用户 职称 函数 运算 姓名 表达式 语句 命令 数字 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 五级区划代码数据库百度网盘搜索 数据库技术与应用学啥呀 创建一个网站必须要服务器吗 云备份手机程序数据库 软件开发项目经理必备技能 广东前端软件开发价格 美国PHMSA数据库 软件开发工程师太累了 如何攻击网页数据库 怎么设置2列同时重复数据库 网络安全包括基础设施安全吗 绵阳安全服务器散热风扇价格 搭建服务器管理商品数据库 数据库mysql自学 查询各科不及格人数数据库 服务器c盘空间不足 http和服务器有关系吗 数据库运行管理规范编号 网络技术服务发票代码 金窗软件开发有限公司 五级区划代码数据库百度网盘搜索 kis数据库怎么打开 深圳网络技术怎么样 国家首届网络安全宣传周的主题 服务器ioioi是什么 光遇哪些服务器互通 湖南爱优网络技术有限公司刘丹 民法典如何保护网络安全 人力资源软件开发啥 app软件开发质优价廉
0