DQL—— 查询 表中的数据:
语法:
SELECT
selection_list /* 要查询的列名称* /
FROM
table_list /* 要查询的表名称* /
WHERE
condition /* 行条件 * /
GROUP BY
grouping_columns /* 对结果分组* /
HAVING
condition /* 分组后的行条件* /
ORDER BY
sorting_columns /* 对结果排序* /
LIMIT
offset_start, row_count /* 控制查询结果数量* /
条件查询:where 子句
=、!=、<>(不等于)、<、<=、>、>=;
BETWEEN…AND; 在什么范围之间
IN(set);
IS NULL;为空
IS NOT NULL 不为空
AND; 并且
OR; 或者
NOT;非
模糊查询:like
通配符:
'_':匹配单个任意字符
'%':匹配任意数量(包括0个)任意字符
例如:查询第二个字符是m的
select * from student where sanme like '_m%';
字段控制:
- 修改字段的别名:AS (可以省略)
例如:
- 给字段起别名:
select sname as 姓名, sage 年龄 from student;
- 给运算字段起别名:
select sname as 姓名, (工资+奖金) as 总收入 from student;
- 给表起别名:给每一张表起一个别名。简化书写
select stu.sname, stu.sage from student as stu;
字段运算:
- null参与的运算,结果都为null
例如:
工资 是100 奖金是null 我们让这两个字段运算 那结果就为null
- ifnull(字段名称,如果是null的替换值)
(注意:ifnull 是mysql的方言)
例如:
所有如果奖金字段为null 一般我们把奖金替换为0
select sname,(工资+ifnull(奖金,0)) as 总收入from student;
去除重复记录:
语法:
- DISTINCT
例如:
我查询工资是3000的 出现了多条工资为3000 的记录
那我只想展示一条3000的记录 所以可以用 distinct 去除重复记录:
select distinct 工资 from student;
排序:
语法:
order by 排列方式
排列方式 取值:
- ASC 默认值
- DESC 降序排列
例如:
- 按工资从小到大排
select * from student order by 工资 asc;
- 按工资从大到小排
select * from student order by 工资 desc
- 如果出现多条工资一样的 那我们可以指定第二排序条件
select * from student order by 工资 desc,奖金desc;
聚合函数:
定义:
聚合函数是用来做纵向运算的函数
相关函数:
- COUNT():统计指定列不为NULL的记录行数;
例如:
统计个数的 比如我统计有多少个学生
select count(sid) from student;
# 或者传个 星号(*)
select count(*) from student;
- MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
例如:
查询工资最大值
select max(工资) as 最高工资 from student;
- MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
例如:
查询 最少工资
select min(工资) as 最小工资 from student;
- SUM():计算指定列的数值和,如果指 定列类型不是数值类型,那么计算结果为0;
例如:
计算总工资
select sun(工资) as 总支出 from student;
- AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
例如:
计算平均 工资
select avg(工资) as 平均工资 from student;
分组查询:
语法:
group by:一般配合聚合函数使用,查出的数据才有意义
查询的字段:
- 分组字段本身
- 聚合函数
例如:
- 我按部分编号分组 比如有三个部门 然后我求每个部门的平均工资
select 部门编号,AVG(工资) from student group by 部门编号;
- 每个部门的部门编号 已经每个部门工资大于1500的人数
select 部门编号, count(*) from student where 工资>1500 group by 部门编号;
在这里,本人讲解下 where和having的区别:
where和having的区别:
- where:
在分组之前对条件进行限定
不满足条件,就不会参与分组- having:
在分组之后,对结果集的筛选
例如;
- 查询 各个部门平均工资 大于2000 的部门
select 部门编号,avg(工资) from student group by 部门编号 having avg(工资)>2000;
- 查询 各个部门 员工工资大于1500 的平均工资 并且平均工资 大于2000的部门
上面这句话怎么理解呢?
首先查询各个部门,那肯定要按部门编号分组
分组前的条件限定是: 员工工资大于1500的才参与分组
计算出平均工资,然后对结果再进行筛选
筛选出 平均工资 大于2000的部门
select 部门编号,avg(工资) from student group by 部门编号 where 工资>1500 having avg(工资)>2000;
分页查询:
语法:
limit 开始的记录索引, 每一页显示的条数
(开始的记录索引 = (页码-1)*每一页显示的条数)
例如:
15条记录,分3页查询:
select * from student limit 0,5 ; 这是第一页 5 条记录
select * from student limit 5,5 ; 这是第二页 5条记录
select * from student limit 10,5 这是第三页 5条记录
那么,本篇博文的知识点在这里就讲解完毕了。
(请观看本人博文 —— 《【数据库】SQL语句》)