数据库知识点总结-03sql

本文详细介绍SQL语言在数据库操作中的应用,包括数据定义、查询、更新和安全性管理。涵盖模式、表、视图的创建与修改,索引的建立,以及各种查询、更新操作的语法与技巧,同时讲解权限管理和角色分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、数据定义

1.模式的定义与删除

CREATE SCHEMA <模式名> AUTHORIZATION <用户名>[<表定义子句>|<视图定义子句>|<授权定义子句>]

eg:

CREATE SCHEMA TEST AUTHORIZATION ZHANG 

删除模式

DROP SCHEMA <模式名> <CASCADE | RESTRICT>
CASCADE(级联)
    删除模式的同时把该模式中所有的数据库对象全部删除
RESTRICT(限制)
   如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。
   当该模式中没有任何下属的对象时 才能执行。

eg:

DROP SCHEMA ZHANG CASCADE

2.基本表的定义,删除和修改
定义:

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

eg:

CREATE TABLE Student          
      (Sno   CHAR(9) PRIMARY KEY, /* 列级完整性约束条件*/                  
        Sname  CHAR(20) UNIQUE,     /* Sname取唯一值*/
        Ssex    CHAR(2),
        Sage   SMALLINT,
        Sdept  CHAR(20)
       ); 
 CREATE TABLE  Course
               ( Cno       CHAR(4) PRIMARY KEY,
                 Cname  CHAR(40),            
                 Cpno     CHAR(4) ,               	                      
                 Ccredit  SMALLINT,
                FOREIGN KEY (Cpno) REFERENCES  Course(Cno) 
            ); 

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*/
                   ); 

删除:

DROP TABLE <表名>[RESTRICT| CASCADE];
RESTRICT:删除表是有限制的。
欲删除的基本表不能被其他表的约束所引用
如果存在依赖该表的对象,则此表不能被删除
CASCADE:删除该表没有限制。
在删除基本表的同时,相关的依赖对象一起删除 

eg:
删除Student表
     DROP TABLE  Student  CASCADE ;
基本表定义被删除,数据被删除
表上建立的索引、视图、触发器等一般也将被删除 

若表上建有视图,选择RESTRICT时表不能删除	
    CREATE VIEW IS_Student      
	AS 
	    SELECT Sno,Sname,Sage FROM  StudentWHERE Sdept='IS';
	DROP TABLE Student RESTRICT;   
    --ERROR: cannot drop table Student because other  objects depend on it

修改

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

eg:

1.向Student表增加“入学时间”列,其数据类型为日期型。
     ALTER TABLE Student ADD S_entrance DATE;
不论基本表中原来是否已有数据,新增加的列一律为空值。 
2.将年龄的数据类型由字符型(假设原来的数据类型是字符型)改为整数。
    		ALTER TABLE Student ALTER COLUMN Sage INT;
3.增加课程名称必须取唯一值的约束条件。
    		ALTER TABLE Course ADD UNIQUE(Cname); 

3.索引的建立与删除

建立索引的目的:加快查询速度
谁可以建立索引
DBA 或 表的属主(即建立表的人)
DBMS一般会自动建立以下列上的索引
 PRIMARY  KEY
 UNIQUE
谁维护索引
     DBMS自动完成 
使用索引
     DBMS自动选择是否使用索引以及使用哪些索引
RDBMS中索引一般采用B+树、HASH索引来实现
B+树索引具有动态平衡的优点 
HASH索引具有查找速度快的特点
采用B+树,还是HASH索引 则由具体的RDBMS来决定
索引是关系数据库的内部实现技术,属于内模式的范畴 
CREATE INDEX语句定义索引时,可以定义索引是唯一索引、非唯一索引或聚簇索引 
语句格式:
CREATE [UNIQUE] [CLUSTER] INDEX <索引名> 
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
CREATE CLUSTER INDEX Stusname  ON   Student(Sname);
在Student表的Sname(姓名)列上建立一个聚簇索引
在最经常查询的列上建立聚簇索引以提高查询效率 
一个基本表上最多只能建立一个聚簇索引 
经常更新的列不宜建立聚簇索引 
DROP INDEX <索引名>;
删除索引时,系统会从数据字典中删去有关该索引的
描述。
eg:
删除Student表的Stusname索引
DROP INDEX Stusname;

二、数据查询

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

1.单表查询

  • 选择表中的若干列
查询全体学生的学号与姓名。
SELECT Sno,Sname
FROM Student; 
 
查询全体学生的姓名、学号、所在系。
SELECT Sname,Sno,Sdept
FROM Student;

使用列别名改变查询结果的列标题:
SELECT Sname NAME,'Year of Birth: ’ BIRTH,
2007-Sage BIRTHDAY,LOWER(Sdept)  DEPARTMENT
FROM Student;
  • 选择表中的若干元组
查询选修了课程的学生学号。
SELECT Sno   FROM SC;
等价于:
SELECT ALL  Sno  FROM SC;


指定DISTINCT关键词,去掉表中重复的行 
SELECT DISTINCT Sno
FROM SC


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


查询年龄不在20~23岁之间的学生姓名、系别和年龄
SELECT Sname,Sdept,Sage
FROM    Student
WHERE Sage NOT BETWEEN 20 AND 23; 


查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
SELECT Sname,Ssex
FROM  Student
WHERE Sdept IN ( 'IS','MA','CS' );


查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。
SELECT Sname,Ssex
FROM Student
WHERE Sdept NOT IN ( 'IS','MA','CS' );


查询学号为200215121的学生的详细情况。
     SELECT *    
     FROM  Student  
     WHERE  Sno LIKE ‘200215121';
等价于: 
      SELECT  * 
      FROM  Student 
      WHERE Sno = '200215121';
  • ORDER BY子句
ORDER BY子句
可以按一个或多个属性列排序
升序:ASC;降序:DESC;缺省值为升序
当排序列含空值时
ASC:排序列为空值的元组最后显示
DESC:排序列为空值的元组最先显示 
查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。
        SELECT Sno,Grade
        FROM  SC
        WHERE  Cno= ' 3 '
        ORDER BY Grade DESC;

查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
        SELECT  *
        FROM  Student
        ORDER BY Sdept,Sage DESC; 
  • 聚集函数
查询学生总人数。
    SELECT COUNT(*)
    FROM  Student; 
    
查询选修了课程的学生人数。
     SELECT COUNT(DISTINCT Sno)
     FROM SC;
     
计算1号课程的学生平均成绩。
          SELECT AVG(Grade)
          FROM SC
          WHERE Cno= ' 1 ';
          
          
查询选修1号课程的学生最高分数。
   SELECT MAX(Grade)
   FROM SC
   WHER Cno= ‘ 1 ’;
   

查询学生200215012选修课程的总学分数。
    		  SELECT SUM(Ccredit)
             FROM  SC, Course
             WHER Sno='200215012' AND SC.Cno=Course.Cno; 
  • GROUP BY子句
求各个课程号及相应的选课人数。
     SELECT Cno,COUNT(Sno)
     FROM    SC
     GROUP BY Cno; 

查询选修了3门以上课程的学生学号。
     SELECT Sno
     FROM  SC
     GROUP BY Sno
     HAVING  COUNT(*) >3;   

HAVING短语与WHERE子句的区别:
作用对象不同
WHERE子句作用于基表或视图,从中选择满足条件的元组
HAVING短语作用于组,从中选择满足条件的组。

2.连接查询–同时涉及多个表的查询
连接条件或连接谓词:用来连接两个表的条件
一般格式:

[<表名1>.]<列名1>  <比较运算符>  [<表名2>.]<列名2>
[<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>

连接字段:连接谓词中的列名称
连接条件中的各连接字段类型必须是可比的,但名字不必是相同的

查询每个学生及其选修课程的情况
SELECT  Student.*,SC.*
FROM     Student,SC
WHERE  Student.Sno = SC.Sno;


查询每一门课的间接先修课(即先修课的先修课)
    SELECT  FIRST.Cno,SECOND.Cpno
     FROM  Course  FIRST,Course  SECOND
     WHERE FIRST.Cpno = SECOND.Cno;


查询选修2号课程且成绩在90分以上的所有学生		
		SELECT Student.Sno, Sname
		FROM    Student, SC
		WHERE Student.Sno = SC.Sno AND     /* 连接谓词*/
                         SC.Cno= ‘2’ AND SC.Grade > 90;     
                           
查询每个学生的学号、姓名、选修的课程名及成绩
  SELECT Student.Sno,Sname,Cname,Grade
   FROM    Student,SC,Course    /*多表连接*/
   WHERE Student.Sno = SC.Sno 
                   and SC.Cno = Course.Cno	/* 其他限定条件 */

3.嵌套查询
一个SELECT-FROM-WHERE语句称为一个查询块
将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询

SELECT Sname	 /*外层查询/父查询*/
     FROM Student
     WHERE Sno IN
         (SELECT Sno       /*内层查询/子查询*/
           FROM SC
           WHERE Cno= ' 2 ');

子查询的限制:

  • 不能使用ORDER BY子句
  • 层层嵌套方式反映了 SQL语言的结构化
  • 有些嵌套查询可以用连接运算替代
    不相关子查询:
  • 子查询的查询条件不依赖于父查询
  • 由里向外 逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。
    相关子查询:子查询的查询条件依赖于父查询
    首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表然后再取外层表的下一个元组重复这一过程,直至外层表全部检查完为止
    4.集合查询
    集合操作的种类
    并操作UNION
    交操作INTERSECT
    差操作EXCEPT
    参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同
查询计算机科学系的学生及年龄不大于19岁的学生。
        SELECT *
        FROM Student
        WHERE Sdept= 'CS'
        UNION
        SELECT *
        FROM Student
        WHERE Sage<=19;
        
UNION:将多个查询结果合并起来时,系统自动去掉重复元组。
UNION ALL:将多个查询结果合并起来时,保留重复元组 

SELECT  DISTINCT  *
        FROM Student
        WHERE Sdept= 'CS'  OR  Sage<=19;
        
查询选修了课程1或者选修了课程2的学生。
SELECT Sno
         FROM SC
        WHERE Cno=' 1 '
        UNION
        SELECT Sno
        FROM SC
        WHERE Cno= ' 2 ';

三、数据更新
1.插入数据
两种插入数据方式

  • 插入元组
    语句格式:
INSERT
INTO <表名> [(<属性列1>[,<属性列2 >…)]
VALUES (<常量1> [,<常量2>]    …           )

INTO子句
属性列的顺序可与表定义中的顺序不一致
没有指定属性列
指定部分属性列
VALUES子句
提供的值必须与INTO子句匹配
值的个数
值的类型
eg:

1.将一个新学生元组(学号:200215128;姓名:陈冬;性别:男;所在系:IS;年龄:18岁)插入到Student表中。
          INSERT
          INTO  Student (Sno,Sname,Ssex,Sdept,Sage)
          VALUES ('200215128','陈冬','男','IS',18);

2.将学生张成民的信息插入到Student表中。
             INSERT
    		INTO  Student
    		VALUES (‘200215126’, ‘张成民’, ‘男’,18,'CS'); 

插入一条选课记录( ‘200215128’,'1 ')。

INSERT
INTO SC(Sno,Cno)
VALUES (‘ 200215128 ’,‘ 1 ’);

RDBMS将在新插入记录的Grade列上自动地赋空值
或者:

INSERT
INTO SC
VALUES (' 200215128 ',' 1 ',NULL);
  • 插入子查询结果–可以一次插入多个元组
    语句格式
INSERT 
INTO <表名>  [(<属性列1> [,<属性列2>…  )]
子查询;

功能–将子查询结果插入指定表中
INTO子句(与插入元组类似)
子查询;
SELECT子句目标列必须与INTO子句匹配
值的个数
值的类型
eg:
对每一个系,求学生的平均年龄,并把结果存入数据库。

第一步:建表
      CREATE  TABLE  Dept_age
          (Sdept  CHAR(15)           	/* 系名*/
           Avg_age SMALLINT);   	/*学生平均年龄*/                                        
第二步:插入数据
        INSERT
         INTO  Dept_age(Sdept,Avg_age)
              SELECT  Sdept,AVG(Sage)
              FROM  Student
              GROUP BY Sdept;

2.修改数据
语句格式

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

功能–修改指定表中满足WHERE子句条件的元组的指定列值

SET子句–指定修改方式
要修改的列
修改后取值
WHERE子句–指定要修改的元组
缺省表示要修改表中的所有元组

三种修改方式

  1. 修改某一个元组的值
将学生200215121的年龄改为22岁
         UPDATE  Student
         SET Sage=22
         WHERE  Sno=' 200215121 '; 
  1. 修改多个元组的值
将所有学生的年龄增加1岁
     UPDATE Student
     SET Sage= Sage+1;
  1. 带子查询的修改语句
将计算机科学系全体学生的成绩置零。
         UPDATE SC
         SET Grade= 0
         WHERE Sno IN
                 (SELECT Sno 
                  FROM Student 
                  WHERE Sdept='CS');

3.删除数据
语句格式

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

功能–删除指定表中满足WHERE子句条件的元组
WHERE子句–指定要删除的元组
缺省表示要删除表中的全部元组,表的定义仍在字典中

三种删除方式

  1. 删除某一个元组的值
删除学号为200215128的学生记录。
 DELETE
 FROM Student
 WHERE Sno= ‘200215128 ';
  1. 删除多个元组的值
删除所有的学生选课记录。
    DELETE
    FROM SC;
  1. 带子查询的删除语句
    删除计算机科学系所有学生的选课记录
 DELETE
 FROM SC
 WHERE Sno IN
         (SELECT Sno 
           FROM Student
           WHERE Sdept='CS');      

四、视图

**视图的特点:**
虚表,是从一个或几个基本表(或视图)导出的表,只存放视图的定义,不存放视图对应的数据,基表中的数据发生变化,从视图中查询出的数据也随之改变
**基于视图的操作:**
 查询
 删除
 受限更新
 定义基于该视图的新视图

视图的建立

语句格式
CREATE  VIEW [<视图名>  [(<列名>  [,<列名>]…)]  AS  <子查询>  [WITH  CHECK  OPTION];
组成视图的属性列名:全部省略或全部指定
**子查询不允许含有ORDER BY子句和DISTINCT短语**
RDBMS执行CREATE VIEW语句时只是把视图定义存入数据字典,并不执行其中的SELECT语句。
在对视图查询时,按视图的定义从基本表中将数据查出。

eg:

建立信息系学生的视图
        CREATE VIEW IS_Student
        AS 
        SELECT Sno,Sname,Sage
        FROM    Student
        WHERE  Sdept= 'IS';
建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生 
        CREATE VIEW IS_Student
        AS 
        SELECT Sno,Sname,Sage
        FROM  Student
        WHERE  Sdept= 'IS'
        WITH CHECK OPTION;
带WITH CHECK OPTION选项时对IS_Student视图的更新操作:
修改操作:自动加上Sdept= 'IS'的条件
删除操作:自动加上Sdept= 'IS'的条件
插入操作:自动检查Sdept属性值是否为'IS' 
如果不是,则拒绝该插入操作
如果没有提供Sdept属性值,则自动定义Sdept为'IS'

视图的删除

语句的格式: DROP  VIEW  <视图名>;
该语句从数据字典中删除指定的视图定义
如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除 
删除基表时,由该基表导出的所有视图定义都必须显式地使用DROP VIEW语句删除 
删除视图BT_S: DROP VIEW BT_S;
删除视图IS_S1:DROP VIEW IS_S1;
拒绝执行
级联删除: DROP VIEW IS_S1 CASCADE;       

五、数据库安全性
安全级别划分
在这里插入图片描述
1.授权–GRANT

GRANT语句的一般格式:
       GRANT <权限>[,<权限>]... 
       [ON <对象类型> <对象名>]
       TO <用户>[,<用户>]...
       [WITH GRANT OPTION]

语义:将对指定操作对象的指定操作权限授予指定的用户
发出GRANT:
DBA
数据库对象创建者(即属主Owner)拥有该权限的用户

按受权限的用户
一个或多个具体用户 PUBLIC(全体用户)
WITH GRANT OPTION子句:
指定:可以再授予
没有指定:不能传播
[ WITH GRANT OPTION ]短语表示不仅对某一用户授与对某些数据对象的某些权限,而且允许该用户再把这些权限又授予另外的用户。
eg:

1.把查询Student表权限授给用户U1
   GRANT SELECT ON TABLE Student TO U1;
   
 2.把对Student表和Course表的全部权限授予用户U2和U3
  GRANT ALL PRIVILIGES 
  ON TABLE Student, Course 
  TO U2, U3;

3.把对表SC的查询权限授予所有用户
  GRANT SELECT 
  ON TABLE SC 
  TO PUBLIC;
  
4.把查询Student表和修改学生学号的权限授给用户U4
  GRANT UPDATE(Sno), SELECT 
  ON TABLE Student 
  TO U4;

对属性列的授权时必须明确指出相应属性列名


把对表SC的INSERT权限授予U5用户,并允许他再将此权限授予其他用户
GRANT INSERT 
ON TABLE SC 
TO U5
WITH GRANT OPTION;

GRANT INSERT ON TABLE SC TO U6
WITH GRANT OPTION;
同样,U6还可以将此权限授予U7:

GRANT INSERT ON TABLE SC TO U7;
但U7不能再传播此权限。

2.收回–REVOKE
授予的权限可以由DBA或其他授权者用REVOKE语句收回

REVOKE语句的一般格式为:
      REVOKE <权限>[,<权限>]... 
      [ON <对象类型> <对象名>]
      FROM <用户>[,<用户>]...;

eg:

1.把用户U4修改学生学号的权限收回
REVOKE UPDATE(Sno)
ON TABLE Student 
FROM U4;

2.收回所有用户对表SC的查询权限
REVOKE SELECT 
ON TABLE SC 
FROM PUBLIC;    

3.把用户U5对SC表的INSERT权限收回
REVOKE INSERT 
ON TABLE SC 
FROM U5 CASCADE ;

将用户U5的INSERT权限收回的时候必须级联(CASCADE)收回系统只收回直接或间接从U5处获得的权限 

3.数据库角色
数据库角色:被命名的一组与数据库操作相关的权限角色是权限的集合
角色的创建

CREATE  ROLE  <角色名> 

给角色授权

 GRANT  <权限>[,<权限>]… 
 ON <对象类型>对象名  
 TO <角色>[,<角色>]…

将一个角色授予其他的角色或用户

GRANT <角色1>[,<角色2>]…
TO  <角色3>[,<用户1>]… 
[WITH ADMIN OPTION]

角色权限的收回

REVOKE <权限>[,<权限>]…
ON <对象类型> <对象名>
FROM <角色>[,<角色>]…

通过角色来实现将一组权限授予一个用户。
步骤如下:

1. 首先创建一个角色 R1
    CREATE  ROLE  R1;
2. 然后使用GRANT语句,使角色R1拥有Student表的SELECT、UPDATE\INSERT权限
    GRANT SELECT,UPDATE,INSERT 
    ON TABLE Student 
    TO R1;
3. 将这个角色授予王平,张明,赵玲。使他们具有角色R1所包含的全部权限
    GRANT  R1 
    TO 王平,张明,赵玲;
4. 可以一次性通过R1来回收王平的这3个权限
     REVOKE  R1 
     FROM 王平;

角色的权限修改

  GRANT DELETE 
  ON TABLE Student
  TO R1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值