SQL语言

来自姬鸿昌的知识库
跳到导航 跳到搜索

https://www.bilibili.com/video/BV1hg411V7Bm/?p=94

1)创建表

CREATE TABLE <表名1> (

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

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

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

数据类型:

  • 字符型:char(N)
  • 整型:int
  • 浮点型:float
  • 日期型:date YYYY-MM-DD


列级完整性约束:

  • NULL(可以取空值)、NOT NULL(不能取空值)
  • UNIQUE(取值唯一)
  • PRIMARY KEY(列名)主键
  • FOREIGN KEY(列名1) REFERENCES 表名2(列名2)外键


例题1:设有学生、课程和学生选课关系模式分别用基本表S、C和SC表示,

其中:S(Sno,Sname,SD,Sage,Sex),属性表示学号、姓名、系、年龄和性别;

C(Cno,Cname,teacher),属性表示课程号、课程名和授课教师;

SC(Sno,Cno,Grade),属性表示学号、课程号和成绩。

除年龄与成绩的数据类型为整型int外,其余属性均为字符型char。

CREATE TABLE S (
      Sno char(5) PRIMARY KEY,
      Sname char(16) NOT NULL,
      SD char(10),
      Sage int,
      Sex char(2)
);


CREATE TABLE C(
     Cno char(2) PRIMARY KEY,
     Cname char(16) UNIQUE,
     teacher char(8)
);


CREATE TABLE SC (
    Sno char(5),
    Grade int,
    PRIMARY KEY(Sno, Cno),
    FOREIGN KEY(Sno) REFERENCES S(Sno),
    FOREIGN KEY(Cno) REFERENCES C(Cno)
);



考点1:创建表

某高校教学管理系统中的院系关系 Department 和学生关系 Students 的模式分别为:

Department(院系号,院系名,负责人,办公电话),学生关系 Students(学号,姓名,身份证号,院系号,联系电话,家庭住址)。

Department 中的“院系号”唯一标识一个院系,Students 中的“学号”能唯一标识一名学生,“家庭住址”可进一步分为邮编、省、市、街道。

根据以上描述可知,关系 Students 的候选键为(),

A、学号

B、身份证号和院系号

C、学号和身份证号 √

D、学号和院系号

“家庭住址”为()。

A、简单属性

B、复合属性 √

C、多值属性

D、派生属性


某高校教学管理系统中的院系关系 Department 和 学生关系 Students。

Department 中的“院系号”唯一标识一个院系,Students 中的“学号”能唯一标识一名学生。

创建 Students 的SQL语句如下,请填补其中的空缺。

CREATE TABLE Students (

学号 CHAR(8) PRIMARY KEY,

姓名 CHAR(16),

身份证号 CHAR(18),

院系号 CHAR(4),

联系电话 CHAR(13),

家庭住址 CHAR(30),

FOREIGN KEY();

A、(联系电话) REFERENCES Department(办公电话)

B、(院系号) REFERENCES Department(院系号) √

C、(院系号) REFERENCES Students(学号)

D、(负责人号) REFERENCES Students(学号)


2)修改和删除

ALTER TABLE <表名>

[ADD <新列名><数据类型><列级完整性约束条件>] 添加属性列

[DROP <列名/完整性约束条件>] 删除属性列

[MODIFY/CHANGE<列名><数据类型>] 修改属性列的数据类型

[CHANGE <列名><新列名><数据类型>] 修改属性列名


DROP TABLE <表名> 例如用“DROP TABLE Student”删除表 Student

3)数据更新

操作类别 语法 示例
插入数据 INSERT INTO <表名>

[(<属性列1>

[,<属性列2>……)]

VALUES (<常量1>[,<常量2>]……);

注:VALUES子句可用子查询替代

INSERT INTO student

VALUES ('95020', '李四', '男', 'CS', '18');

INSERT INTO SC(Sno, Cno)

VALUES('95020', '1');

修改数据 UPDATE <表名>

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

[WHERE <条件>];

将学生95001的年龄改为23岁

UPDATE student

SET Sage=23

WHERE Sno='95001';

删除数据 DELETE

FROM <表名>

[WHERE <条件>];

删除学号为95019的学生记录

DELETE FROM student

WHERE Sno='95019';


考点2:数据修改

某数据库系统中,假设有部门关系 Dept(部门号,部门名,负责人,电话),其中,

“部门号”是该关系的主键;员工关系 Emp(员工号,姓名,部门,家庭住址),属性“家庭住址”包含省、市、街道以及门牌号,

该属性是一个(1)属性。

(1)

A、简单

B、复合 √

C、多值

D、派生

创建 Emp 关系的SQL语句如下:

CREATE TABLE Emp(

员工号 CHAR(4) (2),

姓名 CHAR(10),

部门 CHAR(4),

家庭住址 CHAR(30),

(3);

)

(2)

A、PRIMARY KEY √

B、NULL

C、FOREIGN KEY

D、NOT NULL

(3)

A、PRIMARY KEY NOT NULL

B、PRIMARY KEY UNIQUE

C、FOREIGN KEY REFERENCES Dept(部门名)

D、FOREIGN KEY REFERENCES Dept(部门号) √



某数据库系统中,假设有部门关系 Dept(部门号,部门名,负责人,电话),其中,

“部门号”是该关系的主键;员工关系 Emp(员工号,姓名,部门,家庭住址),

为在员工关系 Emp 中增加一个“工资”字段,其数据类型为数字型并保留2位小数,可采用的SQL语句为()。

A、ALTER TABLE Emp ADD 工资 CHAR(6,2)

B、UPDATE TABLE Emp ADD 工资 NUMERIC(6,2)

C、ALTER TABLE Emp ADD 工资 NUMERIC(6,2) √

D、ALTER TABLE Emp MODIFY 工资 NUMERIC(6,2)


4)创建索引

https://www.bilibili.com/video/BV1hg411V7Bm/?p=95

索引是某个表中的一列或者若干列值的集合,以及相应的指向表中物理标识这些值的数据页的逻辑指针清单。


聚集索引确定表中数据的物理顺序。

由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。

但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。


非聚集索引的逻辑顺序与磁盘上行的物理存储顺序不同。


CREATE——创建索引

ALTER——修改索引

DROP——删除索引

UNIQUE——建立唯一索引

CLUSTERED——建立聚集索引

NONCLUSTERED——建立非聚集索引

ASC——索引升序排序

DESC——索引降序排序


CREATE UNIQUE INDEX S_SNO ON S(Sno);

CREATE UNIQUE INDEX SPJ_NO ON SPJ(Sno ASC, Pno DESC, JNO ASC);


5)查询语句

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

FROM <表名>[<表名>]……

[WHERE <条件表达式>]

[GROUP BY <列名1> [HAVING <条件表达式>]]

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

处理类型 处理子类 示例/语法
结果排序 升序或降序 ORDER BY 字段名 DESC|ASC
集函数 统计 COUNT([DISTINCT|ALL]<列名>)
计算一列中值的总和 SUM([DISTINCT|ALL]<列名>)
计算一列值的平均值 AVG([DISTINCT|ALL]<列名>)
求一列值中的最大值 MAX([DISTINCT|ALL]<列名>)
求一列值中的最小值 MIN([DISTINCT|ALL]<列名>)
对结果分组 将查询结果按列值分组 GROUP BY <列名>
对分组结果筛选 对分组结果筛选 HAVING<条件表达式>



5)查询语句——简单查询

最简单的查询是找出关系中满足特定条件的元组。

只需要使用3个保留字 SELECT、FROM 和 WHERE。

设有学生、课程和学生选课关系,其基本表分别用S、C和SC表示。

S(Sno, Sname, SD, Sage, Sex) 属性表示学号、姓名、系、年龄和性别

C(Cno, Cname) 属性表示课程号、课程名

SC(Sno, Cno, Grade) 属性表示学号、课程号和成绩


□查询学生基本表中计算机系CS的学生学号、姓名及年龄

SELECT Sno, Sname, Sage

FROM S

WHERE SD='CS';

CS表示计算机系


5)查询语句——连接、嵌套查询

若涉及两个以上的表,则称为连接查询


□检索选修了课程号为C1的学生,列出学号和学生姓名

SELECT Sno, Sname

FROM S, SC

WHERE S.Sno=SC.Sno AND SC.Cno='C1';


□检索选修了课程号为C1或C3的学生学号和学生姓名

SELECT Sno, Sname

FROM S, SC

WHERE S.Sno=SC.Sno AND (SC.Cno='C1' OR SC.Cno='C3');


5)查询语句——分组查询

1)GROUP BY 子句

□对于学生数据库中的SC关系,查询每个学生的平均成绩

SELECT Sno, AVG(Grade)

FROM SC

GROUP BY Sno;


2)HAVING 子句

□查询平均成绩大于等于80的学生学号和其平均成绩,并按照学号的降序排列

SELECT Sno, SVG(Grade) as avgGrade

FROM SC

GROUP BY Sno

HAVING AVG(Grade)>=80

ORDER BY S.Sno DESC;


6)别名和匹配

AS子句为关系和属性指定不同的名称或别名

Old-name AS New-name 进行设置别名


LIKE 用于对字符串:%匹配任意字符串 _匹配任意一个字符

例如:

SELECT Sname

FROM S

WHERE Addr LIKE '%科技路%' 匹配含有科技路的地址


SELECT Sname, Sno

FROM S

WHERE Sname LIKE '_小芳' 匹配名为小芳的单姓学生