MySQL经典练习题(一)

  • 建立学生成绩表scores

create table if not exists scores(
name varchar(2) not null default ' ',
course varchar(4) not null default ' ');

 

改变表结构,插入列:

 alter table scores add grade tinyint(1) not null default '0';

  

  • 插入数据

单行插入:

 insert into scores values('张三', '语文', 81);

多行插入:

insert into scores values
('张三', '数学', 75),
('李四', '语文', 76),
('李四', '数学', 90),
('王五', '语文', 81),
('王五', '数学', 100),
('王五', '英语', 90);

表数据:

  • 用一条SQL 语句 查询出每门课都大于80 分的学生姓名

分析:只要把小于80的人去掉,剩下的就是都大于80的学生

select distinct(name) from scores
where name not in (select distinct(name) from scores where grade < 80);

第二种:找到每个人的最小值,然后找到最小值大于80的人

select name from scores 
group by name
having min(grade) > 80;
  • 建立学生表scores2

增加自动编号、学号、课程编号:

create table if not exists scores2
(id tinyint(1) auto_increment primary key,
stu_num varchar(7) not null default ' ',
name varchar(2) not null default ' ',
cou_num varchar(4) not null default '0000',
course varchar(4) not null default ' ',
grade tinyint(1) not null default '0');

表结构:

插入数据:

由于id是自增型,在插入时要指明插入的列,要是默认全部的话会出错。

insert into scores2(stu_num, name, cou_num, course, grade)
values
('2005001', '张三', '0001', '数学', 69),
('2005002', '李四', '0001', '数学', 89),
('2005001', '张三', '0001', '数学', 69);

表数据:

  • 删除除了自动编号不同, 其他都相同的学生冗余信息

分析:先分组把列属性一样的分一块,再找出id,这些就是不重复的。最后删除重复的信息。

#先分组把列属性一样的分一块,再找出id,这些就是不重复的

select id from scores2
group by stu_num, name, cou_num, course, grade;

  

#删除重复的信息

delete from scores2 where id not in
(
	select temp.id from
	(
		select id from scores2
		group by stu_num, name, cou_num, course, grade
	)as temp
);

结果:

遇到的问题:

在MySQL中是不允许在同一张表上,先进行检索在进行更新的。因此代码

delete from scores2 where id not in 
(
	select id from scores2
	group by stu_num, name, cou_num, course, grade
);

出现You can’t specify target table for update in FROM clause错误,即不能先select出同一表中的某些值,再update这个表(在同一语句中)。

解决:在select外边套一层,让数据库认为你不是查同一表的数据作为同一表的更新数据。

这个问题只出现于mysql,mssql和oracle不会出现此问题。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值