一、基本表的操作:
1、基本表创建:
CREATE TABLE <基本表名>
( <列名 数据类型>,
.... ....
< 完整性约束 >,
PRIMARY KEY (列名 ),
FOREIGN KEY (列名 ) REFENRENCES < 表名> (列名));
备注:PRIMARY KEY (列名 ) 设置主键;FOREIGN KEY (列名 )设置外键;REFENRENCES < 表名> (列名)外键与哪个表对应。
2、基本表修改:
ALTER TABLE < 基本表名 > ADD <列名> < 类型> 向表中添加新的列
ALTER TABLE < 基本表名 > DROP <列名> < 类型> [ CASCADE | RESTRTCT ] 删除某列
ALTER TABLE < 基本表名 > ALTER column [列名] [列类型] 修改表的字段类型
3、删除基本表:
DROP TABLE < 基本表名>[ CASCADE | RESTRTCT ]
4、创建表的索引:
CREATE [ UNIQUE ] INDEX < 索引名> ON <基本表名> ( <列名序列 > )
备注:UNIQUE表示每个索引值对应卫衣的数据记录。
二、基础查询语句:
(一)语句格式:
1、关系代数表达式:πA1,A2,...An( δF ( R1×R2×...Rn ) )
对应SELECT语句:SELECT A1,A2,...An
FROM R1×R2×...Rn
WHERE F
备注:A1,A2,...An表示:要查询的内容
F 表示:查询的条件
R1×R2×...Rn 表示:与查询相关的基本表
2、SELECT完整句法:
SELECT < 目标表的列名或列表达序列 >
FROM < 基本表名和(或)视图序列 >
[ WHERE < 行条件表达式 > ]
[ GROUP BY < 列名序列 > ]
[ HAVING < 组条件表达式 > ]
[ ORDER BY < 列名 [ ASE | DESC ] > ,...]
备注:[ ] :括号的内容视情况而定,不必须有。
ASE :表示升序排列;DESC :表示降序排列。
(二)举例说明:
先给出一个小型的数据库(包含几个关系模式)
教师关系T(T#,TName,T)
课程关系C(C#,CNAME,T#)
学生关系S(S#,SNAME,AGE,SEX)
选课关系SC(S#,C#,SCORE)
1、检索学习课程号为C2 课程的学生学号和姓名
连接查询:SELECTS.S#,SNAME
FROM S, SC
WHERE S.S# = SC.S# AND C# = ' C2 ' ;
备注: S.S# 为了区别要查询的是S表中的S#。
S.S# = SC.S# 表示 S表的主键S#对应SC表的外键S#,从而把两个表联系起来。
嵌套查询:SELECT S#,SNAME
FROM S
WHERE S# IN ( SELECT S#
FROM SC
WHERE C# = ' C2 ' ) ;
2、检索学习课程为C2的学生学号与成绩
SELECT S#,SCORE
FROM SC
WHERE C# = ' C2 ' ;
3、检索至少选修刘老师的所授课程一门课程的学生学号与姓名
SELECT S.S# , SNAME
FROM S ,SC ,C , T
WHERE S.S3 = SC.S# AND SC. C# = C.C#
AND C.T# = T.T# AND TNAME = ‘刘’ ;
4、检索选修课程为C2或者C4课程的学生学号
SELECT S#
FROM SC
WHERE C# = ' C2 ' OR C# = ' C4 ' ;
5、检索至少选修课程号为C2和C4课程的学生学号
SELECT X. S#
FROM SC AS X , SC AS Y
WHERE X.S# = Y.S# AND X.C# = ' C2 ' AND Y.C# = ' C4 '
备注:同一个基本表SC在同一层中出现两次,为加以区别,引入别名 X 和 Y 。也可以看成是定义了两个元组变量X和Y。在语句中对列名加以限定,譬如X.S#。As关键字可省略,直接写成 SC X, SC Y。
6、检索不学C2课程的学生学号
SELECT SNAME ,AGE
FROM S
WHERE S# NOT IN (SELECT S#
FROM SC
WHERE C#= ' C2 ');
或者:
SELECT SNAME ,AGE
FROM S
WHERE NOT EXISTS (SELECT ❈
FROM SC
WHERE SC.S# = S.S# AND C# = ' C2 ');
备注:这个查询不能使用连接查询。
(三)包含函数的举例说明:
SQL 提供以下聚合函数:
COUNT( ❈) 计算元组个数
COUNT( <列名>) 对一列的值计算个数
SUM (<列名>) 求和 (列的值必须是数值型)
AVG (<列名>) 求平均值 (列的值必须是数值型)
MAX (<列名>) 求某一列最大值
MIN (<列名>) 求某一列最小值
备注: 在聚合函数遇到空值时,除了COUNT(*)外,都跳过空值去处理非空值。
1、 求男同学总人数和平均年龄
SELECT COUNT( ❈ ), AVG ( AGE )
FROM S
WHERE SEX = ' M' ;
2、 统计选修了课程的学生人数
SELECT COUNT ( DISTINCT S# )
FROM SC ;
备注:DISTINCT 去除重复的
3、算数比较操作:
在基本表S中检索18~20岁的学生姓名
SELECT SNAME
FROM S
WHERE AGE >= 18 AND <= 20 ;
(还可以写成:WHERE AGE BETWEEN 18 AND 20 )
备注:类似的,不在某个范围用 "NOT BETWWEEN ... AND ..."。
4、在基本表S中检索年龄为空值的学生姓名
SELECT SNAME
FROM S
WHERE AGE IS NULL ;
备注:“ IS NULL ” 是测试列值是否为空值。如果测试非空值,可用“ IS NOT NULL ”。
三、数据插入语句:
1、 单元组的插入:
INSERT INTO < 基本表名 > [ ( < 列名序列 > ) ]
VALUES ( < 元组值 > )
2、多元组的插入:
INSERT INTO < 基本表名 > [ ( < 列名序列 > ) ]
VALUES ( < 元组值 > ) ,( < 元组值 > ) ......( < 元组值 > )
3、查询结果的插入:
INSERT INTO < 基本表名 > [ ( < 列名序列 > ) ]
< SELECT 查询语句 >
4、表的插入:
INSERT INTO < 基本表名 1 > [ ( < 列名序列 > ) ]
TABLE < 基本表名 2 >
例1:往基本表S 中插入一个元组(S36,GU,20,M)
INSERT INTO S ( S# , SNNAME , AGE , SEX )
VALUES ( 'S36','GU',20,' M ' ) ;
备注:如果插入的是一个完整的序列,那么基本表后面的 [ ( < 列名序列 > ) ] 可省略。
四、数据修改语句:
数据修改语法格式:
UPDATE < 基本表名>
SET < 列名 > = < 值表达式 > [ , < 列名 > = < 值表达式 > ... ] | ROW = (< 元组 >)
[ WHERE < 条件表达式 > ]
例1:把C5的课程名改为DB
UPDATE C
SET CNAME = ' DB '
WHERE C# = ' C5 ' ;
例2: 把女同学的成绩提高 5%
UPDATE SC
SET SCORE = SCORE * 1.05
WHERE S# IN ( SELECT S#
FROM S
WHERE SEX = ' F ' ) ;
例3:当C4课的成绩低于该门课程的平均成绩时,提高5%
UPDATE SC
SET SCORE = SCORE * 1.05
WHERE C# = ' C4 ' AND SCORE < ( SELECT AVG ( SCORE )
FROM SC
WHERE C# = 'C4' ) ;
例4:在C中,把课程号为C5 的元组修改为(C5,DB,T3)
UPDATE C
FROM ROW = ('C5', 'DB', 'T3' )
WHERE C# = ' C5 ' ;
五、视图:
1、创建视图 :
CREATE VIEW < 视图名> ( < 列名序列 > )
AS < SELECT 查询语句 >
例1: 根据S,SC,C基本表创建名为STUDENT_SCORE 包含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# ;
2、 撤销视图:
DROP VIEW < 视图名 >
小结:以上这些SQL语句是最基础的,最常用的,也是必须掌握的。只有掌握了这些语句,才能学习更加复杂的和深层次的SQL语言。