第三章SQL查询与函数.docx

上传人:b****8 文档编号:27758878 上传时间:2023-07-04 格式:DOCX 页数:25 大小:26.16KB
下载 相关 举报
第三章SQL查询与函数.docx_第1页
第1页 / 共25页
第三章SQL查询与函数.docx_第2页
第2页 / 共25页
第三章SQL查询与函数.docx_第3页
第3页 / 共25页
第三章SQL查询与函数.docx_第4页
第4页 / 共25页
第三章SQL查询与函数.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

第三章SQL查询与函数.docx

《第三章SQL查询与函数.docx》由会员分享,可在线阅读,更多相关《第三章SQL查询与函数.docx(25页珍藏版)》请在冰豆网上搜索。

第三章SQL查询与函数.docx

第三章SQL查询与函数

SQL查询与函数

一、SQL概述

SQL(StructuredQueryLanguage)结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

同时也是数据库脚本文件的扩展名。

ØSQL语言主要包含5个部分

✓数据定义语言DataDefinitionLanguage(DDL),用来建立数据库、数据对象和定义其列。

例如:

CREATE、DROP、ALTER等语句。

✓数据操作语言DataManipulationLanguage(DML),用来插入、修改、删除、查询,可以修改数据库中的数据。

例如:

INSERT(插入)、UPDATE(修改)、DELETE(删除)语句

✓数据查询语言(DataQueryLanguage,DQL)是SQL语言中,负责进行数据查询而不会对数据本身进行修改的语句,这是最基本的SQL语句。

例如:

SELECT(查询)

✓数据控制语言DataControllingLanguage(DCL),用来控制数据库组件的存取允许、存取权限等。

例如:

GRANT、REVOKE、COMMIT、ROLLBACK等语句。

✓事务控制语言(TransactionalControlLanguage,TCL),用于维护数据的一致性,包括COMMIT(提交事务)、ROLLBACK(回滚事务)和SAVEPOINT(设置保存点)3条语句

二、Oracle的数据类型

类型

参数

描述

字符类型

Char

1~2000字节

固定长度字符串,长度不够的用空格补充

varchar2

1~4000字节

可变长度字符串,与CHAR类型相比,使用VARCHAR2可以节省磁盘空间,但查询效率没有char类型高

数值类型

Number(m,n)

m(1~38) 

n(-84~127) 

可以存储正数、负数、零、定点数和精度为38位的浮点数,其中,M表示精度,代表数字的总位数;N表示小数点右边数字的位数

日期类型

Date

7字节

用于存储表中的日期和时间数据,取值范围是公元前4712年1月1日至公元9999年12月31日,7个字节分别表示世纪、年、月、日、时、分和秒

二进制数据类型

Raw

1~2000字节

可变长二进制数据,在具体定义字段的时候必须指明最大长度n

longraw

1~2GB

可变长二进制数据

LOB数据类型

Clob

1~4GB

只能存储字符数据

Nclob

1~4GB

保存本地语言字符集数据

Blob

1~4GB

以二进制信息保存数据

三、DDL语言

1.Createtable命令

用于创建表。

在创建表时,经常会创建该表的主键、外键、唯一约束、Check约束等

Ø语法结构

createtable表名(

[字段名][类型][约束]

………..

PRIMARYKEY(column1,column2),

FOREIGNKEY(column1,column2,…..column_n),

REFERENCEStablename(column1,column2,…..column_n)

Ø例子:

createtablestudent(

stuNochar(32)primarykey,--主键约束

stuNamevarchar2(20)notnull,--非空约束

cardIdchar(20)unique,--唯一约束

sexchar

(2)check(sex='男'orsex='女'),--检查约束

addressvarchar2(100)default'地址不详'--默认约束

);

createtablemark(

midintprimarykey,--主键约束

stuNochar(32)notnull,

courseNamevarchar2(20)notnull,--非空约束

scorenumber(3)notnullcheck(score>=0andscore<=100),

--非空约束,检查约束

foreignkey(stuno)referencesstudent(stuNo)

--表级外键约束

);

2.Altertable命令

对已经存在的表进行修改,可以新增或删除字段,修改字段名或其类型和类型长度。

Ø修改表名

altertableold_tablerenametonew_table

Ø修改字段名

altertabletable_namerenamecolumnold_columntonew_column

Ø添加字段

altertabletable_nameadd(new_columnvarhcar2(200)default‘null’,new_column2number)

Ø修改数据类型

altertabletable_namemodifiy(filednamevarchar2(100))

Ø删除字段

altertabletable_namedropcolumncolumn_name

Ø添加主键

altertabletable_nameaddconstraintpk_nameprimarykey(column_id)

Ø删除主键

altertabletable_namedropconstraintpk_name

Ø添加外键,检查,唯一约束

altertabletable_nameaddconstraintfk_nameforeignkey(column_id)references主表(主键)

添加检查约束

Altertablestuaddconstraintck_snamecheck(length(sname)>=2)

添加唯一约束

altertablestuaddconstraintuq_snameunique(sname)

Ø删除外键

altertabletable_namedropconstraintfk_name

3.Droptable命令

用于从数据库中删除表及全部数据

droptabletable_name[purge];--purge:

清除缓存

4.Truncatetable命令

可以快速删除表的记录并释放空间,不使用事务处理,速度快且效率高,但无法回滚事务。

truncatetabletable_name

5.其他create命令

ØCREATEINDEX:

创建数据表索引

ØCREATEPROCEDURE:

创建存储过程

ØCREATEFUNCTION:

创建用户函数

ØCREATEVIEW:

创建视图

ØCREATETRIGGER:

创建触发程序

ØCREATESEQUENCE

6.SEQUENCE

在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。

Ø创建语法

CREATESEQUENCEsequence_marks

INCREMENTBY1--每次加几个

STARTWITH1--从1开始计数

NOMAXVALUE--不设置最大值

NOCYCLE--一直累加,不循环

CACHE10--使序列号预分配,默认NOCACHE

Ø列子

SELECTsequence_marks.currvalfromdual

insertintotable_namevalues(sequence_marks.nextval)

Ø删除

dropsequencesequence_marks

四、DML语言

1.INSERT语句

Insertintotable_name(column1,column2…….column_n)values(val1….)

--插入多条

insertinto表名(列名.....)select列名....from源表名

insertintostu

select1,'abc'fromdualunion

select2,'abcd'fromdual;

2.UPDATE语句

updatetable_namesetcolumn1=value,….where[condition…]

3.DELETE语句

Deletefromtable_namewhere[condition…]

五、运算符

1.算术运算符[+,-,*,/,mod(10,3)]

2.关系运算符[>,>=,<,<=,!

=,<>,=]BETWEEN…AND、IN、LIKE和ISNULL

3.逻辑运算符andornot

4.集合操作符union,unionall,minus,INTERSECT

✓union:

取出2个表数据合并,去除重复记录

✓unionall:

取出2个表数据合并,保留重复记录

✓minus:

取出2个表中不同数据

✓Intersect:

取出2个表中共有数据【交集】

5.连接操作符||

六、DQL语言

1.概述

Ø基本语法

SELECTcolumn_list[*查询所有数据]

[INTOnew_table]

FROMtable_source

[WHEREsearch_condition]

[GROUPBYgroup_by_expression]

[HAVINGsearch_condition]

[ORDERBYorder_expression[ASC|DESC]]

Ø例子

SQL>select*fromem--查询所有数据

SQL>selectename,jobfromem--查询指定的字段数据

SQL>select*fromempwheresal>1000--加条件

2.聚合函数

聚合函数对一组值执行计算并返回单一的值。

聚合函数忽略空值。

聚合函数经常与SELECT语句的GROUPBY子句一同使用。

不能在WHERE子句中使用组函数。

ØAVG(expression):

返回集合中各值的平均值

--查询所有人都的平均工资

selectavg(sal)fromemp

ØCOUNT(expression):

以Int32形式返回集合中的项数

--查询工资低于2000的人数

selectcount(*)fromempwheresal<2000

ØMAX(expression):

返回集合中的最大值

--查询最高工资

selectmax(sal)fromemp

ØMIN(expression):

返回集合中的最小值

--查询最低工资

selectmax(sal)fromemp

ØSUM(expression):

返回集合中所有值的总和

--查询部门编号为20的工资总和

selectsum(sal)fromempwheredeptno=20

3.排序函数

用于根据指定的列对结果集进行排序

ØORDERBY语句

--查询所有信息并按工资排序

select*fromemporderbysal

Ø升序(asc)

--查询所有信息并按工资升序排序

select*fromemporderbysalasc

Ø降序(desc)

--查询所有信息并按工资降序排序

select*fromemporderbysaldesc

ØROWNUM与ORDERBY【ROWNUM:

伪列,只能使用<,<=,!

=】

--查询工资最高的5个人信息

selecte.*,rownum编号from(select*fromemporderbysaldesc)ewhererownum<=5

【或rownum!

=6】

 

4.分组函数

分组函数作用于一组数据,并对一组数据返回一个值。

ØGROUPBY子句

--查询每个部门的平均工资

selectavg(sal)fromempgroupbydeptno

ØHAVING子句

--查询部门的平均工资大于2000

selectavg(sal)fromempgroupbydeptnohavingavg(sal)>2000

5.连接查询

连接查询是关系数据库中最主要的查询,主要包括内连接、外连接和交叉连接等。

通过连接运算符可以实现多个表查询。

Ø内连接

内连接也叫连接,是最早的一种连接。

还可以被称为普通连接或者自然连接,内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。

✓等值连接:

select*fromempinnerjoindeptonemp.deptno=dept.deptno

select*fromemp,deptwhereemp.deptno=dept.deptno

✓不等值连接:

select*fromempinnerjoindeptonemp.deptno!

=dept.deptno

Ø外连接

外连接分为三种:

左外连接,右外连接,全外连接。

对应SQL:

LEFT/RIGHT/FULLOUTERJOIN。

通常我们省略outer这个关键字。

写成:

LEFT/RIGHT/FULLJOIN。

✓左外连接(leftjoin):

是以左表的记录为基础的

select*fromempleftjoindeptonemp.deptno=dept.deptno

select*fromemp,deptwhereemp.deptno=dept.deptno(+)

✓右外连接(rightjoin):

和leftjoin的结果刚好相反,是以右表(BL)为基础的

select*fromemprightjoindeptonemp.deptno=dept.deptno

select*fromemp,deptwhereemp.deptno(+)=dept.deptno

✓全外连接(fulljoin):

左表和右表都不做限制,所有的记录都显示,两表不足的地方用null填充

select*fromempfulljoindeptonemp.deptno=dept.deptno

Ø交叉连接

交叉连接即笛卡儿乘积,是指两个关系中所有元组的任意组合。

一般情况下,交叉查询是没有实际意义的。

select*fromcrossfulljoindept

6.常用查询

✓like模糊查询【Oracle通配符只支持%与_】

--查询姓名首字母为S开始的员工信息

select*fromempwhereenamelike'S%'

--查询姓名第三个字母为A的员工信息

select*fromempwhereenamelike'__A%'

✓isnull/isnotnull查询

--查询没有奖金的雇员信息

select*fromempwherecommisnull

--查询有奖金的雇员信息

select*fromempwherecommisnotnull

✓in查询

--查询雇员编号为7566、7499、7844的雇员信息

select*fromempwhereempnoin(7566,7499,7844)

✓exists/notexists查询(效率高于in)

--查询有上级领导的雇员信息【查询原理:

一条一条读写记录】

select*fromempewhereexists

(select*fromempwhereempno=e.mgr)

--查询没有上级领导的雇员信息

select*fromempewherenotexists

(select*fromempwhereempno=e.mgr)

✓all查询

--查询比部门编号为20的所有雇员工资都高的雇员信息

select*fromempwheresal>all(selectsalfromempwheredeptno=20)

✓union合并不重复

select*fromempwherecommisnotnull

union

select*fromempwheresal>3000

✓unionall合并重复

select*fromempwherecommisnotnull

unionall

select*fromempwheresal>3000

✓intersect和minus

minus:

取出2个表中不同数据

createtableemp2asselect*fromempwhererownum<=5

--取出emp中与emp2不同数据

select*fromempminusselect*fromemp2

Intersect:

取出2个表中共有数据【交集】

select*fromempintersectselect*fromemp2

7.子查询

当一个查询是另一个查询的条件时,称之为子查询。

子查询是一个SELECT语句,它嵌套在一个SELECT、SELECT...INTO语句、INSERT...INTO语句、DELETE语句、或UPDATE语句或嵌套在另一子查询中。

✓在CREATETABLE语句中使用子查询

--创建表并拷贝数据

createtabletemp(id,name,sal)asselectempno,ename,salfromemp

✓在INSERT语句中使用子查询

--当前表拷贝

insertintotemp(id,name,sal)select*fromtemp

--从其他表指定字段拷贝

insertintotemp(id,name,sal)selectempno,ename,salfromemp

✓在DELETE语句中使用子查询

--删除SALES部门中的所有雇员

deletefromempwheredeptnoin

(selectdeptnofromdeptwheredname='SALES')

✓在UPDATE语句中使用子查询

--修改scott用户的工资和smith的工资一致

updateempsetsal=(selectsalfromempwhereename='SMITH')whereename='SCOTT'

--修改black用户的工作,工资,奖金和scott一致

updateempset(job,sal,comm)=(selectjob,sal,commfromempwhereename='SCOTT')whereename='BLAKE'

✓在SELECT语句中使用子查询

--查询和ALLEN同一部门的员工信息

select*fromempwheredeptnoin

(selectdeptnofromempwhereename='ALLEN')

--查询工资大于部门平均工资的雇员信息

select*fromempe

(selectavg(sal)sal,deptnofromempgroupbydeptno)t

wheree.deptno=t.deptnoande.sal>t.asal

七、TCL语言

1.COMMIT

commit--提交事务

2.ROLLBACK

rollbacktop1--回滚到指定的保存点

rollback--回滚所有的保存点

3.SAVEPOINT

savepointp1--设置保存点

4.只读事务

只读事务是指只允许执行查询的操作,而不允许执行任何其它dml操作的事务,它的作用是确保用户只能取得某时间点的数据。

settransactionreadonly

八、oracle函数

1.字符串函数

字符串函数是oracle中比较常用的,下面我们就介绍些常用的字符串函数:

✓concat:

字符串连接函数,也可以使用’||’

--将职位和雇员名称显示在一列中

Selectconcat('Hello','world')fromdual;--->Helloworld

selectename||'('||job||')'fromemp

✓length:

返回字符串的长度

--查询雇员名字长度为5个字符的信息

select*fromempwherelength(ename)=5

✓lower:

将字符串转换成小写

--以小写方式显示雇员名

selectlower(ename)fromemp

✓upper:

将字符串转换成大写

--以大写方式显示雇员名

selectupper(ename)fromemp

✓substr:

截取字符串

--只显示雇员名的前3个字母

selectsubstr(ename,0,3)fromemp

✓replace:

替换字符串

--将雇员的金额显示为*号

selectename,replace(sal,sal,’*’)fromemp;

✓instr:

查找字符串

--查找雇员名含有’LA’字符的信息

select*fromempwhereinstr(ename,’LA’)>0

selectinstr('abcabc','c',-1)fromdual;-->6【负数从后开始】

2.日期函数

✓sysdate:

返回当前session所在时区的默认时间

--获取当前系统时间

selectsysdatefromdual

✓add_months:

返回指定日期月份+n之后的值,n可以为任何整数

--查询当前系统月份+2的时间

selectadd_months(sysdate,2)fromdual

--查询当前系统月份-2的时间

selectadd_months(sysdate,-2)fromdual

✓last_day:

返回指定时间所在月的最后一天

--获取当前系统月份的最后一天

selectlast_day(sysdate)fromdual

✓months_between:

返回月份

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 动物植物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1