数据库学习笔记3(SQL初级)
数据库学习笔记3(SQL初级)
1.SQL基础
1. SQL语言有以下几部分
- 数据定义语言(DDL)
- 数据操纵语言(DML)
- 完整性(Integrity)
- 视图定义(View definition)
- 事务控制(Transaction control)
- 授权(Authorization)
2.SQL数据定义
-
SQL的DDL不仅能够定义一组关系,还能够定义每个关系的信息,包括:
-
- 每个关系的模式
- 每个属性的取值类型
- 完整性约束
- 每个关系维护的索引集合
- 每个关系的安全性和权限信息
- 每个关系在磁盘上的物理存储结构
-
SQL的基本数据类型
-
- char(n) 定长字符数组
- varchar(n) 可变字符数组
- int 整形
- smallint 小整形
- numeric(p,d) p位定点数,小数点后有d位
- real,double precision 浮点数
- float(n) 精度至少为n的浮点数
- null 为缺失值
-
SQL的基本模式
-
-
creat table可以创建一个关系
-
命令的通用形式为
-
create table r (A1 D1, A2 D2 A3 D3 < integrity-constraint > )
r为关系名称,Ai是属性,Di是Ai的类型
-
-
SQL支持很多的完整性约束(integrity constraint)
-
- primary key(Aj1 Aj2 ... Ajm ) 主码属性必须非空且唯一
- foreign key (Aj1 Aj2 ... Ajm ) references s 这些A的属性的取值必须对应于关系s某元组在主码属性上的取值
- not null 表明这个属性不能为空
-
插入命令 insert into s values ("D1","D2"...),D1,D2为具体的值,s为数据表
-
删除命令
delete from r
drop table r
delete保留关系r而drop会删除模式r
-
添加属性
alter table r add A D
r是关系的名称,A为属性 D为类型
刚添加属性时这些新属性的取值为null
3.SQL数据查询
1.单关系查询
select a from t
-
查找t中属性a这一列
-
如果想要在查询时去除重复的属性,可以使用关键字 distinct
select distinct dept_name from instructor
-
同样,我们也可以使用all来显式的声明
-
select 还可以支持 运算符
select salary*1.1 from instructor
返回的值就是salary的1.1倍
-
where 可以允许我们只选出那些在from子句中满足特定关系的元组
select name from instructor where dept_name='Comp.Sci' and salary > 70000
2.多关系查询
-
- select 子句用来列出查询结果中所需要的属性
- from 子句是一个查询求值中所需要访问的关系列表
- where 子句是一个作用于from子句关系的属性上的谓词
-
select A1,A2,...,An from r1,r2,..,rn where p
from中用逗号隔开的表在查询时表示查询这两个表的笛卡尔积
-
理解关系顺序的运算可以这样理解 先是from,然后是where,最后是select
-
一个SQL查询可以理解如下
-
- 为from子句中所列出的关系产生笛卡尔积
- 在步骤1的基础上应用where子句中指定的谓词
- 基于步骤2结果的每个元组,输出select子句中指定的属性
-
自然连接
select A from r1 natural join r2 where P
-
SQL还可以指定自然连接时,需要哪些列相等
select A from r1 join r2 using (A1,A2)
4.数据库附加运算
-
更名运算
利用 as 子句
old-name as new-name
-
字符串运算
-
SQL使用一对单引号来标示字符串,在字符串中,是大小写敏感的,而SQL语句是大小写不敏感的
-
SQL还允许字符串上有多种函数
-
在字符串上还可以使用like操作符进行匹配
-
% (百分号)可以匹配任意子串
_ (下划线)可以匹配任意一个字符
-
select dept_name from department where building like '%Watson%'
-
-
排列元组的显示次序
order by 可以让查询结果中的元组按排列顺序显示
desc表示降序,asc表示升序,其中order by语句默认是升序的
select * from instructor order by salary desc,name asc
-
where子句谓词
SQL提供between运算符
select name from instructor where salary between 900 and 1000
5.集合运算
-
SQL作用在关系上的union,intersect和except运算对应数学集合论的∩,∪和-运算
-
并运算
-
(select a1 from b1 where p1) union (select a1 from b1 where p1)
-
union运算会自动去除重复,如果我们想保留所有重复,可以用union all代替union
-
交运算和差运算就是把上述示例的union改为对应的关键字
6.空值
-
如果算术表达式的任一输入为空,则该算术表达式为空
-
涉及空值的任意比较结果为unknown
-
涉及空值的布尔运算
-
and
(true and unknown) = unknown
(false and unknown) = false
(unknown and unknown) = unknown -
or
(unknown or true) = true,
(unknown or false) = unknown
(unknown or unknown) = unknown -
not
not unknown = unknown
-
7.聚集函数
1.基本聚集
-
聚集函数是以值的一个集合为输入,返回单个值的函数,SQL提供了五个固有聚集函数
1.平均值 avg
2.最小值 min
3.最大值 max
4.总和 sum
5.计数 count
-
select avg(salary) as av_salary from instructor where dept_name='Comp.Sci';
-
如果我们需要删除重复元组,可在聚集表达式中使用关键字distinct
2.分组聚集
-
我们可以使用 group by将聚集函数作用到一组元组集上
-
select dept_name,avg(salary) as avg_salary from instructor group by dept_name;
-
当SQL查询使用分组时,一个很重要的事情就是需要保证出现在select语句中但没有被聚集的属性只出现在group by 子句中的属性
3.having子句
-
针对group by子句构成的分组,我们可以使用having 子句,having 子句中的谓词在形成分组后才起作用
-
select dept_name,avg(salary) as avg_salary from instructor group by dept_name having avg(salary) > 78000
-
SQL关键字的执行顺序
1.先根据from子句来计算出一个关系
2.where子句中的谓词应用到from子句的结果上
3.满足where谓词的元组通过group by子句形成分组
4.having子句应用在每个分组上
5.select子句利用剩下的分组产生出查询结果中的元组
4.对空值的聚集
- 除count(*)以外的所有聚集函数都忽略输入集合的空值
8.嵌套子查询
-
with 子句
with子句提供定义临时关系的方法
with max_salary(value1) as(select max(salary) from instructor) select ID from instructor ,max_salary where instructor.salary=max_salary.value1;
-
标量子查询
-
子查询只返回包含单个属性的单个元组
1.集合的比较
-
some子句和all子句
-
select name from instructor where salary > some(select salary from instructor where dept_name='Biology')
-
some表示其中的一个元素,all表示其中的所有元素
2.空关系测试
- exist 可以测试一个子查询中是否存在元组
- exist查询非空时则返回true
- not exist表示查询结果中是否不存在元组
3.重复元组存在性测试
- 若查询结果中没有重复的元组,则unique则返回true值,即记录是0或1条时,返回true
9.数据库的修改
1.删除
-
delete子句
-
delete from r where p
2.插入
-
insert是单个元组的插入请求
-
insert into course values(...) insert into instructor select ... from student where ...
3.更新
-
update
-
update instructor set salary=salary*1.05
-
case结构
-
case when pred1 then result1 when pred2 then result2 ... else result0 end
-