1.
创建数据库
,
复制表
1)
创建一个新的数据库
db2
CREATE DATABASE
db2
CHARACTER SET
utf8;
2)
将
db1
数据库中的
emp
表 复制到当前
db2
数据库
2 排序
语法结构:SELECT 字段名 FROM 表名 [WHERE 字段 = 值] ORDER BY 字段名 [ASC / DESC]
ASC
表示升序排序
(
默认
)
DESC
表示降序排序
1)
单列排序
需求
1:
使用
salary
字段
,
对
emp
表数据进行排序
(
升序
/
降序
)
--
默认升序排序
ASC
SELECT
*
FROM
emp
ORDER BY
salary;
--
降序排序
SELECT
*
FROM
emp
ORDER BY
salary
DESC
;
2)
组合排序
需求
2:
在薪水排序的基础上
,
再使用
id
进行排序
,
如果薪水相同就以
id
做降序排序
--
组合排序
SELECT
*
FROM
emp
ORDER BY
salary
DESC
, eid
DESC
;
3
聚合函数
之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对某一列的值进行计算,然后返回一个单一的值(
另外聚合函数会忽略
null
空值。
)
;
语法结构
SELECT
聚合函数
(
字段名
)
FROM
表名
;
count(
字段
) .max(字段).min(字段).sum(字段).
avg(
字段
)
需求1
#1
查询员工的总数
#2
查看员工总薪水、最高薪水、最小薪水、薪水的平均值
#3
查询薪水大于
4000
员工的个数
#4
查询部门为
'
教学部
'
的所有员工的个数
#5
查询部门为
'
市场部
'
所有员工的平均薪水
sql实现
#1
查询员工的总数
--
统计表中的记录条数 使用
count()
SELECT COUNT
(eid)
FROM
emp;
--
使用某一个字段
SELECT COUNT
(*)
FROM
emp;
--
使用
*
SELECT COUNT
(
1
)
FROM
emp;
--
使用
1,
与
*
效果一样
--
下面这条
SQL
得到的总条数不准确
,
因为
count
函数忽略了空值
--
所以使用时注意不要使用带有
null
的列进行统计
SELECT COUNT
(dept_name)
FROM
emp;
#2
查看员工总薪水、最高薪水、最小薪水、薪水的平均值
-- sum
函数求和
, max
函数求最大
, min
函数求最小
, avg
函数求平均值
SELECT
SUM
(salary)
AS
'
总薪水
'
,
MAX
(salary)
AS
'
最高薪水
'
,
MIN
(salary)
AS
'
最低薪水
'
,
AVG
(salary)
AS
'
平均薪水
'
FROM
emp;
#3
查询薪水大于
4000
员工的个数
SELECT COUNT
(*)
FROM
emp
WHERE
salary >
4000
;
#4
查询部门为
'
教学部
'
的所有员工的个数
SELECT COUNT
(*)
FROM
emp
WHERE
dept_name =
'
教学部
'
;
#5
查询部门为
'
市场部
'
所有员工的平均薪水
SELECT
AVG
(salary)
AS
'
市场部平均薪资
'
FROM
emp
WHERE
dept_name =
'
市场部
'
;
4 分组
分组查询指的是使用
GROUP BY
语句
,
对查询的信息进行分组
,
相同数据作为一组
注意:分组通常和聚合函数一起使用,单独分组没有意义
语法格式:SELECT
分组字段
/
聚合函数
FROM
表名
GROUP BY
分组字段
[
HAVING
条件
];
需求1
:
通过性别字段 进行分组
,
求各组的平均薪资
SELECT
sex,
AVG
(salary)
FROM
emp
GROUP BY
sex;
需求2:
#1.
查询所有部门信息
#2.
查询每个部门的平均薪资
#3.
查询每个部门的平均薪资
,
部门名称不能为
null
sql实现
#1.
查询有几个部门
SELECT
dept_name
AS
'
部门名称
'
FROM
emp
GROUP BY
dept_name;
#2.
查询每个部门的平均薪资
SELECT
dept_name
AS
'
部门名称
'
,
AVG
(salary)
AS
'
平均薪资
'
FROM
emp
GROUP BY
dept_name;
#3.
查询每个部门的平均薪资
,
部门名称不能为
null
SELECT
dept_name
AS
'
部门名称
'
,
AVG
(salary)
AS
'
平均薪资
'
FROM
emp
WHERE
dept_name
IS NOT
NULL
GROUP BY
dept_name;
需求3
#
查询平均薪资大于
6000
的部门
.
分析
:
1)
需要在分组后
,
对数据进行过滤
,
使用 关键字
having
2)
分组操作中的
having
子语句,是用于在分组后对数据进行过滤的,作用类似于
where
条件。
sql实现
#
查询平均薪资大于
6000
的部门
--
需要在分组后再次进行过滤
,
使用
having
SELECT
dept_name ,
AVG
(salary)
FROM
emp
WHERE
dept_name
IS NOT
NULL
GROUP BY
dept_name
HAVING AVG
(salary) >
6000
;
5 limit
关键字
说明:limit
是限制的意思
,
用于 限制返回的查询结果的行数
(
可以通过
limit
指定查询多少行数据
)
limit
语法是
MySql
的方言
,
用来完成分页
语法结构
SELECT
字段
1,
字段
2... FROM
表名
LIMIT offset , length;
参数说明
limit offset , length; 关键字可以接受一个 或者两个 为0 或者正整数的参数 |
offset 起始行数, 从0开始记数, 如果省略 则默认为 0. |
length 返回的行数 |
需求
1:
#
查询
emp
表中的前
5
条数据
#
查询
emp
表中 从第
4
条开始
,
查询
6
条
sql实现
#
查询
emp
表中的前
5
条数据
--
参数
1
起始值
,
默认是
0 ,
参数
2
要查询的条数
SELECT
*
FROM
emp
LIMIT
5
;
SELECT
*
FROM
emp
LIMIT
0
,
5
;
#
查询
emp
表中 从第
4
条开始
,
查询
6
条
--
起始值默认是从
0
开始的
.
SELECT
*
FROM
emp
LIMIT
3
,
6
;
需求
2:
分页操作 每页显示
3
条数据
sql实现
--
分页操作 每页显示
3
条数据
SELECT
*
FROM
emp
LIMIT
0
,
3
;
--
第
1
页
SELECT
*
FROM
emp
LIMIT
3
,
3
;
--
第
2
页
2-1=1 1*3=3
SELECT
*
FROM
emp
LIMIT
6
,
3
;
--
第三页
--
分页公式 起始索引
= (
当前页
- 1) *
每页条数
-- limit
是
MySql
中的方言