您的位置:首页 > 数据库

SQL入门

2015-08-10 16:15 197 查看
在基本了解过关系模型后,我们来看一门基于关系代数的,十分具影响力的语言--SQL。

尽管我们说SQL语言是一门“查询语言”,但除了数据库查询,它还具有很多别的功能---定义数据结构、修改数据库中数据以及说明安全性约束条件等。

Part One----SQL语言几个主要组成部分:

数据定义语言DDL:SQL DDL提供定义关系模式、删除关系以及修改关系模式的命令。

交互式数据操纵语言DML(interactive data-manipulating language):包括基于关系代数和元组关系演算(这部分会在“其他关系语言的介绍中了解到)的查询语言,还包括在数据库中插入、删除、修改元组的命令。

完整性:任何破坏完整性约束关系的更新将被禁止。保存在数据库中的数据必须满足的完整性约束条件将在DDL中定义。

视图定义、事务控制、嵌入式SQL和动态SQL(如何将SQL语言嵌入到通用变成语言中)、授权。共七部分。

Part Two--基本DML、DDL特征的描述:

(一)数据定义(DDL能够定义的内容包括---每个关系的模式、每个属性的值域、完整性约束、每个关系维持的索引集合blablablabla。。。。)

这里主要介绍基本模式定义,SQL采用定义表(create table)的方式定义SQL关系。值得注意的是在定义关系同时应给出必要的完整性约束(包括主码约束等)。

前面提到过,SQL的一个重要组成成分就是完整性,任何破坏完整性约束关系的更新将被禁止。以主码约束为例,若关系中一条新插入或修改的元组在任意一个主码属性上有空值(或出现相同取值),SQL将标记一个错误,并阻止更新。

(二)SQL查询的基本结构

SQL查询有三个基本的子句。执行的基本顺序为---先构造from子句中关系的笛卡尔积,再根据where子句中的谓词进行关系代数的选择运算,然后将结果投影到select子句中的属性上!!!查询的结果当然也是一个关系。

A.select子句:返回若干属性组成的关系,若需要去除重复需使用distinct关键字。子句中还可对属性值使用加减乘除算数表达式(注意该属性要更名否则无名)。 B.元组变量:当我们用“关系名.属性名”这种形式书写表达式时,关系名即是隐含定义的元组变量。

一个十分典型的用法如下

select distinct T.branch_name

from branch as T, branch as S

where T.assets>S.assets and S.branch_city='Brooklyn'

这里不能直接引用branch.assets,会造成表意不明。(这里还用到了更名运算as)

C.排列元组的显示顺序order by(desc表示降序,asc表示升序。默认升序)

(三)集合运算:包括union、intersect、except运算,此三者均默认去除重复(for...集合元素重复性..)。要保留重复 使用union all类似。

(四)聚集函数:聚集函数是以值得集合为输入,返回单个值得函数。但查询结果仍是关系(仅含一个值的关系)!!!

A.可用group by子句扩展聚集函数的作用~用法示例------- select branch_name,avg(balance)

from account

group by branch_name

关于 where、group by、having三个子句:

SQL首先应用where子句中的谓词,满足where谓词的元组通过group by子句形成分组。最后having子句作用于每一个元组,不符合having子句的分组将被抛弃,剩余的组被select自己用来产生查询结果。

接下来是嵌套子查询。。。复杂查询。。等。。。过段时间再学习= = 心猿意马的去看操作系统啦哈哈哈

(五)嵌套子查询(嵌套在另一个查询中的select-from-where表达式。一般子查询的使用有以下几个用途。

A.集合成员资格:SQL允许测试元组在关系中的成员资格。 关键字 in/not in

B.集合的比较:some、all与大小于符号的结合使用。

C.测试是否为空关系:测试一个子查询的结果中是否有元组。关键字exists

(六)复杂查询:可以包括多个SQL块。两种方法:

A.派生关系:允许在from子句中使用子查询表达式。(但必须as命名)

B.with子句:可以定义一个仅对此条查询有效的临时视图。

(七)视图:任何不是逻辑模型的一部分但作为虚关系对用户可见的关系[1]

A.作用?--可隐藏不必要的信息,也可把信息多个关系收集到单一视图。

B.一般的,每次查询视图时都应重新计算,以免数据库更新而视图未更新。因此数据库存储视图的定义本身(由一系列关系代数表达式组成)而非计算结果。

C.只要没有更新在其上进行,视图可出现在任何地方。关于视图的更新在数据库的修改部分会介绍到。

(八)数据库的修改

A.删除、插入和更新均是对元组进行的,插入时还要注意属性域。

insert into account

select *

from account

上述例子将会插入无数个元组。就这个问题要思考语句执行的顺序。

B.更新视图:视图一般不允许更新,只有符合条件(略)的视图才允许更新。

可能带来的问题:a.视图可能不包含所有属性,更新时可能null,可能被拒绝;b.比如向一个由两关系合并的视图插入("hhh",900),则需插入(null,null,900),("hhh",null)。而此时合并后视图仍不含("hhh",900)。「for空值匹配时默认不相等」

(八)连接关系

连接类型『如何处理连接条件不匹配的元组』

inner join leftouter join right outer join full outer join

连接条件『决定两关系中哪些元组相互匹配以及结果中出现哪些属性』

natural on<谓词> using(A1,A2,...An)「选择一些公共属性」

以上,SQL入门部分已经初步学习完毕,后续将要学习到的是“高级SQL”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: