Oracle中的SQL语言

4.1  了解SQL语言(结构化查询语言)的特点
SQL语言结构简洁,功能强大,它是一种在关系型数据库中定义和操纵数据的标准语言,有以下几个特点:

1.集合性  允许一条SQL语句的结果作为另一条SQL语句的输入/条件

2.统一性  为许多任务提供了统一的命令,方便用户学习和使用,主要体现在:

查询数据

在表中插入,修改,删除记录

建立,修改和删除数据库的对象(表,视图,索引)

控制对数据和数据对象的读写

保证数据库一致性和完整性

3.易于移植性

4.2  SQL语言的分类
1.数据定义语言DDL(Data Ddefinition Language)

用于建立,修改,删除数据库对象。Create,alter,drop

2. 数据查询语言DQL(Data Query Language)

用于检索数据库中的数据,主要是select语句

3. 数据操纵语言DML(Data Manipulation Language)

主要包括insert,update,delete三条语句

4. 数据控制语言DCL(Data Control Language)

用于执行权限授予和权限收回操作。Grant,revoke

5. 事务控制语言

用于维护数据的一致性。

Commit:用于提交对数据库的更改

Rollback:用于取消对数据库的更改

Savepoint:设置保存点

4.3  用户模式
在Oracle数据库中,为了方便管理用户所创建的数据库对象(表,索引,视图等),引入了模式概念,这样某个用户所创建的数据库对象就都属于用户模式。

模式:是一个数据库对象的集合。模式为一个数据库用户所有,并且具有与该用户相同的名称,比如SYSTEM模式,SCOTT模式等。在一个模式内部不可以直接访问其他其他模式的数据库对象,即使在有访问权限的情况下,也要指定模式名称才可以访问其他模式的数据库对象。

SYS     123456

SYSTEM  manager

SCOTT   tiger

模式对象:是由用户创建的逻辑结构,用于存储或引用数据,比如(表,索引,视图等)

模式拥有模式对象,模式对象被模式所拥有,两者之间是拥有与被拥有的关系。

4.4  实例模式SCOTT
SCOTT   tiger

Oracle提供SCOTT模式的目的,就是为了给用户提供一些实例表和数据来展示Oracle数据库的一些特性。SCOTT模式拥有的模式对象都是数据表(EMP,DEPT,SALGRADE,BOUNS)

连接scott用户,密码是tiger

SQL> conn scott/tiger

SQL> select *from tab;

4.5  检索数据
    用户对表或视图的操作就是检索数据,使用select语句实现(上下顺序不能颠倒)

Select {[distinct] 列名...}   (distinct去重)

[into 表名]               (into到查询列重新声明一个新的表)

From 表名                

[where 选择条件]           

[group by 列名]

[having 选择条件]            

[order by 列名]             (order by排序)

4.6  简单查询
Select  *  from

1. 检索所有的列

例:查询dept表中的所有数据

Select  *  from  dept;

例:查询表dept和salgrade

Select  *  from  dept,salgrade;

 

 

2.检索指定的列

Select 列名1,列名2...  from表名

例:在scott模式下,检索emp表中指定列(job,ename,empno)

Select job,ename,empno from emp;

 

补充:ROWID 行标识符(Oracle数据库自动为其匹配),是Oracle数据库内部使用的隐藏  列

例:检索emp表指定列job和ename,还包括rowid为列

 

3.带有表达式的select子句,算术运算符:+ - * /  ()

例:检索emp表的sal列,把其值调整为原来的1.1倍

Select sal*(1+1.1), sal form emp;

 

4.为列指定别名 两种:as关键字;直接指定列名

例:检索emp表中的指定列(empno,ename,job),并使用as关键字为这些列指定 中文别名(员工编号,员工名称,职务)

Select empno as ”员工编号”,ename as “员工名称”,job as “职务” from emp;

 

指定别名查询:SELECT empno 编号,ename 姓名,job工作FROM emp;

连接符:||  (字符串的拼接作用)注意用英文单引号’

要求查询出雇员的编号,姓名,工作,按照以下格式显示:

编号是:7369的雇员,姓名是:SMITH,工作是:CLERK

 

 

4.7  筛选查询
在select语句中,where子句位于from子句之后,其语法格式如下:

Select c列名

From 表名

Where 选择条件

4.8  条件查询:where关键词
格式:select 列名| * from 表名where选择条件

例:查询工资高于1200的有哪些?

Select * from emp where sal>1200;

 

All:只有与所有的元素比较值都为ture,才返回数据行    (in)

例:使用all关键字过滤工资(sal)同时不等于3000,950,800的员工记录

Select empno,sal,ename from emp

Where sal != all(3000,950,800);

 

注意:在进行比较筛选的时候,字符串和日期值必须使用单引号标识。

判断字段中是否存在内容:

1)内容为空:is null

例:查询每月可以得到奖金的雇员信息

 

2)内容不为空:is not null

例:查询没有奖金的雇员

 

注:A. 如果查询出现多个条件,在where语句之后,条件与条件之间用and连接。

例:要求查询出,基本工资大于1500,同时可以领取奖金的雇员信息。

 

A. 满足其中一个条件,使用关键字or来进行连接

例:查询出基本工资大于1500,或者可以领取奖金的雇员信息。

Select * from emp where sal>1500 or comm is not null;

 

Not关键字:取反,把真的条件变成假,假的变为真

例:查询出基本工资不大于1500,或者不可以领取奖金的雇员信息

Select * from emp where not (sal>1500  and  comm  is not  null);

Select * from emp where sal<=1500 or comm is null;

 

例:查询基本工资大于1500,但是小于3000的全部雇员信息

Select * from emp where sal>1500 and sal<3000

指定范围查询的过滤语句:between...and...(闭区间)

格式:select 列名|* from 表名where列名between最小值and最大值

例:查询工资在1500和3000之间的员工信息情况

Select * from emp where sal between 1500 and 3000;

Oracle对大小写是非常敏感的:

例:查询姓名是SMITH的雇员信息

Select * from emp where ename=‘SMITH’;

 

注:除了1上述语法外,还有in操作符不仅可以用在数字上,还可以用在字符串信息上。

例:要求查询出姓名是SMITH,ALLEN,KING的雇员信息

 

其实,如果指定了查询范围,在SQL语法当中,通过in关键字来完成。

1)查询的内容在此范围中,格式:字段  in(值1,值2...)

例:要求查询出雇员编号是7369,7499,7521的雇员的具体信息

Select * from emp where empno in (7369,7499,7521)

 

2)查询的内容不在此范围中,格式:字段  not  in(值1,值2...)

例:要求查询出雇员编号是7369,7499,7521的雇员的具体信息

Select * from emp where empno  not  in (7369,7499,7521)

 

4.9  LIKE匹配符:也叫做模糊查找功能(模糊查询)
即:输入一个指定的关键字,把复合的内容全部查询出来

%:可以匹配任意长度的内容

_:可以匹配一个长度的内容

例:查询出所有雇员姓名中第二个字母包括“M”的雇员信息

 

Like还可以方便进行日期的查找功能

例:查询出生在1981年的雇员信息

Select * from emp where hiredate like ‘%81%’;

 

练习:在emp表中,使用like关键字匹配出以字母’S’开头的任意长度的员工信息。

 

扩展:在like前面也可以加上not,表示否定的判断

 

4.10  排序查询
使用order by子句排序:—ASC:升序   —DESC:降序

Order by子句在select语句的结尾

例1:要求按照工资由低到高排序(默认升序)

 

 

例2:检索emp表中所有的数据,并按照部门编号,员工编号来排序。

Select deptno,empno,ename

from emp

Order by deptno,empno;

 

4.11  分组查询
select 列名 from表名group by列名

例1:在emp表中,通过分组的方式计算每个部门的平均工资

Select deptno as 部门编号,avg(sal) as平均工资

from emp

group by deptno;

 

例2:在emp表中,先通过分组方式计算出每个部门(部门编号 列)的平均工资,然后通过having过滤掉平均工资大于2000的记录信息

Select deptno as 部门编号,avg(sal) as平均工资

from emp

group by deptno having avg(sal)<=2000;

 

4.12  多表关联查询
在实际的应用当中会涉及多个数据表来进行查询,每个表的信息不是独立存在的,而是若干个表之间的信息存在一定的关系。

1. 表别名

在多表关联查询时,如果多个表之间存在同名的列,则必须使用表名来限制列的引用。

例:在scott模式下,通过deptno列来关联emp和dept表,并检索这两个表中相关字段的信息。

Select e.empno as 员工编号,e.ename as员工名称,d.dname as部门

From emp  e,dept  d

Where e,deptno=d.deptno

 

2. 内连接 inner join on (只有匹配到的信息才能查询出来)

例:通过deptno字段来内连接emp表和dept表,并检索两个表中相关字段

Select emp.ename,job,dept.dname

From emp inner join dept

On emp.deptno=dept.deptno;

 

3. 外连接

左外连接:left outer join

 

右外连接:right outer join

 

完全连接:full outer join

例:完全实现emp和dept表的外部连接

 

4. 自然连接:在检索多个表的时候,Oracle会将第一个表中的列与第二个表中的具有相同名称的列进行自动连接,在自然连接中,用户不需要明确指定进行连接的列,这个 任务由Oracle系统自动完成,自然连接用“natural  join”关键字

例:在emp表中检索工资大于2000的记录,并实现emp与dept的自然连接

Select empno,ename,job,dname

From emp natural join dept

Where sal>2000;

 

5. 交叉连接:不需要任何连接条件的连接,它使用 cross join关键字来实现,格式:

Select 列名 from表1cross join 表2

执行结果为一个笛卡尔积(两个集合中的所有元素均匹配一遍),这种查询结果是非常冗余(多)的

例:通过交叉连接dept和emp表,计算出查询结果的行数

Select count(*) from dept cross join emp;

 

4.13  Oracle常用的系统函数
1. 字符串函数(处理字符串的函数)

1)ASCII(c)函数和CHR(i)函数

ASCII(c)函数用于返回一个字符的ASCII码,其中c表示一个字符;

CHR(i)函数用于返回给出ASCII码值所对应的字符,i表示一个ASCII码值

例:分别求得字符’Z’,’H’,’D’和空格的ASCII值

Select ascii(‘Z’) Z,ascii(‘H’) H,ascii(‘D’),ascii(‘ ’) k from dual;

Select CHR(78) from dual;

 

其中:dual(万能表)表示Oracle系统内部提供的一个用于实现临时数据计算的特殊表,它只有一个列DUMMY,类型VARCHAR2(1)

2)CONCAT(s1,S2)函数

该函数将字符串s2连接到s1后面,如果s1位null,则返回s2;如果s2为null,则返回s1,都为null,结果返回null

例:使用concat函数连接hello和world两个字符串

Select concat(‘hello’,’world’) form dual;

 

3) INITCAP()函数将单词第一个字母大写

select INITCAP(‘hello’) from dual;

 

例:将雇员表中的雇员姓名变为开头字母大写

Select INITCAP(ename) from emp;(该列除首字母外,后面的字母默认为小写)

 

4)instr(s1,s2,i,j)函数

用于返回字符s2在字符串s1中第j次出现的位置,搜索从字符串s1的第i个字符开始。当没有发现要查找的字符时,返回0。如果i为负数,搜索从右到左进行,但是函数返回的位置还是按从左到右来计算。S1和s2均为字符串,i和j为正整数。

例:在字符串‘Oracle 11g’中,从第三个字符开始查询字符串‘1’第二次出现的位置

Select instr(‘oracle 11g’,’1’,3,2) abc from dual;

 

5)length(s)函数:返回字符串的长度

例:通过使用length函数返回雇员名称长度大于5的雇员信息以及所在的部门

Select e.empno, e.ename, d.dname

From emp e inner join dept d

On e.deptno=d.deptno

Where length(e.ename)>5;

 

6)LOWER(S)函数和UPPER(S)函数(大小写的转化)

lower()函数将一个字符串变为小写字母(转小写)

Select lower(‘HELLO WORLD’) from dual;

upper()函数将一个字符串变为大写字母(转大写)

Select upper(‘hello world’) from dual;

 

7)Replace(s1,s2,s3)函数

该函数使用s3字符串替换出现s1字符串所有s2的字符串,并返回新的字符串

Select replace(‘bad luck bad girl’,’bad’,’good’) from dual;

 

8)substr(s,i,[j])函数

表示从字符串s的第i个位置开始截取长度为j的子字符串

例:从‘MessageBox’中第8个位置截取长度为3的子字符串(其中若第三个参数不写,默认情况下截取从第i个字符开始一直到 截取完该字符串)

 select substr('MessageBox',8,3) from dual;

 

2. 数字类函数(用于执行各种数据的计算)

 1)ABS(n):返回n的绝对值

select ABS(-8) from dual;

 

2)ROUND(n1,n2)函数:返回四舍五入小数点n2位的n1值

例:返回π的两位小数值  select round(3.141592653,2) from dual;

 

对emp表中的sal列进行除以20,并四舍五入的保留结果小数点后两位的数字

 

3)power(n1,n2)函数:返回n1的n2次方,其中n1和n2都为整数

例:计算2的3次方         select power(2,3) from dual;

 

3. 日期和时间类函数

 1)sysdate表示当前日期

 select sysdate as 系统日期 from dual;

 

2)add_months(d,i):在指定日期d上指定月数i,求出之后的日期

例:在当前的日期下加上6个月,并显示值

 select add_months(sysdate,6) from dual;

 

4. 聚合类函数

 AVG(列名):求平均值           SUM(列名):求和

MAX(列名):求最大值           MIN(列名):求最小值

COUNT(列名):求查询结果中的记录数  (行数)

例:使用count()函数计算员工总数,用avg()计算工资

 select count(empno), round(avg(sal),2) from emp;

 

4.14  子查询的用法
子查询是在SQL语句中包含另一条select语句,也称为内查询

例:在emp表中查询部门名称(dname)为‘RESEARCH’的员工的信息

 select *

from emp

where deptno=(select deptno

from dept

where dname='RESEARCH');

 

在使用子查询的时候应注意:

 1)子查询必须用()括起来 2)子查询中不能包括order by子句

3)子查询允许嵌套多个,不能超过255个

在Oracle 11g中,子查询分为:单行子查询、多行子查询、关联子查询3种。

4.15  单行子查询
单行子查询是指返回一行数据的子查询语句

例:在emp表中查询既不是最高工资,也不是最低工资的信息

 select * from emp  where sal>(select min(sal) from emp)and sal<(select max(sal) from emp);

 

4.16  多行子查询
多行子查询是指返回多行数据的子查询语句,当在where子句中使用多行子查询,必须使用多行运算符(in,all,any)

1.使用in运算符:只要匹配一个结果成功,就会返回检索记录

例:查询不是销售部门(sales)的员工信息

select *from empwhere deptno in(select deptnofrom deptwhere dname<>'sales');

 

查询薪水大于SMITH的员工信息

select *

 from emp

where sal>(select salfrom empwhere ename='SMITH');

 

查询薪水大于平均薪资的员工信息

select *from emp where sal>(select avg(sal) from emp);

 

2.使用any运算符

any运算符必须和单行比较运算符结合使用,并返回行只要匹配子查询的任何一个结果即可。

例在emp表中,查询工资大于部门编号为10的任意一个员工的工资即可的其他部门的员工信息

select * from emp

where sal>any(select sal from emp where deptno=10)

and deptno<>10;

 

3.使用all运算符:只有与所有的元素比较值都为ture,才返回数据行    


例:使用all关键字过滤工资(sal)同时不等于3000,950,800的员工记录

Select empno,sal,ename from emp

Where sal != all(3000,950,800);

 

注意:在进行比较筛选的时候,字符串和日期值必须使用单引号标识。

4.17  关联子查询

 内查询的执行需要借助于外查询,而外查询的执行又离不开内查询的执行,这时,内查询和外查询是相互关联的,这种查 
询被称为关联子查询


 例:检索工资大于同职位的平均工资的员工信息
 select empno,ename,sal 
 from emp f 
 where sal >(select avg(sal) from emp where job=f.job) 
 order by job;

例:要求查询出比7654工资高的全部雇员信息
 select *from emp
where sal>(select sal from emp where empno=7654);


4.18   操作数据库

1.插入数据(insert)

insert into 表名(列名...)  values(值...)

例:在dept表中,使用insert语句添加一条记录

insert into dept(deptno,dname,loc) values(23,'qianfeng','beijing');

 

2.批量插入数据

select查询语句insert into 表名(列名)  select查询语句

 insert into emp_tempselect * from emp;

如下:创建emp2,将emp中的数据插入emp

 

3.更新数据

 格式:update 表名 set 列=值 where 条件

例:把emp表中职务是销售员(SALESMAN)的工资上调20%

 update emp set sal=sal*1.2 ehere job='SALESMAN';

和insert语句一样,update语句也可以与select语句结合使用。

例:把emp表中工资小于2000的雇员工资调整为管理者(MANAGER)的平均工资。

 update emp set sal=(select avg(sal)) from emp where job='MANAGER'

where sal<2000;

4.19  删除数据

格式:delete from 表名 [where 条件]

例:删除姓名是“SMITH”个人信息

 delete from emp where ename='SMITH';

 

*使用delete语句删除数据时,Oracle系统会产生回滚记录,所以这种操作可以使用ROLLBACK语句来撤销 

4.20  事务处理
事务是由一系列语句构成的逻辑工作单元。通常都是为了完成一定业务逻辑而将一条或者多条语句‘封装’起来,使他们与其他语句之间出现一个逻辑上的边界,并形成相对独立的工作单元。

事务的四个属性:

 1)原子性:事务是一个整体的工作单元,事务对数据库所做的操作要么全部执行,要么全部取消。如果某条语句执行失败,则所有语句全部回滚。(rollback)

 

 此时若此前的事务处理未进行提交(commit),将全部回滚。

2)一致性:事务完成的时候,必须使所有的数据保持一致状态。

3)隔离性:由事务所做的修改必须与其他事务所做的修改隔离。

4)持久性:当事务提交后,对数据库所操作的修改就会永久保存下来。

4.21  操作事务
以下情况,Oracle认为一个事务结束:

 1)commit语句提交事务

2)执行rollback语句撤销事务

3)执行一条数据定义(DDL)和控制(DCL)语句,比如create,alter,drop等,如果该语句执行成功,

那么Oracle会自动执行commit命令,否则自动执行rollback命令。

4)正常的断开数据库的连接,正常的退出SQL*PLUS环境,Oracle会自动执行commit命令,否则自动执行rollback命令

注:Oracle结束一个事务归根结底要么执行commit语句,要么执行rollback语句。

4.22  commit和rollback
 1)提交事务(commit):把对数据库进行的全部操作持久性的保存在数据库中

 例:向bonus表中插入一条数据,然后用commit语句进行提交

insert into bonus

values('zhangsan','manager',1200,200);

commit;

 

 2)回滚事务(rollback):撤销对数据库进行的全部操作

4.23 数据表
 数据表是Oracle数据库的主要数据存储容器,表中的数据被组织成行和列。

 数据表的逻辑结构:表是最常见的一种组织数据的方式,一张表一般都具有多个列(字段)。每个字段都极有特定的属性。包括字段名,数据类型,字段长度,约束,默认值等。

 Oracle除了提供的数值类型,字符类型,日期时间类型之外,还有以下最常见的几种:

1)字符类型

  char:用于存储固定长度的字符串。范围是1-2000字节

  varchar2:用于存储变长, 而非固定长度的字符串。

2)数值类型

 number:用于存储整数或浮点数

3)日期时间类型

 date:可以存储日期和时间组合数据。最常见的获取日期的方法是通过sysdate函数,可以获取当前系统的日期值。

 to_date函数将数值或字符串转换成date类型。

4)rowid数据类型

 也被称为‘伪列类型’,用于在Oracle内部存储表中记录每条记录的物理地址,在Oracle内部通过rowid来定位所需记录的。

4.24 创建数据表
创建表使用create table语句

例:创建一个学生信息表student,包括学号,姓名,性别,年龄,系别编号,班级编号,建档日期

 create table student

(

sno number(10) not null,

name varchar2(10),

sex varchar2(5),

age number,

departno varchar2(6) not null,

classno varchar2(6) not null,

regdate date

);

 

当使用create table ...as select ...语句创建表时,Oracle将通过student表中复制列来建立表。在创建表后,Oracle就会使用select语句中返回的行来填充新表。

例:使用create table...as select...语句创建student表的一个副本

create table student2

as select *

from student;

 

select * from tab;查看当前用户下的所有表

 

4.25 维护数据表
1. alter
1)添加或者删除字段 alter table 表名 add (列名,数据类型)
 例:给student表添加一个province(省份)新字段

 alter table student add(province varchar2(4));

 例:删除province字段  alter table student drop column province;

 例:同时删除sex,age字段  alter table student drop(sex,age);

 

 

 注:删除多个列时不加column

2)修改字段
 格式:alter table 表名 modify lieming 要修改的属性

 例:把student表中 departno字段长度修改为10

  alter table student modify departno varchar2(10);

 

3)重命名
①修改表名:alter table 原表名称 rename to新表名称

例:更改student表名为s1 alter table student rename to s1;

 

②修改列名:alter 表名 rename column 原列名 to 新列名;

 例:更改表student中name为sname alter table s1 rename column name to sname;

 

2. drop
1)删除表 drop table 表名[cascade constraints];
注:如果该表存在约束,关联的视图等,则必须使用“cascade constraints”这个可选的子句才能删除。
例:删除student2表      drop table student2;

2)当用户需要还原该表时,可以使用flashback table语句来进行还原。
flashback table student2 to before drop;


章末总结
1.了解SQL语言的特点(集合性、统一性、可移植性)

2.理解用户模式和模式对象(模式中拥有模式对象,模式对象被用户所拥有)(scott)

3.掌握检索数据的方法


  [where 选择条件]           

  [group by 列名]

  [having 选择条件]            

  [order by 列名]             (order by排序)

  表连接 自然连接 交叉连接

4.Oracle常用系统函数

5.掌握子查询的用法(in    any(单行比较运算符)    all)

6.掌握操作数据库的3种方法(insert  update  delete)
---------------------
作者:猫发出喵的声音
来源:CSDN
原文:https://blog.csdn.net/weixin_41096399/article/details/79104902
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自www.cnblogs.com/FanKL/p/10990754.html