mysql练习题
创建表
-
创建student表
-
CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY, name VARCHAR(20) NOT NULL, sex VARCHAR(4), birth YEAR, department VARCHAR(20), address VARCHAR(50) )ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
创建score表
-
CREATE TABLE score ( id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT, stu_id INT(10) NOT NULL, c_name VARCHAR(20), grade INT(10) )ENGINE=InnoDB DEFAULT CHARSET=utf8;
表创建记录
-
student插入记录的INSERT语句
-
INSERT INTO student VALUES( 901,'张老大', '男',1985,'计算机系', '北京市海淀区'); INSERT INTO student VALUES( 902,'张老二', '男',1986,'中文系', '北京市昌平区'); INSERT INTO student VALUES( 903,'张三', '女',1990,'中文系', '湖南省永州市'); INSERT INTO student VALUES( 904,'李四', '男',1990,'英语系', '辽宁省阜新市'); INSERT INTO student VALUES( 905,'王五', '女',1991,'英语系', '福建省厦门市'); INSERT INTO student VALUES( 906,'王六', '男',1988,'计算机系', '湖南省衡阳市');
-
score插入记录的INSERT语句
-
INSERT INTO score VALUES(NULL,901, '计算机',98); INSERT INTO score VALUES(NULL,901, '英语', 80); INSERT INTO score VALUES(NULL,902, '计算机',65); INSERT INTO score VALUES(NULL,902, '中文',88); INSERT INTO score VALUES(NULL,903, '中文',95); INSERT INTO score VALUES(NULL,904, '计算机',70); INSERT INTO score VALUES(NULL,904, '英语',92); INSERT INTO score VALUES(NULL,905, '英语',94); INSERT INTO score VALUES(NULL,906, '计算机',90); INSERT INTO score VALUES(NULL,906, '英语',85);
查询
查询student所有记录
select * from student;
查询student表的第2条到第4条记录
select * from student limit 1,3;
查询student表所有学生的学号(id)、姓名(name)、和院系(department)的信息
select id,name,department from student;
从student表中查询计算机系和英语系的学生信息
select * from sthdent where department in ("计算机系","英语系");
从student表中查询年龄18-22岁的学生信息
select * from student where 2022-birth between 18 and 22;
select * from student where 2022-birth>=18 and 2022-birth<=22;
从student表中查询每个院系有多少人
select department,count(id) from student group by department
从score表中查询每个科目的最高分
select c_name,MAX(grade) from score group by c_name
查询李四的考试科目和考试成绩
select c_name,grade from score where stu_id=(select id from student where name='李四')
用连接的方式查询所有学生的信息和考试信息
select * from score,student where score.stu_id=student.id
计算每个学生的总成绩
select student.id,name,sum(grade) from score,student where score.stu_id=student.id group by id
计算每个科目的平均成绩
select c_name,avg(grade) from score group by c_name
查询计算机成绩低于95的学生信息
select * from student where id in (select stu_id from score where grade<95 and c_name='计算机')
同时查询参加计算机和英语考试的学生的信息
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 a.* from student a,score b,score c where a.id=b.stu_id and b.c_name='英语' and a.id=c.stu_id and c.c_name='计算机'
将计算机考试成绩按从高到低进行排序
select * from score where c_name='计算机' order by grade desc
从student表和score表中查询出学生的学号,然后合并查询结果
select id from student union select stu_id from score
查询姓张或着姓王的同学的姓名、院系、考试科目及成绩
SELECT a.id,name,sex,birth,department,address,c_name,grade
FROM student a,score b where (name LIKE '张%' OR name LIKE '王%') AND a.id = b.stu_id
查询都是湖南的学生姓名,年龄,院系和考试科目及成绩
SELECT a.id,name,birth,department,address,c_name,grade
FROM student a,score b where (address LIKE '湖南%') AND a.id = b.stu_id
查询student表中学生的学号,姓名,年龄,院系和籍贯,并按照年龄从小到大排序
select id,name,2022-birth,department,address from student where 2022-birth order by 2022-birth
查询score表中学生的学号,考试科目和成绩并按照成绩从高到底进行排序
select stu_id,c_name,grade from score ORDER BY grade desc
基础知识
-
order by
- 对指定的结果进行排序,默认升序,使用降序排序可以使用desc关键字
-
limit
- 在sql server中,查询前10条记录,使用top10即可,但在mysql中不支持这个语法,而是使用limit10,limitx/y时,取值为前开后闭,也就是X+1到Y的值
-
group by:分组查询
- 查询的时候需要按照指定的分类进行统计返回结果
- group by 字段1,字段2.。having 筛选条件
- having
- 对分组以后的数据进行筛选
-
like:模糊查询
- 有点类似正则表达式匹配的规则
- 使用%代替*,如果没有%,like子句就与等号的效果是一样的
- %:代表零个或者多个字符
- _:仅代表一个字符
- 【chare】通配符
- 字符列中的任何单一字符
-
in
- 在指定的范围内匹配,只要配到任何一个即可
- 字段名 in (集合)
-
distinct
-
去除重复值,比如我们在上面的示例中查询出score表中有几个考试科目,就可以使用distinct,mysql使用时distinct需要放在select后面的第一个位置
-
select distinct c_name from score
-
-
子查询
-
子查询是指嵌入到别的sql语句中的查询语句
-
常用关键字
-
in
- 字段名 in (子查询)
-
any
- 字段名 >= any(子查询)
-
all
- 字段名 >= all(子查询)
-
exists
-
原来的对比条件子弹要放到exists中作为筛选条件
-
exists (select barcode from storesum where remained=0 and goods.barcode=barcode)
-
-
-
-
连接查询
-
内连接
-
inner join:效率高于where,如果是俩张表的联合查询,优先使用inner join。去俩个集合中共同存在的数据
-
select t1.x1,t1.x2,t2.y1,t2.y2 from t1 inner join t2 on t1.x=t2.y
-
select t1.x1,t1.x2,t2.y1,t2.y2 from t1 inner join t2 where t1.x=t2.y
-
-
外连接
- 左连接
- left join:以左表数据为主,同时获取右表中匹配的数据
- 右连接
- right join:以右表数据为主,同时获取左表中匹配的数据
- 左连接
-
-
组合查询
-
union:主动查重
- 连接俩个以上的select语句的结果组合到一个结果集合中,多个select语句会删除重复的数据
-
union all:当加上all时,不会删除掉重复的数据
-
union左右俩边的返回列数必须一样多,类型必须一样,同时对应的顺序也要一样
-