0 总结

Get to the points first. The article comes from LawsonAbs!

  • updata on 20200506:修改创表语句中的字符集错误;修改相关格式;

1.创建一个数据库

create database myDatabase;

2.使用这个数据库

use myDatabase;

3.创建一张表,并命名为student
create table student(
id int(10) primary key not null unique auto_increment,
name varchar(20) not null,
sex varchar(4) ,
birth year,
department varchar(20) not null,
address varchar(50))
default charset=utf8; 

在建表的时候就设置字符集为utf8,注意不是utf-8。显示建表信息:show create table student \G;

4.创建表score
create table score(
id int(10) primary key  not null unique auto_increment,
stu_id int(10) not null ,
C_name varchar(20) ,
Grade int(10));

//显示表score的表结构:desc score;

5.往表student中插入数据
INSERT INTO student VALUES(901,'张老大', '男',1985,'计算机系', '北京市海淀区'),
(902,'张老二', '男',1986,'中文系', '北京市昌平区'),
(903,'张三', '女',1990,'中文系', '湖南省永州市'),
(904,'李四', '男',1990,'英语系', '辽宁省阜新市'),
(905,'王五', '女',1991,'英语系', '福建省厦门市'),
(906,'王六', '男',1988,'计算机系', '湖南省衡阳市');
6.往表score中插入数据
INSERT INTO score VALUES(1,901, '计算机',98),
(2,901, '英语', 80),
(3,902, '计算机',65),
(4,902, '中文',88),
(5,903, '中文',95),
(6,904, '计算机',70),
(7,904, '英语',92),
(8,905, '英语',94),
(9,906, '计算机',90),
(10,906, '英语',85);

如果执行按照上述过程执行,会出现如下错误:

ERROR 1366 (HY000): Incorrect string value: '\xBC\xC6\xCB\xE3\xBB\xFA' for column 'C_name' at row 1

也就是因为字符集额问题。修改表的特定字符模式:alter table score convert to character set utf8;

修改数据库的字符模式
alter database mydatabase default character set utf8;

查看mysql数据库默认的编码
show variables like 'character%';

修改数据库字符server模式为utf8
set character_set_server=utf8;

7. 查看表中数据
select * from student
limit 1,3;
select *
from student
where department in('计算机系','英语系');
8.查询年龄在18和40之间的学生

使用当前年减去出生的年份

select * from student
where 2018-birth between 18 and 40;
9.查询student表中每个院系有多少人
select department,count(id)
from student
group by department;

//这里的department,count(*)是两列

select department,count(*)
from student
group by department;

//如下这个代码是错误的,因为这里select *只会出现group by department中的一个而不会出现所有的信息 如果想要出现所有的信息,则应该使用count(id),使用count(name)也是可以的

select *
from student
group by department;
select department,count(name)
from student
group by department;

再插入单条数据:
insert into student values(907,'张老二', '男',1986,'中文系', '北京市昌平区');

10.查询每科的最高成绩
select C_name,max(grade)
from score
group by C_name;

查询每科的最低成绩

select C_name,min(grade)
from score
group by C_name;
11.查询李四的考试科目和考试成绩

李四的考试科目和成绩在score表中,但是现在只知道姓名是李四。所以需要通过student表来找到李四的id,通过id,再到score表中找到相应的成绩信息
3.select id ……这个语句需要加上括号,否则报错

select C_name,grade
from score
where stu_id = (select id
from student
where name='李四');
12.用连接的方式查询每个人的具体信息
select * from student,score
where student.id = score.stu_id;

输出如下:
Mysql编程实战一之入门篇_sql语句上面的那条SQL语句不完善的地方在于,会将id和stu_id同时输出,但是事实上,这个id是相同的,我们只需要输出一次即可。

这个搜索不会按照from表的顺序来,应该是按照select ……后面的字段名来

select stu_id,name,sex,birth,department,address,C_name,Grade
from student,score
where student.id = score.stu_id;
13.计算每个学生的总成绩

楼下写的不对原因在于group by语句和where语句的顺序写反了,应该是先where,再是group by

select stu_id,name,sum(grade) 
from score,student 
group by stu_id 
where stu_id=student.id;

改正如下:

select stu_id,name,sum(grade)
from score,student
where stu_id=student.id
group by stu_id;

或者如下:

select student.id,name,sum(grade) 
from student,score
where student.id = score.stu_id
group by id;
14.查询每个考试科目的平均成绩
select C_name,avg(grade)
from score
group by C_name;
15.查询成绩低于95的学生信息

楼下的SQL语句错误,在于=号的问题。原因可能是:stu_id可能不止一个,所以让一个student.id去等于多个stu_id(集合),所以出现了问题

select * 
from student
where student.id =
(select stu_id
from score
where Grade<95);

正确的SQL语句如下:[将=修改为in]

select * 
from student
where student.id in 
(select stu_id
from score
where Grade<95);
16.查询同时参加计算机和英语考试的学生信息

any关键字的使用

select * 
from student 
where id = any 
(
	select stu_id 
	from score 
	where stu_id in 
	(select stu_id from score where C_name='计算机') 
	and  C_name='英语' 
);
select * 
from student 
where id in 
(
	select stu_id 
	from score 
	where stu_id in (select stu_id from score where C_name='计算机') 
	and  C_name='英语'
); 

这条语句应该这么理解:
1.从score表中查询stu_id,需要满足的条件是C_name=‘计算机’
2.再从score表中查询stu_id,这个时候的stu_id需要再满足C_name='英语’的要求
3.最后从student中找出在该集合中的id即可
4.in 是“= any”的别名,用脑子想想,就知道,这里的in表示在这个集合中,而= any()同样也表示在这个集合中。

17.将计算机考试成绩从高到低进行排序

desc是降序;asc是升序。分别对应单词descend,ascend。

select C_name,Grade 
from score 
where C_name='计算机' 
order by Grade desc; 
select C_name,Grade
from score
where C_name='计算机'
order by Grade asc;
18.从student表和score表中查询出学生的学号,然后合并查询结果

union操作符用于将两个以上的select语句的结果组合到一个结果集中。多个select语句会删除重复的数据

select id 
from student 
union 
select stu_id from score; 
19.查询王姓或者张姓的同学的姓名,院系,考试科目和成绩
select name,department,C_name,Grade
from student,score
where student.id =(
select student.id 
from student
where name like "王%" or name like "张%");

执行上述代码,报错信息如下:Subquery returns more than 1 row。原因在于……student.id = (select ……)之后的这个是数量不匹配,正确代码如下:

select student.id,name,sex,birth,department,address,C_name,Grade
from student,score
where 
(name like '张%' or name like '王%') and student.id = score.stu_id;
20.查询湖南的学生的姓名、年龄、院系和考试科目及成绩

先找出地址是湖南省的学生的id号,再找出id号的信息

select stu_id,name,birth,department,address,C_name,Grade
from student,score
where student.id = score.stu_id and (student.address like "湖南省%");