码迷,mamicode.com
首页 > 数据库 > 详细

(一)SQL关联查询的使用技巧 (各种 join)

时间:2016-08-04 09:01:46      阅读:534      评论:0      收藏:0      [点我收藏+]

标签:

---恢复内容开始---

(一)SQL关联查询的使用技巧 (各种 join)

 

这几天因为工作的时候,发现自己的sql语句基础不是很好,特意研究了一下,发现sql语句真的是博大精深,sql语句不仅是要查出来你想要的数据,更讲究查询的效率,因为在查询大量数据时往往会因为数据量大,造成效率很低,再加上前后台数据的交互,造成了访问延迟等等的一系列问题。

 

   在我们的日常工作中往往用到很多的查询方式,例如 嵌套查询,关联查询,子查询等等,就我而言,我感觉关联查询是最容易学习,和效率最高的。下面就我总结的关联查询如下:

 

关联查询:

 

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字句来缩小乏味

 

2)左连接

 

左连接(left join)返回左表中所有记录和右表中连接字段相等的记录
如果两个表中字段并不完全一一对应,想要那些没有对应的字段也显示出来就可以使用左连接和
右连接查询,一个是包括左边所有,一个是包括右边所有罢了
左连接两表的例子:
select * from 表1 left join 表2 on 表.字段号=表2.字段号;
左连接三表查询的例子:
left join 表2 on 表1.字段号=表2.字段号 left join 表3 on
表2.字段号=表3.字段号

 

3)右连接

 

右连接(right join)返回右表中所有记录和左表中连接字段相等的记录,语法与左连接同,这里就不再举例。另外还有全连接,是将左右两表中没有相关性的记录都选出来。
自连接左连接右连接还可以用于同一张表中,称为自连接,这中用法一般用于表中有层级关系的数据,例如部门表,有部门id,部门名称,上级部门id。为了查询部门名称和
所有上级部门名称,可以这样查询
select 部门名,上级部门名 from 部门表 别名1 left join 部门表 别名2
on 别名1.部门id=别名2.上级部门id

 

4)分组查询

 

group by的使用技巧:他的作用就是对相应的字段进行分组:

 

例子如下:

 

新建一张学生成绩数据表:

 

 技术分享

 

这是一个t_grade表

 

(1)查询该学生的总体成绩的总分

 

sql:  select t.stuName,SUM(t.score) as score from t_grade t  GROUP BY t.stuName

 

结果图:

 

 技术分享

 

(2)查询该学生最高的成绩

 

sql: select t.stuName,MAX(t.score) as score from t_grade t  GROUP BY t.stuName
结果图:

 

 技术分享

 

在分组查询中往往还有很多的查询关系,这里我就不一一的例举了

 

下面分享一个工作中用到的五张表关联查询所用到的sql语句

 

下面是所有的表:

 

(1)sam_domain

 

 技术分享

 

(2) sam_appsystem

 

 技术分享

 

(3) sam_service

 

 技术分享

 

(4) sam_operation

 

 技术分享

 

(5) nxgjj_user_operation

 

 技术分享

 

 

 

查询需求:查询出每个系统模块下,有多少用户访问生成柱状图:

 

sql :

 

select total.app_name, count(distinct total.userid) total_num from

 

             (

 

                select t.domain_code,a.app_code,a.app_name,s.service_code,o.operation_code,u.* from

 

             (  

 

                 select domain.domain_code from sam_domain domain

 

                        where domain.domain_code =‘com.hopesoftnxgjj‘

 

              ) t

 

       inner join sam_appsystem a on a.domain_code = t.domain_code

 

      left join  sam_service s on s.app_code = a.app_code

 

      left join sam_operation o on o.sam_service_code = s.service_code

 

      left join nxgjj_user_operation u on u.dest_operation_code = o.operation_code) total

 

      group by total.app_name

 

结果图:

 

 技术分享

 

效果图:

 

 技术分享

 

以上数据都为测试数据;

 

 

 

 

 

 

 

 

 

 

 

---恢复内容结束---

(一)SQL关联查询的使用技巧 (各种 join)

 

这几天因为工作的时候,发现自己的sql语句基础不是很好,特意研究了一下,发现sql语句真的是博大精深,sql语句不仅是要查出来你想要的数据,更讲究查询的效率,因为在查询大量数据时往往会因为数据量大,造成效率很低,再加上前后台数据的交互,造成了访问延迟等等的一系列问题。

 

   在我们的日常工作中往往用到很多的查询方式,例如 嵌套查询,关联查询,子查询等等,就我而言,我感觉关联查询是最容易学习,和效率最高的。下面就我总结的关联查询如下:

 

关联查询:

 

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字句来缩小乏味

 

2)左连接

 

左连接(left join)返回左表中所有记录和右表中连接字段相等的记录
如果两个表中字段并不完全一一对应,想要那些没有对应的字段也显示出来就可以使用左连接和
右连接查询,一个是包括左边所有,一个是包括右边所有罢了
左连接两表的例子:
select * from 表1 left join 表2 on 表.字段号=表2.字段号;
左连接三表查询的例子:
left join 表2 on 表1.字段号=表2.字段号 left join 表3 on
表2.字段号=表3.字段号

 

3)右连接

 

右连接(right join)返回右表中所有记录和左表中连接字段相等的记录,语法与左连接同,这里就不再举例。另外还有全连接,是将左右两表中没有相关性的记录都选出来。
自连接左连接右连接还可以用于同一张表中,称为自连接,这中用法一般用于表中有层级关系的数据,例如部门表,有部门id,部门名称,上级部门id。为了查询部门名称和
所有上级部门名称,可以这样查询
select 部门名,上级部门名 from 部门表 别名1 left join 部门表 别名2
on 别名1.部门id=别名2.上级部门id

 

4)分组查询

 

group by的使用技巧:他的作用就是对相应的字段进行分组:

 

例子如下:

 

新建一张学生成绩数据表:

 

 技术分享

 

这是一个t_grade表

 

(1)查询该学生的总体成绩的总分

 

sql:  select t.stuName,SUM(t.score) as score from t_grade t  GROUP BY t.stuName

 

结果图:

 

 技术分享

 

(2)查询该学生最高的成绩

 

sql: select t.stuName,MAX(t.score) as score from t_grade t  GROUP BY t.stuName
结果图:

 

 技术分享

 

在分组查询中往往还有很多的查询关系,这里我就不一一的例举了

 

下面分享一个工作中用到的五张表关联查询所用到的sql语句

 

下面是所有的表:

 

(1)sam_domain

 

 技术分享

 

(2) sam_appsystem

 

 技术分享

 

(3) sam_service

 

 技术分享

 

(4) sam_operation

 

 技术分享

 

(5) nxgjj_user_operation

 

 技术分享

 

 

 

查询需求:查询出每个系统模块下,有多少用户访问生成柱状图:

 

sql :

 

select total.app_name, count(distinct total.userid) total_num from

 

             (

 

                select t.domain_code,a.app_code,a.app_name,s.service_code,o.operation_code,u.* from

 

             (  

 

                 select domain.domain_code from sam_domain domain

 

                        where domain.domain_code =‘com.hopesoftnxgjj‘

 

              ) t

 

       inner join sam_appsystem a on a.domain_code = t.domain_code

 

      left join  sam_service s on s.app_code = a.app_code

 

      left join sam_operation o on o.sam_service_code = s.service_code

 

      left join nxgjj_user_operation u on u.dest_operation_code = o.operation_code) total

 

      group by total.app_name

 

结果图:

 

 技术分享

 

效果图:

 

 技术分享

 

以上数据都为测试数据;

 

 

 

 

 

 

 

 

 

 

 

(一)SQL关联查询的使用技巧 (各种 join)

标签:

原文地址:http://www.cnblogs.com/fzstruggle/p/5735301.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!