一、MySQL的安装
在网上有太多教程了,我也就不再此详细说,不过提示一点,如果下载了下面图中的文件时,请注意安装卸载都应该在右键该文件上操作
二、创建一个数据库
- 当需要创建一个全新的数据库时:
create database mydb default charset=utf8;
其中default是指默认utf8编码格式
- 很明显在创建数据库的时候有可能会遇到数据库太多,不知道想创建的数据库的名字是否已经存在时:
create database mydb if not exists mydb;
- 在处理完上述情况后,可能也会遇到一种情况就是已经存在的同名数据库中的表跟您想要创建的表差距太大,也可以选择删除已有的数据库的,但是前提是您已经知道这个数据库没有什么用处的时候:
drop database if exists mydb;
create database mydb charset=utf8;
注意:在sql中是utf8,而不是utf-8!
三、创建表格
- 1、查看已有表格:
show tables;
同上,查看已有的数据库,当然就是
show database;
- 2、创建新表格:
create table grade ('在括号里写要创建的数据')
同样的在创建新表格的时候, 也会遇到在创建数据库的时候相同的情况,方式都一样,我就不再此处再详细说明了
-
- 1)、主键创建:
primary key(id)
-
- 2)、外键创建:
foreign key(g_id) references grade(id)
ps:在添加外键的时候,一定要写好关联状态
- 3、插入数据:
insert into grade values('', ''....)
ps:在上面的情况中,因为没有说好要添加那些值,所以在定义的时候,不管是否是主键的值,都要写进去,否则就会报错
insert into grade (g_name, g_desc) values('', '')
- 4、删除数据:
delete from grade where id=1;
- 5、更新数据:
update grade set id=3 where id=1;
- 6、查找数据:
select * from grade;
ps: *的位置可以写你想要查找的元素名
四、索引的增删改查
- 1、什么是索引:
什么是索引: MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。 实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。 但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
- 2、索引的增删改查:
创建语法: create index [index_name索引名] on table_name([column_name 列名]);
删除语法: drop index [index_name 索引名] on table_name;
查看语法: show index from table_name;
修改语法: alter table table_name add unique [index_name 索引名]
五、练习
- 1、创建学生表student,有字段学生姓名s_name,家庭地址s_addr,性别s_sex,电话s_te1,语文成绩,数学成绩s_ shuxue,主键id,外键g_id(关联班级表),学生创建时间s_ create_time
create table student(
id int auto_increment not null,
s_name varchar(30) not null,
s_addr varchar(30) default null,
s_tell varchar(30) not null,
s_chinese float not null,
s_math float not null ,
s_create_time varchar(30) not null,
g_id int default null,
primary key(id),
foreign key(g_id) references grade(id));
由于在创建的时候,漏了一个s_sex, 可以使用以下语句进行准确插入:
alter table student add s_sex char(1) after s_addr;
- 2、创建班级表grade,有字段班级名称g_name,班级描述g_deso,班级创建时间g_ create time,主键id
create table grade(
id int auto_increment not null,
g_name varchar(30) not null,
g_deso varchar(500) not null,
primary key(id),
)
- 3、创建学生扩展表Studentinfo,有字段家长姓名1name,家长电话i_ phone,主键id,外键i_id(关联学生表
create table studentinfo (
id int auto_increment not null,
i_name varchar(10) not null,
i_phone varchar(30) not null,
i_id int default null,
primary key(id),
foreign key(i_id) references student(id));
- 4、向各个表格中插入数据
insert into student (s_name, s_addr, s_sex, s_tell,.....) values(......)
插入数据就按照这个格式一致写就对了,当然也可以按照以下的方法进行开火车式书写
insert into student (s_name, s_addr, s_sex, s_tell,...) values(...), (...), (...)
- 5、查询每个班级下有多少学生
select count(*) as '学生个数', g.g_name as '班级名称' from student s join grade g on s.g_id=g.id group by(g.id);
- 6、 查询每个班级下学生的语文成绩最高的学生
select t2.s_chinese as '最高语文成绩', t2.s_name as '学生名字', t1.id as '班级名字' from
(select max(s.s_chinese) as chinese_score, g.id as id from student s join grade g on s.g_id=g.id GROUP BY g.id) as t1 join student t2 on t1.id=t2.g_id where t2.s_chinese=t1.chinese_score;
- 7、查询每个班级下学生的数学成绩最低的学生前3个学生
select t1.s_name as stu_name, t1.s_chinese as chinese_score,
t2.name as name from (
select min(s.s_chinese) as min_score, g.id as id, g.g_name as name from student s join grade g on s.g_id=g.id group by g.id) as t2 join student t1 where t2.min_score!=t1.s_chinese and t1.g_id=t2.id;
ps: 我这种方法目前只能找到除去最低成绩的所有学生,下面还有一种方法,要比上面的好一点,不过当班级人数不够3人, 或者有多个最低分的时候,会出现bug
SELECT * from student s1
where 2>=(
select count(*) from student s
WHERE s1.s_math>s.s_math
and s1.g_id=s.g_id
)ORDER BY s1.g_id, s1.s_math
- 8、统计每个班级下语文成绩的平均值,以及总和
select sum(s_chinese), avg(s_chinese), g_id from student s join grade g on s.g_id=g.id group by g.id;
- 9、查询每个班级下语文成绩大于68分的学生信息
select s.s_chinese as '语文成绩', s.s_name as '学生名字', g.id as '班级名字' from student s join grade g on s.g_id=g.id where s.s_chinese>68;