精华内容
下载资源
问答
  • PAGE PAGE 1 项目3创建并使用索引和视图 5.5 同步实训创建与管理索引 6.6 同步实训创建与使用视图
  • 数据库-模式-表,视图,索引 关键词 创建:create 删除:drop 修改:alter 插入数据:insert 修改数据:update 删除数据:delete cascade:删除数据时级联方式 restrict:删除数据时如果别的数据参照这个则拒绝 avg ...

    首先说明:以下大部分针对的是标准sql

    结构

    大致结构:
    数据库-模式-表,视图,索引

    关键词

    创建:create
    删除:drop
    修改:alter
    插入数据:insert
    修改数据:update
    删除数据:delete
    cascade:删除数据时级联方式
    restrict:删除数据时如果别的数据参照这个则拒绝
    avg max min :聚集函数

    关于模式

    创建模式:
    CREATE SCHEMA Schema_Name AUTHORIZATION UserName;
    
    删除模式
    DROP SCHEMA Schema_Name CASCADE;
    

    cascade:如果模式上定义了表视图或者其他东西,都会直接删除;而如果是restrict,则会提示,且拒绝操作。

    关于表

    创建表

    这里举个例子吧

    CREATE TABLE Student
    		(Sno CHAR(9) PRIMARY KEY,
    		 Sname CHAR(20) UNIQUE,
    		 Ssex CHAR(2),
    		 Sage SMALLINT,
    		 Sdept CHAR(20)
    		 );
    

    在创建表的时候可以定义约束。有实体,参照,用户自定义三种约束,primary key,foreign key() reference __,check ,not null,unique等。这一部分我们下面会有个单元单独总结。

    修改表

    增加一列

    ALTER TABLE Table_Name
    ADD 列名 数据类型;
    

    修改一列的数据类型

    ALTER TABLE Table_Name
    ALTER COLUMN 列名 数据类型;
    

    增加一个约束(例子)

    ALTER TABLE Course
    ADD UNIQUE(Cname);
    

    语法:

    ALTER TABLE <表名>
    [ ADD[COLUMN] <新列名> <数据类型> [ 完整性约束 ] ]
    [ ADD <表级完整性约束>]
    [ DROP [ COLUMN ] <列名> [CASCADE| RESTRICT] ]
    [ DROP CONSTRAINT<完整性约束名>[ RESTRICT | CASCADE ] ]
    [ALTER COLUMN <列名><数据类型> ] ;
    
    删除表
    drop table 表名;
    

    如果加上cascade:表上建立的索引、视图、触发器等一般也将被删除;缺省值为restrict,就是提示且拒绝删除请求。

    关于索引

    建立索引

    例子:

    CREATE UNIQUE INDEX Stusno ON Student(Sno);
    CREATE UNIQUE INDEX Coucno ON Course (Cno);
    CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
    

    语法:?

    修改索引

    重命名:

    ALTER INDEX SCno 
    RENAME TO SCSno;
    

    语法:?

    删除索引
    DROP INDEX 索引名字;
    

    关于查询

    SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]FROM <表名或视图名>[,<表名或视图名> ]|(SELECT 语句)
    [AS]<别名> [ WHERE <条件表达式> ] [ GROUP BY <列名1> [ HAVING <条件表达式> ] ] [ ORDER BY <列名2> [ ASC|DESC ] ];
    
    几个点:
    1. 关于all和distinct:缺省时all。distinct就是若查询结果有重复元组则只输出一个重复元组。
    2. where里面不能用聚集函数。
    3. group by就是分组,然后查询结果中如果有聚集函数就会针对的每个组里面的元素,在组里面用聚集函数。
    4. having是group by后面呢,他是一个条件,针对的是每个组。
    5. 排序的缺省值是?
    指定列:
    SELECT Sno,Sname
    FROM Student;
    
    全部列:
    SELECT *
    FROM Student;
    
    经过计算的值:
    select Sname,2021-Sage
    from student;
    
    列的别名(方便查看)以及聚集函数
    select Sname,'出生月份:',2021-Sage,LOWER(Sdept)
    from student;
    
    where就是加条件,用来选择行的。

    between and用法:(可以加not)

    select Sname , Sdept,Sage
    from student
    where Sage between 18 and 23;
    
    in用法:(可以加not)
    select Sname,Ssex
    from student 
    where Sdept in ('cs','ma','is');
    
    模糊查询:
    1. 通配符:% _,%表示的是长度为任意(包括0)的字符串,_表示的是一个字符。
    2. 关于转义字符,这里叫换码字符:比如我们要查询的字符串里真的有%号这个字符,那我们就使用下面这种形式处理:WHERE Cname LIKE ‘DB%Design’ ESCAPE ‘’ ;表示的是\后面的那个字符是真正的字符而不是通配字符。
    select *
    from student
    where Sname like '梁%';
    
    select *
    from student
    where Sname like '欧阳_';
    
    select Sname '姓名'
    from student
    where Sname like '_阳%'
    
    select Sname '姓名',Sno '学号',Ssex '性别'
    from student
    where Sname not like '梁%'
    
    select Cno , Ccredit
    from course
    where Cname like 'DB/_Design' escape '/';
    
    NULL

    注意不能用=NULL,要用is NULL 或者 is not null。

    排序

    ORDER BY子句
    注意:可以按照好几个属性排序,有优先级。(类似写的cmp,asc升序;desc降序,默认为asc);对于空值,由具体系统实现决定(也就是说没有规定)

    常用聚集函数
    ◼ 统计元组个数 COUNT(*) 
    ◼ 统计一列中值的个数 COUNT([DISTINCT|ALL] <列名>) 
    ◼ 计算一列值的总和 SUM([DISTINCT|ALL] <列名>) 
    ◼ 计算一列值的平均值 AVG([DISTINCT|ALL] <列名>) 
    ◼ 求一列中的最大值和最小值
    MAX([DISTINCT|ALL] <列名>)
    MIN([DISTINCT|ALL] <列名>)
    
    
    等值连接

    就是在where里面加条件

    自身连接

    起别名

    select first_table.Cno,second_table.Cpno
    from course first_table,course second_table
    where first_table.Cpno=second_table.Cno;
    
    
    外连接
    select student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
    from student  left outer join sc ON(student.Sno=Sc.Sno);
    
    镶嵌连接
    select Sno,Cno
    from SC x
    where Grade>(
    				select AVG(Grade)
    				from SC y
    				where x.Sno=y.Sno
    );
    
    带有比较运算符的子查询

    事实上,select返回的是一个集合,刚才用in是集合里可能有好几个数据;这里用 比较运算符(>,<,=,>=,<=,!=或< >)就是得确定 集合只有一个元素。关于例子我们在这个文章的第一题已经说过了,这里不再写。

    #带有ANY(SOME)或ALL谓词的子查询

    any 相当于存在,all相当于所有。所以这个语义就很简单了。我们高中就讲过。
    在这里插入图片描述

    带有EXISTS谓词的子查询

    关于几点:

    1. 只返回true或者false;
    2. 当内层查询里有数据时,为true,否则为false;
    3. 相当于存在量词。
    4. 一般内层查询的列只用*,因为无论写什么,他只返回一个true 或者 false。
    5. not exists 相当于exist取反。

    例如

    select Sname,Sno
    from student 
    where NOT EXISTS(
    		select *
    		from SC
    		where Sno=student.Sno AND Cno='1'
    )
    
    

    这里有个难点:用存在量词替换全程连词和蕴含逻辑
    这一部分比较难,我直接贴一份之前写的博客,里面写的比较详细。
    exists
    但大体就是 把肯定句换成双重否定
    在这里插入图片描述
    在这里插入图片描述

    集合查询

    这里就比较简单了,我们都知道,select返回的是一个集合,那么他的集合操作就是普通的集合操作,交 并 差 union intersect except。
    例如:

    select *
    from student
    where Sdept = 'cs'
    union 
    select *
    from student
    where Sage<=19;
    
    基于派生表的查询

    不仅可以在where里镶嵌查询块,在from里也可以,这个时候叫做 临时派生表。
    例如:

    select Sno,Cno
    from sc,(select Sno,AVG(Grade)
    		 from sc
    		 group by SNo) as AVG_sc(avg_sno,avg_grade)
    where	sc.Sno=AVG_sc.avg_sno AND sc.Grade>=AVG_sc.avg_grade;
    
    

    关于插入数据

    其中数据插入有两种方式,一种是插入元组,我;还有一种是插入查询结果,也就是查询集合。

    INSERT 
    INTO <表名>  [(<属性列1> [,<属性列2>)]
    valuse(值,值。。);--需要和上面一一对应,values可以插入几组组
    
    INSERT 
    INTO <表名>  [(<属性列1> [,<属性列2>)]
    子查询;
    

    关于修改数据

    UPDATE  <表名>
    SET  <列名>=<表达式>[,<列名>=<表达式>][WHERE <条件>];
    

    关于删除数据

    DELETE FROM     <表名> 
    [WHERE <条件>];
    

    关于视图

    创建视图
    CREATE  VIEW <视图名>  [(<列名>  [,<列名>])] 
    AS  <子查询> 
    [WITH  CHECK  OPTION];
    

    属性名全部省略或者指定
    啥时候全部指定?

    1. 某个目标列是聚集函数或列表达式
    2. 多表连接时选出了几个同名列作为视图的字段
    3. 需要在视图中为某个列启用新的更合适的名字

    “关系数据库管理系统执行CREATE VIEW语句时只是把视图定义存入数据字典,并不执行其中的SELECT语句。”

    视图不保存数据,只记录select语句,当使用的时候,再执行select语句。

    删除视图
    DROP  VIEW  <视图名>[CASCADE];
    

    “删除基表时,由该基表导出的所有视图定义都必须显式地使用DROP VIEW语句删除”
    “如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除 ”

    关于创建视图时的with check option选项

    with check option参数会对添加数据产生限制,如果不符合创建视图时的where,将不能添加。
    这里有个差异关于标准sql和tsql:
    标准sql会

    带有WITH CHECK OPTION子句,对该视图进行插入、修改和删除操作时,RDBMS会自动加上Sdept='IS’的条件。

    带有WITH CHECK OPTION子句,对该视图进行插入、修改和删除操作时,RDBMS会自动加上Sdept='IS’的条件。

    而tsql直接不能插入。
    标准sql中,向视图里插入数据会自动补充一个信息:就是创建视图的那个条件。

    关于数据库安全性

    授予权限
    GRANT <权限>[,<权限>]... 
    ON <对象类型> <对象名>[,<对象类型> <对象名>]TO <用户>[,<用户>]... 
    [WITH GRANT OPTION];
    WITH GRANT OPTION子句: 指定:可以再授予 没有指定:不能传播
    
    收回权限
    REVOKE <权限>[,<权限>]... 
    ON <对象类型> <对象名>[,<对象类型><对象名>]FROM <用户>[,<用户>]...[CASCADE | RESTRICT];
    
    角色
    1.角色的创建 
    CREATE  ROLE  <角色名> 
    2.给角色授权 
    GRANT  <权限>[,<权限>]ON <对象类型>对象名 
    TO <角色>[,<角色>]3.
    将一个角色授予其他的角色或用户 
    GRANT  <角色1>[,<角色2>]TO  <角色3>[,<用户1>][WITH ADMIN OPTION]
    
    指定了WITH ADMIN OPTION则获得某种权限的角色或用户还可以把这种权限
    授予其他角色
    
    4.角色权限的收回 
    REVOKE <权限>[,<权限>]ON <对象类型> <对象名> 
    FROM <角色>[,<角色>]
    敏感度
    敏感度标记(Label)
     对于主体和客体,DBMS为它们每个实例(值)指派一个敏感度标记(Label)
     敏感度标记分成若干级别
    绝密(Top Secret,TS)
    机密(Secret,S)
    可信(Confidential,C)
    公开(Public,P)
    TS>=S>=C>=P
    主体的敏感度标记称为许可证级别(Clearance Level)
    客体的敏感度标记称为密级(Classification Level

    规则:主体(操作者)的密级别=客体的密集时,可读可写。
    主体>客体,只读不写。
    主体<客体,只写不读。

    审计

    审计就是把对应表或者数据库别的元素的所进行的操作保存下来,然后人或者机器通过这个文件,观察这些操作,找出是否存在可疑行为。

    AUDIT语句和NOAUDIT语句
    audit alter ,update
    on sc
    
    noaudit alter ,update
    on sc
    

    完整性

    有实体完整性,参照完整性,用户自定义完整性。
    下面的例子包括了 实体和参照,以及显示处理违规操作。

    create Table SC2
    (Sno CHAR(9) NOT NULL, 
    Cno CHAR(4)  NOT NULL,  
    Grade SMALLINT,
    PRIMARY KEY (Sno, Cno),   
    
    FOREIGN KEY (Sno) REFERENCES Student(Sno)
    on update cascade
    on delete cascade, 
    
    FOREIGN KEY (Cno) REFERENCES Course(Cno)    
    on update cascade
    on delete no action, --拒绝
    );
    
    
    参照完整性的违约处理

    在这里插入图片描述

    用户定义的完整性

    这里分为属性上约束还有元组的约束。
    列上的:not null,unique,check
    元组上的:check
    关于not null和unique,我们之前就做过例子,在这里不做示题
    关于check
    例子:

    create Table Student3
    (Sno char(9) PRIMARY KEY,
     Sname char(9) NOT NULL,
     Ssex char(2) check(Ssex IN('男','女')),
     Sage smallint,
     Sdept char(20),
     check (Ssex='女' OR Sname NOT like 'Mr.%')
     );
    
    
    完整性约束命名子句
    CONSTRAINT <完整性约束条件名><完整性约束条件>
    

    注意是子句,他也是嵌入到create里面写的。其实也就是多了一个关键字和一个你自己命名的名字。
    这是列级的

    例如:

     create Table SC4
    (Sno CHAR(9) NOT NULL, 
    Cno CHAR(4)  NOT NULL,  
    Grade SMALLINT check (Grade>=0 AND Grade<=100),
    
    constraint SC_PK PRIMARY KEY (Sno, Cno),   
    constraint SC_FK1  FOREIGN KEY (Sno) REFERENCES Student(Sno),
    constraint SC_FK2  FOREIGN KEY (Cno) REFERENCES Course(Cno)
    );
    
    
    删除约束
    alter table Student4
    drop constraint Student_PK_Sno;
    
    修改约束

    通过先删除旧的,再添加新的方法修改。

    alter table Student4
    drop constraint Student_PK_Sno;
    alter table Student4
    add constraint Student_PK_Sno PRIMARY KEY(Sno,Sname);
    
    断言

    创建

    create assertion ASSE_SC_DB_NUM
    check (60>=(select count(*)
    		   from course,sc
    		   where course.Cno=sc.Cno AND course.Cname='数据库')); 
    

    删除

    drop assertion asse_name
    

    触发器

    定义触发器
    CREATE TRIGGER语法格式
    CREATE TRIGGER <触发器名> 
    {BEFORE | AFTER} <触发事件> ON <表名> 
    REFERENCING NEW|OLD ROW AS<变量> FOR EACH  {ROW | STATEMENT} 
    [WHEN <触发条件>]<触发动作体>
    
    删除触发器
    DROP TRIGGER <触发器名> ON <表名>;
    

    存储过程

    创建

    CREATE OR REPLACE PROCEDURE 过程名([参数1,参数2,...]) 
    AS
     <过程化SQL>

    执行

    CALL/PERFORM  PROCEDURE
     过程名([参数1,参数2,...])

    修改

    ALTER PROCEDURE 过程名1  RENAME TO 过程名2;
    

    删除

    DROP  PROCEDURE 过程名()

    函数

    1. 函数的定义语句格式
    CREATE OR REPLACE FUNCTION 函数名 ([参数1,参数2,]) RETURNS <类型>  AS <过程化SQL>;
    2. 函数的执行语句格式
    CALL/SELECT 函数名 ([参数1,参数2,]);
    3. 修改函数
    重命名
    ALTER FUNCTION 过程名1 RENAME TO 过程名2;
    重新编译
    ALTER FUNCTION 过程名 COMPILE;
    
    

    ~

    感觉脑子还是不是很清楚(可能是标准sql和tsql差异有点小多),还是需要继续的复习。
    难点感觉在于查询(主要是用exist实现全称和蕴含那个),还有存储过程,存储过程就类似函数(没有返回值的函数,就是执行这个过程,主要是语法和之前学的语言差异很大);还有触发器,触发器就是自动执行,类似qt里面的槽函数。

    本篇完。

    展开全文
  • 创建视图5.创建角色二,INSERT(插入)1.插入信息到表里三,ALTER(修改)1.修改表 一,CREATE(创建) 1.创建模式 CREATE SCHEMA <模式名> AUTHORIZATION <用户名>; 2.创建表 CREATE TABLE <表名&...

    一,CREATE(创建)

    1.创建模式

    要先有个用户。
    在没有说明模式名的情况下,默认和用户名相同

    CREATE SCHEMA <模式名> AUTHORIZATION <用户名>;
    

    2.创建表

    CREATE TABLE <表名>(
    <列名><数据类型>[列级完整性条件]
    [,<列名><数据类型>[列级完整性条件]]
    ...
    [<表级完整性约束条件>]);
    

    3.创建索引

    REATE [UNIQUE] [CLUSTER] INDEX<索引名>
    ON <表名>(<列名>[<次序>[,<列名>[<次序>]]...);
    

    4.创建视图

    CREATE VIEW <视图名>[(<列名>[<列名>...)]]
    AS<子查询>
    [WITH CHECK OPTION];
    

    5.创建角色

    CREATE ROLE <角色名>

    二,INSERT(插入)

    1.插入信息到表里

    INSERT
    INTO <表名> [(<属性列1>[,<属性列2 >)]
    VALUES (<常量1> [,<常量2>]);
    
    • 1.插入的表后没写顺序,则插入的信息必须和表中的书行一致。
    • 2.插入时注意表中不能为空和有外码约束的属性

    三,ALTER(修改)

    1.修改表

    ALTER TABLE <表名>
    [ ADD[COLUMN] <新列名> <数据类型> [ 完整性约束 ] ]
    [ ADD <表级完整性约束>]
    [ DROP [ COLUMN ] <列名> [CASCADE| RESTRICT] ]
    [ DROP CONSTRAINT<完整性约束名>[ RESTRICT | CASCADE ] ]
    [ALTER COLUMN <列名><数据类型> ] ;
    

    ADD 子句用于增加新列、新的列级完整性约束条件和新的表级完整性约束条件
    DROP COLUMN 子句用于删除表中的列

    • 如果指定了 CASCADE 短语,则自动删除引用了该列的其他对象
    • 如果指定了 RESTRICT短语,则如果该列被其他对象引用,关系数据库管理系统将拒绝删除该列

    DROP CONSTRAINT 子句用于删除指定的完整性约束条件
    ALTER COLUMN 子句用于修改原有的列定义,包括修改列名和数据类型

    四,SELECT(查询)

    SELECT [ALL|DISTINCT]
    <目标列表达式> [别名] [ ,<目标列表达式> [别名]] …
    FROM <表名或视图名> [别名]
    [ ,<表名或视图名> [别名]] …
    |(<SELECT语句>)[AS]<别名>
    [WHERE <条件表达式>]
    [GROUP BY <列名1>[HAVING<条件表达式>]]
    [ORDER BY <列名2> [ASC|DESC]];

    1.查询指定列

    SELECT <>或者*--*代表全部列
    FROM <>;
    

    2.查询经过计算的值

    SELECT Sname,2021-Sage   --计算出生年份
    FROM Student;
    

    3.使用列别名改变查询结果的列标题

       SELECT Sname NAME,'Year of Birth:'  BIRTH,
       2021-Sage  BIRTHDAY,LOWER(Sdept)  DEPARTMENT
       FROM Student;
    

    4.消除取值重复的行

     -- SELECT (ALL) Sno  FROM SC;没有指定DISTINCT关键词 ,则缺省ALL
    SELECT DISTINCT Sno 
    FROM SC
    

    DISTINCT关键词,可以去掉表中重复的行

    SELECT DISTINCT Sno
        FROM SC; 
    

    5.比较大小

    --查询所有年龄在20岁以下的血红色呢个姓名及其年龄。
    SELECT Sname,Sage
    FROM Student
    WHERE Sage<20
    

    6.确定范围

    --查询年龄在20~23(包括20岁和23岁)之间的学生的姓名,系别和年龄
    SELECT Sname,Sdept,Sage
    FROM Student
    WHERE Sage BETWEEN 20 AND 23
    

    7.集合的查询

    SELECT Sname,Ssex
    FROM Student
    WHERE Sdept [NOT] IN ('CS','MA','IS')
    

    8.模糊查询

    1.% (百分号) 代表任意长度(长度可以为0)的字符串
    2._ (下横线) 代表任意单个字符。

    --where [NOT] LIKE  ‘<匹配串>’  [ESCAPE ‘ <换码字符>’]
    -- 匹配串为含通配符的字符串的模糊查询 姓刘的同学
    SELECT Sname, Sno, Ssex
    FROM Student
    WHERE  Sname LIKE '刘%';
    --查询名字中第2个字为"阳"字的学生的姓名和学号。
    SELECT Sname,Sno
    FROM     Student
    WHERE  Sname LIKE '_ _阳%';
    --数据库字符集为ASCII时,一个汉字需要两个_
    --数据库字符集为 GBK 时,一个汉字需要一个_
    

    9.使用换码字符将通配符转义为普通字符

    --查询DB_Design课程的课程号和学分。
    SELECT Cno,Ccredit
    FROM     Course
    WHERE  Cname LIKE 'DB\_Design' ESCAPE '\ ' ;
    

    10.涉及空值的查询

    SELECT Sno,Cno
    FROM sc
    WHERE Grade IS NULL
    

    11.多重条件查询

    逻辑运算符:AND和 OR来连接多个查询条件
    1.AND的优先级高于OR
    2.可以用括号改变优先级

    --查询计算机系年龄在20岁以下的学生姓名。
    SELECT Sname
    FROM Student
    WHERE Sdept='CS' AND Sage<20
    

    12.ORDER BY子句

    ORDER BY可以按一个或多个属性列排序
    升序:ASC;降序:DESC;缺省值为ASC

    --查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。
    SELECT Sno,Grade
    FROM SC
    WHERE Cno='3'
    ORDER BY Grade DESC
    

    13.聚集函数

    ◼ 统计元组个数 COUNT(*)
    ◼ 统计一列中值的个数 COUNT([DISTINCT|ALL] <列名>)
    ◼ 计算一列值的总和 SUM([DISTINCT|ALL] <列名>)
    ◼ 计算一列值的平均值 AVG([DISTINCT|ALL] <列名>)
    ◼ 求一列中的最大值和最小值
    MAX([DISTINCT|ALL] <列名>)
    MIN([DISTINCT|ALL] <列名>)

    --查询每个选修课程的学生平均分
    SELECT AVG(Grade)
    FROM SC
    GROUP BY Cno
    
    --查询选修了2门以上课程的学生学号
    SELECT Sno
    FROM SC
    GROUP BY Sno
    HAVING COUNT(*)>=2--要用having(WHERE子句是不能用聚集函数作为条件表达式的)
    

    14.连接查询

    --等值连接查询
    SELECT Student.*,SC.*
    FROM Student,SC
    WHERE Student.Sno=SC.Sno
    --自然连接
    SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Sdept,Cno,Grade
    FROM Student,SC
    WHERE Student.Sno=SC.Sno
    
    --可以和and一起用,一条语句同时完成选择和连接查询
    SELECT Student.Sno,Sname
    FROM Student,SC
    WHERE Student.Sno=SC.Sno
    AND SC.Cno='2'
    AND SC.Grade>50
    

    ①.自身连接

    SELECT FIRST.*,SECOND.*
    FROM Course FIRST,Course SECOND
    WHERE FIRST.Cpno = SECOND.Cno
    

    ②.外连接

    左连接列出左边关系的所有元组

    SELECT Student.Sno,Sname,Ssex,Sage,Cno,Grade
    FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno)
    

    ③.多表查询

    [例3.54]查询每个学生的学号、姓名、选修的课程名及成绩

    SELECT Student.Sno,Sname,Cname,Grade
    FROM Student,Course,SC
    WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno
    

    15.嵌套查询

    ①.不相关子查询

    SELECT Sno,Sname
    FROM Student
    WHERE Sno IN
    (
    SELECT Sno
    FROM SC
    WHERE CNO IN
    (
    SELECT Cno
    FROM Course
    WHERE CNAME='信息系统'
    )
    )
    

    带有比较运算符的子查询
    [例 3.57 ]找出每个学生超过他选修课程平均成绩的课程号。

    SELECT Sno,Cno
    FROM SC x
    WHERE Grade>=(SELECT AVG(Grade)
    FROM SC y
    WHERE y.Sno=x.Sno
    )
    

    使用ANY或ALL谓词时必须同时使用比较运算
    语义为:
    ANY 大于子查询结果中的某个值
    ALL 大于子查询结果中的所有值
    < ANY 小于子查询结果中的某个值
    < ALL 小于子查询结果中的所有值
    = ANY 大于等于子查询结果中的某个值
    = ALL 大于等于子查询结果中的所有值

    [例 3.58] 查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄

    SELECT Sname,Sage
    FROM Student
    WHERE Sage<ANY(
    				SElECT Sage
    				FROM Student
    				WHERE Sdept='CS' 
    				)
    AND Sdept <> 'CS'
    

    EXISTS谓词
    1.存在量词 ∃
    2.带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。
    ⚫ 若内层查询结果非空,则外层的WHERE子句返回真值
    ⚫ 若内层查询结果为空,则外层的WHERE子句返回假值
    3.由EXISTS引出的子查询,其目标列表达式通常都用 *

    在这里插入图片描述
    在这里插入图片描述

    ②.相关子查询

    再看看这里:
    https://blog.csdn.net/m0_49868511/article/details/115613589?spm=1001.2014.3001.5502

    集合查询

    集合操作的种类
    ①并-UNION
    ②交-INTERSECT
    ③差-EXCEPT

    [例 3.64] 查询计算机科学系的学生及年龄不大于19岁的学生。(此题也可以用or解决)并

    SELECT *
    FROM Student
    WHERE Sdept= 'CS'
    UNION
    SELECT *
    FROM Student
    WHERE Sage <=19;
    

    [例3.66] 查询计算机科学系的学生与年龄不大于19岁的学生的交集。(此题也可用AND解决)交

    SELECT *
    FROM Student
    WHERE Sdept='CS'
    INTERSECT
    SELECT *
    FROM Student
    WHERE Sage<=19
    

    [例 3.68] 查询计算机科学系的学生与年龄不大于19岁的学生的差集。(实际上是查询计算机科学系中年龄大于19岁的学生)差

    SELECT *
    FROM Student
    WHERE Sdept='CS'
    EXCEPT
    SELECT *
    FROM Student
    WHERE Sage<=19
    

    16.基于派生表的查询

    [例3.57]找出每个学生超过他自己选修课程平均成绩的课程号

    SELECT Sno,Cno
    FROM SC,(	SELECT Sno,Avg(Grade)
    			FROM SC
    			GROUP BY Sno)
    			AS Avg_sc(avg_sno,avg_grade)--派生表
    WHERE SC.Sno=Avg_sc.avg_sno
    AND SC.Grade>=Avg_sc.avg_grade
    

    如果子查询中没有聚集函数,
    派生表可以不指定属性列,
    子查询SELECT子句后面的列名为其缺省属性。

    五,UPDATE

    UPDATE <表名>
    SET <列名>=<表达式>[,<列名>=<表达式>]…
    [WHERE <条件>];

    六,DROP

    1.删除表

    DROP TABLE <表名>[RESTRICT| CASCADE]
    

    2.删除索引

    DROP INDEX Stusname;
    

    3.删除视图

    DROP VIEW BT_S ; --注意级联删除
    
    drop schema Wang cascade;--cascade删除模式的同时把该模式中所有的数据库对象全部删除
    

    七,DELETE

    DELETE
    FROM     <表名>
    [WHERE <条件>]
    

    删除指定表中满足WHERE子句条件的元组

    DELETE
    FROM Student
    WHERE Sno= '201215128 '; --在Student 表中删除属性Sno= 201215128 的元组
    

    八,GRANT

    GRANT<权限>[<权限>]
    ON<对象类型><对象名>[<对象类型><对象名>]
    TO<用户>[<用户>]
    [WITH GRANT OPTION];
    

    [WITH GRANT OPTION] 获得某种权限的用户还可以把这种权限授予其他用户

    GRANT SELECT --把查询Student表权限授给用户U1
    ON Student  --ON TABLE Student会报错应该是SQL和T-SQL的差别
    TO U1
    
    GRANT ALL PRIVILIGES --把对Student表和Course表的全部权限授予用户U2和U3
    ON TABLE Student,Course 
    TO U2,U3;
    

    九,REVOKE

    REVOKE <权限>[,<权限>]... 
    ON <对象类型> <对象名>[,<对象类型><对象名>]FROM <用户>[,<用户>]...[CASCADE | RESTRICT];
    
    REVOKE SELECT --收回所有用户对表SC的查询权限
    ON TABLE SC 
    FROM PUBLIC;
    
    REVOKE INSERT --把用户U5对SC表的INSERT权限收回
    ON TABLE SC 
    FROM U5 CASCADE
    

    十,AUDIT(审计)

    **对修改SC表结构或修改SC表数据的操作进行审计**
    AUDIT ALTER,UPDATE  
    ON  SC;
    

    取消对SC表的一切审计

    NOAUDIT  ALTER,UPDATE  
    ON  SC;
    

    总结

    有很多的东西要记,练习的题也很多,多看看

    展开全文
  • 数据库实验三 索引与视图

    千次阅读 2014-11-25 22:35:56
    实验三 索引和视图   一、 实验目的 1. 掌握利用SSMS和T—SQL语句创建和删除索引的两种方法。 2. 掌握利用SSMS和T—SQL语句创建、查询、更新及删除视图...3. 验后做好实验总结,根据实验情况完成实验报告

                                                                  实验三  索引和视图

     

    一、 实验目的

    1. 掌握利用SSMS和T—SQL语句创建和删除索引的两种方法。

    2. 掌握利用SSMS和T—SQL语句创建、查询、更新及删除视图的方法。

    二、 实验要求

    1. 能认真独立完成实验内容;

    2. 实验前做好上机实验的准备,针对实验内容,认真复习与本次实验有关的知识,完成实验内容的预习准备工作;

    3. 验后做好实验总结,根据实验情况完成实验报告。情况完成总结报告。

    三、 实验学时

      2学时

    四、 实验内容

    1、用T—SQL建立一个“学生选课数据库”,在此基础上用SQL语句建立该数据库包含的学生表,课程表,学生选修表:

    学生表:Student(Sno,Sname,Ssex,Sage,Sdept) 其中Sno为主键且Sname不能为空值,且取值唯一、Ssex只能取值男或女、Sage 在15到30之间:


    Sno

    Sname

    Ssex

    Sage

    Sdept

    S01

    S02

    S03

    S04

    S05

    S06

    王建平

    刘华

    范林军

    李伟

    黄河

    长江

    21

    19

    18

    19

    18

    20

    自动化

    自动化

    计算机

    数学

    数学

    数学

     

    课程表:Course(Cno,Cname,Cpno,Credeit) 其中Cno为主键

    Cno

    Cname

    Cpno

    Credit

    C01

    英语

    NULL

    4

    C02

    数据结构

    C05

    2

    C03

    数据库

    C02

    2

    C04

    DB_设计

    C03

    3

    C05

    C++

    NULL

    3

    C06

    网络原理

    C07

    3

    C07

    操作系统

    C05

    3

    学生选修表:SC(Sno,Cno,Grade) 其中Sno,Cno为主键同时又为外键、Grade值在0到100;

    Sno

    Cno

    Grade

    S01

    C01

    92

    S01

    C03

    84

    S02

    C01

    90

    S02

    C02

    94

    S02

    C03

    82

    S03

    C01

    72

    S03

    C02

    90

    S04

    C03

    75

     

    2.索引的建立、删除

    ①用SSMS的方式为Student表按Sno(学号)升序建唯一索引

    ②用T—SQL语句为Course表按Cno(课程号)升序建唯一索引,

    ③用T—SQL语句为SC表按Sno(学号)升序和Cno(课程号)号降序建唯一索引。

    ④能否用T—SQL语句再为表Students的Sname(姓名)Sno(学号)列上建立一个聚簇索引?若不能说明原因?

    ⑤用T—SQL语句删除基本表SC上的唯一索引。

     

    3.用T—SQL完成如下视图的建立、查询、修改及删除

    1)建立数学系学生的视图C_Student,并要求进行修改和插入操作时仍需保证该视图只有数学系的学生,视图的属性名为SnoSnameSageSdept

    2) SSMS的方式建立学生的学号(Sno)、姓名(Sname)、选修课程名(Cname)及成绩(Grade)的视图Student_CR。

     

    3) 定义一个反映学生出生年份的视图Student_birth(Sno, Sname, Sbirth)

    4)建立先修课程为空的课程视图v_course

    5) 建立成绩高于90分的女生成绩视图v_F_grade(包括学号,姓名,课程号及成绩列)

    6)建立视图S_AVGAGE(其中包括性别SSEX与平均年龄AVG_AGE两列)用以反映男生、女

    生的平均年龄

    7)对前面创建的视图S_AVGAGE执行更新操作:

    UPDATE S_AVGAGE

    SET AVG_AGE = 85

    WHERE  ssex = '女'

     

    上述语句能否成功执行?为什么?

    8) 在数学系的学生视图C_Student中找出年龄(Sage)小于20岁的学生姓名(Sname)和年龄

    (Sage)。

    9) Student_CR视图中查询成绩在85分以上的学生学号(Sno)、姓名(Sname)和课程名称

    (Cname)。

    10) 将数学系学生视图C_Student中学号为S05的学生姓名改为“黄海”。

    11) 向数学系学生视图C_Student中插入一个新的学生记录,其中学号为“S09”,姓名为“王海”,年龄为20岁。

    12) 删除数学系学生视图C_Student中学号为“S09”的记录。

     

     执行代码

    CREATE DATABASE 学生选课数据库
    ON PRIMARY
    (NAME=学生选课数据库_data,
    FILENAME='D:\包春春\实验三\学生选课数据库_data.mdf',
    SIZE=10,
    MAXSIZE=100,
    FILEGROWTH=10)
    LOG ON
    (NAME=学生选课数据库_log,
    FILENAME='D:\包春春\实验三\学生选课数据库_log.ldf',
    SIZE=20,
    MAXSIZE=200,
    FILEGROWTH=10)


    CREATE TABLE Student 
    (Sno CHAR(9) PRIMARY KEY,
    Sname CHAR(20) NOT NULL UNIQUE,
    Ssex CHAR(2)CHECK(Ssex IN('男','女')),
    Sage INT  CHECK(Sage>15 AND Sage<30),
    Sdept CHAR(20)); 


    CREATE TABLE Course
    (Cno CHAR (5) PRIMARY KEY,
    Cname CHAR(30),
    Cpno CHAR(5),
    Credeit INT);  


    CREATE TABLE SC 
    (Sno CHAR(9),
    Cno CHAR(5),
    Grade INT CHECK(Grade>0 AND Grade<100) 
    PRIMARY KEY (Sno,Cno), 
    FOREIGN KEY(Sno) REFERENCES Student(Sno),
    FOREIGN KEY(Cno) REFERENCES Course(Cno));


    INSERT
    INTO Student
    VALUES('S01','王建平','男','21','自动化'),
    ('S02','刘华','女','19','自动化'),
    ('S03','范林军','女','18','计算机'),
    ('S04','李伟','男','19','数学'),
    ('S05','黄河','男','18','数学'),
    ('S06','长江','男','20','数学');


    INSERT
    INTO Course
    VALUES('C01','英语','NULL','4'),
    ('C02','数据结构','C05','2'),
    ('C03','数据库','C02','2'),
    ('C04','DB_设计','C03','3'),
    ('C05','C++','NULL','3'),
    ('C06','网络原理','C07','3'),
    ('C07','操作系统','C05','3');


     INSERT
    INTO SC 
    VALUES('S01','C01','92'),
    ('S01','C03','84'),
    ('S02','C01','90'),
    ('S02','C02','94'),
    ('S02','C03','82'),
    ('S03','C01','72'),
    ('S03','C02','90'),
    ('S04','C03','75');




    CREATE UNIQUE INDEX Stusno ON Student(Sno);


    CREATE UNIQUE INDEX Coucno ON Course(Cno);


    CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);


    CREATE CLUSTERED INDEX  Snamesno ON Student(Sname,Sno)


    DROP INDEX SC.SCno;


    CREATE VIEW C_Student(Sno,Sname,Sage,Sdept)
    AS 
    SELECT Sno,Sname,Sage,Sdept
    FROM Student 
    WHERE Sdept='数学'
    WITH CHECK OPTION;




    CREATE VIEW Student_birth(Sno, Sname, Sbirth)
    AS 
    SELECT Sno, Sname,2014-Sage
    FROM Student;




    CREATE VIEW v_course
    AS
    SELECT *
    FROM Course
    WHERE Cpno=NULL;


    CREATE VIEW v_F_grade(Sno,Sname,Cno,Grade) 
    AS
    SELECT Student.Sno,Sname,SC.Cno,Grade
    FROM Student,Course,SC
    WHERE Student.Sno=SC.Sno AND Course.Cno=SC.Cno AND Ssex='女' AND Grade>90


    CREATE VIEW S_AVGAGE(Ssex,AVG_AGE)
    AS
    SELECT Ssex,AVG(Sage)
    FROM Student
    GROUP BY Ssex;
     
     
    CREATE VIEW Student_CR(Sno,Sname,Cname,Grade) 
    AS
    SELECT Student.Sno,Sname,Cname,Grade
    FROM Student,Course,SC
    WHERE Student.Sno=SC.Sno AND Course.Cno=SC.Cno;




     UPDATE S_AVGAGE
     SET AVG_AGE=85
     WHERE Ssex='女';
     
     
     SELECT Sage,Sname
     FROM C_Student
     WHERE Sage<20;
     
     SELECT Sno,Sname,Cname
     FROM Student_CR
     WHERE Grade >85;
     
     UPDATE C_Student
     SET  Sname='黄海'
     WHERE  Sdept='数学' AND Sno='S05';
     
     
      INSERT 
      INTO C_Student(Sno,Sname,Sage,Sdept)
      VALUES('S09','王海','20','数学')
      
      DELETE
      FROM  Student
      WHERE Sno='S09' AND Sdept='数学';
      
       
     



     

    展开全文
  • 数据库实验报告

    2017-12-14 23:37:15
    本文档为数据库上机实验报告,是自己认认真真一步一步写的,报告包含试验中的具体步骤,过程以及代码和实验结果截图,和实验总结。 实验一 实验题目: 数据库管理系统的使用 实验目的: 掌握SQL SERVER2005的...
  • 这里小周只总结了小部分的问题和解决办法,其他问题后续再补充。 六、实验存在问题和解决办法 当我们在scott里面创建表空间...3、当我们在创建视图时如果使用了聚合函数,出现如下错误,我们要使用group by 解决问题。

    这里小周只总结了小部分的问题和解决办法,其他问题后续再补充。
    六、实验存在问题和解决办法
    当我们在scott里面创建表空间时出现如下错误
    在这里插入图片描述

    解决办法:首先使用sys用户登陆数据库,再给scott赋予创建表空间的权限:grant create tablespace to scott。再连接到scott中,即可创建。
    在这里插入图片描述

    2、当我们在创建分区时出现分区界限过高时,如下图
    在这里插入图片描述

    我们应该确保依次的分区由以小到大的顺序创建。
    3、当我们在创建视图时如果使用了聚合函数,出现如下错误,我们要使用group by 解决问题。
    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • 《SQL Server2008数据库应用技术》 复习总结

    千次阅读 多人点赞 2018-12-31 15:09:02
    目录 ... 目录 写在前面: ...抽时间总结了下数据库这门课本学期的全部内容 以课本和课后实验作业为参考,筛选了一些觉得相对重点的知识点和例题 汇总和整理了一下,方便复习,也方便以后查看。 文中含...
  • 2017.1.24-2.3日(在大兴实验室) 1.数据库存储引擎: (1)MyISAM: 访问速度快,对事物完整性没要求,并以访问为主的适合这个 (2)InnoDB: 更占磁盘空间,需要进行频繁的更新、删除操作,...2.创建视图: c...
  • 建立环境实验数据库/表 实验学时:2学时 实验类型:验证 实验要求:必修 一、实验目的 ...将实验结果反映在实验报告中,并对实验中遇到的问题及解决方案、进行整理、分析总结,提出实验结论或自己的看法。
  • MSServer SQL这个DBMS我觉得很容易上手,几乎所有操作都可以图形化操作,我们以创建“学生数据库”为例(我是以学校老师给的实验总结的,很有借鉴意义),很多操作我们尽量用SQL语句来完成,(这样才有技术含量害?...
  • 实验报告

    2020-12-14 13:25:37
    总结实验中遇到的问题 1 SQL语句执行不成功 2 创建视图不成功 3 一些SQL命令无法正确执行 解决办法 1 输入命令时要注意在半角英文的条件下,并且标点符号也是如此 2 创建视图时要注意视图的名称,避免重复 3 一些...
  • 这里写自定义目录标题零、知识笔记(一)视图的概念(二)视图的作用(三)创建、修改、删除、查询视图的语句一、实验目的二、实验要求三、实验步骤四、注意事项总结参考文献 零、知识笔记 (一)视图的概念 专业...
  •  3.1.4 数据库创建疑难解析  3.2 删除数据库  3.2.1 数据库删除概述  3.2.2 数据库删除——手工篇  3.2.3 数据库删除——dbca篇 第2篇 网 络 管 理  第4章 oracle网络管理并不难  4.1 oracle网络体系...
  •  3.1.4 数据库创建疑难解析  3.2 删除数据库  3.2.1 数据库删除概述  3.2.2 数据库删除——手工篇  3.2.3 数据库删除——dbca篇 第2篇 网 络 管 理  第4章 oracle网络管理并不难  4.1 oracle网络体系...
  • 1.3.9 sql.bsq文件与数据库创建 28 1.3.10 数据文件及字典的创建 29 1.4 使用模板创建数据库 30 1.4.1 启动创建 31 1.4.2 数据库创建模板 31 1.4.3 rman的引入 32 1.4.4 克隆数据库 35 1.4.5 传输表...
  • oracle学习总结(一)

    2016-09-04 09:54:29
    声明:这份总结只是个人在实际项目中加上自己理解写出的,实验数据库是oracle,并没有查阅很多资料,若有差错或遗漏,欢迎指正 view(视图) -并不是一个真实存在的表,创建后使用视图时,所使用视图的数据还是来自...
  • 二、实验内容和主要知识点(预习实验示例,学习3.1~3.4,视图部分放在后续实验做,通过本次实验,掌握基本表的创建与维护方法和步骤,完成实验3(1创建数据库及表)) 从交互方式和T-SQL两种方式进行总结书写 1、 ...
  • 12.1 创建简单视图与复杂视图 342 12.1.1 使用视图的原因 342 12.1.2 简单视图与复杂视图 345 12.1.3 创建、更改和删除视图 346 12.2 从视图中检索数据 348 12.3 创建私有和公有同义词 349 12.4 创建、维护和...
  • 2.5.4 创建用来管理访问权限的mysql数据库 34 2.5.5 MySQL配置文件和Init-V脚本 34 2.5.6 启动MySQL服务器 35 2.6 配置Apache 35 2.6.1 配置文件 35 2.6.2 基本设置 36 2.6.3 对不同子目录的访问权限(....
  • Sqlite 一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中 W3C 万维网联盟,创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构。主要的工作是发展 Web 规范,...
  • /创建一个关于项目的目标、限定条件和解决方案的概要视图 界面层的异常处理的处理方法有//重试/将问题提交给用户/停止界面流程 52、 常见的Caching技术有://ASP.NET Cache //数据库缓存 //通过静态变量缓存//...
  • 本书注重对实际动手能力的指导,在遵循技术研发知识体系的严密性同时,在容易产生错误、不易理解的环节配以了翔实的开发情景截图,并将重要的知识点和开发技巧以“小实验”、“小提醒”、“小知识”、“注意”等的...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    考核方式: 课程设计(附设计说明文档,正文字数不少于1000字)(60%)+平时作业及实验(30%)+平时表现(10%),按优秀、良好、中、及格、不及格五级评定成绩 通过演示及讲述,讲解课程设计的整体情况,针对其设计提出一些技术...

空空如也

空空如也

1 2
收藏数 28
精华内容 11
关键字:

数据库创建视图实验总结