改变表结构,插入列:
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;增加自动编号、学号、课程编号:
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不会出现此问题。