码迷,mamicode.com
首页 > 数据库 > 详细

SQL基本语句

时间:2015-07-14 13:52:10      阅读:436      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

技术分享定义基本表(创建基本表的语法)

CREATE  TABLE <基本表名>

 (<列名><数据类型> [列级完整性约束条件]                  

 [,<列名><数据类型> [列级完整性约束条件]]

               ……

 [,表级完整性约束条件]);

      如果完整性约束条件涉及到该表的多个属性列时,必须在表级定义该约束条件,否则既可以定义在列级,也可以定义在表级。

例1:建立职工关系模式

 emp(eno,ename,dno,sex,birthday)

 CREATE TABLE emp

 ( eno number(10),

     ename  varchar2(10),

     dno  varchar(6),

  sex  varchar(2),

  birthday  date);

3)约束条件

主键约束(PRIMARY KEY体现了实体完整性。要求某一列的值既不能为空,也不能重复。

外键约束(FOREIGN KEY体现参照完整性。外键的取值或者为空或者参考父表的主键。

属性约束:体现了用户定义的完整性。属性约束主要限制某一属性的取值范围。分为以下几类:

?非空约束(NOT NULL):要求某一属性的值不允许为空值。
?唯一约束(UNIQUE:要求某一属性的值不允许重复。
?检查约束(CHECKCHECK约束可以对某一个属性列的值加以限制。

列级约束:          

CREATE TABLE emp

 ( enonumber(6) primary key,

   enamevarchar2(10) unique,

 sex varchar2(3) not null,

 dnovarchar2(10)referencesdept(dno),

 salnumber(6) check(sal>1000 and

                      sal<=10000))

表级约束:          

CREATE TABLE emp

 ( enonumber(6),

   enamevarchar2(10),

 sex varchar2(3)not null,

 dnovarchar2(10),

 salnumber(6),

 primary key(eno),

 unique(ename),

 foreign key(dno)references dept(dno),

 check(salbetween 1000 and 10000))

      基本表的完整性约束可定义为两级:列级约束表级约束

      上述五种约束条件均可作为列级完整性约束条件但非空约束不可以作为表级完整性约束条件,而其他四种也可以作为表级完整性约束条件。

   

例1:建立一个学生表Student,所有约束条件均为列级完整性约束。

CREATE TABLE Student

(Sno  CHAR(8) PRIMARY KEY,  /*主键约束*/

Sname CHAR(10)  UNIQUE,        /*唯一约束*/

Sex CHAR(3)  NOTNULL,           /*非空约束*/

Age INT  CHECK(Age>16),          /*检查约束*/

Dept VARCHAR(15)

 );

 

例2:建立一个课程表Course,所有约束条件均为列级完整性约束。

   CREATETABLE Course

   (Cno  CHAR(8) PRIMARY KEY,        /*主键约束*/

    CnameVARCHAR(10) NOT NULL, /*非空约束*/

    Tname  VARCHAR(10),

     Cpno  CHAR(8)  REFERENCES  Course(Cno),   

                                                               /*外键约束*/

     CreditNUMBER);

例3:建立一个学生选课表SC,所有约束条件均为表级完整性约束。

   CREATETABLE SC

  ( SnoCHAR(8),

    CnoCHAR(8),

    GradeNUMBER,

    PRIMARY KEY(Sno,Cno),               /*主键约束*/

   FOREIGN KEY(Sno)REFERENCES Student(Sno),      

                                                              /*外键约束*/

   FOREIGNKEY (Cno) REFERENCES Course(Cno)

                                                              /*外键约束*/

   );  


技术分享2.修改基本表结构

   修改基本表的结构包括增加删除修改表的属性列默认值约束条件

语法:

ALTER TABLE<基本表名>

  [ADD<新列名> <数据类型>[列级完整性约束]]

  [DROPCOLUMN<列名>]

  [MODIFY<列名> <新的数据类型>]

  [ADDCONSTRAINT<完整性约束>]

  [DROPCONSTRAINT<完整性约束>];

例:Student表中增加一个身高“Height”属性列,数据类型为INT

   ALTER TABLE Student ADDHeight INT;


例:Student表中的“Height”属性列的数据类型改为real

  ALTER TABLE Student MODIFYHeight real;

例:删除Student表中新增加的“Height”属性列。

   ALTER TABLE Student DROP

                             COLUMNHeight;

增加完整性约束

例:Student表中“Height”属性列增加一个CHECK约束,要求学生的身高要超过140厘米才行。

ALTER TABLE Student ADDCONSTRAINTChk1CHECK(Height>140);

 Chk1Height属性列上新增加的CHECK约束的名字。

例:删除“Height”属性列上的Chk1约束。

ALTER TABLEStudent  DROP

                         CONSTRAINTChk1;

技术分享3.基本表的删除

语法:

     DROP TABLE <表名> [CASCADECONSTRAINTS];

    例:DROPTABLE emp
     
DROPTABLE dept

 ★表一旦被删除,则无法恢复。如果表中有数据,则表结构连同数据,约束一起删除。

    只有表的创建者或者拥有DROPTABLE权限的用户才能删除表。

    如果两张表有主外键约束的话,先删从表(外键表),再删主表。

技术分享二、索引的定义和删除

v有两种重要的索引:聚簇索引(clustered index)和非聚簇索引(non-clustered index)。

1.创建索引

SQL语言中,建立索引使用CREATEINDEX语句,其一般格式为:

CREATE[UNIQUE][CLUSTER]INDEX <索引名>

ON<基本表名><列名>[<次序>][<列名>[<次序>]];

v说明:

UNIQUE:规定此索引为唯一性索引。每一个索引值只对应于表中唯一的记录。

CLUSTER:规定此索引为聚簇索引。省略CLUSTER则表示创建的索引为非聚簇索引。

<次序>:建立索引时指定列名的索引表是ASC(升序)或DESC(降序)。若不指定,默认为升序。

例:StudentCourseSC三张表建立索引。其中Student表按学号Sno升序建唯一索引, Course表按课程号Cno降序建唯一索引,SC表按学号Sno升序和课程号Cno降序建唯一索引。

 

vCREATE UNIQUE INDEX  Index_stu

                                ON  Student(Sno ASC);

 

vCREATE UNIQUE INDEX  Index_Cou

                                ON    Course(Cno DESC);

vCREATE UNIQUE INDEX Index_SC

                                 ON    SC(SnoASC,Cno DESC); 


2.删除索引

v索引可以加快查询速度,但如果数据的增、删、改操作很频繁,系统就会花许多时间来维护索引,导致系统开销增加。

  删除索引的格式为:

        DROP INDEX<索引名>;

例:删除Course表的Index_Cou索引。

         DROP INDEXIndex_Cou;

技术分享

1.插入单个元组

    向基本表中插入数据的语法格式如下:

INSERTINTO <基本表名> [(<列名1><列名2><列名n>)]VALUES<列值1><列值2><列值n>) 

4-64】向学生表中指定的属性列插入数据

         INSERT INTOStudent1(Sno,Sname,Sex)

VALUES(‘05880112‘,‘王晓五‘,‘‘);

2.插入多个元组

向基本表中插入数据的语法格式如下:

 INSERT INTO<基本表名>[(<列名1><列名2><列名n>)] 子查询;

4-65】如果已经创建了课程平均成绩记录表course_avgcno,ave),其中ave表示每门课程的平均成绩,向course_avg表中插入每门课程的平均成绩。

INSERTINTOCourse_avg(Cno,Ave)

SELECTCno,AVG(Grade)

FROMSC

GROUPBY Cno;

4.4.2修改数据

如果表中的数据出现错误,可以利用UPDATE命令进行修改。

    UPDATE语句用以修改满足指定条件的元组信息。

UPDATE语句一般语法格式为:

UPDATE<基本表名>

SET<列名1>= <表达式>[<列名2> = <表达式>]…

[WHERE<条件>] ;

 其中,UPDATE关键字用于定位修改哪一张表,SET关键字用于定位修改这张表中的哪些属性列,WHERE<条件>用于定位修改这些属性列当中的哪些行。

4-66】java课程的学分改为5学分。

        UPDATECourse

        SET Credit=5

        WHERECname=java;

2.修改多个元组的值

4-67】将所有男同学的年龄增加2岁。

                  UPDATEStudent

                  SETAge=Age+2

                  WHERESex=;

4-68】 将所有课程的学分减1

                  UPDATECourse

                  SETCredit=Credit-1;

3.带子查询的更新

4-69】将所有选修java课程的学生成绩改为0分。

    

      UPDATE SC

      SET Grade=0

      WHEREjava= (SELECT Cname

                                  FROM Course

                                  WHERE Course.Cno=SC.Cno);

4.4.3删除数据

DELETE语句的一般语法格式为

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

1.删除某一个元组的值

4-70】删除学号为“05880110”的学生记录。

                  DELETE  FROM  Student 

                  WHERESno=‘05880110‘;

2.删除多个元组的值

4-71】删除学号为“05880102”学生的选课记录。

             DELETE FROM SC

             WHERESno=‘05880102‘;

       每一个学生可能选修多门课程,所以DELETE语句会删除这个学生的多条选课记录。

4-72】删除所有学生的选课记录。

                  DELETE FROM SC;

3.带子查询的删除

4-73】删除张三同学的选课记录。

     DELETEFROMSC

     WHERE张三‘= ( SELECT Sname

                                 FROM  Student

                                 WHERE Student.Sno=SC.Sno);

SELECT 语句完整的句法:

    其基本格式为:

SELECT[ALL|DISTINCT] <目标列表达式>[<目标列表达式>]…

FROM<表名或视图名>[<表名或视图名>]…

[WHERE<条件表达式>]

[GROUPBY<列名1> [ HAVING <组条件表达式>]]

[ORDER BY<列名2> [ ASC|DESC]];

其中:

SELECT子句说明要查询的数据。ALL表示筛选出数据库表中满足条件的所有记录,一般情况下省略不写。DISTINCT表示输出结果中无重复记录

FROM子句说明要查询的数据来源。

WHERE子句指定查询条件。

GROUPBY子句表示在查询时,可以按照某个或某些字段分组汇总HAVING子句必须跟随GROUPBY一起使用,表示在分组汇总时,可以根据组条件表达式筛选出满足条件的组记录。

ORDERBY子句表示在显示结果时,按照指定字段进行排序ASC表示升序,DESC表示降序,省略不写默认情况下是ASC

2)查询全部列

查询全部课程的详细记录。

                SELECT  * 

                FROM    Course;


4)指定别名来改变查询结果的列标题

         方法就是:在列名的后面加上一个空格或者是as”,然后写上它的别名。在查询结果显示时就用别名代替列名了。

查询全体学生的姓名、性别及其出生年份。

    SELECT Sname,Sex,2011-age  出生年份

   FROM Student;

2.选择表中若干行

    选择表中若干行,这就是选择运算

1)消除取值重复的行

查询所有选修了课程的学生学号。

                SELECTSno

                FROM    SC;

        由于存在一名同学选修多门课程的情况,所以查

询的结果中包含了许多重复的行。如果想去掉重复的

行,必须指定DISTINCT关键字。

                SELECTDISTINCTSno

                FROMSC;

2.选择表中若干行

    选择表中若干行,这就是选择运算

1)消除取值重复的行

查询所有选修了课程的学生学号。

                SELECTSno

                FROM    SC;

        由于存在一名同学选修多门课程的情况,所以查

询的结果中包含了许多重复的行。如果想去掉重复的

行,必须指定DISTINCT关键字。

                SELECTDISTINCTSno

                FROMSC;

    查询满足条件的元组是通过WHERE子句实现。在WHERE子句中常用的查询条件如表所示。

技术分享

比较大小

查询数学系全体学生的姓名。

                 SELECTSname

                 FROM Student

                 WHERE Dept =‘数学系;

查询年龄超过20岁的学生姓名及其年龄。

                    SELECTSname,Age

                    FROM Student

                    WHERE Age>20;

查询考试成绩有不及格的学生的学号。

             SELECTDISTINCTSno

             FROM   SC

             WHERE Grade<60;

        语句中使用了DISTINCT关键字,目的是当某一个

学生有多门课程不及格时,他的学号只显示一次。

确定范围(谓词BETWEEN AND

查询年龄在1620岁(包括16岁和20岁)之间的学生姓名和年龄。

               SELECTSname,Age

               FROM Student

               WHEREAge BETWEEN 16 AND 20;

确定集合(谓词IN

查询计算机系、日语系和管理系的学生姓名和性别。

SELECTSname,Sex

FROMStudent

WHEREDept IN(‘计算机系, ‘日语系, ‘管理系);

字符匹配(谓词LIKE

  

    谓词LIKE可以用来进行字符串的匹配。

v其中:

    % (百分号)代表任意长度(长度可以为0)的字符串。

     __(下横线)代表任意单个字符。

查询所有姓张的学生姓名、年龄和系别名称。

   

                   SELECTSname,Age,Dept

                   FROMStudent

                   WHERESnameLIKE ‘%‘;

     如果换成NOT LIKE,表示不姓张的同学。

查询姓名中,第二个汉字是“七”的学生姓名和年龄。

              SELECTSname,Age

              FROM    Student

              WHERESnameLIKE ‘_% ‘;

如果用户查询的匹配字符串本身就含有%_,这时就要使用ESCAPE’<换码字符>’短语对通配符进行转义。

查询以“jsp_”开头,且倒数第2个字符为g的课程的详细信息

SELECT   *

FROM     Course

WHERE  Cname LIKE ‘jsp\_%g_‘   ESCAPE ‘\‘;

涉及空值的查询

查询选修了课程,但没有成绩的学生学号和相应的课程号。

                    SELECTSno,Cno

                    FROM    SC

                    WHEREGrade IS NULL;

注意:这里“IS”不能用等号 “=” 代替。

查询选修了课程,并且有成绩的学生学号和相应的课程号。

                      SELECTSno,Cno

                      FROM     SC

                      WHERE  Grade IS NOT NULL;

多重条件查询

 逻辑运算符ANDOR可用来联结多个查询条件。AND的优先级高于OR,但用户可以通过括号来改变优先级。

查询日语系女同学的姓名和年龄。

       SELECTSname,Age

       FROM    Student

       WHEREDept=‘日语系AND Sex=‘‘;

技术分享v聚组函数分类
计数

COUNT[DISTINCT|ALL] *:统计所有行数(元组个数)

COUNT[DISTINCT|ALL] <列名>:统计某一列中值的行数

计算总和(返回一列值的和,该列必须是数值型

SUM[DISTINCT|ALL] <列名> 

计算平均值(返回一列值的平均值,该列必须是数值型

AVG[DISTINCT|ALL]<列名>

最大最小值(返回一列值中的最大值和最小值)

    MAX[DISTINCT|ALL]<列名>

   MIN[DISTINCT|ALL]<列名>

例:查询学生表中的总人数

  法一:select   count(*)

             from     student;

   法二:select   count(sno)

             from     student;

例:查询选修了课程的学生总人数

         select   count( distinct sno)

         from     sc;

例:查询选修c3课程的平均成绩、最高成绩和最低成绩

    select  avg(grade),max(grade),min(grade)

    from    sc

    where  cno=‘c3‘;

例:查询学号为05880101学生选修课程的成绩  总和

      select  sum(grade)

      fromsc

      where  sno=‘05880101‘;

vGROUP BY子句分组:  细化聚组函数的作用对象
未对查询结果分组,聚组函数将作用于整个查询结果;
对查询结果分组后,聚组函数将分别作用于每个组;
作用对象是查询的中间结果表;
按指定的一列或多列值分组,值相等的为一组.

例:查询选修3门及其以上课程的学生学号

         SELECTSno

         FROM SC

         GROUP BY Sno

         HAVING COUNT(Cno)>=3;

技术分享使用group by having子句需注意技术分享

v带有group by子句的查询语句中,在select子句中指定的列要么是group by子句中指定的列,要么包含聚组函数,否则出错。
v可以使用多个属性列进行分组。
v聚组函数只能出现在select,having,order by 子句中。在where 子句中是不能使用聚组函数的。

HAVING子句与WHERE子句的区别

WHERE子句的作用是在分组之前过滤数据。  

   WHERE条件中不能包含聚组函数

  使用WHERE条件选择满足条件的

HAVING子句的作用是在分组之后过滤数据

   HAVING条件中经常包含聚组函数

  使用HAVING条件选择满足条件的

   使用HAVING子句时必须首先使用GROUP BY进行

   分组

v查询每个学生的学号和平均成绩;

  select sno,avg(grade)

  from sc

  group by sno;

v为评选一等奖学金,需查询平均成绩>80的学生的学号及其平均成绩。

   selectsno,avg(grade)

   from sc

   group by sno

   having avg(grade)>80;

5.对查询结果进行排序

             ORDERBY子句可指定按照一个或多个属性列的升序(ASC或者降序(DESC重新排列查询结果。省略不写,默认为升序排列

注意order by 子句只能用于最终的查 询结果。

例:查询选修c3课程的学生学号及成绩,查询结果按照成绩的降序排列

     SELECTSno,Grade

     FROM    SC

     WHERECno=‘c3‘

     ORDER BY Grade DESC;    

查询男生的人数大于50人的系别名称以及男生人数,要求结果按照系别名称进行升序排列.

Select      dept, count(sno)

From       student

Where      sex=

Group bydept

Having     count(sno)>50

Order by deptasc;

技术分享4.3.3 连接查询

连接查询是指通过两个或两个以上的关系表或视图的连接操作来实现的查询。

连接查询是关系数据库中最主要的查询,包括等值连接非等值连接自然连接自身连接外连接复合条件连接等。

1.等值连接

u当连接运算符为=”时,称为等值连接。使用其他运算符时,称为非等值连接。

例:查询每个同学基本信息及其选修课程的情况。

  
         SELECT  Student.*, SC.*
           
FROM     Student, SC
           
WHERE  Student.Sno=SC.Sno;

2.自然连接

    如果是按照两个表中的相同属性进行等值连接,并且在结果中去掉了重复的属性列,我们称之为自然连接

例:用自然连接来完成查询每个同学基本信息及其选修课程的情况。

 SELECT Student.Sno,Sname,Sex,Age,Dept,Cno,Grade

 FROM   Student, SC

 WHERE  Student.Sno=SC.Sno;

技术分享

3.复合条件连接

连接条件用于多个表之间的连接,限制条件用于限制所选取的记录要满足什么条件,这种连接称为复合条件连接。

 例:查询选修课程号为c1,并且成绩不及格的学生学号、姓名和系别名称

SELECTStudent.Sno,Sname,Dept

FROM   Student,SC

WHERE Student.Sno=SC.Sno      /*连接条件*/

               and Cno=c1                   /*限制条件*/

               and Grade<60;                /*限制条件*/

4.自身连接

:SC表中查询至少选修课程号为c1c2的学生学号

 select  x.sno

 from   sc  x,sc  y

 where x.sno=y.sno

          andx.cno=‘c1‘

          and  y.cno=‘c2‘ ;


5. 外连接

例:查询每个学生及其选修课程的情况(若某一个学生没有选课,只输出学生的基本情况信息,其选课信息为空值。)

   SELECT   Student.Sno,Sname, Sex , age , dept, Cno, Grade

    FROM  Student ,SC

    WHERE  Student.Sno=SC.Sno(+)

外连接的操作符是+。(+)号放在连接条件中信息不完全的

那一边(即没有匹配行的那一边)。

u外连接运算符(+)出现在连接条件的右边,称为左外连接
u外连接运算符(+)出现在连接条件的左边,称为右外连接

嵌套查询(多表查询)

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

Select sname

fromstudent

wheresnoin

(selectsno

  fromsc

  wherecno=c2);

 1、不相关子查询
   子查询的查询条件不依赖父查询,这类子查询称为不相关子查询

        不相关子查询的执行过程先执行子查询,将子查询的结果作为父查询的条件,然后执行父查询。

不相关子查询的特点

Select  sname

from   student

wheresnoin

(select  sno

  from   sc

 where  cno=‘c2‘);

<1> 子查询能够独立执行,不依赖于外层父查询
<2> 子查询只执行一次。

<3> 先执行子查询,后执行父查询

1)带有IN谓词的子查询

:查询选修课程号为c2的学生姓名。

   方法一:采用多表连接查询实现

SELECTSname

FROM    Student,SC

WHEREStudent.Sno=SC.Snoand Cno=‘c2‘;

:查询选修课程号为c2的学生姓名。

方法二:采用不相关子查询实现

SELECTSname

FROM    Student

WHERESnoIN

                  ( SELECTSno

                     FROM    SC

                     WHERECno=‘c2‘);

执行过程:先执行子查询,得到选修c2课程的学生学号的集合,然后将该集合作为外层父查询的条件,执行父查询,从而得到集合中学号对应的学生姓名。

2)带有比较运算符的子查询

可以用><=>=<=!=<>等比较运算符。 

例:查询与学号“05880101”学生在同一系别的学生学号和姓名。

  SELECT Sno,Sname

  FROM   Student

  WHEREDept= ( SELECTDept

                               FROM Student

                               WHERESno=05880101);

也可以用前面学习的IN谓词代替=来实现。

注意:当子查询的结果是单个值时,谓词in=的作用是等价的。当子查询的结果是多个值时,只能用谓词in

3)带有ANY谓词或ALL谓词的子查询

注意:使用anyall谓词前必须同时使用比较运算符

技术分享

例:查询选修课程号为c2的学生姓名。

    (IN=ANY等价)

      SELECTSname

      FROM   Student

      WHERESno=ANY

                            ( SELECTSno

                              FROM     SC

                              WHERE  Cno=c2);

例:查询比所有男同学年龄都大的女同学的学号、姓名和年龄。

SELECTSno,Sname,Age

FROM    Student

WHERE Sex= and Age>all

                                             (SELECTAge

                                             FROM    Student

                                              WHERESex=);

    聚组函数实现子查询通常比直接用ANYALL查询效率高,ANY与ALL与聚组函数的对应关系如表所示。

技术分享

技术分享

1)带有比较运算符的相关子查询 

:查询所有课程成绩均及格的学生学号和姓名。

   SELECTSno,Sname

   FROM    Student

   WHERE  60<=( SELECT MIN(Grade)

                      FROM    SC

              WHEREStudent.Sno=SC.Sno);

2)有EXISTS谓词的子查询 

1. EXISTS谓词

n存在量词$
n带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true或逻辑假值“false
?若内层查询结果非空,则外层的WHERE子句返回真值
?若内层查询结果为空,则外层的WHERE子句返回假值
?

2. NOT EXISTS谓词

?若内层查询结果非空,则外层的WHERE子句返回假值
?若内层查询结果为空,则外层的WHERE子句返回真值

v3.exists引出的子查询,其目标列表达式通常用*,因为带

      exists的子查询只返回真值或假值,给出列名无实际的意义。

例:查询选修c2课程的学生姓名。 

            select  sname

            from    student

            where exists

                     (  select  *

                        from   sc

                        where student.sno=sc.sno

                                    and cno=‘c2‘);

:假设全体同学都选修了相应的课程且有成绩,那么查询所有课程成绩均大于80分的学生学号和姓名。

 SELECTSno,Sname

 FROM   Student

 WHERE  NOTEXISTS

                      ( SELECT *

                        FROM    SC 

                        WHERE Student.Sno=SC.Sno     

                                       and  Grade<=80);


技术分享4.5 视图

v视图是从一个或几个基本表(或视图)导出

的表,它与基本表不同,是一个虚表

v视图一经定义,就可以和基本表一样被查

询、被删除,我们也可以在一个视图之上再定

义新的视图,但对视图的更新(增加、删除、修

)操作则有一定的限制。

视图的特点

1视图是从现有的一个或多个表中提取出来的,可以屏蔽表中的某些信息。

2视图是一个虚表,对视图的操作实际上是对基本表的操作。

3数据库中只存放视图的定义,不存放视图对应的数据。这些数据仍存放在原来的基本表中,所以基本表中的数据发生变化,从视图中查询的数据也就随之改变了。

4.视图可以简化用户查询操作,隐蔽表之间的连接。

1.创建视图

CREATEVIEW<视图名>

      [<列名1>,<列名2>,]

      AS  SELECT  查询语句

      [WITHCHECK OPTION]

     [WITH READ ONLY]; 

★ WITH CHECK OPTION表示对视图进行UPDATEINSERTDELETE操作时,系统需检查该操作的数据是否满足子查询中WHERE子句里限定的条件,若不满足,则系统拒绝执行。

WITH READ ONLY选项保证在视图上不能进行任何DML操作。

 例:建立计算机系学生的视图,包括学号、姓名、性别和年龄。并要求进行插入和修改操作时仍要保证此视图中只有计算机系的学生。

           CREATEVIEWCS_Student

            AS

           SELECTSno,Sname,Sex,Age

           FROMStudent

           WHEREDept=‘计算机系

           WITH CHECK OPTION;

 例:建立计算机系学生的只读视图,包括学号、姓名、性别和年龄。 

           CREATEVIEWCS_Student_Only

             AS

            SELECTSno,Sname,Sex,Age

            FROM     student

            WHEREDept=计算机系

            WITH READ ONLY;

       视图CS_Student_Only一旦建立,

不允许在视图上进行任何DML操作。 

 例:建立一个记录每个系别学生人数的视图,包括系别名称和学生人数。

            CREATEVIEWDept_Count(Dept,Num)

            AS

            SELECTDept,Count(Sno)

            FROM    Student

            GROUP BYDept;

注意:由于AS子句中select语句的目标列学生人数是通过使用聚组函数得到的,所以create view中必须明确定义组成dept_count视图的各个属性列名,必须使用列别名来命名表达式count(sno)

2.删除视图

 语法:DROPVIEW<视图名>           

    视图删除后从数据字典中删除该视图的定义。但由该视图导出的其他视图仍然存在,不过无效了。

   :DROP  VIEWCs_Student;

4.5.2查询视图

例:在计算机系学生的视图中查找男同学的信息。

                        SELECT  *

  FROM   CS_Student

                       WHERESex=;

视图消解转换后的查询语句为:

CREATEVIEWCS_Student

            AS

           SELECTSno,Sname,Sex,Age

           FROMStudent

           WHEREDept=‘计算机系

           WITH CHECK OPTION;

 

SELECTSno,Sname,Sex,Age

FROM    Student

WHEREDept=计算机系and Sex=;

4.5.3操纵视图

    操纵视图是指通过视图来插入(INSERT)、删除(DELETE)和修改 (UPDATE)数据。

 

     同查询视图一样,由于视图是不实际存储数据的虚表,因此对视图的操纵,最终要转换为对基本表的操纵

 例:建立数学系学生的视图,包括学号、姓名、性别和系别名称。

           CREATE VIEWMath_Student

          AS

          SELECTSno,Sname,Sex,dept

          FROM    Student

          WHEREDept=数学系;

1.对视图的数据插入

例:向数学系学生的视图中插入一个新的学生记录,其中学号为“05880118”,姓名为“张新”,性别为“女”,系别为“数学系”。

 

      INSERT INTOMath_Student

      VALUES(‘05880118‘,‘张新‘,‘‘,‘数学系‘);

      上述语句在执行时,将转换成对学生表student的数据插入:

     INSERTINTOStudent

     VALUES(‘05880118‘,‘张新‘, ‘‘,NULL, ‘数学系‘);

例:将数学系学生的视图中,学号为“05880118”的学生姓名改为“张心”

 

          UPDATEMath_Student

          SET Sname= ‘张心

          WHERESno= ‘05880118‘;

       上述语句在执行时,将转换成对学生表Student的数据修改:

         UPDATEStudent       

         SET  Sname= ‘张心

         WHERE Sno= ‘05880118‘ and Dept=‘数学系‘;

例:从数学系学生的视图中,删除学号为“05880118”

的学生记录。

          DELETE FROMMath_Student

          WHERESno= ‘05880118‘;

      上述语句在执行时,将转换成对学生表student的数据删除:

          DELETE FROMStudent

          WHERESno= ‘05880118‘ and Dept=‘数学系‘;


版权声明:本文为博主原创文章,未经博主允许不得转载。

SQL基本语句

标签:

原文地址:http://blog.csdn.net/wangfengfan1/article/details/46874653

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!