根据提供的实验报告,我们可以归纳出一系列关于T-SQL简单数据库查询的重要知识点,这些知识点涵盖了基本的查询操作以及一些更复杂的查询技巧。
### T-SQL基础知识
#### SELECT 语句的基本语法格式
- `SELECT` 语句是T-SQL中最常用的语句之一,用于从一个或多个表中检索数据。
- 基本格式为:`SELECT column_name(s) FROM table_name;`
- 示例:`SELECT Sno, Sname FROM Student;`
#### 多表查询
- **内连接**:通过使用 `INNER JOIN` 可以连接两个表并返回两表中存在匹配的数据行。
- 示例:查询已选课学生的选课情况包含学生学号、姓名、所选课程、成绩。
```sql
SELECT Student.Sno, Sname, Cname, Grade
FROM Student
INNER JOIN SC ON Student.Sno = SC.Sno
INNER JOIN Course ON SC.Cno = Course.Cno;
```
- **外连接**:包括左外连接 (`LEFT OUTER JOIN`) 和右外连接 (`RIGHT OUTER JOIN`),可以用来查询一个表中所有记录与另一个表中的匹配记录。
- 示例:查询所有学生的选课情况包含学生学号、姓名、课程号、课程名、成绩(包含选课和未选课所有学生)。
```sql
SELECT Student.Sno, Sname, Course.Cno, Cname, Grade
FROM Student
LEFT OUTER JOIN SC ON Student.Sno = SC.Sno
LEFT OUTER JOIN Course ON SC.Cno = Course.Cno;
```
#### 单表查询
- **条件筛选**:使用 `WHERE` 子句来过滤特定条件下的数据。
- 示例:查询计算机系学生的信息。
```sql
SELECT Sno, Sname, Ssex, Sage
FROM Student
WHERE Sdept = '计算机系';
```
- **聚合函数**:如 `COUNT(*)`、`SUM()`、`AVG()`、`MAX()` 和 `MIN()` 用于执行数值计算和统计分析。
- 示例:查询全体学生的人数。
```sql
SELECT COUNT(*)
FROM Student;
```
- **模式匹配**:使用 `LIKE` 操作符进行模式匹配。
- 示例:查询名字中带“阳”的学生信息。
```sql
SELECT *
FROM Student
WHERE Sname LIKE '%阳%';
```
#### 分组与排序
- **GROUP BY** 子句用于将数据按一个或多个列分组。
- 示例:查询每个系中的男生人数并按人数的降序排列。
```sql
SELECT Sdept, COUNT(Ssex)
FROM Student
WHERE Ssex = '男'
GROUP BY Sdept, Ssex
ORDER BY COUNT(Ssex) DESC;
```
- **HAVING** 子句与 `GROUP BY` 结合使用,用于过滤分组后的结果。
- 示例:查找选修课程超过2门且成绩都在80分以上的学生的学号。
```sql
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(Cno) > 2 AND MIN(Grade) > 80;
```
- **ORDER BY** 子句用于对结果集进行排序。
- 示例:查询每个学生选课的总学分,并按总学分的降序排列。
```sql
SELECT Student.Sno, Sname, SUM(Ccredit) AS TotalCredits
FROM Student
INNER JOIN SC ON Student.Sno = SC.Sno
INNER JOIN Course ON SC.Cno = Course.Cno
GROUP BY Student.Sno, Sname
ORDER BY TotalCredits DESC;
```
#### 特殊谓词
- **IN** 和 **NOT IN**:用于比较是否存在于指定的值列表中。
- 示例:查询未选课的学生情况包含学生学号、姓名和所在系。
```sql
SELECT Sno, Sname, Sdept
FROM Student
WHERE Sno NOT IN (
SELECT Sno
FROM SC
);
```
- **EXISTS** 和 **NOT EXISTS**:用于检查子查询是否有结果返回。
- 示例:查询没有学生选的课程信息包含课程号、课程名。
```sql
SELECT Cno, Cname
FROM Course
WHERE NOT EXISTS (
SELECT *
FROM SC
WHERE SC.Cno = Course.Cno
);
```
### 综合应用
- **派生表**:可以在查询中创建临时的结果集,作为后续查询的一部分。
- 示例:查询所有成绩中的最高分的学生学号、姓名、系名、课程号、成绩。
```sql
WITH HighestScores AS (
SELECT Sno, MAX(Grade) AS MaxGrade
FROM SC
GROUP BY Sno
)
SELECT Student.Sno, Sname, Sdept, SC.Cno, Grade
FROM Student
INNER JOIN SC ON Student.Sno = SC.Sno
INNER JOIN HighestScores ON Student.Sno = HighestScores.Sno AND SC.Grade = HighestScores.MaxGrade;
```
这些知识点覆盖了T-SQL简单数据库查询的核心内容,能够帮助读者理解和掌握如何使用SQL进行基本到较为复杂的查询操作。