只有理解了SQL才能真正理解关系数据库

SQL语言是数据库的核心语言,全称是结构化查询语言(structured Query Language)

前身是SQUARE语言


SQL作为一种通用的数据库操作语言有以下优点:

  • 非过程化语言

因为他一次处理一个记录,对数据提供自动导航。sql允许在高层的数据结构上工作,而不对单个记录进行操作,可操作记录集!所有SQL语句接受集合作为输入,返回集合作为输出。SQL的集合特性允许一条SQL语句的结果作为另一条SQL语句的输入。SQL不要求用户指定对数据的存放方法。这种特性更易集中精力于要得到的结果!

  • 统一的语言

    SQL可用于所有用户的DB活动模型,包括SA,DBA..

  • 是所有关系数据库的公共语言


SQL语言功能

增删改查  修改表格结构(新建删除或者是修改表格字段) 建立索引值  

针对某个数据库或者表,授予用户存取权限

改变数据库系统环境设置

建库 建表(包括表格可以使用的空间)


SQL语法六大类

  1. 属性词(predicates) —— * distinct

  2. 声明(declaration)——declare a varchar(20)

  3. 条件字句(clause)——where from

  4. 运算符(operator)——+ -

  5. 函数(functions)

  6. SQL语句(statement) ——select update


SQL语句的运行环境

  • 命令方式下

  • 开发工具上——主要是sql puls

  • 程序中


sql puls


简介:

执行sql的主要工具,是oracle公司为执行SQL语句以及编写,处理PL/SQL语言而提供的一种开发环境。sqlplus运行sql语句,oracle特有命令——connect exit等,不分大小写,但是检查后比较字母是区分,如name='TOM'  name='tom'有区别

启动:

开始——程序——oracle——OraDb10g——应用开发程序——sqlplus

连接数据库,本地连接是可以不写连接字符串


引入PL/SQL原因


SQL语言是第四代语言,这就意味着这类语言会描述该做些什么,但是不会描述该如何去做,例如:执行select insert,这些语句送到服务器,我们并不知道数据库将如何操作,这些细节被系统屏蔽,我们无从知晓!

SQL相比第三代语言,使用简单。语句种类少,但是这类语言与实际的数据结构与算法隔离开来,对数据的具体处理完全由该类语言的运行时系统实

但是,第三类语言的过程结构对表达某些程序过程来说非常有用。这也就是引入PL/SQL的原因:即PL/SQL语言将第四代的强大功能和灵活性与第三代语言的过程结构和优势融为一体

PL/SQL代表面向过程化的语言与SQL语言的结合

PL/SQL实在SQL语言中扩充了面向过程中使用的程序结构,如:

  1. 变量和类型

  2. 控制语句

  3. 过程和函数

  4. 对象类型和方法

PL/SQL实现了将过程结构与oracle SQL的无缝集成,从而为用户提供了一种强大的结构化程序设计语言。同时集成了面向过程语言的过程结构和强大的数据库操作,未设计复杂的数据库应用提供了功能强大,健壮可靠的程序设计语言


PL/SQL数据类型

整数型-浮点型-字符型-布尔性-日期型-集合型-引用型-LOB型

四大类:

  1. 标量类型(double,integer,number,char,varchar2,date,timestamp,boolen等)不含有任何组件

  2. 复合类型(record,table,varray)

  3. 引用类型(ref cursor)是指向另一个类型的指针

  4. LOB类型(blob,clob)用来存储大型的对象

数字型

binary_integer

number

PLS_integer

字符型

char

vchar2

long

long raw

LOB型

bfile

blob

clob

nclob

布尔型

boolean

日期和时间间隔类型

date

timestamp


PL/SQL运算符

  • 算术——** + - * /  +(+5本位运算符,和取反运算符相同)  -(-5求反运算符)

  • 逻辑——and or not

  • 比较—— +, >= ,<= ,> ,<  , Is null,like,between,in, (<> != ~= ^=)

  • 字符串

  • 用户自定义



SQL语句的详细介绍与实例

  • 创建及查看表空间

  • 创建用户及授权

  • 创建表

  • 创建主键和索引

  • 创建序列



事务控制命令

事务:工作逻辑单元!要么全部执行,要么全部不执行!如果其中任何一条sql执行失败,则全部语句回滚不会执行,保证了数据的一致性和完整性!


事务开始:

第一条sql语句开始执行时

前一个事务结束以后的第一条sql语句

显示调用set transaction来开始一个事务


事务结束:

事务结束一般是使用commit或者是rollback开标志的


commit和rollback:

commit事务提交语句,将缓冲区中的数据写入数据库

由于我们使用DML中insert update delete语句更改表的时候,结果只是反映在缓冲区中,要把最终结果写入数据库,则需要运行commit语句,rollback正好相反!



数据库查询

简单查询

连表查询

联合查询



%type和%rowtype

%type:希望申明的变量和数据库中某一个字段的类型相同!即使数据库中字段的类型发生了变化吗,也可以保持一致

例子:declare x_mm user.mmW%type


如果一个表有实际列的话,一个记录的定义就要十几行——引出%rowtype

例子:declare recordnane tablename%rowtype


比较:

declare V_Recordname user%rowtype



declare type Recordname is record

(

   a user%type,

   b user%type,

   c user%type

);

V_Recordname Recordname;


引用相同:V_Recordname.a




伪列

伪列不是表中真正的列,伪列提供了一种方便的获取数据库各个方面的信息的方法

  1. currval和nextval伪列

    他们一般和序列联合使用;序列是一种oracle对象,他用来产生唯一的数字序列创建好之后如下访问

    Sequence_name.currval

    sequence_name.nextval  他们返回number类型的值

    序列值可以用在查询的选择列表,insert语句的values子句中,以及update语句的set子句中,但是不能用在where子句或者是PL/SQL过程性语句中!

  2. rowid伪列

    表示表中记录的二进制地址,每个表都有这个伪列,Rowid返回rowid类型的值,例如

    select rowid from user;

    可以使用urowid类型的变量一可读的形式存储rowid,为此,下面申明了一个叫row_id的变量

    declare row_id urowid

  3. rownum伪列

   指出从表中检索数据的次序,即返回当前的行序号,n表示表中的第n条记录,他不受order by子句的影响

   列子:select * from users where rownum>=2 and rownum<10 查询2 到9条的记录