sql练习

 

1.写出创建上面这两张表的sql

CREATE TABLE score(

  id int(10) NOT NULL AUTO_INCREMENT,

  stuId int(10) NOT NULL,

  grade int(10) DEFAULT NULL,

  c_name varchar(20) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8

CREATE TABLE students (

  id int(10) NOT NULL AUTO_INCREMENT,

  name varchar(20) NOT NULL,

  age int(10) DEFAULT NULL,

  sex varchar(4) DEFAULT NULL,

class VARCHAR(20) NOT NULL,

  address varchar(50) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8

2. 使用while循环和repeat循环写各两个存储过程,传入一个行数,控制插入多少条数据,往第一题创建的两个表中各插入500条数据

 

delimiter $$;

CREATE PROCEDURE myproc()

BEGIN

Declare i int;

Set i =1;

While i<=500 do

insert into students(name,sex,age,class,address) values('lgqest', '男','21', '路飞', '广东省');

set i=i+1;

end while;

 

End

$$;

delimiter;

Call myproc();

 

createprocedurescorepc()

begin

declarei int;

seti = 1;

 

repeat

insert into score(stuid,c_name,grade) values(i,'计算机','98');

seti = i + 1;

until i >500

 

endrepeat;

 

end;

call scorepc()

 

 

3.写insert语句插入两个表的数据

(1)

insert into students(id,name,sex,age,class,address) values(801,'张三', '男','21', '乔巴', '北京市海淀区');

insert into students(id,name,sex,age,class,address) values(802,'周星星', '男','18','乔巴', '北京市昌平区');

insert into students(id,name,sex,age,class,address) values(803,'味道', '男','26','路飞', '湖南省永州市');

insert into students(id,name,sex,age,class,address) values(804,'孙杨', '女','21','乔巴', '辽宁省阜新市');

insert into students(id,name,sex,age,class,address) values(805,'李佳家', '女','22','超人', '福建省厦门市');

insert into students(id,name,sex,age,class,address) values(806,'保总才', '女','30','乔巴', '湖南省衡阳市');

insert into students(id,name,sex,age,class,address) values(1001,'徐振宁', '男','21','索隆',  '辽宁省阜新市');

insert into students(id,name,sex,age,class,address) values(1002,'李小强', '男', '18','索隆', '福建省厦门市');

insert into students(id,name,sex,age,class,address) values(1003,'狄任杰', '男','26','蜘蛛侠',  '湖南省衡阳市');

insert into students(id,name,sex,age,class,address) values(1004,'女屌丝', '女', '21','蜘蛛侠', '北京市海淀区');

insert into students(id,name,sex,age,class,address) values(1005, '郁金香', '女','22','索隆',  '北京市昌平区');

insert into students(id,name,sex,age,class,address) values(1006,'裴飞菲', '女', '30','索隆', '辽宁省阜新市');

insert into students(id,name,sex,age,class,address) values(1007,'李小龙', '男','50','索隆',  '福建省厦门市');

(2)insert into score(stuid,c_name,grade) values(801,'计算机','98');

insert into score(stuid,c_name,grade) values(801,'英语','80');

insert into score(stuid,c_name,grade) values(802,'计算机','65');

insert into score(stuid,c_name,grade) values(802,'中文','88');

 

insert into score(stuid,c_name,grade) values(803,'中文','95');

insert into score(stuid,c_name,grade) values(804,'计算机','70');

insert into score(stuid,c_name,grade) values(804,'英语','92');

insert into score(stuid,c_name,grade) values(805,'英语','94');

 

insert into score(stuid,c_name,grade) values(806,'计算机','57');

insert into score(stuid,c_name,grade) values(806,'英语','45');

insert into score(stuid,c_name,grade) values(1001,'计算机','98');

insert into score(stuid,c_name,grade) values(1007,'英语','80');

 

insert into score(stuid,c_name,grade) values(1002,'计算机','65');

insert into score(stuid,c_name,grade) values(1002,'中文','88');

insert into score(stuid,c_name,grade) values(1003,'中文','95');

insert into score(stuid,c_name,grade) values(1004,'计算机','70');

insert into score(stuid,c_name,grade) values(1004,'英语','92');

insert into score(stuid,c_name,grade) values(1005,'计算机英语','94');

insert into score(stuid,c_name,grade) values(1006,'英语','57');

insert into score(stuid,c_name,grade) values(1006,'英语','45');

4.查询students表的所有记录

select * from students;

5.查询students表的第2条到4条记录

select * from students order by id asc limit 4;

6.从students表查询所有学生的学号(id)、姓名(name)和班级(class)的信息

Select id,name,class from students;

7.从students表中查询乔巴和索隆的学生的信息

Select * from students where class='乔巴' or class ='索隆';

8.从students表中查询年龄18~25岁的学生信息

Select * from students where age between 18 and 25;

9.从students表中查询每个班有多少人

Select class,count(id) from students group by class;

10.从score表中查询每个科目的最高分

Select c_name,max(grade) from score group by c_name;

11.查询女屌丝的考试科目(c_name)和考试成绩(grade)

Select c_name,grade from score where stuid = (select id from student where name='女屌丝');

12.用4种多表连接的方式查询所有学生的信息和考试信息(左连接、右连接、内连接、=号连接)

(1)Select * from students left join score on students.id=score.stuid;

(2)Select * from students right join score on students.id=score.stuid;

(3) Select * from students inner joinscore on students.id=score.stuid;

 Select * from students a,score b where a.id=b.stuid;

 13.计算每个学生的总成绩

Select students.name,sum(grade) from students inner join score on students.id=score.stuid GROUP BY students.id;

 14.计算每个考试科目的平均成绩

select c_name,avg(grade) from score GROUP BY c_name;

 15.查询计算机成绩低于95的学生信息

Select * from students inner join score on students.id=score.stuid  where score.c_name='计算机' and score.grade<95;

 16.查询同时参加计算机和英语考试的学生的信息

 Select * from students inner join score on students.id=score.stuid  where c_name='计算机' and stuid in (select stuid from score where c_name='英语');

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

Select * from students inner join score on students.id=score.stuid  where c_name='计算机' ORDER BY grade DESC;

 18.从student表和score表中查询出学生的学号,然后合并查询结果

select id FROM students UNION ALL select stuid from score;

select students.id,score.stuId from students inner JOIN score on students.id=score.stuid;

19.查询索隆班姓李的男同学的成绩和学生信息

select * from students inner JOIN score on students.id=score.stuid where students.name like '李%' and sex='男' AND students.class='索隆';

20.查询都是湖南的学生的姓名、年龄、班级和考试科目及成绩

select students.name,students.age,students.class,score.c_name,score.grade from students inner JOIN score on students.id=score.stuid where students.address like '%湖南%';

21.把总成绩小于100的学生名称修改为白胡子

select * from score GROUP BY stuid HAVING sum(grade)<100;

 update students set students.name='天才' where students.id in (select score.stuId from score GROUP BY stuid HAVING sum(grade)<100);

 22.查询只学过一门课的学生信息

select * from students where students.id in(select stuId from score GROUP BY stuid HAVING count(stuid)<2);

 23.查出有多少个年龄一样的学生、把已有年龄全部分组 然后统计

select age,count(age) from students GROUP BY age;

 24.索引是什么,如何创建索引,为什么要使用索引?写自己的理解

(1)索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。

(2)

–直接创建索引

 

 

CREATEINDEXindex_name ONtable(column(length))

     

 

 

–修改表结构的方式添加索引

 

 

ALTERTABLEtable_name ADDINDEXindex_name ON(column(length))

 

 

–创建表的时候同时创建索引

 

CREATETABLE`table` (

 

 

 

`id` int(11) NOTNULLAUTO_INCREMENT ,

 

 

`title` char(255) CHARACTERSETutf8 COLLATEutf8_general_ci NOTNULL,

 

 

`content` text CHARACTERSETutf8 COLLATEutf8_general_ci NULL,

 

`time` int(10) NULLDEFAULTNULL,

 

 

 

PRIMARYKEY(`id`),

 

 

INDEXindex_name (title(length))

 

 

)

 

 

–删除索引

 

 

DROPINDEXindex_name ONtable

(3) 如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型网站单日就可能会产生几十万甚至几百万的数据,没有索引查询会变的非常缓慢

25.创建一个视图,要求显示总成绩大于160分的的学生的班级、课程名称、分数、学号、学生姓名、学生性别。

select sum(grade),students.class,students.id,students.name,students.sex,score.c_name from score INNER JOIN students ON score.stuid=students.id GROUP BY stuid HAVING sum(grade)<160;

 

posted @ 2016-09-23 11:27  先定一个小目标  阅读(340)  评论(0编辑  收藏  举报