5.SQL-结构化查询语言(一)
SQL怎么念?
- /'sɜːkl/ – 同 circle. 部分开发者独创发音
- /ˈsiːkwəl/ - 同 Sequel.
- Ess-cue-ell, 即 S-Q-L, ISO 标准规定发音
大纲
- 介绍
- 数据定义语言-DDL
- 基础概念
- 数据操作语言-DML
- 数据定义语言-DDL
- 进阶概念
数据定义语言:DDL(基础概念)
允许指定
- 定义属性及其定义域
- 完整性约束
- 在磁盘上存储的组织方式
- 索引方法
- 用户对 relation 的权限操作
SQL的主要数据类型
- char(n):长度恒为 n 的字符串
- varchar(n):可变长度的字符串,最长为 n
- int:整型,四个字节
- smallint:小整型,一般两个字节,具体和机器有关
- Numeric(p,d):数值,一共 p 位,其中小数点后 d 位
- real,double precision:浮点数和双精度浮点数,具体与机器相关的精度
- float(n):浮点数,用户通过 n 指定精度( bits )
- 还有 date、time 等......
- 所有数据类型的取值范围都包含 null,可以在声明的时候加上后缀 not null,表示不允许取 null 值
- float [ (n) ] 其中 n 是用于以科学记数法存储浮点数尾数的位数,因此决定了精度和存储大小。如果指定了 n,则它必须是 1 到 53 之间的值。n 的默认值为 53。
SQL模式定义
- 删除表
- 从数据库中删除 relation r,我们用 drop table 命令:
- drop table r
- 从数据库中删除 relation r,我们用 drop table 命令:
- 修改表
- alter table:删除或者增加属性
- 加属性后,现有记录在新属性的值为 null
- alter table customer add phone char(10)
- alter table customer drop phone
完整性约束
- IC:anytime-constrain —— 数据库在任何时候都要成立
- 譬如:not null 表示相应的属性值不能为空
- ICs:一般情况下,在设定 relation 的时候设定 IC 约束
- ICs:在 relation 发生变化的时候,IC 都会被检查
数据操纵语言(DML)
基本查询语句
- 查询语句在 SQL 中的基本形式
- Relation-list:关系名称列表(每个名称后面可能带有范围变量)
- Target-list:属性列表,逗号分隔
- Qualification:逻辑表达式
- DISTINCT:可选,表示最终结果去重(默认不去重)
- SELECT clause:后接选择的属性
- 选取 columns.相当于 projection 操作
- FROM clause:返回 relations 的笛卡尔积
- WHERE clause:可选语句,用来指定记录需要满足的条件.相当于selection操作
- 以一个表为例:
- 我们查找贷款关系中所有支行的名字
- 消重
- 我们查找贷款关系中所有支行的名字
算数运算
- select 字句可以包含涉及运算符 +,-,/ 和 × 的算术表达式,并对元组的常量或属性进行操作
- 譬如:
SELECT branch name, loan-number, account * 100 FROM loan
- 将返回与 loan 相同的关系,只不过属性 amount 乘以 100
WHERE 语句
- WHERE 子句指定 FROM 子句的 relation 中的元组必须满足的条件
- 例如:
- 例如:
- WHERE 语句允许使用逻辑运算符 and,or,not
- SELECT 和 WHERE 语句中用到的属性必须存在于 FROM 语句的 relation 中
- 可以直接用 between ... and ... 关键字表示目标区间
- 例如
- 例如
FROM 语句
- FROM 返回的是 relations 的笛卡尔积
- 例如:查找:borrower × loan
- 找出在 Perryridge 分行拥有贷款的顾客及其贷款记录
重命名操作
- 使用 as 字句重命名关系和属性
- 重命名用法
- 把 loan-number 属性重命名为 loan-id
- 例如:
- 可以在 from 语句利用 as 关键字起别名
- 找出资产不是比 Zhuhai 所有的支行的资产都少(或相等)的支行。即:只要大于至少 Zhuhai 一家的支行都行
字符串操作
- 在匹配中,可以用特殊字符描述字符串模式
- % 指代任意字符组合(可以为空)
- _ 指代任意单个字符
- 找出地址名字带有 Main 的顾客
- 在上述 SQL 语句中如何还想要匹配“ main ”,即包括 Main 和 main 甚至 MAIN 等,怎么做呢?(Oracle 匹配区分大小写)
- Oracle 正则表达式函数 REGEXP_LIKE 的使用:
REGEXP_LIKE(x, pattern, [match_option])
- 当源字符串 x 匹配正则表达式 pattern 时,返回 true,可以使用 match_option 修改默认匹配选项,该参数可以被设置为:
- -'c', 说明在匹配时区分大小写(默认选项)
- -'i', 说明在匹配时不区分大小写
- -'n', 允许使用可以匹配任意字符串的操作符(通常是 '.' )
- -'m', 将 x 作为一个包含多行的字符串
- 上面的 SQL 语句匹配 test_reg 表中 name 列含有两个连续字符 'a'(不区分大小写)的行,如 name = “SaAs”
- 此外,我们用了正则表达式中的后引用语法 '...\n' 表示重复n次上次匹配的内容,此处(a)\ 1 表示匹配两个连续的字符 'a'
- Oracle 正则表达式函数 REGEXP_LIKE 的使用:
给结果排序
- 按名字给结果排序
- asc 表示升序,也是默认模式
- desc 表示降序
- 在很多的时候对结果排序很耗时,在必要的时候用
- 例:按 customer-city 升序、customer-name 降序列出所有客户的姓名