《数据库系统概念》学习笔记2

第二章    
  关系模型

a.关系代数基本运算有:选择、投影、并、集合差、笛卡尔积、和更名

b.附加的关系代数运算:集合交、自然连接、除运算、赋值运算、

c.扩展的关系代数运算:广义投影,聚集函数,外连接

d.数据库的修改:删除,插入,更新

小结

A.关系数据模型建立在表的集合的基础之上。数据库系统的用户可以对这些表进行查询,可以插入新元组、删除元组以及更新(修改)元组。

B.关系代数定义了一套在表上运算,且输出结果也是表的代数运算。这些运算可以混合使用以得到表达所希望查询的表达式。关系代数定义了关系查询语言中使用的基本运算

C.关系代数运算可分为:基本运算、附加运算、扩展运算

D.数据库可以通过插入、删除或更新元组来修改。我们用包含赋值运算符的关系代数来表达这些修改

E.关系代数是简洁的、形式化的语言,不适合那些偶尔使用数据库系统的用户。因此,商用数据库采用有更多“语法修饰”的语言------SQL

第三章  
SQL

a.SQL语言有以 下几个部分:数据定义语言,交互式数据操纵语言,完整性,视图定义,事务控制

嵌入式SQL和动态SQL,授权

b.SQL表达式基本结构包括三个字句

select子句:对应关系代数中的投影运算,用来列出查询结果中所要的属性

from子句:  对应关系代数中的笛卡尔积,它列出表达式求值中需扫描的关系

where子句:对应关系代数中的选择谓词,它包括一个作用在from子句中关系的属性上的谓词

c. select        ”找出loan关系中所有支行的名字“

select
branch_name

from
loan

*若要删除重复,则select后加入关键词distinct

d.  where      
 ”找出所有再Perryridge支行贷款并且贷款额超过1200美元的贷款的贷款号“

select
loan_number

from
loan

where
 branch_name = ‘Perryridge‘ and amount>1200

*还提供between比较运算符来说明一个值是小于或等于某个值、同时大于或等于另一个值

e.   from          
”找出从银行贷款的所有用户的名字、贷款号、贷款数目“

select customer_name,borrower.loan_number,amount

from borrower,loan

where borrower.loan_number=loan.loan_number

f.    as更名运算  
 ”我们想用名字loan_id代替属性名loan_number,我们可以像下面这样重写上面的查询

select customer_name,borrower.loan_number as
loan_id,amount

from borrower,loan

where borrower.loan_number=loan.loan_number

g. like字符串运算    “找出街道地址中包含子串‘Main‘的所有客户名“

select customer_name

from customer

where customer_street like ‘%Main%‘

*其中有转义字符‘\’类似java

h. order by 排列元组的显示次序    
 ”按字母顺序列出Perryridge支行中有贷款的客户“

select distinct customer_name

from borrower,loan

where borrower.loan_number=loan.loan_number and

branch_name =
‘Perryridge‘

order by customer_name

*order by默认为升序,可加desc表示降序,asc表示升序,如”order by amount
desc,loan_number asc"

i.集合运算:union、intersect、except分别对应关系代数中的交、并、差

union      “找出在银行有账户、有贷款或两者都有的所有客户

(select customer_name

from
depositor)

union

(select customer_name

from borrower)

*  与select字句不同,union运算自动去除重复,若要保留重复,可用union all代替union

intersect     ”找出在银行同时有账户和贷款的客户“

(select
distinct customer_name

from depositor)

intersect

(select distinct customer_name

from borrower)

*同union一样,也是自动去除重复

except     ”找出在银行中有账户但无贷款的客户“

(select distinct
customer_name

from
depositor)

except

(select
customer_name

from
borrower)

*自动去除重复

j.聚集函数:平均值:avg,最小值:min,最大值:max,总和:sum,计数:count。

*sum和avg的输入必须是数字集,而其他运算符还可以作用在非数字数据类型

”找出Perryridge支行账户余额平均值“

select avg(balance)

from account

where
branch_name=‘Perryridge‘

“找出每个支行储户数”

select
branch_name,count(distinct customer_name)

from
depositor,account

where
depositor.account_number = account.account_number

* group
by  语句用于结合合计函数,根据一个或多个列对结果集进行分组。

此处解释很精辟http://www.w3school.com.cn/sql/sql_groupby.asp

k.having子句中的的谓词在形成分组后才起作用(即group by起作用后才起作用),因此可以使用聚集函数

select branch_name,avg(balance)

from account

group by branch_name

having avg(balance)>1200

l.可以用count计算一个关系中的元组数。SQL中该函数的写法是count(*)。因此,要找出customer关系中的元组数,可写成:  
 select count(*)

from customer

*SQL不允许在用count(*)时使用distinct

为了说明having子句和where子句出现在同一个查询时的用法,我们考虑查询“找出住在Harrison且在银行中至少有三个账户的客户的平均余额”

select depositor.customer_name,avg(balance)

from depositor,account,customer

where depositor.account_number = account.account_number and

depositor,customer_name =
customer.customer_name and

customer_city = ‘Harrison‘

group by depositor.customer_name

having count(distinct depositor.account_number)>=3

m.null 空值     “找出loan关系中amount为空值的贷款号”

select loan_number

from loan

where amount is null

*谓词is not
null用来检测非空值。如果算数运算的输入有一个是空,则该算数表达式的结果是空。如果有空值参与比较运算,SQL将比较运算的结果看成unknown(既不是is
null,也不是is not null)

SQL还允许我们用is unknown子句或is not
unknown子句来判断比较结果是不是unknown,而不是判断true or false

n.嵌套子查询,子查询是嵌套在另一个查询中的select-from-where表达式。一般子查询的使用时为了对集合的成员资格、集合的比较以及集合的基数进行检查

连接词in测试元组是否是集合中成员,not in 则相反

“找出在银行中同时有账户和贷款的客户”

select distinct customer_name

from borrower

where customer_name in (select customer_name

from depositor)

*in和not in运算符也能用于枚举集合  
“找出在银行中有贷款的客户,并且它的名字既不是”smith",也不是“jones”

select distinct
customer_name

from borrower

where customer_name not in
(‘Smith‘,‘Jones‘)

o.短语“至少比某一个大”在SQL中用>some表示

select branch_name

from branch

where assets>some (select
assets

from
branch

where
branch_city = ‘Brooklyn‘)

p.exists 测试是否为空关系,非空时返回true

“找出在银行既有账户又有贷款的客户”

select customer_name

from borrower

where exists (select*

from depositor

where depositor.customer_name=borrower.customer_name)

q. unique 查看子查询中有没重复的元组。没有则返回true

“找出所有在Perryridge支行中只有一个账户的客户”

select
T.customer_name

from
depositor as T

where unique
(select R.customer_name

from
account,depositor as R

where
T.customer_name = R.customer_name and

R.account_number = account.account_number and

account.branch_name = ‘Perryridge‘)

r.派生关系,as

“查询产生的关系包含各支行的名字和相应的平均账户余额”

(select branch_name
,avg(balance)

from account

group by branch_name)

as
branch_avg(branch_name,avg_balance)

s. with 子句

with子句提供定义临时视图的方法,这个定义只对with子句出现在的那条查询有效

t.视图:任何不是逻辑模型的一部分,但作为虚关系对用户可见的关系称为视图。

create view all_customer as

(select
branch_name,customer_name

from
depositor,accunt

where
depositor.account_number=account.account_number)

union

(select
branch_name,customer_name

from
borrower,loan

where
borrower.loan_number=loan.loan_number)

一旦我们定义了一个视图,我们就可以用视图名指代该视图生成的虚关系

select
customer_name

from
all_customer

where
branch_name = ‘Perryridge‘

*只要没更新操作在视图上的执行,视图名可以出现在关系名可以出现的任何地方

u.数据库的修改

删除:   格式    delete from r

where P

删除Perryridge支行的所有账户

delete
from account

where
branch_name=‘Perryridge‘

删除所有数额在1300美元到1500美元之间的贷款

delete from
loan

where amount
between 1300 and 1500

删除所有位于Brooklyn的支行的所有账户

delete from
account

where
branch_name in(select branch_name

from branch

where branch_city = ‘Brooklyn‘

插入:insert into account

select
loan_number,branch_name,200

from
loan

where
branch_name = ‘Perryridge‘

"向depositor关系中添加元组“

insert into
depositor

select customer_name ,loan_number

from borrower,loan

where borrower.loan_number = loan.loan_number and

branch_name =
‘Perryridge‘

更新:     ”对余额超过10000美元的账户付6%的利息,其余账户付5%”

update
account

set  balance = balance * 1.06

where balance>10000

update
account

set balance = balance * 1.05

where
balance<=10000

*这两条update语句的顺序非常重要。假如改变这两条语句的顺序,略少于1W美元的存款将获得11.3%的利息。

小结:

A.商业数据库系统并不使用第二章所介绍的简洁的、形式化的关系代数。本章我们学习广泛应用的SQL语言

,是建立在关系代数基础上并提供了许多便利语法的语言

B.SQL的数据定义语言用于建立具有特定模式的关系。SQL DLL支持若干数据类型,包括date和time等类型。

C.SQL包括各种用于查询数据库的语言结构。所有的关系代数运算,包括扩展的关系代数运算都可以用SQL表达。SQL还允许对查询结果按某些特定属性进行排序

D.SQL通过一般的真值取值(即true和false)外增加真值”unknown“来处理关系中含有空值的查询

E.SQL允许在where子句中嵌套子查询。外层查询可以在子查询的结果上执行多种操作

F.视图关系可以定义为包含查询结果的关系

G.临时视图用with来定义

《数据库系统概念》学习笔记2,码迷,mamicode.com

时间: 2024-10-26 05:09:48

《数据库系统概念》学习笔记2的相关文章

lua游戏开发实践指南学习笔记1

本文是根据lua游戏开发实践指南做的一些学习笔记,仅用于继续自己学习的一些知识. Lua基础 1.  语言定义: 在lua语言中,标识符有很大的灵活性(变量和函数名),不过用户不呢个以数字作为起始符,也要避免下划线(_)接大写字母,因为这种格式为lua自身保留如_Start. 建议用户使用如下格式和命名规则来定义变量.常量和函数名: ①  常量用全大写和下划线,例如:MY_CONSTANT ②  变量第一个字母小写,例如:myVariable ③  全角变量第一个字母用小写g表示,例如:gMyG

lua游戏开发实践指南学习笔记2

深入学习Lua 本人学习lua游戏开发实践指南的学习笔记,主要记录书中的一些知识点. 1.  函数 函数是划分游戏脚本功能的主要工具,它是通过标识符(事实上是一个变量)调用的lua代码块,可以执行某种处理.返回值,或者二者都有. 简单的函数定义如下: Function Wow() print(" ") print(Wow ,that wasaawesome:) print(" ") end 函数定义以function关键字开始,后面是函数名称,然后是传递给函数的参数

《LUA游戏开发实践指南》学习笔记1

本文只做个人学习笔记! Lua脚本语言的优点:免费.小巧.快速和易移植. 游戏项目中的Lua,可以完成以下工作 编辑游戏用户界面(玩家和你的游戏进行交互的媒介) 定义.存储和管理游戏数据(Lua本人并没有直接访问外部数据库的能力,但可以使用C++组件) 管理游戏实时事件 创建和维护开发者有好的游戏存储和载入系统 编写游戏的人工智能(AI) 创建功能原型,可以之后用高性能语言移植 Lua入门 Lua控制台 lua脚本(扩展名为.lua的文本文本) 代码块(Chunk):单个命令或者一系列命令组成脚

《Lua游戏开发实践指南》学习笔记2

深入学习Lua 一.函数 函数是划分游戏脚本的主要工具. 函数以function关键字开始,后面是函数名然后是参数列表,end关键字结尾 单一参数的例子 function SetName(myString) print(" ") print("Your name is :",myString) print(" ") end "myString"传递给了函数,并在函数中使用,函数中的参数是局部变量,调用结束后被回收 Lua可以定

Hadoop权威指南学习笔记一

Hadoop权威指南学习笔记一 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习参考,有什么不到之处还望指出,一起学习一起进步. 转载请注明:http://blog.csdn.net/my_acm 1. 数据的增长远远超过了磁盘的读取速度,传统的数据存储方式和分析方式变得不再适用于大数据的处理. Hadoop分为两大核心技术,HDFS(HadoopDistributed File System-分布式hadoop文件处理系统)和MapReduce(分为Map-数据映射等

Cocos2d-x lua游戏开发之安装Lua到mac系统

注意:mac ox ,lua version :5.15 下载lua官网的lua, 注意:最好是5.15以下,5.2的lua不支持table的getn()方法,这让我情何以堪.(获取table长度,相当与cout,size,length) 下载解压, cd 目录 make macosx sudo make install (是的,就是小写的install,虽然文件夹下的是INSTALL) ook,进入命令行,输入lua 看下,效果 Cocos2d-x lua游戏开发之安装Lua到mac系统,布布

ASP.Net开发基础温故知新学习笔记

申明:本文是学习2014版ASP.Net视频教程的学习笔记,仅供本人复习之用,也没有发布到博客园首页. 一.一般处理程序基础 (1)表单提交注意点: ①GET通过URL,POST通过报文体: ②需在HTML中为表单元素设置name: ③元素id是给Dom用的,name才是提交给服务器用的: (2)请求处理响应模型: ①浏览器发出访问请求→②服务器处理访问请求并返回HTML→③浏览器解析HTML并显示页面 (3)GET与POST的区别:(★★★→重点) ①GET通过URL传值,而POST通过HTT

《JavaScript设计模式与开发实践》读书笔记之观察者模式

1.<JavaScript设计模式与开发实践>读书笔记之观察者模式 观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. JavaScript中通常采用事件模型替代传统的观察者模式 1.1 逐步实现观察者模式 以客户看房为例 首先指定谁充当发布者,如售楼处 然后给发布者添加一个缓存列表,用于存放回调函数以便通知订阅者.这里为了让订阅者只接收自己感兴趣的消息,增加一个标识key 最后发布消息时候,发布者遍历缓存列表,依次触发里面存放的订阅者的回

Git权威指南学习笔记(一)Git初始化

1.在Git中配置用户名和邮件地址 $ git config --global user.name "Jymn_Chen" $ git config --global user.email "[email protected]" 注意把用户名和邮件地址替换成你自己的资料. 在这里的参数global表示配置的作用范围是当前用户,如果将参数改为system,那么配置的作用范围是系统中的所有用户. 2.创建版本库 新建一个目录并cd到目录中,执行以下命令: $ git i

Git权威指南学习笔记(二)Git暂存区

如下图所示: 左侧为工作区,是我们的工作目录. 右侧为版本库,其中: index标记的是暂存区(stage),所处目录为.git/index,记录了文件的状态和变更信息. master标记的是master分支所代表的目录树.HEAD指向master分支. objects标记的是Git的对象库,所处目录为.git/objects,文件索引建立了文件和对象库中对象实体之间的映射关系. 通过该图我们可以清晰地看出add,commit等命令的转化关系.下面通过git diff和git status两条命