数据库系统工程师软考备战:第三篇 - SQL语言深入解析与应用
1. SQL语言概述
SQL(Structured Query Language)是关系数据库的标准语言,具有数据定义、数据操纵、数据控制等功能。
1.1 SQL语言特点
- 综合统一:集数据定义、数据操纵、数据控制于一体
- 高度非过程化:只需提出"做什么",无需说明"怎么做"
- 面向集合操作:操作对象和结果都是元组的集合
- 多种使用方式:既可独立使用,也可嵌入到高级语言中
1.2 SQL语言组成
- 数据定义语言(DDL):CREATE、ALTER、DROP
- 数据操纵语言(DML):SELECT、INSERT、UPDATE、DELETE
- 数据控制语言(DCL):GRANT、REVOKE
- 事务控制语言(TCL):COMMIT、ROLLBACK
2. 数据定义语言(DDL)
2.1 基本表操作
创建表:
CREATE TABLE Student (
Sno CHAR(9) PRIMARY KEY,
Sname VARCHAR(20) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept VARCHAR(20)
);
修改表:
ALTER TABLE Student ADD EntranceDate DATE;
ALTER TABLE Student ALTER COLUMN Sage INT;
ALTER TABLE Student DROP COLUMN EntranceDate;
删除表:
DROP TABLE Student;
2.2 索引管理
创建索引:
CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE INDEX Stusname ON Student(Sname);
删除索引:
DROP INDEX Stusname;
3. 数据查询语言(DQL)
3.1 单表查询
基本查询:
SELECT Sno, Sname FROM Student;
SELECT * FROM Student;
SELECT DISTINCT Sdept FROM Student;
条件查询:
SELECT Sname, Sage FROM Student WHERE Sage > 20;
SELECT Sname FROM Student WHERE Sdept = 'CS' AND Sage < 22;
排序查询:
SELECT Sno, Grade FROM SC ORDER BY Grade DESC;
3.2 连接查询
等值连接:
SELECT Student.Sno, Sname, Cname, Grade
FROM Student, SC, Course
WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno;
自然连接:
SELECT Student.*, SC.*
FROM Student NATURAL JOIN SC;
3.3 嵌套查询
IN谓词:
SELECT Sname FROM Student
WHERE Sno IN (
SELECT Sno FROM SC WHERE Cno = '2'
);
比较运算符:
SELECT Sno, Sname FROM Student
WHERE Sage < (
SELECT AVG(Sage) FROM Student
);
EXISTS谓词:
SELECT Sname FROM Student
WHERE EXISTS (
SELECT * FROM SC
WHERE Sno = Student.Sno AND Cno = '1'
);
3.4 集合查询
并操作:
SELECT * FROM Student WHERE Sdept = 'CS'
UNION
SELECT * FROM Student WHERE Sage <= 19;
交操作:
SELECT * FROM Student WHERE Sdept = 'CS'
INTERSECT
SELECT * FROM Student WHERE Sage <= 19;
差操作:
SELECT * FROM Student WHERE Sdept = 'CS'
EXCEPT
SELECT * FROM Student WHERE Sage <= 19;
4. 数据操纵语言(DML)
4.1 插入数据
INSERT INTO Student(Sno, Sname, Ssex, Sage, Sdept)
VALUES ('2023001', '张三', '男', 20, 'CS');
INSERT INTO Student
SELECT * FROM NewStudents;
4.2 修改数据
UPDATE Student SET Sage = Sage + 1;
UPDATE Student SET Sdept = 'IS' WHERE Sdept = 'CS';
4.3 删除数据
DELETE FROM Student WHERE Sno = '2023001';
DELETE FROM SC WHERE Grade IS NULL;
5. 视图
5.1 视图定义
CREATE VIEW CS_Student AS
SELECT Sno, Sname, Sage
FROM Student
WHERE Sdept = 'CS';
CREATE VIEW Student_Grade(Sno, Sname, Cname, Grade) AS
SELECT Student.Sno, Sname, Cname, Grade
FROM Student, SC, Course
WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno;
5.2 视图查询
SELECT Sno, Sage FROM CS_Student WHERE Sage > 20;
5.3 视图更新
UPDATE CS_Student SET Sage = 22 WHERE Sno = '2023001';
INSERT INTO CS_Student VALUES('2023005', '李四', 21);
6. 数据控制语言(DCL)
6.1 权限授予
GRANT SELECT ON TABLE Student TO U1;
GRANT ALL PRIVILEGES ON TABLE Student TO U2;
GRANT UPDATE(Sage) ON TABLE Student TO U3;
6.2 权限回收
REVOKE SELECT ON TABLE Student FROM U1;
REVOKE UPDATE ON TABLE Student FROM U3;
7. 典型试题解析
7.1 选择题
试题1:SQL语言中,实现数据检索的语句是( )
A. SELECT B. INSERT C. UPDATE D. DELETE
解析:正确答案是A。SELECT语句用于数据查询,INSERT用于插入数据,UPDATE用于更新数据,DELETE用于删除数据。
试题2:在SQL语言中,与"NOT IN"等价的操作符是( )
A. = SOME B. <> SOME C. = ALL D. <> ALL
解析:正确答案是D。"NOT IN"等价于"<> ALL",表示不等于所有值。
7.2 综合题
试题:设有三个表:
学生表S(Sno, Sname, Ssex, Sage, Sdept)
课程表C(Cno, Cname, Cpno, Ccredit)
选课表SC(Sno, Cno, Grade)
用SQL语句实现以下查询:
- 查询选修了3门以上课程的学生学号
- 查询所有学生的选课情况(包括没有选课的学生)
- 将计算机系学生的年龄增加1岁
参考答案:
-- 1. 查询选修3门以上课程的学生
SELECT Sno FROM SC
GROUP BY Sno
HAVING COUNT(*) > 3;
-- 2. 查询所有学生的选课情况
SELECT S.Sno, Sname, Cno, Grade
FROM S LEFT JOIN SC ON S.Sno = SC.Sno;
-- 3. 更新计算机系学生年龄
UPDATE S SET Sage = Sage + 1 WHERE Sdept = 'CS';
8. 备考建议
- 熟练掌握SQL语法:特别是SELECT语句的各种用法
- 理解视图概念:掌握视图的定义、查询和更新限制
- 注重实践操作:通过实际数据库环境练习SQL语句
- 理解权限管理:掌握GRANT和REVOKE的使用方法
下一篇我们将讲解数据库设计与ER模型,这是数据库系统设计的重要基础。
本文仅供参考,具体备考请以官方指定教材和考纲为准。