我们都知道,在SQL库中,为了消除数据的冗余性,因此呢,常常用多个表的连接来表述一条完整的记录。如:一条完整的部门职工信息通常是由三个不同的表来表述的,即:员工信息表、部门信息表和城市信息表。
多表的连接通常有两种方式:全连接和join连接。Join连接分内连接、左外连接和右外连接三种。
全连接:
将各个表用逗号隔开,形式如下:查询出公司所有员工姓名, 所在部门名
select 员工信息.name,部门信息.name from 员工信息,部门信息 where 员工信息.department_id = 部门信息.id;
join连接:
1. 内连接:用关键字inner修饰的,如:查询所有员工, 员工所属部门select 员工信息.name,部门信息.name from 员工信息 inner join 部门信息 on 员工信息.department_id = 部门信息.id;
2. 左外连接(left outer join(注:outer可省略)):除了匹配行外,还包含左表中有的但右表中没有的,对于这样的行,右表中被选择的列设置为null。
3. 右外连接(right outer join(注:outer可省略)):除了匹配行外,还包含右表中有的但左表中没有的,对于这样的行,左表中被选择的列设置为null。
子查询:
在SQL语句中,常用的是where子句的运用,一般来说,在where子句中写入要查找的条件,从而在指定的表中进行查询,同时,where子句也可进行嵌套,实现在多表中的查询。
如:查询出公司所有员工姓名, 所在部门名
select 员工信息.name,部门信息.name from 员工信息,部门信息 where 员工信息.department_id = 部门信息.id;
查询出开发部所有员工名
select name from 员工信息 where department_id = (select id from 部门信息 where name = "开发部");
组函数查询:
1. Count()统计组中满足条件的行数
2. 统计员工人数, 显示如下格式
select count(*) as "员工总数",count(age<30) AS "30以下",count(age>30) as "30以上" from 员工信息;
3. max/min求表达式中所有值的最大值与最小值,avg()求指定列的平均值,sum()求指定列的值总和
查询公司员工工资最大值, 最小值, 平均值, 总和
select max(salary)from 员工信息;
select min(salary)from 员工信息;
select avg(salary)from 员工信息;
select sum(salary)from 员工信息;
4. group by 子句
select 列名 from 表明 group by 列名 [having 条件语句]注:having 语句相当于where 子句,having必须与group by 连接
如:查询年龄大于30岁的员工有几个:select count(name
) from 员工信息 group by age having age>30;