c203数据库练习题上半

发布时间 2023-12-20 20:21:55作者: 兮宇

1.使用SQL语言创建满足以下要求的数据库。

(1)创建数据库名称为jwgl,字符集选择utf8,排序规则选择utf8_general_ci。

create database jwgl character set utf8 collate utf8_general_ci;

(2)查看数据库。

show databases;

(3)将数据库jwgl的指定字符集修改为gb2312。

mysql> alter database jwgl

-> default character set gb2312;

(4)删除数据库jwgl。

drop database jwgl;

3.使用SQL语言查看数据库存储引擎。

mysql> show engines;

(6).创建kc表

mysql> CREATE TABLE kc

-> (

-> kch char(4) NOT NULL PRIMARY KEY,

-> kcm char(20),

-> xss int,

-> xf int);

(7).①增加“成绩”一列cj,类型是int,允许空值。默认为0。

mysql> alter table kc add column cj int default 0;

②修改cj列的类型为char。

mysql> alter table kc change column cj cj char(4);

③修改cj列名为mark。

mysql> alter table kc change column cj mark char(4) default 0;

④删除mark列。

mysql> alter table kc drop column mark;

(8).删除表kc。

mysql> drop table kc;

(9).将表xs重命名为Student。

mysql> rename table xsgl.xs to xsgl.Student;

1.根据学生基本信息表(xsjbxxb)和学生选课表(xsxkb)创建学生表(xsb)和课表(xkb)。

use jwgl;

create table xsb as select * from xsjbxxb;

create table xkb as select * from xsxkb;

2. 根据xsb表和xbk表,完成以下各题。

(1)对xsb表的xh字段添加单一主键,对xkb表的xh和kcdm字段创建复合主键。

alter table xsb modify xh varchar(20) primary key;

alter table xkb add primary key(xh,kcdm);

(2)对xkb表的xh字段创建外键约束,建立xsb表和xkb表的关联关系。

alter table xkb add foreign key(xh) references xsb(xh);

(3)针对xsb表的xm,bjbh,xy字段添加非空约束。

alter table xsb modify xm varchar(50) not null;

alter table xsb modify bjbh varchar(20) not null;

alter table xsb modify xy varchar(10) not null;

(4)针对xsb表的xm字段添加唯一性约束。

alter table xsb modify xm varchar(50) unique;

(5)针对xsb表的xb字段添加检查约束,要求只能取值男或女。

alter table xsb add check(xb in ("男","女"));

(6)针对xsb表的xb字段添加默认值:男。

alter table xsb modify xb char(2) default "男";

(7)删除创建的外键约束。

show create table xkb;

alter table xkb drop foreign key xkb_ibfk_1;

(8)删除创建的主键约束。

alter table xsb drop primary key;

(9)删除创建的唯一性约束。

show index from xsb;

alter table xsb drop index xm;

(10)删除创建的非空约束。

alter table xsb modify xm varchar(50);

alter table xsb modify bjbh varchar(20);

alter table xsb modify xy varchar(10);

(11)删除创建的默认值约束。

alter table xsb modify xb char(2);

(12)删除创建的检查约束。

show create table xsb;

alter table xsb drop check xsb_chk_1;

1.无条件查询:

(1)查询课程代码表的数据。(5分)

mysql>select * from kcdmb;

(2)在学生基本信息表中查询每个学生的姓名及专业信息。(5分)

mysql> select xm,zymc from xsjbxxb;

2. 条件查询

(1)查询学生基本信息表中男生的基本信息。(5分)

mysql> select * from xsjbxxb where xb ='男';

(2)查询2000年出生的女生的信息。(5分)

mysql> select * from xsjbxxb where year(csrq) =2000 and xb ='女';

(3)查询考试成绩在80~90分之间的学生学号、课程号和成绩。(5分)

mysql> select xh,kcdm,cj from xsxkb where cj between 80 and 90;

(4)查询选修了课程代码00202117或00202118学生选课信息。(5分)

mysql> select * from xsxkb where kcdm in('00202117','00202118');

(5)查询选修了课程名中包含了“数据库”的选课信息。(5分)

mysql> select xh,xk.kcdm,cj

-> from xsxkb as xk join kcdmb

-> on xk.kcdm=kcdmb.kcdm

-> where kcmc like '%数据库%';

(6)查询学号为201820107101的学生的课程选课信息,输出学号和平均成绩。(5分)

mysql> select xh ,avg(cj) as 平均成绩

-> from xsxkb

-> where xh='201820107101';

(7)查询考试成绩前3名的选课信息。(5分)

mysql> select * from xsxkb order by cj desc limit 3;

(8)查询教师基本信息表的第3至6条记录。(5分)

mysql> select * from jsjbxxb limit 2,4;

(9)查询每门课程的平均成绩,并显示平均成绩最高的前3门课程的课程代码,课程名称,平均成绩。(10分)

mysql> select xsxkb.kcdm,kcdmb.kcmc,avg(xsxkb.cj) as '平均成绩'

-> from xsxkb,kcdmb

-> where xsxkb.kcdm=kcdmb.kcdm

-> group by xsxkb.kcdm

-> order by avg(xsxkb.cj) desc

-> limit 3;

或者:

mysql> select xsxkb.kcdm,kcmc, avg(cj) as平均成绩

-> from xsxkb join kcdmb

-> on xsxkb.kcdm=kcdmb.kcdm

-> group by xsxkb.kcdm

-> order by 3 desc

-> limit 3;

(10)统计每个学生的成绩平均分,并按平均成绩降序排序。(10分)

mysql> select xh,avg(cj) as 平均成绩

-> from xsxkb

-> group by xh

-> order by 2 desc;

(11)统计学生基本信息表中女生的人数。(10分)

mysql> select xb as 性别,count(*) as 人数

-> from xsjbxxb

-> where xb='女';

(12)按性别分组,求每组学生的平均年龄。(10分)

mysql> select xb as 性别,avg(year(now())-year(csrq)) as 平均年龄

-> from xsjbxxb

-> group by xb;

(13)查找选修课程超过2门且每门成绩都在80分以上的学生的学号。(10分)

mysql> select xh as 学号, count(*) as 选课人数

-> from xsxkb

-> group by xh

-> having count(*)>2 and min(cj)>80;

1、按照要求使用连接查询进行以下操作。

(1)查找学生基本信息表中年龄最大的男生的所有信息。

mysql> select * from xsjbxxb

-> where xb = '男'

-> order by age desc

-> limit 1;

查询学生的选课信息,输出学号,姓名,课程名称,成绩。

mysql> select xs.xh,xm,kcmc,cj

-> from xsjbxxb as xs join xsxkb on xs.xh=xsxkb.xh

-> join kcdmb on xsxkb.kcdm=kcdmb.kcdm

-> ;

统计每个学生的成绩平均分,输出学号,姓名,平均成绩。

mysql> select xs.xh,xm,avg(cj) as 平均成绩

-> from xsjbxxb as xs,xsxkb

-> where xs.xh=xsxkb.xh

-> group by xs.xh;

统计每门课程的平均成绩,输出课程编码,课程名称,平均成绩。

mysql> select kcdmb.kcdm, kcmc, avg(cj) as 平均成绩

-> from kcdmb join xsxkb

-> on kcdmb.kcdm=xsxkb.kcdm

-> group by kcdm;

查询每个学生选修的课程成绩信息,要求显示学号,姓名,课程代码,成绩。

mysql> select xs.xh,xm,kcdm,cj

-> from xsjbxxb as xs join xsxkb

->on xs.xh=xsxkb.xh;

查询每个学生选修的课程成绩信息,要求只显示成绩在90分(包含90)以上的学生的学号,姓名,课程名称,成绩。

mysql> select xs.xh,xm,kcmc,cj

-> from xsjbxxb as xs join xsxkb on xs.xh=xsxkb.xh

-> join kcdmb on xsxkb.kcdm=kcdmb.kcdm

-> where cj >=90;

查询每个学生选修的课程成绩信息,要求只显示平均成绩在90分(包含90)以上的学生的学号,姓名,课程名称,成绩。

select xs.xh,xm,kcmc,cj

from xsjbxxb as xs join xsxkb on xs.xh=xsxkb.xh

join kcdmb on xsxkb.kcdm=kcdmb.kcdm

group by xsxkb.xh

having avg(cj)>=90;

或者:使用子查询

select xs.xh,xm,kcmc,cj

from xsjbxxb as xs ,xsxkb,kcdmb

where xs.xh=xsxkb.xh

and xsxkb.kcdm=kcdmb.kcdm

and xs.xh in(select xh from xsxkb group by xh having avg(cj)>=90)

;

查看每个同学的选课信息,包括未选课的学生信息,要求显示学号,姓名,课程代码,成绩。

mysql> select xs.xh,xm,kcdm,cj

-> from xsjbxxb as xs left join xsxkb

-> on xs.xh = xsxkb.xh; -> ;

查看每门课程的选课信息,包括没有人选修的课程,要求只显示课程代码,课程名,成绩。

mysql> select xsxkb.kcdm, kcmc,cj

-> from kcdmb left join xsxkb

-> on kcdmb.kcdm = xsxkb.kcdm;

2、按照要求使用union进行查询。

(10)查找学号为201820919102和学号为201820511102的两位同学的信息。

mysql> select *

-> from xsjbxxb

-> where xh='201820919102'

-> union

-> select *

-> from xsjbxxb

-> where xh='201820511102'

-> ;

3、按照要求使用子查询进行以下操作。

(11)查找电子信息工程平均成绩在70上的学生的学号和平均成绩。

mysql> select xh,avg(cj) as '平均成绩'

-> from xsxkb

-> where xh in

-> (select xh from xsjbxxb where zymc='电子信息工程')

-> group by xh

-> having avg(cj)>=70;

(12)查找与学号为201820917101学生性别相同、专业相同的学生学号和姓名。

select xh,xm

from xsjbxxb as xs1

where exists(select * from xsjbxxb as xs2

where xs2.xb=xs1.xb and xs2.zymc=xs1.zymc

and xs2.xh='201820917101')

and xs1.xh!='201820917101';

(13)从xsjbxxb表中查找所有女学生的姓名、学号,以及与学号为201820917101的学生的年龄差距。

mysql> select xm,xh,

-> year(csrq)-(select year(csrq) from xsjbxxb where xh='201820917101') as 年龄差

-> from xsjbxxb

-> where xb='女';

(14)查找选修了全部课程的同学的姓名。

mysql> select xm

-> from xsjbxxb

-> where not exists

-> (

-> select *

-> from kcdmb

-> where not exists

-> ( select *

-> from xsxkb

-> where xh=xsjbxxb.xh and kcdm=kcdmb.kcdm

-> )

-> );

或者

mysql> select xm from xsjbxxb

-> where xh in

-> (select xh from xsxkb where kcdm=all

-> (select kcdm from kcdmb));

(15)查找选修了课程代码为00202118的课程的学生姓名。

mysql> select xm

-> from xsjbxxb

-> where xh in(

-> select xh from xsxkb where kcdm='00202118');

(16)查找选修了计算机接口技术的学生学号,姓名。

mysql> select xh,xm

-> from xsjbxxb

-> where xh in(select xh from xsxkb

-> where kcdm in

-> (select kcdm from kcdmb where kcmc='计算机接口技术'));

(17)查找xsjbxxb表中,比所有土木工程专业的学生年龄都大的学生学号、姓名、专业名称、出生日期字段。

mysql> select xh,xm,zymc,csrq

-> from xsjbxxb

-> where csrq<all(select csrq from xsjbxxb where zymc='土木工程');

4、按照要求使用正则表达式进行以下操作。

(18)查询姓李的学生的学号、姓名和专业名称。

mysql> select xh, xm, zymc

-> from xsjbxxb

-> where xm regexp '^李' ;

查询学号里包含4、5、6的学生学号、姓名和专业名。

mysql> select xh, xm, zymc

-> from xsjbxxb

-> where xh regexp '4|5|6' ;

或者mysql> select xh,xm,zymc

-> from xsjbxxb

-> where xh regexp '[4-6]';

查询学号以2018开头,以101结尾的学生学号、姓名和专业名称。

mysql> select xh, xm, zymc

-> from xsjbxxb

-> where xh regexp '^2018' and xh regexp '101$' ;

或者mysql> select xh,xm,zymc

-> from xsjbxxb

-> where xh regexp '^2018.*101$';

1、索引练习

(1)对学生基本信息表xsjbxxb的籍贯jg字段,建立全文索引index_jg,并验证索引的建立。

Create fulltext index index_jg on xsjbxxb(jg);

Show index from xsjbxxb;

QQ图片20231115085839

对学生基本信息表xsjbxxb的xm和bjbh字段,建立复合索引index_xm_bjbh,并验证索引的建立。

Create index index_xm_bjbh on xsjbxxb(xm,bjbh);

Show index from xsjbxxb;

QQ图片20231115085832

对部门代码表bmdmb的部门名称bmmc字段,建立唯一降序索引index_bmmc,并验证索引的建立。

Create unique index index_bmmc on bmdmb(bmmc desc);

Show index from bmdmb;

QQ图片20231115085846

删除索引index_bmmc。

Drop index index_bmmc on bmdmb;