1.聚合函数 (分组函数)
将多行中得某列得值聚合成一行数据
count(字段名) 根据字段名统计数量返回一个数字也可以将字段名替换成*但是效率不高
sum(字段名) 将多行得指定列得值相加求和 只能应用于数字列上
avg(字段名) 将多行得指定值相加然后去平均值 只能应用数字列上
max(字段名) 获取当前列得最大值可以应用数字 字符串 和日期以上
min(字段名) 获取当前列得最小值可以应用数字 字符串 和日期以上
注意:
1.我们所有得聚合函数都会自动忽略为null得数据
2.当显示列中使用聚合函数之后那么现实中不能出现非聚合数据否则出现错误 但是mysql不会出现错误
但是返回得数据都是不正确得
3.
练习
统计公司中所有得人数
select count(emptno) from emp;
获取工资的平均值
select avg(sal) from emp;
获取部门20的工资平均值
select avg(sal) from emp where job=20;
获取入职时间最早的时间
select min(hiredata) from emp;
获取工资高于公司平均工资的所有员工 (这道题无法实现)
select * from emp where sal>avg(sal); where 后面不能直接聚合函数
2.多表查询 链接查询
查询语句将有多个表 同时查询多个表中的数据 有两个语法 92语法和99语法
一条查询将有多个表
多表查询
语法格式
select 显示列 from 表1[别名] , 表2[别名] where 条件 [group by [having]] [order by]
练习:
获取所有员工的信息及部门信息
错误:这条语句出现笛卡儿积问题 多表查询时获取的所有内容时所有表的城际这个表所有的数据
都会逐一匹配 表越多数据越多那么获取的数据积也越来越多
select * from dept d , emp e
92语法多表查询
需要在where后面添加一个条件 我们需要用这个条件获取对应的数据
where条件的数量至少是表数量-1个 而且必须使用多表之间的关联列消除笛卡儿积
例如:emp和dept表中的deptno部门编号就是关联列
select * from emp e , dept d where e.deptno=d.deptno;
注意:
1.在多表查询时推荐为表名添加别名然后使用别名,字段名,这是为了防止这些表中会出现相同的字段名
99语法多表查询 链接查询 分为两类 内链接和外连接 左外链接 右外链接
语法格式
内连接:
select 显示列 from 表名1[别名] inner join 表名2[别名] on 条件 inner join 表名3[别名] on 条件 …[group by[having]] [order by]
左外连接:
select 显示列 from 表名1[别名] left outer join 表名2[别名] on 条件 left outer join 表名[别名] on 条件 …[group by[having]] [order by
右外连接
select 显示列 from 表名1[别名] right outer join 表名2[别名] on 条件 right outer join 表名[别名] on 条件 …[group by[having]] [order by
注意:
1.inner 和outer 可以省略
2.99语法的内连接获取的数据与92语法是完全一样的
3.左外连接和右外连接相互的 当两个表的数据不能完全匹配时, 如果想让左侧的表多显示数据那就使用左外否则就使用右外
练习
获取所有的员工信息以及部门信息
select * from epm e inner join dept d on d.deptnp=e.deptno
或者
获取所有员工信息和部门信息同时显示没有员工的部门信息
右外连接
select * from emp e right outer join dept d on e.deptno=d.deptno
或者
select * from emp e outer join dept d on e.deptno=d.deptno
左外连接
select * from dept d left outer join emp e on d.empto=e,empto
或者
select * from dept d outer join emp e on d.empto=e,empto
6.子查询
在一条查询语句中嵌套再嵌套
可以出现三个位置中
出现where后面作为一个或者多个数据,
注意:这个子查询只能返回1列n行的数据,如果返回的是1列1行可以使用简单条件 = > >= < <= !=
这个子查询返回的是1列n行那么就要使用 in not in
出现再 from后面 作为一个临时表
注意:1.这个子查询可以返回n行n列的数据
2.这个子查询显示列名作为临时表的字段名使用
3.如果子查询中使用函数 那么必须要为这个显示列起别名
出现再select后面作为显示列的一部分
注意:1.这个子查询需要返回1行1列得数据
2.每一条数据记录都会执行这个子查询因此效率是非常低的不推荐使用
注意:
1.无论子查询出现再什么位置上,子查询必须要放再()里面
where中使用子查询
练习01
获取工资高于公司平均工资的所有员工
思路:
1. 获取公司的平均工资
select avg(sal) from emp
2.使用步骤1作为查询条件,获取工资高于步骤1查询结果的所有记录
select * from emp where sal>( select avg(sal) from emp );
form中使用子查询
练习02
查询员工信息,查询哪些人是管理者 ,要求显示出其员工编号和员工姓名
思路:
1.获取管理者的编号
select mgr from emp where mgr is not null group by mgr
2.使用步骤1的查询语句作为临时表temptable,然后使用emp与temtable进行多表查询
使用temp中的tempno和temptable中的mgr消除笛卡儿积
select * from emp e join temptable tt on e.deptno=tt.mgr
3.使用步骤1的查询语句替换步骤2中的temptable
select * from emp e join (select mgr from emp where mgr is not null group by mgr) tt on e.deptno=tt.mgr
select中使用子查询
练习03
获取员工的信息以及部门的名称
思路
- 获取所有的员工信息
select * from emp e
2.在步骤1的基础上显示列中添加一个子查询,要根据当前记录行中员工的部门编号作为查询条件
select * ,(selcet dname from dept where deptno=e.deptno ) from emp e
union查询结果的合并
limit 分页查询
获取数据库表中的一部分的数据内容,用来提高数据库的响应速度,比较适合数据量大的时候使用
分页也可以提高用户体验
语法结构
select 显示列 from 表名 [where] [group by[having]] [order by] limit 跳过的数据记录 获取多少条记录
跳过的记录数量: 取值为正整数 ,大于等于0
获取多少条记录:取值为正整数 ,大于0
获取前五条记录
select * from emp limit 0,5
获取6到10的记录
select * from emp limit 5,5
获取薪水最高的前五条记录
select * from emp order by sal desc
创建表
create table 表名(
字段名1 数据类型[(长度)] 约束条件,
字段名2 数据类型[(长度)] 约束条件,
…
字段名n 数据类型[(长度)] 约束条件
)
常用的数据类型
Varchar(长度) 变长字符串,存储空间等于实际数据空间
double(有效的数字位数,小数位) 数值型
float(有效的数字位数,小数位) 数值型
Int(长度) 整形
bigint(长度) 长整型
Date 日期型 年月日
DataTime 日期型 年月日 时分秒 毫秒
创建表 t_student 拥有字段
stu_no 字符串类型 长度64
stu_name 字符串类型
stu_age 数字
create table t_student(
stu_no Varchar(64) ,
stu_name Varchar(64) ,
stu_age int
);