目录
单表查询
查询不会对数据库中的数据进行修改,只是一种显示数据的方式。
select 列名 from 表名 [where 条件表达式]
# 1) select 命令可以读取⼀⾏或者多⾏记录。
# 2) 可以使⽤星号(*)来代替其他字段,select语句会返回表的所有字段数据
# 3) 可以使⽤where语句来包含任何条件。
简单查询
查询所有行和列的数据
#使⽤*表示所有列
select * from 表名;
查询指定列
#查询指定列的数据, 多个列之间以逗号分隔
select 字段名 1, 字段名 2, 字段名 3, ... from 表名;
#例:查询 student 表中的 name 和 age 列
select name,age from student;
指定列的别名进行查询
#对列指定别名(as可省略)
select 字段名 1 as 别名, 字段名 2 as 别名... from 表名;
#对列和表同时指定别名(as可省略)
select 字段名 1 as 别名, 字段名 2 as 别名... from 表名 as 表别名;
表使用别名的原因:用于多表查询的操作
清除重复值
#查询指定列并且结果不出现重复数据
select distinct 字段名 from表名;
查询结果参与运算
某列数据和固定值运算
select 列名 1 + 固定值 from 表名;
某列数据和其它列数据参与运算
select 列名 1 + 列名 2 from 表名;
参与运算的必须是数值类型
示例
/* 需求:
准备数据: 添加数, 英语成绩列, 给每条记录添加对应的数学和英语成绩.
查询的时候将数学和英语的成绩相加
*/
#给所有的数学加 5 分
select math + 5 from student;
#查询 math + english 的和
select *, (math+english) as 总成绩 from student;
#as 可以省略
select *, (math+english) 总成绩 from student;
条件查询
运算符
比较运算符 | 说明 |
---|---|
>、<、<=、>=、=、<> | <>在mysql表示不等于,也可以使用!= |
between… and | 在一个范围之内,如:between 100 and 200表示在100到200之间,包括边界 |
in(集合) | 集合表示多个值,用,分隔 |
like ‘%王%’ | 模糊查询 |
is null | 查询某一列的值为null |
具体操作
#查询 math 分数⼤于 80 分的学⽣
select * from student where math > 80;
#查询 english 分数⼩于或等于 80 分的学⽣
select * from student where english <= 80;
#查询 age 等于 20 岁的学⽣
select * from student where age = 20;
#查询 age 不等于 20 岁的学⽣,注:不等于有两种写法
select * from student where age <> 20;
select * from student where age != 20;
逻辑运算符
逻辑运算符 | 说明 |
---|---|
and | 与 |
or | 或 |
not | 非 |
具体操作
#查询 age ⼤于 35 且性别为男的学⽣(两个条件同时满⾜)
select * from student where age > 35 and sex = '男';
#查询 age ⼤于 35 或性别为男的学⽣(两个条件其中⼀个满⾜)
select * from student where age > 35 or sex = '男';
#查询id是1或3或5的学⽣
select * from student where id = 1 or id = 3 or id = 5;
in关键字
select 字段名 from 表名 where 字段 in (数据 1, 数据 2...);
# in ⾥⾯的每个数据都会作为⼀次条件,只要满⾜条件的就会显示
具体操作
#查询id是1或3或5的学⽣
select * from student where id in(1, 3, 5);
#查询id不是1或3或5的学⽣
select * from student where id not in(1, 3, 5);
范围查询
between 值 1 and 值 2
# 表示从值 1 到值 2 范围,包头⼜包尾
# ⽐如: age BETWEEN 80 AND 100 相当于: age >= 80 && age <= 100
具体操作
#查询 english 成绩⼤于等于 75,且⼩于等于 90 的学⽣
select * from student where english between 75 and 90;
like关键字
# like 表示模糊查询
select * from 表名 where 字段名 LIKE '通配符字符串';
MySQL通配符
通配符 | 说明 |
---|---|
% | 匹配任意多个字符串 |
_ | 匹配一个字符串 |
具体操作
#查询姓⻢的学⽣
select * from student where name like '⻢%';
select * from student where name like '⻢';
#查询姓名中包含'德'字的学⽣
select * from student where name like '%德%';
#查询姓⻢,且姓名有两个字的学⽣
select * from student where name like '⻢_';
排序
# 通过 order by⼦句,可以将查询出的结果进⾏排序(排序只是显示⽅式,不会影响数据库中数据的顺序)
select 字段名 from 表名 where 字段=值 order by 字段名 [asc|desc];
# asc: 升序,默认值
# desc: 降序
单列排序
单列排序:只按某一个字段进行排序。
具体实现
#查询所有数据,使⽤年龄降序排序
select * from student order by age desc;
组合排序
组合排序:对多个字段进行排序,如果第一个字段相等,按第二个字段排序,依次类推。
#语法
select 字段名 from 表名 where 字段=值 order by 字段名 1 [asc|desc], 字段名 2
[asc|desc];
具体实现
#查询所有数据, 在年龄降序排序的基础上, 如果年龄相同再以数学成绩升序排序
select * from student order by age desc, math asc;
聚合函数
之前的查询都是横向查询,它们都是根据条件一行一行判断,而聚合函数是纵向查询,它是对一列值进行计算,然后返回一个结果值。聚合函数忽略空值null。
SQL中的聚合函数 | 作用 |
---|---|
max(列名) | 求这一列的最大值 |
min(列名)求这一列的最小值 | |
avg(列名) | 求这一列的平均值 |
count(列名) | 统计这一列有多少条记录 |
sum(列名) | 对这一列求总和 |
#语法
select 聚合函数(列名) from 表名;
ifnull()函数:可以使用该函数,如果记录为null,赋一个默认值
具体操作
select count(IFNULL(id, 0)) from student;
分组
# 分组查询是指使⽤ GROUP BY 语句对查询信息进⾏分组,相同数据作为⼀组
select 字段 1,字段 2... from 表名 group by 分组字段 [having 条件];
分组的目的是为了统计,一般和聚合函数一起使用
具体操作
#按性别进⾏分组,求男⽣和⼥⽣数学的平均分
select sex, avg(math) from student group by sex;
实际上是将每组的math求了平均,返回每组的统计结果。
当我们使用某个字段进行分组,在查询的时候也要将这个字段查询出来,否则看不到数据属于哪组。
查询年龄大于25岁的人,按性别分组,统计每组的人数,并只显示性别人数大于2的数据
#错误写法
SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex WHERE COUNT(*) >
2;
#正确写法 对分组查询的结果再进⾏过滤
SELECT sex, COUNT(*) FROM student WHERE age > 25 GROUP BY sex having COUNT(*) >
2;
where与having的区别
子局 | 作用 |
---|---|
where | 对查询结果进行分组前,将不符合where的条件行去掉,即在分组前过滤数据,先过滤再分组 |
having | having子局的作用是筛选满足条件的组,即在分组之后过滤数据。 |
where后面不可以使用聚合函数
having后面可以使用聚合函数
limit语句
limit是限制的意思,所以limit的作用是限制查询记录的条数。
limit语法
limit offset, length;
# offset: 起始⾏数,从 0 开始计数,如果省略,默认就是 0
# length: 返回的⾏数