一、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<null的结果为unknow,这样除了“是”与“否”两种逻辑结果,有多了一个unknow;AND, OR, NOT逻辑运算遇到unknow时的情况依次为:
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

​《数据库系统概念》4-DDL、集合运算、嵌套子查询的更多相关文章

  1. ylb:子查询(嵌套子查询)和子查询(相关子查询)

    ylbtech-SQL Server:SQL Server-子查询(嵌套子查询)和子查询(相关子查询) SQL Server 子查询(嵌套子查询)和子查询(相关子查询). 1,ylb:1,子查询(嵌套 ...

  2. [SQL SERVER系列]之嵌套子查询和相关子查询

    子查询有两种类型,一种是只返回一个单值的子查询,这时它可以用在一个单值可以使用的地方,这时子查询可以看作是一个拥有返回值的函数:另外一种是返回一列值的子查询,这时子查询可以看作是一个在内存中临时存在的 ...

  3. 相关子查询和嵌套子查询 [SQL Server]

    SQLServer子查询可以分为 相关子查询 和 嵌套子查询 两类.前提,假设Books表如下: 类编号  图书名         出版社               价格-------------- ...

  4. SQL嵌套子查询和相关子查询的执行过程有什么区别(推荐)

    SQLServer子查询可以分为 相关子查询 和 嵌套子查询 两类.前提, 假设Books表如下: 类编号 图书名 出版社 价格 ----------------------------------- ...

  5. Yii2.0ActiveRecord嵌套子查询(AR子查询)

    yii2.0的ActiveRecord是可以嵌套子查询的. 比如从一个子查询里面筛选数据. 首先实例化出来一个Query对象,代表子查询. $subQuery = new \yii\db\Query( ...

  6. SQL相关子查询是什么?和嵌套子查询有什么区别?

    目录 两者的各种叫法 相关子查询MySQL解释 相关子查询Wikipedia解释 相关子查询执行步骤拆解 相关子查询和嵌套查询的区别 参考资料 两者的各种叫法 相关子查询叫做:Correlated S ...

  7. java数据库编程之嵌套子查询及exists的使用

    第四章:高级查询(二) 4.1:exists和not exists子查询 4.1.1:exists子查询 用exists作为子查询的where条件 语法:select,,,,,,from 表名   w ...

  8. sql 语句 嵌套子查询 执行顺序分析

    --创建测试数据create table Student(S# varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10))inser ...

  9. SQL Server case when 日期字符串转换 多表查询 嵌套子查询

    select distinct stu.*, dbo.GetClassNameByStudentCode(stu.Code) as ClassName, dbo.GetCourseNameByStud ...

随机推荐

  1. Swift5 语言指南(十四) 下标

    类,结构和枚举可以定义下标,下标是用于访问集合,列表或序列的成员元素的快捷方式.您可以使用下标按索引设置和检索值,而无需单独的设置和检索方法.例如,您可以访问在元素Array实例作为someArray ...

  2. itext实现合同尾部签章部分自动添加,定位签名

    使用的pom <!-- pdf处理 start--> <dependency> <groupId>com.itextpdf</groupId> < ...

  3. SQL-1--语句分类

  4. Tools - VirtualBox的使用方法和技巧

    01 - 为CentOS虚拟机安装VirtualBox增强功能 启动CentOS虚拟机,点击"菜单 -> 设备 -> 安装增强功能". vboxadd的映像文件将会被挂 ...

  5. vue 自学笔记(4): 样式绑定与条件渲染

    一:对象绑定 Vue 对于页面的样式加载也有独特的方式,按照 Vue 提供的方式,我们可以轻松的控制它们的呈现. 假使我们要实现点击 div 变色 Vue 提供的样式方案的本质是对元素节点进行属性的绑 ...

  6. [视频]K8飞刀 HackerIE自动检测网站注入教程

    [视频]K8飞刀 HackerIE自动检测网站注入教程 https://pan.baidu.com/s/1c08rihi

  7. [EXP]McAfee ePO 5.9.1 - Registered Executable Local Access Bypass

    # Exploit Title: McAfee ePO 5.9.1 Registered Executable Local Access Bypass # Date: 2019-03-07 # Exp ...

  8. Java并发框架AbstractQueuedSynchronizer(AQS)

    1.前言 本文介绍一下Java并发框架AQS,这是大神Doug Lea在JDK5的时候设计的一个抽象类,主要用于并发方面,功能强大.在新增的并发包中,很多工具类都能看到这个的影子,比如:CountDo ...

  9. 剖析QMenu & Qt完全定制化菜单

    贴张效果图:  定制包括: 1. 周边阴影 2. 菜单项的元素(分割符, 控制ICON大小, 文字显示位置与颜色, 子菜单指示符) 菜单内的效果, 部分可以使用stylesheet实现, 但要做到这样 ...

  10. ACM学习大纲

    1 推荐题库 •http://ace.delos.com/usaco/ 美国的OI 题库,如果是刚入门的新手,可以尝试先把它刷通,能够学到几乎全部的基础算法极其优化,全部的题解及标程还有题目翻译可以b ...