根据给定的信息,我们可以将知识点概括为以下几个方面:
### 一、数据库的创建与管理
#### 1. 创建数据库
- **数据库名称**: `studydb`
- **要求**:
- 必须包含主要文件(Primary File)、日志文件(Log File)以及次要文件(Secondary File)。
#### 2. 表的创建
- **学生表** (`student`)
- 字段定义:
- `stuid`: 学生编号,`varchar(32)`,主键,不允许为空
- `stuname`: 学生姓名,`varchar(20)`,不允许为空
- `age`: 年龄,`int`,允许为空
- `sex`: 性别,`char(2)`,不允许为空,需通过检查约束确保输入正确
- `address`: 地址,`varchar(200)`,允许为空
- **课程表** (`course`)
- 字段定义:
- `cid`: 课程编号,`int`,主键且自动增长
- `cname`: 课程名称,`varchar(20)`,不允许为空且唯一
- `teacherid`: 教师编号,`int`,不允许为空且作为外键
- **成绩表** (`score`)
- 字段定义:
- `sid`: 成绩编号,`int`,主键且自动增长
- `cid`: 课程编号,`int`,不允许为空且作为外键
- `mark`: 分数,`float`,不允许为空,需通过检查约束确保分数范围合理
- **教师表** (`teacher`)
- 字段定义:
- `tid`: 教师编号,`int`,主键且自动增长
- `tname`: 教师姓名,`varchar(20)`,不允许为空
### 二、数据操作
#### 1. 插入测试数据
- 虽然具体数据未给出,但可以想象这一步骤涉及使用`INSERT INTO`语句来填充上述表格中的信息。
#### 2. 实现高级查询
以下是一些高级查询示例的详细解释:
- **查询java课程比C#分数高的学生**
- 此查询涉及到对成绩表进行复杂筛选,比较特定课程之间的分数差异。
- **查询平均分成绩大于70分的同学的姓名和平均成绩**
- 使用`AVG()`函数计算每位学生的平均成绩,并结合`GROUP BY`子句进行分组处理。
- **查询所有同学的学号、姓名、选课数、总成绩**
- 结合使用`COUNT()`和`SUM()`函数来统计每位学生的选课数量及总成绩。
- **查询姓“王”的老师的个数**
- 这里需要利用`LIKE`关键字来匹配教师姓名中的特定前缀。
- **查询没有学过java课的学生的学号、姓名**
- 可以使用`LEFT JOIN`或`NOT EXISTS`来找出那些没有Java课程成绩的学生。
- **查询学过“C#”课程并且也学过“sql”课程的学生的学号、姓名**
- 通过多次`JOIN`操作将多个表关联起来,以获取符合条件的学生信息。
- **查询所有课程的平均分、及格率**
- 综合运用`AVG()`函数和条件计数(`COUNT(CASE ... END)`)来计算及格率。
- **查询所有课程成绩小于60分的同学的学号、姓名、性别**
- 使用`WHERE`子句筛选出成绩低于60分的学生,并展示相关信息。
- **查询没有学全所有课的同学的学号、姓名、性别**
- 可以通过`EXCEPT`操作符来找出那些缺少某些课程成绩的学生。
- **查询至少有一门课与学号为“002”的同学所学相同的同学的学号和姓名**
- 这通常涉及到使用`IN`或`EXISTS`来进行条件匹配。
- **查询至少学过学号为“002”同学所有一门课的其他同学学号和姓名**
- 需要通过子查询来筛选出特定学生的课程列表,并与其他学生对比。
- **把成绩表中“李庆”老师教的课的成绩都更改为此课程的平均成绩**
- 先计算出平均成绩,然后使用`UPDATE`语句更新成绩表。
- **查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名**
- 通过比较两个学生所选课程的集合来确定是否完全相同。
- **删除学习“李庆”老师课的成绩表记录**
- 使用`DELETE`语句删除指定教师教授课程的成绩记录。
### 三、规范化
- **代码缩进**和**注释**: 保持代码整洁,增加可读性。
- **建表和建库判断**: 在执行建表和建库操作之前,应先检查这些对象是否已经存在。
- **分离数据库**: 为了提高性能和安全性,数据库应该按照不同的业务需求进行分离。
- **文件提交**: 按照要求提交包含SQL脚本和数据库文件在内的所有必要文件。
以上内容涵盖了SQL高级查询中的关键知识点,包括数据库设计、数据操作语言(DML)的使用以及数据查询技巧等方面。这些技能对于从事数据库管理和开发工作的专业人士来说至关重要。