zoukankan      html  css  js  c++  java
  • (五) 结构化查询语言SQL——3

    4. 数据更新

    1)增

    对应INSERT语句。格式为INSERT INTO T[(A1,…,Ak)]  VALUES (C1,…,Ck),其中A代表表T的属性,C代表常量,A可以缺省,此时C必须严格按照基本表T定义的属性顺序提供相应的值,否则A可以是任何顺序,并且也可以是不完整的,即可以只列举基本表的若干属性。例如插入一个选课记录,学号为20142480135的学生选修了课程号为MA302的课程,

    INSERT INTO SC (Sno,Cno)

    VALUES ('20142480135','MA302');

    基本用法较为简单,但是插入有跟=更高级的用法,即插入查询结果,即上面VALUES语句改为SELECT语句,只是SELECT选择的属性要和要插入的属性保持一致。

    注:当SELECT语句中出现常量时,会将查询结果中的每个元组的值均取该值。

    2)删

    对应DELETE语句。基本格式为DELETE FROM T [ WHERE <删除条件> ],整体比较简单,例如删除学号为20142480135的学生信息

    DELETE FROM Student

    WHERE Sno = '20142480135';

    没有WHERE时,代表删除一个表中所有的记录(不是删除表,而是清空表)

    DELETE FROM Student

    同样的,这里也能使用SELECT代替WHERE语句,例如删除所有软件工程学生的选课记录

    DELETE FROM SC

    WHERE Sno IN

      (SELECT Sno

      FROM Student

      WHERE Speciality = '软件工程');

     

    3)改

    对应UPDATE语句。基本格式:UPDATE T SET A1 = C1,…,Ak = Ck [WHERE <查询条件> ]

    基本用法很好理解,直接上例子,修改学号为20142480135学号的学生MA302课程成绩为90:

    UPDATE SC

    SET Grade = 90

    WHERE Cno = 'MA302' AND Sno = '20142480135';

    再来,修改姓名武一鸣,课程名称微积分的课程分数为90

    UPDATE SC

    SET Grade = 90

    WHERE Cno IN (

    SELECT Cno

    FROM Course

    WHERE Cname = '微积分'

    AND Sno IN (

    SELECT Sno

    FROM Student

    WHERE Sname = '武一鸣'); 

    5. 视图

    视图是一种命名的导出表,并不物理的存储在数据库中。

    1)视图创建和删除

    CREATE VIEW <视图名> [ (<列名>,…,<列名>) ]

    AS <查询表达式>

    [WITH CHECK OPTION]

    查询表达式通常不带DISTINCT和ORDER BY的SELECT语句,其中列名可以缺省,不过只能是SELECT语句选择的结果时属性时,(你问还有什么?还有聚集函数、常数等等啊),WITH CHECK OPTION这句短语代表视图是可更新的。(你为什么不起名updatable啊??)

    视图到底有什么用呢?我直接创建一个这样表不就行了?接下俩有时间我可能会介绍数据库设计理论,数据库必须要符合相应的范式,切不可随意设计,因为数据库设计不好会导致后面开发工作寸步难行。所以视图是有必要的。这是我理解的视图作用,而不是教科书中的那样几点,包括查询简洁、逻辑独立、安全保护和提供不同角度看待相同数据。

    创建软件工程学生成绩视图:

    CREATE VIEW STU_GRADE

    AS SELECT Sno,Cno,Cname,Sname,Grade

    FROM SC,Student,Course

    WHERE SC.Cno = Course.Cno AND 

    SC.Sno = Student.Sno AND 

    Speciality = '软件工程';

    删除和基本表相同:DROP VIEW <视图名> { CASCADE | RESTRICT }

    2)基于视图的查询和更新

    事实上与基本表并无任何区别,就是FROM后面紧跟的基本表名改为视图名即可;但是除了视图还可以使用不命名的导出表,除了能改成视图名之外,还可以进一步改为视图的定义,例如:

    SELECT * 

    FROM ( SELECT Sno,Cno,Cname,Sname,Grade

    FROM SC,Student,Course

    WHERE SC.Cno = Course.Cno AND 

    SC.Sno = Student.Sno AND 

    Speciality = '软件工程') AS STU_GRADE

    WHERE Sname = '武一鸣'; (不知道AS STU_GRADE是不是必须的?)

    6. 模式Schema和索引Index

    之前刚开始看到模式是还是有点懵的,不知道这有什么用,只是看到定义说是“支持SQL的DBMS环境”,囊括所有SQL对象,包括关系、视图、索引和函数等。我认为,注意是我认为,这里的模式SCHEMA应该同MySQL中的DataBase是同一个概念,有删除和创建的用法:

    CREATE SCHEMA (DATABASE) MY_SCHEMA AUTHORIZATION WuYiming;

    即为用户Wuyiming创建一个MY_SCHEMA 的模式(数据库),后面的AUTHORIZATION WuYiming是可以省略的,代表不想任何用户授权。还可以不写名字,

    CREATE SCHEMA (DATABASE) AUTHORIZATION WuYiming;

    这样模式(数据库)的名字就和用户名一样了。

    删除模式则是和视图基本表等同样的操作

    DROP SCHEMA MY_SCHEMA CASCADE;

    至于索引,是为了优化查找速度而对某些属性建立的,通常DBMS会为主码建立索引。建立索引的语句格式为:

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

     ON <表名> ( <列名> [ <次序> ],…,<列名> [ <次序> ] 

    其中次序包括ASC和DESC两种情况,缺省为ASC,UNIQUE 表示唯一性索引,CLUSTER表示聚簇索引。

    聚簇索引查询效率比非聚簇索引高,但是维护代价高,且一个基本表上只能有一个聚簇索引。

    删除索引,DROP INDEX <索引名>

  • 相关阅读:
    八张图读懂未来“互联网+”的六大趋势
    跑一段代码遍历所有汉字
    PHP业务逻辑层和数据访问层设计
    漫谈社区PHP 业务开发
    以Apache服务器、php语言为例 详解动态网站的访问过程
    sublime text
    《产品经理的20堂必修课》
    检测文件是否有bom头
    利用开源框架Volley来下载文本和图片。
    往SD卡中写文件的方法。
  • 原文地址:https://www.cnblogs.com/lbrs/p/11330161.html
Copyright © 2011-2022 走看看