第三章 SQL语句

版权声明:转载请注明出处 https://blog.csdn.net/nanhuaibeian/article/details/88779923

1. 创建模式

  1. 为用户ZHANG创建一个模式TEST,并且在其中定义一个表
CREATE SCHEMA TEST AUTHORIZATION TO ZHANG
CREATE TABLE TAB1(
SNO CHAR(9) PRIMARY KEY,
SNAME CHAR(20) UNIQUE,
SSEX CHAR(2)
);
  1. 删除模式
DROP SCHEMA TEST CASCADE;//级联删除语句,模式下的表也被删除
DROP SCHEMA TEST RESTRICT;//限制性删除,若该模式下定义了下属对象,则拒绝删除操作

2. 基本表的定义、删除、修改

  1. 建立一个学生选课表
CREATE TABLE SC(
SNO CHAR(8),
CNO CHAR(4),
GRADE INT,
PRIMARY KEY(SNO,CNO),
FOREIGN KEY(SNO) REFERENCES STUDENT(SNO),
FOREIGN KEY(CNO) REFERENCES COURSE(CNO)
) ;
  1. 修改一个基本表
//向Student表增加“入学时间”列,数据类型为日期型
ALTER TABLE STUDENT ADD S_DATE DATE;
//将年龄的数据类型由字符型改为整数
ALTER TABLE STUDENT ALTER COLUMN SAGE INT;
//增加课程名称必须取唯一值的约束条件
ALTER TABLE COURSE ADD UNIQUE(CNAME);
  1. 删除一个基本表
DROP TABLE STUDENT CASCADE;//级联删除包括由此表导出的视图
DROP TABLE STUDENT RESTRICT;//此表如果有依赖对象,则拒绝执行此操作

3. 索引的建立与删除

  1. 建立索引
CREATE INDEX UNIQUE INDEX_STUDENT ON STUDENT(SNO,SNAME);
CREATE INDEX CLUSTER INDEX_STUDENT ON STUDENT(SNO,SNAME);
//索引按照学号升序,课程号降序排列
CREATE INDEX UNIQUE INDEX_SC ON SC(SNO ASC,CNO DESC);

UNIQUE:表明此索引的每一个索引值只对应唯一的数据记录
CLUSTER:表示要建立的索引是聚簇索引

  1. 修改索引
ALTER INDEX INDEX_SC RENAME TO I_SC;//修改索引名
  1. 删除索引
DROP INDEX INDEX_SC;

4. 视图的定义、删除、修改、查询、更新

  1. 定义视图
1.建立信息系学生的视图,且要求修改和插入操作时仍需保证该视图只有信息系的学生
CREATE VIEW VIEW_ISSTUDENT(SNO,SNAME) AS SELECT SNO,SNAME FROM STUDENT WHERE SDEPT='IS'
WITH CHECK OPTION
2.建立信息系选修了1号课程的学生的视图
CREATE VIEW VIEW_IS_1(SNO) AS SELECT SC.SNO FROM S,SC 
WHERE SDEPT='IS' 
AND S.SNO=SC.SNO AND CNO=1;
3.视图也可以建立在一个或多个已定义好的视图上
CREATE VIEW IS_S2 AS
SELECT SNO,SNAME,GRADE FROM VIEW_IS_1 WHERE GRADE>=90;
  1. 删除视图
DROP VIEW VIEW_IS_1;//拒绝执行,由于该视图还导出了其他视图
DROP VIEW VIEW_IS_1 CASCADE;//成功执行
  1. 查询视图
SELECT SNO,SAGE FROM IS_STUDENT WHERE SAGE<20;
  1. 更新视图
UPDATE IS_STUDENT SET SNAME='JACK' WHERE SNO='0001';
INSERT INTO IS_STUDENT VALUES('0002','MIAK','20');
DELETE FROM IS_STUDENT WHERE SNO='0002';

5. 数据查询

// 查询全体学生的姓名、出生年份和所在的院系,要求使用小写字母表示系名
SELECT SNAME,'YEAR OF BIRTH:',2014-SAGE,LOWER(SDEPT) FROM STUDENT;
//查询年龄在20-23范围
SELECT SNAEM FROM STUDENT WHERE SAGE BETWEEN 20 AND 23;

SELECT SNO FROM STUDENT WHERE SDEPT IN('IS','CA');
SELECT SNO FROM STUDENT WHERE SDEPT NOT IN('IS','CA');

//查询所有姓刘的姓名
SELECT SNAME FORM STUDENT WHERE SNAME LIKE '刘%';
SELECT SNAME FORM STUDENT WHERE SNAME NOT LIKE '刘%';//不姓刘

//第二个字为阳的学生姓名
SELECT SNAME FROM STUDENT WHERE SNAME LIKE '_阳';

//查询DB_Design 课程的课程号和学分
SELECT CNO CREDIT FROM COURSE 
WHERE CNAME LIKE'DB\_DESIGN' ESCAPE '\';//ESCAPE'\'表示换码字符

//缺少成绩的学号
SELECT SNO FROM SC WHERE GRADE IS NULL;
SELECT SNO FROM SC WHERE GRADE IS NOT NULL;//成绩非空

//按照所在系的系号升序,同一系的按年龄降序排列
SELECT * FROM STUDENT ORDER BY SDEPT ASC, SAGE DESC;
//查询每一门课的间接先修课
SELECT FIRST.CNO,SECOND.CPNO FROM COURSE FIRST,COURSE SECOND 
WHERE FIRST.CPNO=SECOND.CNO;
//查询与jack在同一个系学习的学生
SELECT SNO FROM STUDENT WHERE SDEPT IN(
SELECT SDEPT FROM STUDENT WHERE SNAME='JACK' );

SELECT S1.SNO FROM STUDENT S1,STUDENT S2 
WHERE S1.DEPT=S2.DEPT AND S2.SNAME='jack';
//找出每个学生超过他自己选修课程平均成绩的课程号
SELECT CNO FROM SC X WHERE GRADE >=(
SELECT AVG(GRADE) FROM SC Y WHERE X.SNO=Y.SNO);
//查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名
SELECT SNAME FROM STUDENT WHERE SAGE<ANY(SELECT SAGE FROM STUDENT
WHERE SDEPT='CS') AND SDEPT<>'CS'
//查询选修了全部课程的学生姓名
SELECT SNAME FROM STUDENT WHERE NOT EXISTS
(SELECT * FROM COURSE WHERE NOT EXISTS (
SELECT * FROM SC WHERE STUDENT.SNO=SC.SNO AND COURSE.CNO=SC.CNO));
//查询至少选修了学生2015102选修的全部课程的学生号码
SELECT SNO FROM SC X WHERE NOT EXISTS(
SELECT * FROM SC Y WHERE Y.SNO='2015102' AND NOT EXISTS(
SELECT * FROM SC Z WHERE X.SNO=Z.SNO AND Z.CNO=Y.CNO));
集合查询:UNION,INTERSECT,EXCEPT

6. 数据更新

  1. 插入数据
//如果属性列的次序和表中的次序一致,则不需要在指定属性名
INSERT INTO SC VALUES('001','C1',89);
INSERT INTO SC(SNO,CNO) VALUES('001','C1');
INSERT INTO DEPT_AGE(SDEPT,AVG_AGE)
SELECT SDEPT,AVG(AGE) FROM STUDENT
GROUP BY SDEPT ;
  1. 修改数据
UPDATE STUDENT SET SAGE=SAGE+1;//学生表中的年龄都加1
//将计算机系全体学生的成绩置0
UPDATE SC SET GRADE=0 WHERE SNO IN(
SELECT SNO FROM STUDENT WHERE SDEPT='CS');
  1. 删除数据
DELETE FROM STUDENT WHERE SNO='001';
//删除计算机系所有学生的选课记录
DELETE FROM SC WHERE SNO IN(
SELECT SNO FROM STUDENT WHERE SDEPT ='CS');

7. 常用的数据类型

数据类型 含义
NUMERIC(P,D) 定点数,由P为数字(不包括符号和小数点)组成,小数点后面有D为数字
DATE 日期,包含年、月、日,格式为YYYY-MM-DD
TIME 时间,包含一日的时、分、秒,格式为HH:MM:SS

8. 一些知识点

  1. 每一个基本表都属于某一个模式,一个模式包含多个基本表
  2. 当表的数据量比较大时,查询操作会比较耗时,建立索引是加快查询速度的有效手段
    缺点:索引虽然能够加速数据库的查询,但需要占用一定的存储空间,以及他的更新都给数据库增加了负担
  3. 视图消解:关系数据库管理系统执行对视图的查询时,首先进行有效性检查,检查查询中涉及的表、视图是否存在。如果存在则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成等价的基本表的查询。
  4. 行列子集视图:若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码,则称这类视图为行列子集视图
    一般的行列子集视图是可更新的
  5. 视图的作用
    简化用户的操作、使用户以多种角度看同一数据、对重构数据库提供一定程度的逻辑独立性、对机密数据提供安全性保护、适当利用视图更清晰表达查询

9. 一道题目

学生表S(SNO,SNAME,AGE,SEX)
选课表SC (SNO,CNO,GRADE)
课程表C (CNO,CNAME,TEACHER)

  1. 从SC表中吧MATHS课程中低于MATHS平均成绩的选课元组全部删去
DELETE FROM SC WHERE GRADE<(
SELECT AVG(MATHS) FROM SC,C WHERE C.CNO=SC.CNO AND CNAME='MATHS')
 AND SNO IN (
SELECT SNO FROM SC,C WHERE C.CNO=SC.CNO AND CNAME='MATHS');

DELETE删除元组FROM后面只能跟一个表,其他的约束由WHERE来完成

  1. 把wu老师的女同学选课成绩增加4%
UPDATE SC SET GRADE=(1+0.04)*GRADE WHERE SNO IN(
SELECT SNO FROM S WHERE SEX='女') AND CNO IN(
SELECT CNO FROM C WHERE TEACHER='wu');

UPDATE删除元组FROM后面只能跟一个表,其他的约束由WHERE来完成

  1. 试用SQL断言来表达规定每个女同学最多选课6门
CREATE ASSERTION ASSE_SC_NUM CHECK(
6>=(SELECT COUNT(*) FROM S,SC WHERE S.SNO=SC.SNO AND SEX='女' 
GROUP BY SNO))

猜你喜欢

转载自blog.csdn.net/nanhuaibeian/article/details/88779923