SQL笔记

一、数据定义
1.数据模式的创建和撤销

Create schema <模式名> authorization <用户名>
Eg:create schema st_co authorization lismith;

Drop schema <模式名> [cascade|restrict]
Eg:drop schema st_co cascade;

一般用法:create database … drop database …

2.基本数据类型
a.数值型
Integer 长整型 (int)
Smallint 短整型
Real 浮点数
Double precision 双精度浮点数
Float(n) 浮点数,精度至少为n位数字
Numeric(p,d) 定点数,有p位数字组成(不包括符号,小数点),小数点后有d位数字
也可以写作:decimal(p,d)或dec(d,d)

b.字符串型
char(n) 长度为n的定长字符串
varchar(n) 具有最大长度为n的变长字符串
c.位串型
bit(n) 长度为n的二进制位串
Bit varying(n) 最大长度为n的变长二进制位串
d.时间型
Date 日期,包含年、月、日,形式为YYYY-MM-DD
Time 时间,包含一日的时、分、秒,形式为HH:MM:SS
Interval 时间间隔

e.定义新数据类型 create domain …
Create domain person_name char(8);

3.基本表的创建、修改、撤销

a.创建表
Create table <基本表名>
(<列名 类型>,… <完整性约束>,…)
完整性约束:主键子句(primary key)、外键子句(foreign key)、检查子句(check)

eg. Create table T
(T# char(4) not null, Tname char(8) not null, title char(10),
primary key(T#));
Create table C
( C# char(4), Cname char(10) not null, T# char(4),
primary key(C#), foreign key (T#) references T(T#));

b.基本表结构修改
增加列 alter… add…
Alter table <基本表名> add <列名> <类型>
eg.Alter table S sdd sddress varchar(30);
删除原有列 alter … drop …
Alter table <基本表名> drop <列名> [cascade|restrict]
eg.alter table S drop age cascade;
修改原有列类型、宽度 alter…modify…
Alter table <基本表名> modify <列名> <类型>
eg.alter table S modify s# char(6);

c.基本表的撤销
撤销语句 drop table…
Drop table <基本表名> [cascade|restrict]
eg.Drop table S restrict;

4.索引的创建和撤销 (索引属于物理存储路径概念)
a.索引的创建 create index…
Create [unique] index <索引名> on <基本表名> (<列名序列>)
eg:如在创建S表时未使用主键字句,可以建索引的方法起到主键作用
Create unique index S#_index on S(S#);
eg.一个索引建可以对应多个列,索引排列可以用ASC升序,DESC降序
Create unique index sc_index on sc(s# asc,c# desc)
b.索引撤销 drop index …
Drop index <索引名>
eg.drop index S#_index,sc_index;

二、数据查询
5.select 查询的结构
Select <目标表列名>
from<基本表名或视图序列>
[ where <行条件表达式>]
[ group by <列名序列>
[ having <组条件表达式>]]
[ order by <列名[ASC|DESC]>,…]

a.where子句表达式可使用以下运算符:
算术比较运算:< <= > >= = <> !=
逻辑运算符: and or not
集合成员资格运算符:in not in
谓词:exists (存在量词) all some unique
聚合函数:avg min max sum count
嵌套另一个select语句
b.执行过程:(1)读取from子句中基本表、视图的数据,执行执行笛卡尔积操作;
(2)选取满足where子句中给出的条件表达式元组;
(3)按group子句中指定列的值分组,同时提取满足having子句中组条件表达式的那些组;
(4)按select子句中给出的列名或列表达式求值输出;
(5)order子句对输出的目标进行排序,按附加说明asc升序,desc降序;
where子句称为条件子句,group子句称为分组子句,having子句称为组条件子句,order子句称为排序子句;
c.select语句使用技术 :
连接查询、嵌套查询、带存在量词的嵌套查询
eg:教学数据库
教师关系 T(T#, tname, title)
课程关系 C(C#, cname, T#)
学生关系 S(S#, sname, age, sex)
选课关系 SC(S#, C#, score)

检索学习课程号为C2的学生学号与姓名,这个查询要从基本表S和SC中检索数据
第一种写法(连接查询):
Select S.S#, sname from S,SC where S.S#=SC.S# AND C#=‘C2’;
第二种写法(嵌套查询):
Select S#,sname from where S# IN
(select S# from SC where C#=‘C2’);
嵌套查询的执行效率比连接查询的笛卡尔积效率高
第三种写法(使用存在量词的嵌套查询):
select S#,sname from where exists
(select * from SC where SC.S#=S.S# AND C#=‘C2’)
6.查询中的限制和规定
a.select子句的规定
select子句用于描述查询输出的表格结构 select [all|distinct] <列名或表达式序列> | *
distinct去重,all默认选项;允许表达式包含+、-、*、/
b.集合的并、交、差操作 union 、intersect、except
(select 查询语句1) union all (select 查询语句2)
(select 查询语句1) intersect all (select 查询语句2)
(select 查询语句1) except all (select 查询语句2)
c.条件表达式中的比较操作
(1)算术比较操作
算术比较运算符: < , <=, >, >=,=, != between…and…/ not between… and…
(2)字符串匹配操作
字符串匹配操作符: like / not like ,可使用两种通配符: “%” “ _”
为使字符串包含 “%” “ _” ,可以定义转义字符,在like比较中使用escape关键字来定义转义字符,如果使用反斜线(\)作为转义字符,如:like ‘ab%cd%’ escape ‘\’ 匹配所有以“ab%cd”开头字符串;
(3)空值比较
测试是否值为空,is null / is not null;
涉及到含有算术运算+ - * / ,表达式里有一个空值时,表达式的值也为空;
(4)集合成员比较
判断元组是否在集合中:<元组> [not] in (<集合>)
集合成员算术比较 : <元组> 比较运算符 all/some/any (<集合>)
(5)集合空否测试
使用谓词exists测试集合是否为空/非空,
[not] exists (<集合>)
(6)集合中重复元组是否存在测试
[not] unique (<集合>)
7.嵌套查询的改进和写法
嵌套使查询显得非常复杂,难于理解,为降低复杂度,使用两个方法改进:导出表和临时视图;
导出表的使用
Select SC.S#
from SC,(select avg(score) from SC group by S#) as result (avg_score)
Group by SC.S#
having avg (SC.score) >= all (result.avg_score);
可以把子查询定义为导出表(命名为result),移到外层查询的from子句;
b.with子句和临时视图
SQL允许用户用with子句定义一个临时视图(result,即子查询),置于select语句的开始处;
With result (avg_score) as
select avg(score)
from sc group by S#
Select S# from SC,result
Group by S# having avg(score) >=all (result.avg_score);

8.基本表的连接操作

a.连接类型
[inner] jion 内连接
Left [outer] jion 左外连接
Right [outer] jion 右外连接
Full [outer] jion 完全外连接
b.连接条件
Natural 写在连接类型左边
On 等值连接条件 写在连接类型右边
Using (A1,A2,…An) 写在连接类型右边

9.递归查询
用with recursive子句可定义递归查询,先创建一个视图,再附加关键字recursive,指明这个临时视图是递归的。
eg. 假设课程见间有先修与后继的联系,关系模式 course (c#,cname,pc#),其属性表示表示课程号、课程名、直接先修课的课程号。
select语句表示这个递归查询:
With recursive pre (c#,pc#) as
((select c# ,pc# from course)
union
(select course.c#,per.pc# from course ,pre where course.pc# =pre.c#))
Select * from pre;

三、数据更新
1.数据插入
a.单组/多组数据插入
Insert into <基本表名> [(列名序列)]
values(<元组值>…<元组值>)
b.查询结果插入
Insert into <基本表名> [(列名序列)]

eg.数据库基本表S、SC、C,用户经常要用到S#、Sname、Cname、Score等列数据,可以建立视图;
Create view student_score(S#,Sname,Cname,Score)
as select S.S#,Sname,Cname,Score
from S,SC,C
where S.S# = SC.S# and SC,C#=C.C# ;
视图中的列名、顺序与select子句的列名、顺序一致,因此视图的列名可以省略。
2.视图的撤销
Drop view <视图名>
eg. Drop view student_score;
3.对视图的操作
如果视图是从单基本表中使用选择、投影操作导出的,并包含了基本表的主键,这样的视图称为:行列子集视图,行列子集视图可以被执行更新操作;允许用户更新的的视图在定义时必须加上“with check option” 短语。
eg.create view s_male as select S#,Sname,age from S where sex=‘M’;
Insert into s_male values (‘s28’,’wu’,’18’)
五、嵌入式SQL
多数系统采用预处理方式,先用预处理程序对源程序进行扫描,识别出SQL语句,并处理成主语言的函数调用形式,然后再用主语言的编译程序编译成目标程序;
数据库和主语言程序间信息的传递是通过共享变量实现的;
SQL_STATE是特殊的共享变量,有5位字符组成的字符组,表示执行语句发生的各种错误情况,
当SQL语句执行成功 ,SQL_STATE=00000;当未找到元组,SQL_STATE=02000;
1.嵌入式SQL语句格式:
Exec SQL end_exec C语言程序规定结束标志不用end_exce,而是分号 ;。
允许嵌入式的SQL语句引用主语言的程序变量(共享变量),规定:引用时变量前必须加冒号:,
这些变量由主语言定义,并用SQL的declare语句说明;
eg.
Exec SQL begin declare section;
char sno[5],name[9];
char SQL_STATE [6];
Exec SQL end declare section;
STATE的长度是6,而不是5,是由于C语言规定变量值在做字符串使用是有结束符”\0” 引起;
2.游标 Cursor
SQL语句处理的是记录集合,而主语言语句一次只能处理一个记录,因此需要用游标机制,把集合操作转换成单记录处理方式;
a.游标定义语句(declare)
Exec SQL declare <游标> cursor for