2021-06-25

mysql练习案例(实操)

最近想要在回去复习mysql语句,就在网上找了一些案例练习,起初找得都是零零散散的,后面参考这篇博客做出了一个实操案例。Eric_Squirrel:mysql学生表经典案例50题。

首先是建表,我用的是mysql5.7,基本上没有问题

建库

创建alibaba数据库

create database alibaba;

切换到alibaba数据库

use alibaba;

建表

创建学生表student表=

create table student(s_id varchar(10),s_name varchar(10),s_age date,s_sex varchar(10)) engine=InnoDB default charset utf8;insert into student(s_id,s_name,s_age,s_sex)values('01' , '赵雷', '1990-01-01' , '男'),('02' , '钱电' , '1990-12-21' , '男'),('03' , '孙风' , '1990-05-20' , '男'),('04' , '李云' , '1990-08-06' , '男'),('05' , '周梅' , '1991-12-01' , '女'),('06' , '吴兰' , '1992-03-01' , '女'),('07' , '郑竹' , '1989-07-01' , '女'),('08' , '王菊' , '1990-01-20' , '女');

查询 student 表中的数据

select * from student;

创建课程表course

create table course(c_id varchar(10),c_name varchar(10),t_id varchar(10)) engine=InnoDB default charset utf8;insert into course values('01' , '语文' , '02'),('02' , '数学' , '01'),('03' , '英语' , '03');

查询 course 表中的数据

select * from course;

创建教师表teacher

create table teacher(t_id varchar(10),t_name varchar(10)) engine=InnoDB default charset utf8;insert into teacher values('01' , '张三'),('02' , '李四'),('03' , '王五');

查看 teacher 表中的数据

select * from teacher;

创建学生成绩表stu_sco

create table stu_sco(s_id varchar(10),c_id varchar(10),score decimal(18,1)) engine=InnoDB default charset utf8;insert into stu_sco values ('01' , '01' , 80), ('01' , '02' , 90), ('01' , '03' , 99), ('02' , '01' , 70), ('02' , '02' , 60), ('02' , '03' , 80), ('03' , '01' , 80), ('03' , '02' , 80), ('03' , '03' , 80), ('04' , '01' , 50), ('04' , '02' , 30), ('04' , '03' , 20), ('05' , '01' , 76), ('05' , '02' , 87), ('06' , '01' , 31), ('06' , '03' , 34), ('07' , '02' , 89), ('07' , '03' , 98);

查看 stu_sco 表中的数据

select * from stu_sco;

效果图

 

 

 

接下来就是对sql的操作;

完成如下查询语句

1、查询"01"课程比"02"课程成绩高的学生信息及课程分数

SELECT a.*, b.score AS sc1, c.score AS sc2FROM student aJOIN stu_sco bON a.s_id = b.s_idAND b.c_id = 1JOIN stu_sco cON a.s_id = c.s_idAND c.c_id = 2WHERE b.score > c.score;

sql解析:给student表起个别名 a ,给stu_sco表起个别名b,给stu_sco表起个别名c 。注意:b表和c表本质上是同一张表,名字不同而已。然后把这三张表用JOIN连接起来,很显然我们要的不是三张表的全部数据,所以我们要在ON后面加上我们想要过滤的条件。Where后面在加上限制条件,就能得到我们想要的数据。

MySQL中 join的用法:join具有 连接的作用,即当两个或者两个以上的表有关系时,需要用join来连接这些相关的表,来处理或分析数据。

举个例子,我用teacher表course表进行连接

执行select * from teacher JOIN course;之后,等到得新表为

            

 

 

 

 course表和teacher表一一匹配,得出一个新表

新表的列名是两个表列名加起来的,可能会产生相同的列名,如t_id
先用表course中的一行数据和表teacher中的每一行数据不断的拼接,产生新的行
再用表course的第二行去和表teacher中的每一行数据拼接,以此类推
表chourse是3行,表teacher是2=3行,所以按照上面的规律会产成3*3 = 9行的新的表

 

 

 一般我们join后的表,并不是我们想要的,这时,可以用 ON 来加一些条件:

例如:teacher join course on teacher.t_id = course.t_id ,on后面就是我们加的条件,我们想要teacher.t_id这一列数据和course.t_id这一列的数据相等的数据,这里注意一下,join后的表列名是有重复的,所以ON后面的条件语句中我们要加上原来的表名。

select * from teacher join course on teacher.t_id = course.t_id;

 

2、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

SELECT student.s_id AS 学生编号, student.s_name AS 学生姓名, AVG(score) AS 平均成绩FROM student JOIN stu_sco ON student.s_id = stu_sco.s_idGROUP BY student.s_id, student.s_nameHAVING 平均成绩 >= 60;

 

 

 

sql解析:从student表和stu_sco表中查询出学生编号,学生姓名,学生平均成绩,并且学生平均成绩要大于60

 

 

 MySQL中 GROUP BY的用法:

1、当聚集函数和非聚集函数出现在一起时,需要将非聚集函数进行group by
2、当只做聚集函数查询时候,就不需要进行分组了。

MySQL中的聚合函数用来对已有数据进行汇总,如求和、平均值、最大值、最小值等。

count(col): 表示求指定列的总行数
max(col): 表示求指定列的最大值
min(col): 表示求指定列的最小值
sum(col): 表示求指定列的和
avg(col): 表示求指定列的平均值


简单的说,就是先看select 后面的字段,看他要查询那些字段。

其中数据表中有的字段叫非聚集函数,比如上面的student.s_name和student.s_id;这两个字段是student表中有的字段

 

 

 而数据表中没有的字段叫聚集函数,比如平均成绩是通过聚合函数AVG(score)出来的

比如张三的各科成绩的score为语文:100,数学:98

AVG(score)之后就是99,要区别开:score是非聚集函数,但是AVG(score)是聚集函数。

对于上面的sql,我们就要用

GROUP BY student.s_id, student.s_name

对这两个非聚集函数分组,如果不用GROUP BY分组,就会出现下面的错误

 

 

 

 MySQL中 HAVING的用法:

having一般和group by 配合使用。

误区:不要错误的认为having和group by 必须配合使用。

例如:没有group by也能用having

 

 

 

对于非聚集函数,having和where的用法是一样的

 

 

 但是,如果select后面没有那个字段,但是数据表中有那个字段,此时只能用where(大家可以仔细看看两张截图中sql语句的区别)

 

 

 

对于聚集函数,只能用having

3、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩

SELECT student.s_id AS 学生编号, student.s_name AS 学生姓名, COUNT(c_id) AS 选课总数 , SUM(score) AS 总成绩FROM student JOIN stu_sco ON student.s_id = stu_sco.s_idGROUP BY student.s_id, student.s_name;

4、查询"李"姓老师的数量

SELECT COUNT(*) AS 李姓老师的数量FROM teacherWHERE t_name LIKE '李%';

MySQL LIKE 语法:

LIKE运算符用于WHERE表达式中,以搜索匹配字段中的指定内容,语法如下:

WHERE column LIKE 参数

WHERE column NOT LIKE 参数

在LIKE全面加上NOT运算符时,表示与LIKE相反的意思,即选择不包含参数的数据记录

LIKE通常与通配符%一起使用,而不加通配符%的LIKE语法,表示精确匹配,其实际效果等同于 = 等于运算符

 MySQL中 %的用法:

%在sql语句中表示通配符,在模糊查询中用到 如查询姓名以 李开头的 就写成 like '李%' 如 姓名以 李结尾的 写成 like '%李'。 姓名中包含 李的 写成 like '%李%'

5、查询学过"张三"老师授课的同学的信息

SELECT *FROM studentWHERE s_id IN ( SELECT s_id FROM stu_sco WHERE c_id IN (  SELECT c_id  FROM course  WHERE c......

原文转载:http://www.shaoqun.com/a/828832.html

跨境电商:https://www.ikjzd.com/

bol:https://www.ikjzd.com/w/291

笨鸟:https://www.ikjzd.com/w/2713

吴佳:https://www.ikjzd.com/w/1770


最近想要在回去复习mysql语句,就在网上找了一些案例练习,起初找得都是零零散散的,后面参考这篇博客做出了一个实操案例。Eric_Squirrel:mysql学生表经典案例50题。首先是建表,我用的是mysql5.7,基本上没有问题建库创建alibaba数据库createdatabasealibaba;切换到alibaba数据库usealibaba;建表创建学生表student表=createta
prime:https://www.ikjzd.com/w/129
海拍客:https://www.ikjzd.com/w/1742
旺季节日报名时段太短,如何解决备货难题?:https://www.ikjzd.com/articles/6304
遇见西塘 时光漫漫旧事如歌(组图):http://www.30bags.com/a/415316.html
阴茎骨的消失,是男性壮阳的理由,更是人类社会文明的开端:http://www.30bags.com/a/307554.html
为什么30岁的大叔都喜欢找年轻女孩?"看透"90后的女孩:http://lady.shaoqun.com/a/387414.html
睡前的甜蜜故事:http://lady.shaoqun.com/a/387415.html
甜蜜的睡前故事引发:http://lady.shaoqun.com/a/387416.html
Shopify携手ArcMEAD与全球大卖共话中国品牌出海新征途:https://www.ikjzd.com/articles/6306
亚马逊运营之Listing打造中需要了解的几个要素:https://www.ikjzd.com/articles/6328
口述:继子怕我分家产竟把我赶出家门:http://lady.shaoqun.com/m/a/79242.html
趁女朋友洗澡上她闺蜜 把女闺蜜摸出水了:http://lady.shaoqun.com/m/a/247548.html

No comments:

Post a Comment