《数据库系统概念(第六版)》读书笔记——第三章:SQL

基础SQL

标签(空格分隔): 数据库


SQL基本数据类型

数据类型说明
字符串
char(n)固定长度字符串
varchar(n)可变长度字符串
nvarchar(n)存放使用Unicode表示的多语言数据
布尔值
booleantrue / false
二进制
binary(n)二进制串.固定长度n
varbinary(n)二进制串.最大长度n
整数
int整数类型(和机器相关).默认精度5
int(n)精度n
smallint小整数类型(和机器相关).默认精度10
bigint大整数(和机器相关).默认精度19
浮点数
numeric(p, d)精确数值. 定点数,p位数字(包含一个符号位),d位小数
decimal(p, d)精确数值. 同上
real近似数值. 浮点数(与机器相关).尾数精度7
double近似数值. 双精度浮点数(与机器相关).尾数精度16
float(n)近似数值. 精度至少为n位的浮点数.尾数精度16
时间
date年-月-日
time时-分-秒
timestamp年-月-日 时-分-秒
interval由一些整数字段组成,代表一段时间,取决于区间的类型
array元素的固定长度的有序集合
multist元素的可变长度的无序集合
xmlXML 数据

说明:
1)不同类型字符串的比较结果依赖于数据库系统. 为了避免出错,推荐统一使用varchar类型
2)每种类型都包含null, 表示缺失或unknown

distinct

在关系模型的形式化数学定义中,关系是一个集合.既然是集合,就不允许有重复的元祖.但是在实践中,重复是一种很普遍的情况,况且去重很费时.因此,为了性能考虑,允许(+默认)在关系以及SQL表达式结果中出现重复.
--找出所有系名
select dept_name
from instructor
/* 结果必然包含很多重复的系名. 应该利用 "distinct" 去重*/

all

--显式保留重复元祖(因为默认all,大多数情况下省略)
select all dept_name
from instructor

多关系查询

1.select-from-where

直观上:
    产生笛卡尔积->应用where谓词筛选
在SQL的实际实现中不会这样
    而是通过只产生满足whrer子句谓词的元素进行笛卡尔积

2.自然连接

需要在所有匹配名称的属性上相等(结果集中相同属性只出现一次)

3.自然连接的坑

``示例一
select name 
from instructor natural join teaches natural join course;

--实例二
select name 
from instructor natural join teaches join course using (id);

--示例三
select name 
from instructor natural join teaches, course
where teaches.id = course.id;
实例二和示例三等价.是否和示例一等价取决于instructor natural join teaches自然连接的结果集是否和course只有id属性匹配.

始终注意:
    自然连接需要在所有匹配名称的属性上相等.有N个相同的属性,那么这N个属性上需要取值都相同才能连接成一条元祖

更名运算

/* 找出老师: 他/她的薪资高于生物系老师的最低薪资*/
select distinct name
--相关变量: 更名运算中的标识符u
from instructor T, instructor S
where T.salary > S.salary and S.dept = 'biology';

字符串比较

1.字符串的比较

SQL标准中字符串的相等运算是区分大小写的.但是MySQL和Sql Server并不区分.所以,"看手册"!

2.字符串函数

||
lower
upper
trim

3.模式匹配

like
not like
%
-
escape

显示次序

asc:
    默认升序
desc:
    显示降序

where子句谓词

空关系测试exists

用法示例

select ...
from ...
where A and B and exists(C)
A,B是谓词,
C是一个相关子查询,且只能是相关子查询

什么是相关子查询?

相关名称: 更名运算中的别名
子查询中用到了来自外层查询的相关名称,则为相关子查询

子查询的作用域规则
not exists结构

最大的用处:模拟超集操作.
即:
    关系A包含关系B
可以表示为:
    not exists (B except A)
这样理解:
    不存在 "只出现在关系B,不出现在关系A" 这样的元祖
    亦即,出现在关系B中的元祖一定出现在关系A中
    故,关系A包含关系B

case结构

case结构返回: then后面的语句
    update A
        set salary = 
            case 
                when salary <= 1000 then salary * 1.05
                else salary * 1.1
            end
应用
--检验输出是否合法
select case
          when sum(credits) is not null then sum(credits)
          else 0
       end

可以没有else分支.

此时,如果没有满足所列出的when条件,则返回null
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值