MySQL 数据库查询题解析
表的创建与数据插入
在开始之前,我们需要创建一些基础的表格并插入测试数据,以下是创建学生表(student
)和成绩表(score
)的SQL语句示例:
1、创建学生表
```sql
CREATE TABLE student (
id INT(10) NOT NULL PRIMARY KEY, # 学生ID 自增
name VARCHAR(20) NOT NULL, # 学生姓名
sex VARCHAR(4), # 学生性别
birth YEAR, # 学生出生年份
department VARCHAR(20), # 所在院系
address VARCHAR(50) # 家庭住址
);
```
2、插入学生表数据
```sql
INSERT INTO student VALUES(901,'张老大', '男',1985,'计算机系', '北京市海淀区');
INSERT INTO student VALUES(902,'张老二', '男',1986,'中文系', '北京市昌平区');
INSERT INTO student VALUES(903,'张三', '女',1990,'中文系', '湖南省永州市');
...其他数据...
```
3、创建成绩表
```sql
CREATE TABLE score (
id INT(10) NOT NULL PRIMARY KEY AUTO_INCREMENT, # 自增ID
stu_id INT(10) NOT NULL, # 学生ID 外键创建可有可无
c_name VARCHAR(20), # 学科名称
grade INT(10) # 分数
);
```
4、插入成绩表数据
```sql
INSERT INTO score VALUES(NULL,901, '计算机',98);
INSERT INTO score VALUES(NULL,901, '英语',80);
INSERT INTO score VALUES(NULL,902, '计算机',65);
...其他数据...
```
常见查询题目及解答
我们通过具体的题目来演示如何使用这些表中的数据进行查询。
1、查询 student 表的所有记录
```sql
SELECT * FROM student;
```
这个查询将返回student
表中的所有记录,包括每个学生的所有信息。
2、查询第2条到第4条记录
```sql
SELECT * FROM student LIMIT 1,3;
```
使用LIMIT
子句可以限制查询结果的数量,这里的1,3
表示从第一条记录(索引从0开始)开始,最多返回3条记录。
3、查询所有学生的学号、姓名和院系信息
```sql
SELECT id, name, department FROM student;
```
这个查询只返回学生的学号、姓名和院系信息,而不包括其他列。
4、查询计算机系和英语系的学生信息
```sql
SELECT * FROM student WHERE department IN ('计算机系', '英语系');
```
IN
子句允许我们在WHERE
子句中指定多个值。
5、查询1985年至1990年间出生的学生信息
```sql
SELECT * FROM student WHERE birth BETWEEN 1985 AND 1990;
```
BETWEEN
子句用于指定一个范围,包含端点值。
6、查询每个院系的学生人数
```sql
SELECT department, COUNT(*) as 人数 FROM student GROUP BY department;
```
使用GROUP BY
子句可以按照指定的列对结果集进行分组,这里我们按照院系分组并计算每个院系的学生数量。
7、查询每个科目的最高分
```sql
SELECT c_name, MAX(grade) as 最高分 FROM score GROUP BY c_name;
```
同样地,我们可以使用GROUP BY
子句按照科目分组并使用MAX()
函数计算每个科目的最高分。
8、查询李四的考试科目和考试成绩
```sql
SELECT stu_id, c_name, grade FROM score WHERE stu_id = (SELECT id FROM student WHERE name = '李四');
```
这是一个嵌套查询的例子,我们先根据姓名查询到学生的id
,然后根据该id
查询其考试成绩。
9、用连接的方式查询所有学生的信息和考试信息
```sql
SELECT stu.*, sc.c_name, sc.grade
FROM student stu
INNER JOIN score sc ON stu.id = sc.stu_id;
```
INNER JOIN
用于根据某个条件连接两个表,这里我们连接了学生表和成绩表,获取了学生的所有信息以及他们的考试信息。
10、计算每个学生的总成绩
```sql
SELECT stu_id, SUM(grade) as 总成绩 FROM score GROUP BY stu_id;
```
使用SUM()
函数可以计算每个学生的总成绩。
11、计算每个考试科目的平均成绩
```sql
SELECT c_name, AVG(grade) as 平均成绩 FROM score GROUP BY c_name;
```
类似地,可以使用AVG()
函数计算每个科目的平均成绩。
12、查询计算机成绩低于95的学生信息
```sql
SELECT stu.
FROM student stu
INNER JOIN score sc ON stu.id = sc.stu_id
WHERE sc.grade < 95 AND sc.c_name = '计算机';
```
在这个查询中,我们首先连接学生表和成绩表,然后添加了两个条件:成绩必须低于95且科目必须是计算机。
13、将计算机考试成绩按从高到低排序
```sql
SELECT stu_id, c_name, grade
FROM score
WHERE c_name = '计算机'
ORDER BY grade DESC;
```
使用ORDER BY
子句可以根据某列的值对结果集进行排序,DESC
关键字表示降序排序。
14、查询姓张或者姓王的同学的姓名、院系和考试科目及成绩
```sql
SELECT stu.name, stu.department, sc.c_name, sc.grade
FROM student stu
INNER JOIN score sc ON stu.id = sc.stu_id
WHERE stu.name LIKE '张%' OR stu.name LIKE '王%';
```
使用LIKE
子句可以进行模糊匹配,'张%'
和'王%'
分别匹配以 “张” 和 “王” 开头的姓名。
是一些常见的MySQL查询题目及其解答,希望对你有所帮助,在实际使用中,你可能需要根据自己的数据表结构和需求进行调整。