基础SQL
标签(空格分隔): 数据库
SQL基本数据类型
数据类型 | 说明 |
---|---|
字符串 | |
char(n) | 固定长度字符串 |
varchar(n) | 可变长度字符串 |
nvarchar(n) | 存放使用Unicode表示的多语言数据 |
布尔值 | |
boolean | true / 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 | 元素的可变长度的无序集合 |
xml | XML 数据 |
说明:
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