文章目录
1、模式的定义与删除
定义模式
在CREATE SCHEMA中可以接受CREATE TABLE,CREATE VIEW和GRANT子句,语句如下:
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>[<表定义子句>|<视图定义子句>|<授权定义子句>]
例子:为用户ZHANG创建了一个模式TEST,并且在其中定义一个表TAB1
CREATE SCHEMA TEST AUTHORIZATION ZHANG
CREATE TABLE TAB1 (
COL1 SMALLINT,
COL2 INT,
COL3 CHAR(20),
COL4 NUMERIC(10,3),
COL5 DECIMAL(5,2)
);
删除模式
CASCADE:删除模式的同时把该模式中所有的数据库对象全部删除
DROP SCHEMA <模式名> <CASCADE|RESTRICT>
例子: 删除模式ZHANG, 同时该模式中定义的表TAB1也被删除
DROP SCHEMA ZHANG CASCADE;
2、基本表的定义、删除与修改
定义表
CREATE TABLE <表名>
(<列名> <数据类型>[ <列级完整性约束条件> ]
[,<列名> <数据类型>[ <列级完整性约束条件>] ]
…
[,<表级完整性约束条件> ] );
例子:
//建立一个“课程”表Course
CREATE TABLE Course
( Cno CHAR(4) PRIMARY KEY, //主键
Cname CHAR(40),
Cpno CHAR(4),
Ccredit SMALLINT,
FOREIGN KEY (Cpno) REFERENCES Course(Cno) //外键,Course(Cno)为被参照表(被参照列)
);
//建立一个学生选课表SC
CREATE TABLE SC
( Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY (Sno,Cno), /* 主码由两个属性构成,必须作为表级完整性进行定义*/
FOREIGN KEY (Sno) REFERENCES Student(Sno), /* 表级完整性约束条件,Sno是外码,被参照表是Student */
FOREIGN KEY (Cno)REFERENCES Course(Cno) /* 表级完整性约束条件, Cno是外码,被参照表是Course*/
);
定义表的所属模式
方法一:在表名中明显地给出模式名
Create table"S-T".Student(......); /*模式名为 S-T*/
Create table "S-T".Cource(......);
Create table "S-T".SC(......);
方法二:在创建模式语句中同时创建表
CREATE SCHEMA TEST AUTHORIZATION ZHANG
CREATE TABLE TAB1 (
COL1 SMALLINT,
COL2 INT,
COL3 CHAR(20),
COL4 NUMERIC(10,3),
COL5 DECIMAL(5,2)
);
方法三:设置所属的模式
设置搜索路径,然后定义基本表,结果建立了S-T.Student基本表
SET search_path TO "S-T",PUBLIC; //设置搜索路径
Create table Student(......); //定义基本表
修改表
(1)添加属性
ALTER TABLE Student ADD S_entrance DATE;
(2)属性的数据类型
ALTER TABLE Student ALTER COLUMN Sage INT;
(3)给属性添加约束条件
ALTER TABLE Course ADD UNIQUE(Cname);
删除表
例子:删除Student表
DROP TABLE Student CASCADE; //基本表定义被删除,数据被删除,表上建立的索引、视图、触发器等一般也将被删除
创建视图
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS';
3、索引的建立与删除
创建索引
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
修改索引
ALTER INDEX <旧索引名> RENAME TO <新索引名>
删除索引
删除索引时,系统会从数据字典中删去有关该索引的描述
DROP INDEX <索引名>;
4、查询操作
单表查询
1、查询指定列
SELECT Sno,Sname FROM Atudent;
2、查询全部列
SELECT * FROM Atudent;
3、查询经过计算的值:详情链接
4、使用列别名改变查询结果的列标题
SELECT Sname NAME FROM Student;
或
SELECT Sname as NAME FROM Student;
5、消除取值重复的行:DISTINCT关键词
SELECT DISTINCT Sno FROM SC; //查询sno,并去掉sno重复的记录,只留下一条
6、模糊查询:详情链接
7、逻辑运算符:AND和 OR来连接多个查询条件
AND的优先级高于OR,可以用括号改变优先级
查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别
SELECT Sname, Ssex FROM Student
WHERE Sdept= ' CS' OR Sdept= ' MA' OR Sdept= 'IS ';
8、order by 升序/降序排序一个或多个属性列(默认升序)
升序:ASC;降序:DESC;缺省值为升序
查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列
SELECT *
FROM Student
ORDER BY Sdept, Sage DESC;
聚集函数
count sum avg max min
1、查询学生总人数
SELECT COUNT(*) FROM Student;
2、查询选修了课程的学生人数。
SELECT COUNT(DISTINCT Sno) FROM SC;
3、计算1号课程的学生平均成绩。
SELECT AVG(Grade) FROM SC WHERE Cno= ' 1 ';
4、查询选修1号课程的学生最高分数。
SELECT MAX(Grade) FROM SC WHERE Cno='1';
5、查询学生201215012选修课程的总学分数。
SELECT SUM(Ccredit) FROM SC,Course
WHERE Sno='201215012' AND SC.Cno=Course.Cno;
GROUP BY子句
细化聚集函数的作用对象
- 如果未对查询结果分组,聚集函数将作用于整个查询结果
- 对查询结果分组后,聚集函数将分别作用于每个组
- 按指定的一列或多列值分组,值相等的为一组
求各个课程号及相应的选课人数。
SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno;
HAVING子句
HAVING短语与WHERE子句的区别:作用对象不同
- WHERE子句作用于基表或视图,从中选择满足条件的元组
- HAVING短语作用于组,从中选择满足条件的组
1、查询选修了3门以上课程的学生学号。
SELECT Sno FROM SC
GROUP BY Sno
HAVING COUNT(*) >3;
2、查询平均成绩大于等于90分的学生学号和平均成绩
SELECT Sno, AVG(Grade) FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90;