zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

MySQL【二】---数据库查询详细教程{查询、排序、聚合函数、分组}

2023-02-18 16:37:16 时间

1.数据准备、基本的查询(回顾一下)

创建数据库

create database python_test charset=utf8;

查看数据库:

show databases;

 使用数据库:

use python_test;

显示当前使用那个数据库:

select database();

 创建一个数据表:

create table student( id int unsigned primary key auto_increment not null, name varchar(20) default '', age tinyint unsigned default 0, height decimal (5,2), gender enum('男', '女', '中性', '保密') default '保密', cls_id int unsigned default 0, is_delete bit default 0 );
create table classes( id int unsigned auto_increment primary key not null, name varchar(30) not null );

查看数据表:

show tables;

显示如何创建的:

show create table student;

插入数据:

insert into studuent values (0,'小明',18,168.00,2,1,0), (0,'小黄',17,175.00,1,2,0), (0,'小红',14,177.00,2,3,0), (0,'小汉',11,180.00,3,4,0), (0,'小八',12,187.00,3,5,0), (0,'小九',13,182.00,4,6,0), (0,'小十',18,188.00,3,7,0), (0,'小之',17,186.00,2,8,0), (0,'小一',10,188.00,2,9,0), (0,'小二',15,182.00,3,9,0), (0,'小三',18,184.00,2,6,0), (0,'小四',19,185.00,4,4,0), (0,'小五',13,190.00,2,3,0), (0,'小六',14,189.00,2,4,0), (0,'小七',15,178.00,2,5,0), (0,'十一',15,167.00,1,7,0), (0,'十二',18,176.00,1,2,0);
insert into classes values (0, "python01期"), (0, "python02期"), (0, "python04期");

分别得到student和classes的数据库:

 自定义查询:

select id as 序号,name as 姓名,height as 身高 from student;

 同时可以通过as给表起名:达到一样的效果

select s.name,s.age from student as s;

消除重复行:distinct 字段,以查询性别为例:

select distinct gender from student;

2. 条件查询

当数据量比较大的时候,千万别用 select * from student;会占用太多内存;因此采用条件查询;

2.1比较运算符

语法:select .... from 表名 where ....

其中,比较运算符>>=<=都可以

查询大于18岁的信息

select * from student where age>18;

select name,gender from student where age>18;

 等于符号要注意一下:=

select * from student where age=18;

2.2逻辑运算符

逻辑运算符 and or not

18-28岁的学生信息

select * from students where age>18 and age<28;

18岁以上或者身高超过180的

select * from students where age>18 or height>180;

不在18岁以上的女性

select * from students where not (age>18 and gender='女');
select * from students where not (age>18 and gender=2);

不在18岁以上并且是女性
select * from students where not age>18 and gender='女';

其中一个例子:

 2.3 模糊查询

模糊查询 like rlike

like: %替换1个或多个 ;_替换1个 【效率比较低】

查找以小开始的姓名

select name from student where name like "小%";

 查询姓名中有 小的所有名字

select name from student where name like "%小%";

结果和上述相同;

查询有两个字的名字:两个下划线

select name from students where name like "__"

查询有三个字的名字:三个下划线

select name from students where name like "___"

查询至少两个字的名字

select name from student where name like "__%"

rlike:正则表达查找

查找以小开始的姓名:^表示开头中间使用.*

select name from students where name rlike "^小.*";

查找以周开头伦结尾的姓名:结尾使用$

select name from student where name rlike "^周.*伦$";

 2.4 范围查询(不连续查询)

查找年龄为12、18、34的名字

select name from student where age=12 or age=18 or age=34;

select name from student where age in (12,18,34);

不是12、18、34的名字

select name from students where age not in (12,18,34);

连续查询between and

--查找年龄为18~34岁的名字

select name from student where age between 18 and 34;

--查找年龄不为18~34岁的名字

select name from student where age not between 18 and 34;

空判断

判断身高为空的信息

select * from student where height is null;

3.排序

order by 字段【默认是按照组件排序】

asc从小到大 升序(默认)ascend

desc从大到小 降序descend

查询年龄在18-34岁之间的男性,按照年龄从小到大排序。

select * from student where (age between 18 and 34) and gender=1;

select * from student where (age between 18 and 34) and gender=1 order by age desc;

查询年龄在18-34岁之间的女性,按照身高从大到小排序。

select * from student where (age between 18 and 34) and gender=2 order by height desc;

当值相同时,还是按照主键(id)asc排;

order by 多个字段

查询年龄在18-34的女性,身高从高到矮,如果身高相同的情况下按照年龄从小到大排序。如果年龄也相同按照id从大到小

select * from student where (age between 18 and 34) and gender=2 order by height desc,age asc,id desc;

 前面相同情况下再看后续;

按照年龄从小到大,身高从高到矮;

select * from student order by age asc, height desc;

 4.聚合函数

总数count

查询男性有多少人

select count(*) as 男性人数 from student where gender=1;

最大值max,min通用

查询年龄最大的是谁

select max(age) from student;

查询女性最高身高

select max(height) from student where gender=2;

求和:sum

求所有人年龄之和

select sum(age) from student;

求平均值

求所有人年龄的平均值。

select avg(age) from student;

等于 avg(age)   sum(age)/count(*)

四舍五入round(data,2)保留两位

求所有人年龄的平均值。

select round(avg(age),2) from student;

对于有小数存储,建议乘以100等扩大到整数,确保精度

 5.分组

group by 语法:分组数据查询先分组再查询

select gender,count(*) from students group by gender;

按照性别分组,统计处各个性别的人数分配。

select gender,count(*) from student group by gender;

按照性别分组,统计处各个性别有哪些人。

group_concat(name,age...)可以查看多种

select gender,group_concat(name) from student group by gender;

按照性别分组,统计处各个性别的年龄分配.

select gender,avg(age) from students group by gender;

男性的详细信息

select gender,group_concat(name,' ',age,'',id) from student where gender=1 group by gender;

having:对分组进行条件判断:

查询平均年龄超过30岁的性别,以及姓名。

select gender,group_concat(name) from student group by gender having avg(age)>16;

 只显示分组平均年龄大于16的分组

查询每种性别中的人数多于两个的信息。

select gender,group_concat(name) from student group by gender having count(*)>2;

where 和 having的区别:

  • where使用分组前的筛选
  • having 用于分组后的筛选