mysql分组统计查询 张三_MySQL 数据的查询

查询的基本语法

select * from 表名;

SELECT [ALL|DISTINCT] [,]…

FROM [,]…

[WHERE ]

[GROUP BY [HAVING ]]

[ORDER BY [ASC|DESC]…]

select distinct *

from 表名

where ....

group by ... having ...

order by ...

limit star,count

from关键字后面写表名,表示数据来源于是这张表

select后面写表中的列名,如果是*表示在结果中显示表中所有列

在select后面的列名部分,可以使用as为列起别名,这个别名出现在结果集中

SELECT 字段名1 [AS] 别名 [,字段名1 AS 别名]… FROM

如果要查询多个列,之间使用逗号分隔

在select后面列前使用distinct可以消除重复的行

select distinct gender from students;

准备数据

1.创建数据库和数据表

2.插入基本数据

drop table if exists student;

-- 创建学生表

CREATE TABLE student (

id INT PRIMARY KEY ,

name VARCHAR(20) NOT NULL ,

sex VARCHAR(1) ,

birth YEAR,

department VARCHAR(20) ,

address VARCHAR(50)

);

-- 创建分数表

drop table if exists score;

CREATE TABLE score (

id INT PRIMARY KEY AUTO_INCREMENT ,

stu_id INT(10) NOT NULL ,

c_name VARCHAR(20) ,

grade INT(10)

);

-- 向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);

简单查询

-- 查询所有的列

select * from student;

-- 查询部分列

select name,department,address from student;

2a3481b98208

查询结果

2a3481b98208

查询部分列

条件

使用where子句对表中的数据筛选,结果为true的行会出现在结果集中

语法如下:

select * from 表名 where 条件;

运算符:

运算符

描述

=

等于

<> 或 !=

不等于

>

大于

<

小于

>=

大于等于

<=

小于等于

BETWEEN

在某个范围内

LIKE

搜索某种模式

关于BETWEEN和LIKE,专门拿出来重点说下

模糊查询 LIKE

LIKE关键字与通配符一起使用

通配符

描述

%

替代一个或多个字符

_

仅替代一个字符

[charlist]

字符列中的任何单一字符

[^charlist]

或者[!charlist]

不在字符列中的任何单一字符

-- 查询姓氏为张的学生信息

SELECT id,name,address FROM student WHERE name LIKE '张%'

-- 查询名字最后一个为“生”的同学

SELECT id,name,address FROM student WHERE name LIKE '%生'

-- 查询名字中含有“生”的学生信息

SELECT id,name,address FROM student WHERE name LIKE '%生%'

-- 查询姓名为两个字,且姓张学生信息

SELECT id,name,address FROM student WHERE name LIKE '张_'

-- 查询姓氏为张、李的学生信息这个可以使用or关键字,但是使用通配符更简单高效

SELECT id,name,address FROM student WHERE name LIKE '[张李]%'

-- 查询姓氏非张、李的学生信息

-- 这个也可以使用NOT LIKE 来实现,用下面方法更好。

SELECT id,name,address FROM student WHERE name LIKE '[^张李]%'

-- 或者:

SELECT id,name,address FROM student WHERE name LIKE '[!张李]%'

2a3481b98208

查询结果

范围查询 BETWEEN

between ... and ...表示在一个连续的范围内

select * from score

where grade between 60 and 80;

2a3481b98208

分数在60~80之间的数据

IN 操作符允许我们在 WHERE 子句中规定多个值。表示:在哪些值当中。

in表示在一个非连续的范围内

-- 查询计算机,英语的成绩

select * from score

where c_name in ('计算机','英语');

2a3481b98208

计算机,英语的成绩

逻辑运算符

AND 在 WHERE 子语句中把两个或多个条件结合起来。表示和的意思,多个条件都成立。

-- 查询姓张的男同学信息

SELECT name,sex FROM student WHERE sex='男' AND Name LIKE '张%'

OR可在 WHERE 子语句中把两个或多个条件结合起来。或关系,表示多个条件,只有一个符合即可。

-- 查询姓氏为张、李的学生信息

SELECT * FROM student WHERE Name LIKE '张%' OR Name LIKE '李%'

NOT对于条件的否定,取非。

-- 查询非张姓氏的学习信息

SELECT * FROM Students WHERE Name NOT LIKE '张%'

空判断

注意:null与''是不同的

判空is null

-- 查询没有填写地址的学生

select * from student where address is null;

判非空is not null

-- 查询填写了地址的学生

select * from students where address is not null;

-- 查询填写了地址的女生

select * from students where address is not null and sex='女';

聚合函数查询

聚合函数:是一个值的集合为输入,返回单个值的函数。

SQL预定义了5个聚集函数:AVG(平均值)、MIN(最小值)、MAX(最大值)、SUM(求和)、COUNT(计数)。

具体的数据库还会预定义一些其他常用的函数,比如字符串相聚合函数、时间聚合函数……。

-- 查询学生总数

select count(id) from student;

-- 分数那一列的求和,最大值,最小值,平均值

select sum(grade),max(grade),min(grade),avg(grade) from score;

2a3481b98208

统计结果

分组查询

按照字段分组,表示此字段相同的数据会被放到一个组中

分组后,只能查询出相同的数据列,对于有差异的数据列无法出现在结果集中

可以对分组后的数据进行统计,做聚合运算

语法:

select 列1,列2,聚合... from 表名 group by 列1,列2,列3...

-- 查询各城市人数

select address as 家乡,count(*)

from student

group by address ;

分组后的数据筛选

语法:

select 列1,列2,聚合... from 表名

group by 列1,列2,列3...

having 列1,...聚合...;

having后面的条件运算符与where的相同

对比where与having

where是对from后面指定的表进行数据筛选,属于对原始数据的筛选

having是对group by的结果进行筛选

注意:分组之后,只能查询被分组的列和聚合函数

-- having后面的条件运算符与where的相同

-- 查询男生总人数

-- 方案一

select count(*)

from student

where sex='男';

-- 方案二

select sex as 性别,count(*)

from student

group by sex

having sex ='男';

2a3481b98208

Paste_Image.png

排序

为了方便查看数据,可以对数据进行排序

语法:

select * from 表名

order by 列1 asc|desc,列2 asc|desc,...

将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推

默认按照列值从小到大排列

asc从小到大排列,即升序

desc从大到小排序,即降序

除了制定某个列排序外,还能指定多列排序,每个排序字段可以制定排序规则

说明:优先第一列排序,如果第一列相同,则按照第二列排序规则执行,以此类推。

-- 排序

select * from score

order by grade;

select * from score

order by grade asc;

select * from score

order by grade desc;

分页

当数据量过大时,在一页中查看数据是一件非常麻烦的事情

语法

select * from 表名

limit start,count```

从start开始,获取count条数据

start索引从0开始

-- 分页

-- 每页显示2条(pageSize),要第4页(pageNow) limit (pageNow-1)*pageSize,pageSize

select * from score

order by id

limit 0,3;

select * from score

order by id

limit 6,2;

####小结

完整的select语句

select distinct *

from 表名

where ....

group by ... having ...

order by ...

limit star,count

执行顺序为:

from 表名

where ....

group by ...

having ...

order by ...

limit star,count

实际使用中,只是语句中某些部分的组合,而不是全部


版权声明:本文为weixin_32127359原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。