解决数据库不能插入中文方式: 在建立数据库前 输入指令 showvariableslike ‘%char%’ ; 展示字符默认设置 将Variable_name中client、connection、results的value设置为gbk(初始为utf8),指令为: Setcharacter_set_client = “gbk”; Setcharacter_set_connection = “gbk”; Setcharacter_set_results = “gbk”; 要使用包括如下三个表的“教学管理”数据库JXGL: (1)学生表Student,由学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、所在系(Sdept)五个属性组成,记作:Student(Sno,Sname,Ssex,Sage,Sdept),其中主码为Sno。 (2)课程表Course,由课程号(Cno)、课程名(Cname)、先修课号(Cpno)、学分(Ccredit)四个属性组成,记作:Course(Cno,Cname,Cpno,Ccredit),其中主码为Cno。 (3)学生选课SC,由学号(Sno)、课程号(Cno)、成绩(Grade)三个属性组成,记作:SC(Sno,Cno,Grade),其中主码为(SNO,CNO)。 创建数据库的命令:CREATE DATABASE JXGL 2、刷新数据库目录后,选择新出现的JXGL数据库,在SQL操作窗口中,创建Student、SC、Course三表及表记录插入命令如下: Create Table Student1 ( Sno CHAR(5) NOT NULL , Sname VARCHAR(20), Sage SMALLINT CHECK(Sage>=15 AND Sage<=45), Ssex CHAR(2) DEFAULT '男'CHECK (Ssex='男' OR Ssex='女'), Sdept CHAR(2), PRIMARY KEY(Sno)); Create Table Course ( Cno CHAR(2) NOT NULL PRIMARY KEY, Cname VARCHAR(20), Cpno CHAR(2), Ccredit SMALLINT); Create Table SC ( Sno CHAR(5) NOT NULL, CONSTRAINT S_F FOREIGN KEY(Sno) REFERENCES Student(Sno), Cno CHAR(2) NOT NULL, Grade SMALLINT CHECK ((Grade IS NULL) OR (Grade BETWEEN 0 AND 100)), FOREIGN KEY(Cno) REFERENCES Course(Cno), PRIMARY KEY(Sno,Cno)); INSERT INTO Student VALUES('98001','钱横',18,'男','CS'); INSERT INTO Student VALUES('98002','王林',19,'女','CS'); INSERT INTO Student VALUES('98003','李民',20,'男','IS'); INSERT INTO Student VALUES('98004','赵三',16,'女','MA'); INSERT INTO Course VALUES('1','数据库系统', '5',4); INSERT INTO Course VALUES('2','数学分析',null,2); INSERT INTO Course VALUES('3','信息系统导论','1',3); INSERT INTO Course VALUES('4','操作系统原理','6',3); INSERT INTO Course VALUES('5','数据结构','7',4); INSERT INTO Course VALUES('6','数据处理基础',null,4); INSERT INTO Course VALUES('7','C语言','6',3); INSERT INTO SC VALUES('98001','1',87); INSERT INTO SC VALUES('98001','2',67); INSERT INTO SC VALUES('98001','3',90); INSERT INTO SC VALUES('98002','2',95); INSERT INTO SC VALUES('98002','3',88); [1] 查考试成绩大于等于90的学生的学号。 [2] 查年龄大于18,并不是信息系(IS)与数学系(MA)的学生的姓名和性别。 [3] 查以”信息”开头,且倒数第二个汉字为“导”字的课程的详细情况。 [4] 查询选修了课程的学生人数。 [5] 查询计算机系(CS)选修了2门及以上课程的学生的学号。 根据以上要求,编写出mysql命令代码
时间: 2025-07-07 20:43:47 浏览: 4
<think>嗯,用户需要解决数据库插入中文的问题,然后创建三个表,并执行五个查询。首先,我得确认字符集设置是否正确。用户提到要将client、connection、results的字符集设置为gbk,这可能是因为数据库或客户端默认使用utf8导致中文乱码。不过,现在通常推荐使用utf8mb4,但用户要求用gbk,所以得按照他的步骤来。
接下来是创建数据库JXGL,然后建表Student、Course、SC。注意到用户提供的Student表名字是Student1,这可能是个笔误,应该改为Student,否则后续外键引用可能会出错。需要检查CREATE TABLE语句是否正确,特别是主键和外键约束。比如,SC表中的外键S_F引用的是Student(Sno),但原表名如果是Student1,会导致错误,所以必须确认表名一致。
然后是插入数据,这里要注意字符集是否匹配,如果数据库是gbk,插入的中文字符应该没问题。但用户提供的插入语句里的系别如'CS'、'IS'等是英文,可能没问题,但如果有中文系名,需要确保客户端也使用gbk编码。
接下来是五个查询:
第一个查询是成绩>=90的学号,比较简单,用SELECT Sno FROM SC WHERE Grade >= 90。
第二个查询是年龄>18,且不在IS和MA系的学生。注意使用NOT IN或者AND条件,需要正确使用逻辑运算符,可能需要括号来确保条件正确组合。
第三个查询是课程名以“信息”开头,倒数第二个字是“导”。这里要用LIKE,并且注意通配符。中文的字符处理可能需要用两个下划线,比如'信息%导_',但得看具体数据库的排序规则。不过用户可能用的是gbk,每个中文字符算两个字节,所以可能需要调整通配符的数量。或者使用RIGHT函数,但用LIKE更简单。
第四个查询是统计选修课程的学生人数,需要用COUNT(DISTINCT Sno),避免重复计算同一学生选多门课的情况。
第五个查询是CS系选修至少2门课程的学生学号。需要连接Student和SC表,按Sno分组,并过滤COUNT>=2,同时系别为CS。这里要注意JOIN的条件和GROUP BY的正确使用。
在编写SQL时,还需要注意表名是否正确,比如Student1是否应该为Student,否则外键约束会失败。另外,插入课程数据时,Cpno有的为null,比如课程2和6,这可能没问题,但需要确保外键引用存在,比如Cpno=5的课程是否存在?
检查所有SQL语句的语法,比如CREATE TABLE中的约束是否正确,INSERT的数据是否匹配列的类型和约束。例如,Student表中的Sdept是CHAR(2),但插入的值'CS'、'IS'等是两个字符,没问题。课程表的Cno是CHAR(2),插入的值如'1'可能是一个字符,但存储为CHAR(2)时会有空格填充,可能影响外键引用,需要确认是否应该用更长的CHAR长度,或者确保所有Cno都是两位字符。
最后,确保每个查询命令符合MySQL的语法,比如在查询3中使用LIKE时,是否需要用ESCAPE或者处理通配符,但用户的问题描述中没有特殊字符,所以可能不需要。</think>### 解决中文插入问题(前置步骤)
```sql
-- 查看字符集设置
SHOW VARIABLES LIKE '%char%';
-- 修改客户端字符集(会话级设置)
SET character_set_client = 'gbk';
SET character_set_connection = 'gbk';
SET character_set_results = 'gbk';
```
---
### 数据库及表创建
```sql
-- 创建数据库
CREATE DATABASE JXGL;
USE JXGL;
-- 创建Student表(修正表名为Student)
CREATE TABLE Student (
Sno CHAR(5) NOT NULL,
Sname VARCHAR(20),
Sage SMALLINT CHECK(Sage >= 15 AND Sage <= 45),
Ssex CHAR(2) DEFAULT '男' CHECK (Ssex = '男' OR Ssex = '女'),
Sdept CHAR(2),
PRIMARY KEY(Sno)
);
-- 创建Course表
CREATE TABLE Course (
Cno CHAR(2) NOT NULL PRIMARY KEY,
Cname VARCHAR(20),
Cpno CHAR(2),
Ccredit SMALLINT
);
-- 创建SC表
CREATE TABLE SC (
Sno CHAR(5) NOT NULL,
Cno CHAR(2) NOT NULL,
Grade SMALLINT CHECK ((Grade IS NULL) OR (Grade BETWEEN 0 AND 100)),
PRIMARY KEY(Sno, Cno),
FOREIGN KEY(Sno) REFERENCES Student(Sno),
FOREIGN KEY(Cno) REFERENCES Course(Cno)
);
```
---
### 数据插入
```sql
-- 插入学生数据
INSERT INTO Student VALUES ('98001', '钱横', 18, '男', 'CS');
INSERT INTO Student VALUES ('98002', '王林', 19, '女', 'CS');
INSERT INTO Student VALUES ('98003', '李民', 20, '男', 'IS');
INSERT INTO Student VALUES ('98004', '赵三', 16, '女', 'MA');
-- 插入课程数据
INSERT INTO Course VALUES ('1', '数据库系统', '5', 4);
INSERT INTO Course VALUES ('2', '数学分析', NULL, 2);
INSERT INTO Course VALUES ('3', '信息系统导论', '1', 3);
INSERT INTO Course VALUES ('4', '操作系统原理', '6', 3);
INSERT INTO Course VALUES ('5', '数据结构', '7', 4);
INSERT INTO Course VALUES ('6', '数据处理基础', NULL, 4);
INSERT INTO Course VALUES ('7', 'C语言', '6', 3);
-- 插入选课数据
INSERT INTO SC VALUES ('98001', '1', 87);
INSERT INTO SC VALUES ('98001', '2', 67);
INSERT INTO SC VALUES ('98001', '3', 90);
INSERT INTO SC VALUES ('98002', '2', 95);
INSERT INTO SC VALUES ('98002', '3', 88);
```
---
### 查询命令实现
**[1] 查考试成绩大于等于90的学生的学号**
```sql
SELECT Sno
FROM SC
WHERE Grade >= 90;
```
**[2] 查年龄大于18,并不是信息系(IS)与数学系(MA)的学生的姓名和性别**
```sql
SELECT Sname, Ssex
FROM Student
WHERE Sage > 18
AND Sdept NOT IN ('IS', 'MA');
```
**[3] 查以"信息"开头,且倒数第二个汉字为“导”字的课程的详细情况**
```sql
SELECT *
FROM Course
WHERE Cname LIKE '信息%导_';
```
**[4] 查询选修了课程的学生人数**
```sql
SELECT COUNT(DISTINCT Sno) AS 选课人数
FROM SC;
```
**[5] 查询计算机系(CS)选修了2门及以上课程的学生的学号**
```sql
SELECT Sno
FROM Student
WHERE Sdept = 'CS'
AND Sno IN (
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) >= 2
);
```
---
### 关键点说明
1. **字符集设置**:通过修改客户端、连接和结果集的字符集为`gbk`,确保中文数据能正确存储
2. **表结构验证**:注意外键约束需要被引用表先创建
3. **查询逻辑**:
- 查询3使用`LIKE`实现模糊匹配,`%`匹配任意多个字符,`_`匹配单个字符
- 查询5通过子查询统计选课数量,结合`GROUP BY`和`HAVING`过滤结果
4. **数据完整性**:CHECK约束确保年龄范围(15-45)、性别有效性、成绩范围(0-100)等业务规则
阅读全文
相关推荐















