一、单表查询
聚合函数:
- 统计个数:count(): 根据表中实际数据量返回结果
- 最小:min(),各种数据类型的统计
- 最大:max(),各种数据类型的统计
- 平均:avg(),针对数字的统计
- 求和:sum(),针对数字的统计
带过滤条件的分组查询
1、where
WHERE放在group by前
先过滤然后再进行分组
where后面不能使用聚合函数
2、HAVING
HAVING必须配合group by使用 ,并且放在group by后面
【WHERE是在分组前过滤,having是在分组后过滤】
#计算工资在2000以上且各种职位的平均工资大于3000的职位及平均工资
3、Order by 条件 desc(降序)/asc(升序,默认,可省略)
SELECT
表格-列
,AVG(列)
,Count(1)
FROM 表格
WHERE 列 条件
GROUP BY 列
HAVING 条件
ORDER BY 条件 desc/acs
*********************************************************
表格1
表格2
查找平均分数在80分以上的班级,平均分按降序排序
SELECT
s.C_ID 班级
,AVG(s.SCORE ) 平均分
FROM STUDENTS s
GROUP BY s.C_ID
HAVING AVG(s.SCORE ) >=80
ORDER BY 2 desc
4、模糊查询 LIKE
- %:代表零个或多个字符
- [^]:不在范围内
- []:在某一范围内的字符,表示括号内的任一个,有规律的连续数据可表示为[0-9]、[a-g]
- _:代表任一字符,用于控制字符的长度
************************************************************************************************************
--显示名字中有‘i’的学生性别
SELECT
s.S_NAME
,s.SEX
FROM STUDENTS s
WHERE s.S_NAME LIKE '%i%'
二、多表查询
- 方法一
FROM 表1,表2
WHERE 表1,(共性列) = 表2,(共性列)
AND 表1(列) In (‘字符串’)
ORDER BY 表1/2(列)
*********************************************************
----显示2班同学的姓名和班级名称和老师以及成绩
SELECT
s.S_NAME 姓名
,c.C_NAME 班级
,s.C_ID 班号
,c.C_TEA 老师
,s.SCORE 成绩
FROM STUDENTS s ,CLASS c
WHERE s.C_ID = c.C_ID
ORDER BY c.C_ID
- 方法二
FROM 表1 JOIN 表2
ON 表1,(共性列) = 表2,(共性列)
WHERE 表1(列) In (‘字符串’)
ORDER BY 表1/2(列)
*********************************************************
--显示2班同学的姓名和班级名称和老师以及成绩
SELECT
s.S_NAME 姓名
,c.C_NAME 班级
,s.C_ID 班号
,c.C_TEA 老师
,s.SCORE 成绩
FROM STUDENTS s JOIN CLASS c
ON s.C_ID = c.C_ID
ORDER BY c.C_ID
- 方法三
LEFT JOIN:左连接
RIGHT JOIN:右链接
①LEFT JOIN
SELECT *
FROM 表1(主表) LEFT JOIN 表2(附表)
ON 表1,(共性列) = 表2,(共性列)
②(+)表示附表,另一张则为主表
SELECT *
FROM 表1,表2
WHERE 表1,(共性列) = 表2,(共性列) (+)表示附表
**************************************************************************************************************
--查找出没有学生的班级信息
①LEFT JOIN
SELECT
c.*
,s.C_ID
FROM CLASS c LEFT JOIN STUDENTS s
ON c.C_ID = s.C_ID
WHERE s.C_ID IS NULL
②(+)表示附表,另一张则为主表
SELECT
c.*
,s.C_ID
FROM CLASS c , STUDENTS s
WHERE c.C_ID = s.C_ID
AND s.C_ID IS NULL