Oarcle数据库学习总结大全(1)

帅比萌擦擦* 提交于 2020-11-24 12:30:48

1.数据库

1.登陆数据库

使用windows+r健,然后输入cmd,进入命令框,连接用户,sqlplus+用户名/密码

把会话环境改成中文模式:

alter session set nls_language='simplified chinese';

把会话环境改成英文模式:

alter session set nls_language=english;

然后导入数据表: @表名.sql.

sql语句的分类:

1.DQL:主要是查询语句语言———主要是select语句

2.DML:数据操纵语言———改变数据库中的是数据,

主要是insert,update,delete语句

3.DDL:数据定义语言———主要是建立修改删除数据库中的对象,

主要是create,alter,drop,truncate语句

4.TCL:事物控制语句,用来维护事物的一致性,

主要是commit,rollback,savapoint语句

5.DCL:数据控制功能

用来执行权限授予和权限收回操作,

主要是grant,revoke语句


1.单行函数

select语句基础

举几个例子:

1.查看s_dept中所有的记录

select *
from s_dept;

2.查看s_dept中的指定字段

select id,name,salary
from s_dept;

2.运算:

1.查看每个员工的id,年薪和名字,(但是不会对原始数据做修改)

select id,last_name,salary*12
from s_emp;

2.查看每个员工的员工id,名字和月薪涨100以后的年薪

select id,last_name,(salary+100)*12
from s_emp;

3.起别名

1.查看员工的员工id,名字和年薪,年薪列名为annual

select id,last_name,salary*12 [as] annual
from s_emp;

或者是

select id,last_name,salary*12 annual
from s_emp;

4.拼接语法

1.查看员工的员工id,全名

select id,firat_name||last_name
from s_emp;

2.查看员工的员工id,全名和职位名称,全名和职位名称合并成一列显示,且格式为:姓名,职位名称

select id,first_name||' '||last_name||','||title tiltename
from s_emp;

5.nvl:使用nvl函数可以对null进行替换

例:查看所有员工的员工id,名字和提成,如果提成为空,显示成0

select id,last_name,nvl(commission_pct,0) commission_pct
from s_emp;

6.distinct:该可以将重复数据去除,

如果后面出现多列,就是代表多列去重,就是多列的值都相同才会认为是重复的数据。

select distinct dept_id,title
from s_emp;

7.fommat:可以将查询的结果显示的宽度进行调整

例如:将id设置成宽度为15的_的个数。

col  id  for a15

2.sqlplus相关的命令:

常用的命令:

l 查看缓存中的sql语句
a 在[定位]的那一行后面追加新的内容
i 在[定位]的那一行下面插入新的一行
c 替换[定位]的那一行中的某些字符串 ,格式为:c/老的字符串/新的字符串
del 删除[定位]的那一行内容
n 后面加内容可以重写这一行
$ 后面跟一个终端命令,例如$cls清屏,linux中使用!
/ 执行缓存sql命令

特殊的spool命令:可以记录操作的过程


3.排序:

例:查看员工的id,名字和薪资,按照薪资的降序排序显示,工资相同就按名字升序排序

select  id,last_name,salary
from s_emp
order by salary desc, last_name [asc];

4.条件查询:

格式:

select 列名…
from 表名…
where 操作的列名 比较操作表达式

例:查看员工工资小于1000的员工id和名字

select  id,last_name,salary
from s_emp
where salary <1000;

常用操作符:

1.between and

查看员工工资在700到1500之间的

select id,last_name,salary
from s_emp
where salary between 700 and 1500;

2.in():表示值在一个指定的列表中

例:查看员工id=1,3,5,9的员工工资

select id,salary
from s_emp
where id in(1,3,5,9);

3.like:模糊查询,表示在值不精确的时候用

%:代表0-多个字符

_:代表一个字符

:转义字符 ,需要escape关键字,后面加的字符代表本来的意思

例:

查看员工名字以C字母开头的员工的id,工资

select id,last_name,salary
from s_emp
where last_name like 'C%';

查看员工名字包含c字母开头的员工的id,工资

select id,last_name,salary
from s_emp
where last_name like '%c%';

查看员工名字长度不小于5,且第四个字母为n字母的员工id和工资

select last_name,salary
from s_emp
where last_name like '_ _ _ _ n _%';

查看员工名字中包换一个_的员工id和工资

select id,last_name
from s_emp
where last_name like '%\_%' escape '\';

代表\后面的字符要恢复原本的意思(恢复_的意思)

4.is null ,判断值为null的时候使用,null的值不能使用=

查看员工提成为空的名字和id

select  id,last_name
from s_emp
where commission_pct is null;

查看员工提成—不为空的名字和id

select  id,last_name
from s_emp
where commission_pct is  not null;

and/or,当条件需要的时候多次使用

查看员工部门id为41且职位名称为Stock Clerk(存库管理员)的员工id和名字

select dept_id,title,last_name
from s_emp
where dept_id=41
and
title ='Stock Cleck';

查看员工部门为41 或者 44号部门,且工资大于1000的员工id和名字

select dept_id,salary,last_name
from s_emp
where (dept_id =41 or dept_id=44)
and
salary>1000;

以上就是单行函数用到的


2.聚合函数

多行函数,可以结合组函数,group ,分组函数。

查询id小于5的所有员工的平均工资

select avg(salary)
from s_emp
where id<5;

使用单行函数,将上面的结果中每一个last_name转换为大写

select id,upper(last_name),salary
from s_emp
where id<5;

查询每个部分的员工人数、以及该部门的平均工资,并且按照平均工资的降序排序

select dept_id,avg(salary) avs,count(*)
from s_emp
group by dept_id
order by avs desc;

1.哑表

Dual表主要用来选择系统变量或求一个表达式的值,因为要使用dual来构造完成的查询语法1.单行函数

也可以称为单值函数,每操作一行数据(某个字段值),都会返回一个结果。


1.字符函数:

ASCII(X) ,返回字符X的ASCII码

select ascii('a') from dual;//a的asc码

CONCAT(X,Y) ,连接字符串X和Y

select concat('hello','world') 
from dual;

INSTR(X,STR[,START][,N) ,从X中查找str,可以指定从start开始,也可以指定从n开始

select instr('hello world','o',2)
//从前往后查找这个字符串中第二个位置开始
from dual;
select inste('hello world ','o',-1)
//从后往前面查找,从最后一个查找

查询id小于5的员工信息(id、last_name、salary)

select id ,last-name,salary
from s_emp
where id<5;

LENGTH(X) , 返回X的长度

select length('hello world')
from dual;

LOWER(X) ,X转换成小写

select lower('HELLO THE WORLD')
from dual;//hello the world

UPPER(X) ,X转换成大写

select upper('hello')
from dual;//HELLO 

INITCAP(X) ,X首字母转换为大写,其他字母小写

select initcap('bbbbb ccccc')
from dual;//Bbbbb Ccccc

LTRIM(X[,TRIM_STR]) ,把X的左边截去trim_str字符串,缺省截去空格

select ltrim('==hello==','=')  from dual;
//hello==

RTRIM(X[,TRIM_STR]) ,把X的右边截去trim_str字符串,缺省截去空格

select rtrim('==hello==','=')  from dual;
//==hello

TRIM([TRIM_STR FROM]X) ,把X的两边截去trim_str字符串,缺省截去空格

select trim('=' FROM '==hello==') 
from dual;//hello

REPLACE(X,old,new) ,在X中查找old,并替换成new

select replace('hello tt world','tt','theeee')
from dual;//hello theeee world

SUBSTR(X,start[,length]) ,返回X的字串,从start处开始,截取length个字符,缺省length,默认到结尾

select substr('abcdefg',2,4)
from dual;//bcde

2.数字函数

常用的数字函数:

ROUND(X[,Y]) ,X在第Y位四舍五入,Y代表要保留到哪一位

//保留到小数点后面俩位
select round(45.953,2)
from dual;//45.95
//保留到个位(小数点后面零位)
select round(45.923,0)
from dual;//46
//如果是保留到10位就是-1,百位就是-2,依次类推

TRUNC(X[,Y]) ,X在第Y位截断

//截取到小数点的后面俩位
select trunc(45.929,2)
from dual;
//45.92

MOD(X,Y) ,X除以Y的余数

select mod(10,3) 
from dual;
//(10除以3取余)

3.日期函数

sysdate,表示的是当前的时间

sysdate 参与时间的加减操作的时候,单位是天

select sysdate from dual;//显示的是当前的时间
select sysdate+1 from dual;//显示的是明天的这个时候

常见的日期函数:

months_between:俩个日期之间相差几个月

例:

30天之后和现在相差多少个月

select months_between(sysdate+30,sysdate)
from  dual;

add_months:现在的日期/指定的日期往后推2个月

select add_months(sysdate,2) from dual;
select add_months('01-11月-2020',2) from dual;

next_day:离当前时间最近的下一个星期5是哪一个天

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

last_day:当前日期所在月份的最后一天(月底)

select  last_day(sysdate)
from dual;

round:

把当前日期四舍五入到月(如果日期超过16号,那么进一个月)

select round(sysdate,'month')
from dual;

把当前日期四舍五入到年

select round(sysdate,'year')
from dual;

trunc 对日期进行截取,和round类似,但是只舍弃不进位(不管当前日期到没到16号,都舍去当前月份)

select trunc (sysdate,'month')
from dual;

2.转换函数

1.to_char:把一个数字或者是日期转换成字符(varchar2)

例:

select to_char(salary,$999,999,00)
from s_emp;
------
$2,500.00
$1,450.00

日期转为字符的常用格式:

内容 意义
rrrr 四位数的年份
yyyy 四位数的年份
yy 俩位数的年份
rr 俩位数的年份
mm 两位数的月份(数字)
D 一周的星期几
DD 一个月的第几天
DDD 一年的第几天
year 英文的月份
month 英文全称的月份
mon 英文简写的月份
ddsp 英文的第几天(一个月的)
ddspth 英文序列数的第几天(一个月的)
day 全英文的星期
dy 简写的英文的星期
hh 小时
mi 分钟
ss
例:
select to_char(sysdate,'yyyy mm MONTH mon MON D DD DDD DAY DY')
from dual;
------结果-------
2020 11 1111111 22 327 星期日 星期日
select to_char(sysdate,'yy/mm/dd')
from dual;

2.to_number:把varchar2类型转换成数字

select to_numbe('1100')
from s_emp;

3.to_date:把varchar2转换成日期

select to_date('10-12月-2020','dd/mm/yyyy')
from dual;

3.多表查询:

1.笛卡尔积

举例:s_emp表中25条数据,s_dept表中12条数据,查询俩张表,数据俩俩组合,会得到300条数据

2.连接查询:(为了避免笛卡尔积的产生)

1.等值查询:

例如:

查询员工的名字、部门编号、部门名字

select last_name,dept_id,s_dept.id,name
from s_emp,s_dept
where s_emp.dept_id=s_dept.id;

2.不等值连接:在俩个表中拿数据类型相同的去比较

3.外连接(左外,右外,全连接)

1.左外连接:把左边的表当成基础表,左表在右表中查询的数据,不管有没有都要显示出来。

例:查询所有员工,以及对应的部门名字,没有部门名字的也要显示出来。

select id,last_name,dept_id
from s_emp left outer join s_dept
on s_emp.dept_id=s_dept.id;

简写:

select last_name,id,dept_id,name
from s_emp,s_dept
where s_emp.dept_id=s_emp.id(+);
//意思就是想把左边的表多出来的数据也显示查询出来,那么就在右边加上一个加号。

2.右外连接:要把右边的表的数据都要查询出来

例:查询所有员工 以及对应的部门的名字,没有任何员工的部门也要显示出来

select last_name,dept_id,name
from s_emp right [outer]  join s_dept
on s_emp.dept_id =s_dept.id;

简写:

select last_name,dept_id,name
from s_emp,s_dept
on s_emp.dept_id(+)=s_dept.id;

3.全连接

查询所有员工 以及对应的部门的名字,没有任何员工的部门也要显示出来,没有部门的员工也要显示出来

select dept_id,id,last_name,name
from s_emp full join s_dept
on s+emp.dept_id=s_dept.id;
// dept_id,id,last_name,name这四项内容只要有一项就都必须显示出来

4.自连接:自己和自己连接

查询每个员工的名字以及员工对应的管理者的名字

select s1.last_name,s2.last_name manger
from s_emp s1,s_emp s2
where s1.manager_id=s2.id;

4.操作结果集

1.union:取俩个结果集的并集

2.union all :;把俩个结果集合在一起显示(可重复)

3.minus:第一个结果去除第二个结果中和他相同的部分

4.intersect:求俩个结果集的交集

5.伪列:rownum

只要数据库中才会有rownum,就像表中的列一样,但是在表中真实的不存在

伪列在数据库中只能用来查询,并不能像真实的列一样随意操作(加减运算)

伪列可以根据查询结果的条数,自动生成,并且一定是从1开始连续不断的数字
伪列rownum的本质就是给查询的一行行结果标上行号

伪列只能等于1,如果等于其他值查不到任何结果;只能大于0,不能大于其他结果。否则查不到。还可以小于任何数。

例:

select last_name
from s_emp
where rownum<7;

在实际的使用中,Oracle数据库中伪列rownum最核心的作用就是:完成分页查询。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!