第三章——关系数据库标准语言SQL

说在前面

本章习题和答案放在最后,答案是我自己写的,如果与我不一样欢迎留言交流。

1,概论

无所谓,跳吧。


2,数据定义

2.1,建表、改表、删表

建表

create table 表名

(属性名1 类型(长度) 约束,

属性名2 类型(长度) 约束,

..........

PRIMARY KEY(指明哪个属性当主键),

FOREIGN KEY(指明外键) REFERENCES 被参考表名(属性名),

CHECK (写入用户定义约束条件)

);

改表

ALTER包括的操作有三种:增加字段(增字段)、改变类型(改类型)、删除约束(删约束);

增字段:ALTER TABLE 表名 ADD 属性名 类型(长度)约束;

改类型:ALTER TABLE 表名 MODIFY 属性名 类型;

删约束:ALTER TABLE 表名 DROP 约束(属性名);

删表

DROP TABLE 表名;


2.2,建立与删除索引

建立索引

CREATE UNIQUE/CLUSTER INDEX 索引名 ON 表名(属性名 ASC/DESC,...);

这里UNIQUE/CLUSTER表示是唯一值索引还是聚簇索引,缺省值是UNIQUE,对于CLUSTER只用记住每张表只能建立一个聚簇索引,并且聚簇只适用于不常更新的属性

删除索引

DROP INDEX 索引名;


3,查询

3.1单表查询(单查)

SELECT [ALL/DISTICNT] 属性名,...(这里可以用*代表所有属性,同时可以对属性名使用算术表达式或者集函数)

FROM 表名

WHERE 查询条件(这里门道很多)

ORDER BY 属性名 ASC/DESC

GROUP BY 属性名;

HAVING 条件;

3.2连接查询(连查)

等值与非等值连接

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;

外连接

一般情况下连接只会给出符合连接条件的结果,但是外连接会在不符合条件是用空行进行连接,根据左外和右外空行填充在不同位置。

SELECT XXX,XXX,XXX...

FROM Student,SC

WHERE Student.Sno=SC.Sno(*)

这就是右外。

3.3嵌套查询(套查)

IN谓词套查

略。

比较符套查

略。

ANY,ALL套查

略。

EXISTS套查

重中之重,EXISTS可以表达存在量词、全称量词和蕴含。那么应该如何转化?

使用存在量词

SELECT Student.Sname

FROM Student

WHERE EXISTS

(SELECT *

FROM SC

WHERE Student.Sno=SC.Sno AND SC.Cno='1'

);

使用了全称量词

全称量词转化存在量词的转化规则为:

全称转存在的规则

SELECT Student.Sname

FROM Student

WHERE NOT EXISTS

(SELECT *

FROM SC

WHERE SC.Sno=Student.Sno AND SC.Cno='1'

);


使用蕴含

蕴含转存在的规则:

蕴含转存在规则

SELECT SC.Sno

FROM SC SCX

WHERE NOT EXISTS

(SELECT * 

FROM Course

WHERE EXISTS

(SELECT * 

FROM SC SCY

WHERE SCY.Sno=95002 AND SCY.Cno=Course.Cno

) AND NOT EXISTS

(SELECT *

FROM SC SCZ

WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=Course.Cno

))


3.4集合查询(集查)

SQL提供了UNION操作符来讲两个集合求并。


4,数据更新

4.1,插入数据

插入单项:

INSERT

INTO 表名(属性们)

VALUES(值们);

插入子查询结果:

INSERT

INTO 表名(属性们)

子查询;

4.2,修改数据

直接改:

UPDATE 表名

SET 属性=值

WHERE 查询条件

带子查询的改:

UPDATE 表名

SET 属性=值

WHERE 查询条件中带有子查询

4.3,删除数据

直接删:

DELETE

FROM 表名

WHERE 查询条件;

带子查询的删:

DELETE

FROM 表名

WHERE 查询条件中带有子查询;


5,视图

5.1,视图的意义

给不同的用户,不同的数据表现。

5.2,定义视图

创建视图

CREATE VIEW 视图名(属性们)

AS 子查询

[WITH CHECK OPTION];

最后的with check option表示对视图进行增删改时要满足子查询中的条件表达式,可选。

视图名后是否需要指定属性名?三种情况需要指定:1,子查询的SELECT中有集函数;2,子查询的SELECT中存在同名属性;3,你想取个更好的名字。当这三种情况时,需要手动指定。

删除视图

DROP VIEW 视图名;

5.3,查询视图

类似于基本表的查询。

5.4,更新视图

类似于基本表的更新。


6,权限控制

6.1,授权

GRANT 权限们(属性们)

ON 对象类型,对象名们

TO 用户们

[WITH GRANT OPTION]

对象类型如DATABASE,TABLE。

WITH GRANT OPTION意味着可以继续授已有的权给别人,可选。

6.2,收权

REVOKE 权限们(属性们)

ON 对象类型,对象名

FROM 用户们;

收权会链式的把所有间接下放的权限收回。


7,嵌入式SQL

SQL通信区。

主变量,在嵌入式SQL中使用的主程序变量。

游标,逐一访问结果集合的东西。


本章习题

解答:

1,sql语言主要特点包括以下5个:

综合统一。即将DDL(数据库定义语言),DML(数据库操作语言),DCL(数据库控制语言)结合在一起,语法清晰简洁。

高度非过程化。只需写清楚做什么不用写怎么做。

面向集合。就是不需要一条一条的操作。

既可以直接使用,也可以嵌入式使用。

简单易学。


2,SQL的定义功能:关系型数据库支持三级模式。外模式即视图,模式即表,内模式包括索引。所以sql的定义功能包括定义与修改表,定义与修改视图,定义与修改索引。


3,略,自己练习。


4,

(1)求供应工程J1的零件供应商号码SNO。

SELECT SNO

FROM SPJ

WHERE JNO=‘J1’;

(2)求供应商J1零件P1的供应商号码SNO。

SELECT SNO

FROM SPJ

WHERE JNO='J1' AND PNO='P1';

(3)求供应商J1零件为红色的供应商号码SNO。

SELECT SPJ.SNO

FROM SPJ,P

WHERE SPJ.JNO='J1' AND SPJ.PNO = P.PNO AND P.COLOR='红';

(4)求没有使用天津供应商的生产的红色零件的工程号JNO。

这个题有点意思,用连接查询或者嵌套查询都是可以的,我在这里用了嵌套查询,算是检验一下自己是不是真的理解了exist的用法,这里我将关系代数中的全称量词转化成NOT EXIST来完成了表达式的构造。我写的这个如果你不熟悉全称量词和存在量词的表达可能很难看懂,这个题用连接表达会更容易理解一些。

SELECT SPJ.JNO

FROM SPJ

WHERE NOT EXIST

(

SELECT *

FROM S

WHERE S.SNO = SPJ.SNO AND SNO.CITY='天津';

) AND NOT EXIST

(

SELECT *

FROM P

WHERE P.PNO = SPJ.PNO AND P.COLOR = '红'; 

);

(5)求至少使用了供应商S1所提供的的全部零件的工程号JNO。

这个题应该是全场最佳,代码很有点复杂,涉及到全称量词和蕴含转化为SQL中的存在量词,我先把后面的题做完再补上。


5,

(1)

SELECT SNAME,CITY

FROM S;

(2)

SELECT PNAME,COLOR,WEIGHT

FROM P;

(3)

SELECT JNO

FROM SPJ

WHERE SNO='S1';

(4)

SELECT P.PNAME,SPJ.QTY

FROM SPJ,P

WHERE SPJ.JNO='J2' AND SPJ.PNO = P.PNO;

(5)

SELECT  DISTINCT SPJ.PNO

FROM S,SPJ

WHERE S.CITY='上海' AND S.SNO=SPJ.SNO;

(6)

SELECT J.JNAME

FROM J,S,SPJ

WHERE SPJ.JNO = J.JNO AND SPJ.SNO = S.SNO AND S.CITY='上海';

(7)

SELECT J.JNAME

FROM J,S,SPJ

WHERE SPJ.JNO = J.JNO AND SPJ.SNO = S.SNO AND S.CITY != '天津';

(8)

UPDATE P

SET COLOR = '蓝'

WHERE COLOR='红';

(9)

UPDATE SPJ

SET SNO='S3'

WHERE JNO='J4' AND SNO='S5' AND PNO = 'P6';

(10)

DELETE 

FROM S

WHERE SNO='S3';

DELETE 

FROM SPJ

WHERE SNO='S3';

(11)

INSERT

INTO SPJ

VALUES('S2','J6','P4',200);


6,视图是从一个或几个基本表(或视图)中导出的数据,它与基本表不同,是一张虚表。数据库中只存有视图的定义,视图的数据依然存放在基本表中。对视图的更新操作会受到WITH CHECK OPTION的限制。加上WITH CHECK OPTION之后,更新视图时要满足子查询中的WHERE后面的条件。


7,视图的优点:

1,简化操作

2,多角度看待同一数据

3,为重构数据库逻辑独立性

4,对机密数据提供保护


8,并不是所有的视图都可以更新,因为有些对视图的更新不能转化为有意义的唯一的基本表的更新。比如修改S_G视图中的平均成绩是不允许的,因为无法导致基本表的正确更新。


9,一般来说,行列子集视图都是允许更新的,除此之外还有某些视图理论上是可以更新的(书上也没具体说)。例子举得就是那个S_G的例子。


10,sorry,我不熟悉系统的视图更新。


11,

CREATE VIEW SANJIAN_PROVISION

AS

SELECT SNO,PNO,QTY

FROM SPJ,J

WHERE J.JNAME='三建' AND J.JNO = SPJ.JNO

WITH CHECK OPTION;


SELECT PNO,QTY

FROM SANJIAN_PROVISION;


SELECT *

FROM SANJIAN_PROVISION

WHERE SNO = 'S1';


12,

GRANT INSERT

ON TABLE S

TO 张勇

WITH GRANT OPTION;


GRANT SELECT,UPDATE(QTY)

ON TABLE SPJ

TO 李天明


13,为了区分SQL语句与主程序语句,所有SQL语句前面都必须加上EXEC SQL。

14,SQL语句通过SQL通信区向主语言传递sql执行状况,主语言通过主变量向SQL传递数据。

15,通过游标进行协调。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354

推荐阅读更多精彩内容

  • 50个常用的sql语句Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname...
    哈哈海阅读 1,231评论 0 7
  • 50个常用的sql语句 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cna...
    最美的太阳WW阅读 3,182评论 0 23
  • 模式 定义模式实际上定义了一个命名空间,在这个空间中 可以进一步 定义该模式包含的数据对象,例如基本表,视图,索引...
    iOS_愛OS阅读 897评论 0 1
  • 十月,深圳下雨 十月,江西下雨 十月,武汉下雨 十月,襄阳下雨 整个十月,我所到过的地方都被氤氲笼罩,在这种缺氧的...
    雙漁侳阅读 220评论 0 1
  • 首先,小歪再告诉你如何训练之前,先要讲讲为什么要进行胸部训练。 1、女生锻炼胸肌能丰胸吗? 女性对于胸部的训练,锻...
    运动闺蜜万小歪阅读 2,852评论 1 21