一、简介

查询的基本语法

select * from 表名;

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

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

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

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

 

二、消除重复行

在 select 后面列前使用 distinct 可以消除重复的行(重复行是指所有字段都相同的行,有多个字段就要全部判断)

例如 :

select distinct brithday from students;

+---------------------+

| brithday |

+---------------------+

| 1994-02-14 00:00:00 |

+---------------------+

1 row in set (0.00 sec)

三、条件

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

where 前面的是 【原始集】,后面的是 【条件】,筛选得到的结果就是 【结果集】

select * from 表名 where 条件;

条件里面可以写哪些东西呢?

1.比较运算符

等于 =

大于 >

大于等于 >=

小于 <

小于等于 <=

不等于 != 或 <>

例如:

查询编号大于3的学生

select * from students where id>3;

查询编号不大于4的科目

select * from subjects where id<=4;

.....

2.逻辑运算符

and

or

not

例如 :

查询编号大于3的女同学

select * from students where id>3 and gender=0;

查询编号小于4或者没被 删除的学生

select * from students where id<4 or isDelete=0;

3.模糊查询

kill

% 表示任意多个 任意字符

_ 表示一个任意字符

例如 :

查询姓黄的 学生

select * from students where name like '黄%';

查询姓黄并且名只有一个字的 学生

select * from students where name like '黄_';

查询姓黄或者 名为 靖 的学生

select * from students where name like '黄%' or name like '_靖';

4.范围查询

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

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

例如:

查询编号是1或3或8的学生

select * from students where id in (3,5,8);

查询编号是3到 8的学生

select * from students where id between 3 and 8;

5.空判断

注意 null 与 '' 是不同的

判空 is null

判非空 is not null

例如 :

查询没有填写地址的学生

select * from students where hometwon is null;

查询填写了地址的学生

select * from students where hometwon is not null;

5.优先级

小括号 > not > 比较运算符 > 逻辑运算符

and 比 or 先运算,如果 同时出现并希望 先运算 or ,需要结合 ()使用。

 

四、聚合 (聚合就是对现有的多行数据进行统计,使你只能看到统计的结果)

为了快速得到统计数据,提供了5个聚合函数

1. count(*) 表示计算总 行数,括号中写 * 与 列名 ,结果是相同的。

例如 :

查询学生总数

select count(*) from students;

+----------+

| count(*) |

+----------+

| 5 |

+----------+

1 row in set (0.00 sec)

2. max(列) 表示求此列的最大值

例如 :

查询女生编号的最大值

select max(id) from students where gender=1;

+---------+

| max(id) |

+---------+

| 5 |

+---------+

1 row in set (0.00 sec)

3.min(列) 表示求此列的最小值

例如 :

查询未删除的学生的最小编号

select min(id) from students where isDelete=0;

+---------+

| min(id) |

+---------+

| 1 |

+---------+

1 row in set (0.00 sec)

4.sum(列) 表示求此列的和

例如 :

查询女生的编号之和

select sum(id) from students where gender=1;

+---------+

| sum(id) |

+---------+

| 15 |

+---------+

1 row in set (0.00 sec)

5. avg(列) 表示求此列的平均值

例如 :

查询未删除女生的编号的平均值

select avg(id) from students where gender=1 and isDelete=0;

+---------+

| avg(id) |

+---------+

| 3.0000 |

+---------+

1 row in set (0.00 sec)

聚合与子查询 :

例如 :

获取id醉的的女生的所有信息

select * from students where id=(select max(id) from students where gender=1);

+----+------+--------+---------------------+----------+----------+

| id | name | gender | brithday | isDelete | hometwon |

+----+------+--------+---------------------+----------+----------+

| 5 | 雕 | | 1994-02-14 00:00:00 | | NULL |

+----+------+--------+---------------------+----------+----------+

1 row in set (0.01 sec)

把聚合查询的结果作为外面的查询语句的一个条件。

 

五、分组 【给查询 的结果做分组,非聚合字段不能出现在结果集中】

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

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

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

语法 :

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

其中 group by 后面就是分组的依据,比如某个班男的站一队,女的站一队,

那么分组的依据就是男女(性别),分组的目的是为了聚合(更好的统计数据 )。

例如 :

查询男生和女生各自的总数

select gender as '性别' ,count(*) from students group by gender;

+--------+----------+

| 性别 | count(*) |

+--------+----------+

| | 1 |

| | 4 |

+--------+----------+

2 rows in set (0.00 sec)

六、分组后的数据筛选

语法:

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

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

例如 :

查询男生总人数

select gender as '性别' ,count(*) from students group by gender having gender=1;

+--------+----------+

| 性别 | count(*) |

+--------+----------+

| | 4 |

+--------+----------+

1 row in set (0.00 sec)

这个 having 是对 分组后形成的(结果集)进行筛选的。

而 where 是对 from 面的数据(原始集)进行筛选的。

select gender as '性别' ,count(*) from students where gender=1;

 

七、排序

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

语法 :

select * from 表名 order by 列1 asc|desc,列2 asc|desc,...

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

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

asc 从小到大 排序,即 升序

desc 从大到小排序,即 降序

例如 :

查询未删除的男生信息,按 学号降序

select * from students where isDelete=0 and gender=1 order by id desc;

 

八、分页

1.获取部分行

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

语法 :

select * from 表名 limit start,count;

从 start 开始,获取 count 条数据。

start索引从 0 开始(这个编号跟 id 无关)

示例 : 分页

已知,每页显示 m 条数据,当前显示第 n 页

求总页数:

查询 总条数 p1

使用 p1 除以 m 得到 p2

如果整除则 p2 为页数

如果 不整除则 p2+1 为总页数

求第 n 页的数据

select * from students where isDelete=0 limit (n-1)*m,m;