mysql高级查询技巧一二
时间:2014-12-14 14:00 来源:linux.it.net.cn 作者:IT
在第二个项目中由于组长一开始数据库设计的时候没有照顾到功能的实现,所以后期的功能逻辑出现了很大的难度,不过倒也锻炼了自己的数据库查询技巧,这里总结一下数据查询的一些知识
1,关联查询
关联查询分为内连接(inner join或者join)只返回两个表中连接字段相等的行
内连接连接两表的例子:
select * from 表1 inner join 表2 on 表1.字段号=表2.字段号
内连接连接三表的例子:
select * from (表1 inner join 表2 on 表1.字段号=表2.字段号) inner join 表3 on
表1.字段号=表3.字段号
内连接四表的例子:
select * from ((表1 inner join 表2 on 表1.字段号=表2.字段号)inner join 表3 on
表1.字段号=表3.字段号)inner join 表4 on 表1.字段号=表4.字段号
类似查询最好使用数字字段,其查询的字段必须是主键,自动增长类型。否则很难成功,内连接还
可以增加where字句来缩小范围
左连接(left join)返回左表中所有记录和右表中连接字段相等的记录
如果两个表中字段并不完全一一对应,想要那些没有对应的字段也显示出来就可以使用左连接和
右连接查询,一个是包括左边所有,一个是包括右边所有罢了
左连接两表的例子:
select * from 表1 left join 表2 on 表.字段号=表2.字段号;
左连接三表查询的例子:
select * from 表1 left join 表2 on 表1.字段号=表2.字段号 left join 表3 on
表2.字段号=表3.字段号
右连接(right join)返回右表中所有记录和左表中连接字段相等的记录,语法与左连接同,这里就不再举例。另外还有全连接,是将左右两表中没有相关性的记录都选出来。
自连接左连接右连接还可以用于同一张表中,称为自连接,这中用法一般用于表中有层级关系的数据,例如部门表,有部门id,部门名称,上级部门id。为了查询部门名称和
所有上级部门名称,可以这样查询
select 部门名,上级部门名 from 部门表 别名1 left join 部门表 别名2
on 别名1.部门id=别名2.上级部门id
2,嵌套查询
在一个SELECT 语句的WHERE 子句或HAVING 子句中嵌套另一个SELECT 语句的查询称为嵌套查询,被嵌套的称为子查询,子查询还可以嵌套。
简单嵌套查询的例子:
select 单价表.客户, 单价表.产品名, 单价表.单价 from 单价表 where 单价表.产品名
= (select 产品表.产品名 from 产品表 where 产品表.产品ID = "102-5000")
查询得到单价表里满足产品名为产品表里产品ID为“102-5000”的产品的相关信息
带in字句的嵌套查询:
select 雇员表.雇员编号, 雇员表.姓名, 雇员表.职位, 雇员表.薪水 from 雇员表
where 薪水 in (select 薪水 from 雇员表 where 姓名='张三')
查询得到雇员表里满足薪水符合姓名为张三的薪水的所有雇员的相关信息,比如
in(1000,1500,2000)表示薪水=1000或1500或2000的情况。注:此语句完成的查询薪水和张三相等的职员
带any的嵌套查询:
select 雇员表.雇员编号,雇员表.姓名, 雇员表.职务, 雇员表.薪水 from 雇员表
where 薪水> any (select 薪水 from 雇员表 where 职务=‘工程师’)
查询得到薪水比职务为工程师的薪水要高的职员信息。例如子查询结果为(2000,1500,1000)
3,分组查询
在select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句 限制返回的结果集。
在带有group by 子句的查询语句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚组函数 where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数
select max(sal),job emp group by job;
查询语句的select 和group by ,having 子句是聚组函数唯一出现的地方,在where 子句中不能使用聚组函数。
select deptno,sum(sal) from emp where sal>1200 group by deptno having sum(sal)>8500 order by deptno;
在使用group by 时,有一个规则需要遵守,即出现在select列表中的字段,如果没有在组函数中,那么必须出现在group by 子句中。(select中的字段不可以单独出现,必须出现在group语句中或者在组函数中。)
(责任编辑:IT)
在第二个项目中由于组长一开始数据库设计的时候没有照顾到功能的实现,所以后期的功能逻辑出现了很大的难度,不过倒也锻炼了自己的数据库查询技巧,这里总结一下数据查询的一些知识 1,关联查询 关联查询分为内连接(inner join或者join)只返回两个表中连接字段相等的行 内连接连接两表的例子: select * from 表1 inner join 表2 on 表1.字段号=表2.字段号 内连接连接三表的例子: select * from (表1 inner join 表2 on 表1.字段号=表2.字段号) inner join 表3 on 表1.字段号=表3.字段号 内连接四表的例子: select * from ((表1 inner join 表2 on 表1.字段号=表2.字段号)inner join 表3 on 表1.字段号=表3.字段号)inner join 表4 on 表1.字段号=表4.字段号 类似查询最好使用数字字段,其查询的字段必须是主键,自动增长类型。否则很难成功,内连接还 可以增加where字句来缩小范围
左连接(left join)返回左表中所有记录和右表中连接字段相等的记录 如果两个表中字段并不完全一一对应,想要那些没有对应的字段也显示出来就可以使用左连接和 右连接查询,一个是包括左边所有,一个是包括右边所有罢了 左连接两表的例子: select * from 表1 left join 表2 on 表.字段号=表2.字段号; 左连接三表查询的例子: select * from 表1 left join 表2 on 表1.字段号=表2.字段号 left join 表3 on 表2.字段号=表3.字段号 右连接(right join)返回右表中所有记录和左表中连接字段相等的记录,语法与左连接同,这里就不再举例。另外还有全连接,是将左右两表中没有相关性的记录都选出来。 自连接左连接右连接还可以用于同一张表中,称为自连接,这中用法一般用于表中有层级关系的数据,例如部门表,有部门id,部门名称,上级部门id。为了查询部门名称和 所有上级部门名称,可以这样查询 select 部门名,上级部门名 from 部门表 别名1 left join 部门表 别名2 on 别名1.部门id=别名2.上级部门id 2,嵌套查询 在一个SELECT 语句的WHERE 子句或HAVING 子句中嵌套另一个SELECT 语句的查询称为嵌套查询,被嵌套的称为子查询,子查询还可以嵌套。 简单嵌套查询的例子: select 单价表.客户, 单价表.产品名, 单价表.单价 from 单价表 where 单价表.产品名 = (select 产品表.产品名 from 产品表 where 产品表.产品ID = "102-5000") 查询得到单价表里满足产品名为产品表里产品ID为“102-5000”的产品的相关信息 带in字句的嵌套查询: select 雇员表.雇员编号, 雇员表.姓名, 雇员表.职位, 雇员表.薪水 from 雇员表 where 薪水 in (select 薪水 from 雇员表 where 姓名='张三') 查询得到雇员表里满足薪水符合姓名为张三的薪水的所有雇员的相关信息,比如 in(1000,1500,2000)表示薪水=1000或1500或2000的情况。注:此语句完成的查询薪水和张三相等的职员 带any的嵌套查询: select 雇员表.雇员编号,雇员表.姓名, 雇员表.职务, 雇员表.薪水 from 雇员表 where 薪水> any (select 薪水 from 雇员表 where 职务=‘工程师’) 查询得到薪水比职务为工程师的薪水要高的职员信息。例如子查询结果为(2000,1500,1000) 3,分组查询
在select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句 限制返回的结果集。 在使用group by 时,有一个规则需要遵守,即出现在select列表中的字段,如果没有在组函数中,那么必须出现在group by 子句中。(select中的字段不可以单独出现,必须出现在group语句中或者在组函数中。) (责任编辑:IT) |