数据查询语言,用来查询数据库中表的记录。
查询关键字
: SELECT
一.基本语法
SELECT
字段列表
FROM
表名列表
WHERE # 条件查询(WHERE)
条件列表
GROUP BY # 分组查询(group by)
分组字段列表
HAVING
分组后条件列表
ORDER BY # 排序查询(order by)
排序字段列表
LIMIT # 分页查询(limit)
分页参数
基本查询(不带任何条件)
条件查询(
WHERE
)
聚合函数(
count
、
max
、
min
、
avg
、
sum
)
分组查询(
group by
)
排序查询(
order by
)
分页查询(
limit
)
二.基础查询
查询多个字段
|
SELECT 字段1, 字段2, 字段3 ... FROM 表名 ;
|
SELECT * FROM 表名 ;
| |
查询指定字段
name, workno, age并返回:
select
name,workno,age
from
emp;
查询返回所有字段:
select
*
from
emp;
select
id ,workno,name,gender,age,idcard,workaddress,entrydate
from
emp;
| |
字段设置别名
|
SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... FROM 表名;
|
SELECT 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... FROM 表名;
| |
查询所有员工的工作地址,起别名:select workaddress as '工作地址' from emp; select workaddress '工作地址' from emp; | |
去除重复记录
|
SELECT DISTINCT 字段列表 FROM 表名;
select distinct 字段列表 from 表名;
|
查询公司员工的上班地址(不要重复) :select distinct workaddress '工作地址' from emp; |
三.条件查询
SELECT 字段列表 FROM 表名 WHERE 条件列表 ;
select 字段列表 from 表名 where 条件列表 ;
的比较运算符
| |||
>
|
大于
|
<> 或 !=
|
不等于
|
>=
|
大于等于
|
BETWEEN ... AND ...
|
在某个范围之内(含最小、最大值)
|
<
|
小于
|
IN(...)
|
在in之后的列表中的值,多选一
|
<=
|
小于等于
|
LIKE 占位符
|
模糊匹配(_匹配单个字符, %匹配任意个字符)
|
=
|
等于
|
IS NULL
|
是NULL
|
逻辑运算符
| |
AND 或 &&
|
并且 (多个条件同时成立)
|
OR 或 ||
|
或者 (多个条件任意一个成立)
|
NOT 或 !
|
非 , 不是
|
查询年龄等于
88
的员工
|
select
*
from
emp
where
age =
88
;
|
查询没有身份证号的员工信息
|
select
*
from
emp
where
idcard
is
null
;
|
查询有身份证号的员工信息
|
select
*
from
emp
where
idcard
is not
null
;
|
查询年龄
15
岁
(
包含
)
到
20
岁
(
包含
)
之间员工信息
|
select
*
from
emp
where
age >=
15
&& age <=
20
;
select
*
from
emp
where
age >=
15
and
age <=
20
;
select
*
from
emp
where
age
between
15
and
20
;
|
查询性别为 女 且年龄小于
25
岁的员工信息
|
select
*
from
emp
where
gender =
'
女
'
and
age <
25
;
|
查询年龄等于
8
或
2
或
4
的员工信息
|
select
*
from
emp
where
age =
8
or
age =
2
or
age =
4
;
select
*
from
emp
where
age
in
(
8
,
2
,
4
);
|
查询姓名为两个字的员工信息
_ %
|
select
*
from
emp
where
name
like
'__'
;
|
查询身份证号最后一位是
X
的员工信息
|
select
*
from
emp
where
idcard
like
'%X'
;
select
*
from
emp
where
idcard
like
'____________X'
;
|
四.聚合函数
SELECT 聚合函数(字段列表) FROM 表名 ; 【注:NULL值是不参与所有聚合函数运算的】
函数
|
功能
|
count
|
统计数量
|
max
|
最大值
|
min
|
最小值
|
avg
| 平均值 |
sum
|
求和
|
统计该企业员工数:
select count
(*)
from
emp;
--
统计的是总记录数
select count
(idcard)
from
emp;
--
统计的是
idcard
字段不为
null
的记录数
统计该企业员工的平均年龄:
select
avg(age)
from
emp;
统计西安地区员工的年龄之和 :
select
sum(age)
from
emp
where
workaddress =
'
西安
'
;
五.分组查询
SELECT 字段列表 FROM 表名 [ WHERE 条件 ]
GROUP BY 分组字段名 [ HAVING 分组后过滤条件 ];
where与having区别:判断条件不同:
where不能对聚合函数进行判断,而having可以
执行时机不同:where分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
注意事项:
• 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
• 执行顺序: where > 聚合函数 > having 。
• 支持多字段分组, 具体语法为 : group by columnA,columnB
根据性别分组
, 统计男性员工 和 女性员工的平均年龄:
select
gender, avg(age)
from
emp
group by
gender ;
查询年龄小于
45
的员工
,
并根据工作地址分组
,
获取员工数量大于等于
3的工作地:
select
workaddress,
count
(*) address_count
from
emp
where
age <
45
group by
workaddress
having
address_count >=
3
;
统计各个工作地址上班的男性及女性员工的数:
select
workaddress, gender,
count
(*)
'
数量
'
from
emp
group by
gender , workaddress ;
六.排序查询
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式
2 ;
ASC | 升序(默认值) |
DESC | 降序 |
如果是升序, 可以不指定排序方式ASC ;
•如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序 ;
|
根据入职时间
,
对员工进行降序排序 :
select
*
from
emp
order by
entrydate
desc
;
根据年龄对公司的员工进行升序排序
,
年龄相同
,
再按照入职时间进行降序排序 :
select
*
from
emp
order by
age
asc
, entrydate
desc
;
七.分页查询
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;
注意事项:
• 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。
• 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
• 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
查询第
1
页员工数据
,
每页展示
10条记录:
select
*
from
emp
limit
0
,
10
;
select
*
from
emp
limit
10
;
查询第
2
页员工数据
,
每页展示
10
条记录 →
(
页码
-1)*页展示记录数:
select
*
from
emp
limit
10
,
10
;
八.执行顺序
语法结构:select--from--where--group by--having--order by--limit
运行顺序:from--where--group by--having--order by--limit--select