​《数据库系统概念》4-DDL、集合运算、嵌套子查询

一、DDL

a) SQL Data Definition

SQL的基本数据类型有char(n)、varchar(n)、int、smallint、numeric(p,d)、real,double precision、float(n)等,int smallint real float依赖机器的精度

b) char(n)不够的用空格补齐,比较两个char(n)时会先补齐成一样的长度;比较char和varchar时有的数据库会先补齐,但有的不会,所以存储字符串时最好都用varchar;

c)表结构的定义:

类似Create table department (dept_name varchar(20), budget numeric(12,2), primary key(dept_name));

定义表结构的通用形式为:

Create table r

(A1, D1,

… ,

integrity-constraint1,

integrity-constraint2,

…);

常用的一致性约束类型有:主键、外键、非空

二、集合运算和null

a) 集合运算包括并集union、交集intersect、差集except。比如要查询2009年秋季开课的课程和2010年春季开课课程分别为:

select course_id

from section

where semester=’Fall’ and year=2009

select course_id

from section

where semester=’Spring’ and year=2010

要得出两个季度所有的课程可以用Union;使用intersect可以查找到两个季度都开课的课程;而使用except可以得到第一个结果集中存在但第二个结果集不存在的内容,这三种操作如果不需要去重,可以对应使用union all, intersect all, except al。

b)Null

null与其它值类型的算术运算结果都为null;

比较运算中,1

AND :

true,unknown=unknown

false,unknown=false

unknown, unknown= unknown

OR:

true, unknown=true

false, unknown= unknown

unknown, unknown= unknown

NOT:

NOT unknown= unknown

三、嵌套子查询(Nested Subqueries)

子查询是嵌套在另一个查询中的select-from-where表达式,用于对集合的成员资格进行检查以及对集合的比较。

a)检查集合成员资格

比如前面用交集操作实现的查询也可以写为:

select course_id

from section

where semester=’Fall’ and year=2009 and

course_id in (select course_id

from section

where semester=’Spring’ and year=2010)

可见SQL实现同一查询目的的方法可以是多样的。

b)集合的比较

集合比较用到的写法有>some, >=some, =some, >all等,比如要查找比生物系中至少一位教师工资高的人,可以写为:

select distinct T.name

from instructor as T, instructor as S

where T.salary > S.salary and S.dept name = ‘Biology’

也可以使用>some的写法:

select name

from instructor

where salary > some (select salary

from instructor

where dept name = ‘Biology’);

c)空关系测试

可以用exist来测试关系中是否存在元组,对应还有not exist

前面要查询的2009秋季和2010春季都开课的课程,也可以写为:

select course id

from section as S

where semester = ‘Fall’ and year= 2009 and

exists (select *

from section as T

where semester = ‘Spring’ and year= 2010 and S.course id= T.course id);

d)测试重复元组

使用unique来检查关系中是否存在重复元组,对应也有not unique。比如要查找2009年秋季至多开课一次的课程:

select T.course id

from course as T

where unique (select R.course id

from section as R

where T.course id= R.course id and R.year = 2009);

对于当时没开课的课程,因为结果为empty,unique对empty的计算结果也是true

e)From子句中的子查询

在from子句中也可以使用子查询,因为任何select-from-where返回的结果都是关系,所以可以在其上面继续使用from子句。

查询平均薪水超过42000的部门,如果使用having子句可以是:

select dept name, avg (salary) as avg_salary

from instructor

group by dept name

having avg (salary) > 42000;

也可以采用From子查询的方式:

select dept name, avg_salary

from (select dept name, avg (salary) as avg salary

from instructor

group by dept name)

where avg_salary > 42000;

同时还可以为from子查询的的表和字段重命名:

select dept name, avg_salary

from (select dept name, avg (salary)

from instructor

group by dept name)

as dept_avg (dept name, avg_salary)

where avg salary > 42000;

f)With子句

with子句用来定义临时关系,这个定义只对包含with子句的查询有效。比如查询拥有最多预算的部门,可以使用子查询,但子查询往往结构复杂、可读性差,而使用with子句就会好很多:

with max budget (value) as

(select max(budget)

from department)

select budget

from department, max budget

where department.budget = max budget.value;

虽然with子句只能在紧接着的查询中使用,但比子查询方便的是,它可以被多次使用。

g)标量查询

标量查询是指返回结果只是一个值的子查询,比如查询每个部门的员工人数:

select dept_name,

(select count(*)

from instructor

where department.dept_name = instructor.dept name)

as num instructors

from department;

由于使用了count,这儿的子查询结果只有一个值,虽然这仍然是一张表,但数据库会自动从表中取出值使用。标量查询可应用于select, where, having等处。而且编译时无法确保子查询结果确实是一个值,如果不是,在运行时会报错。

四、数据的修改

a)Insert

插入数据时可以直接使用select的结果,但下面的写法会造成死循环,插入无限多条:

insert into student

select *

from student;

而且数据库产品一般会提供批量插入的方式,用于快速地从格式化文本读取并插入大批量的数据。

b)Update

更新数据时可以使用case when来区分不同的情况:

update instructor

set salary = case

when salary <= 100000 then salary * 1.05

else salary * 1.03

end

此外,set子句也可以使用子查询

学习资料:Database System Concepts, by Abraham Silberschatz, Henry F.Korth, S.Sudarshan

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,248评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,681评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,443评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,475评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,458评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,185评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,451评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,112评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,609评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,083评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,163评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,803评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,357评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,357评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,590评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,636评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,925评论 2 344

推荐阅读更多精彩内容

  • mysql数据库中 :database : 文件夹table : 数据表(数据文件) 进入mysqlmysql -...
    赋闲阅读 558评论 0 0
  • 1. 问题的提出## 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出...
    七寸知架构阅读 5,353评论 1 111
  • 1.简介 数据存储有哪些方式?电子表格,纸质文件,数据库。 那么究竟什么是关系型数据库? 目前对数据库的分类主要是...
    乔震阅读 1,702评论 0 2
  • 5.多表查询 多表查询 目的:从多张表获取数据 前提:进行连接的多张表中有共同的列 等连接 通过两个表具有相同意义...
    乔震阅读 1,198评论 0 0
  • oracle 数据库的scott帐号。 <>作为查询条件时,可以使用!= 来替换。 SQL> select * f...
    庄栋栋阅读 2,126评论 0 0