SQL基础 - DQL(查)

  查询是SQL中比较重要的一块,项目中绝大多数操作就是查询,获取该过程的数据。查询是重点也是难点,SQL有一点不一样都会产生天差地别的结果。

一、多表查询

  多表查询根据两张关系相关联的字段关联在一起查找,比如学生表中有学生,班级。课程表中有班级,课程。关联查找就是要找到某个课程的学生名单。就是这样子。

1.1 INNER JOIN(内连接)

  根据两个或多个表中的列之间的关系,从这些表中查询数据。这种方式只返回完全匹配的项,区别于左连接和右连接和全连接。

SELECT fieldlist
FROM table1 [INNER] join table2
ON table1.column=table2.column

1.2 LEFT JOIN(左外连接)

  与内连接相比,即使没有匹配行,也会返回一个表的全集。拿上面那个例子来说,课程表中有些课程是没有班级的,比如公开课,就没有指定班级来上,那么在课程统计的时候,那这些公开课就该是0个学生。如果内联来做,就不会显示这些课程,这当然是不对的。
  左外联的意思就是将左表中即使在由表中没有匹配项,也要完整列出左表内容,没有的选项为NULL。

SELECT Studentid, class, curriculum
FROM Majors LEFT [OUTER] JOIN Students 
ON Students.classid = Majors.classid
或者
SELECT Studentid, class, curriculum
FROM Majors, Students 
ON Majors.classid  =(+)  Students.classid

  如上就是会详细列出Majors下的所有课程,即使他可能没有学生。推荐第一种写法。

1.2 RIGHT JOIN(右外连接)

  右外联的意思就是将右表中即使在由表中没有匹配项,也要完整列出左表内容,没有的选项为NULL。和左外连接正好相反。

SELECT Studentid, class, curriculum
FROM Majors LEFT [OUTER] JOIN Students 
ON Students.classid = Majors.classid
或者
SELECT Studentid, class, curriculum
FROM Majors, Students 
ON Majors.classid  (+)=  Students.classid

1.3 FULL JOIN (全外连接)

  将两张表中的所有行都显示出来,切记,不要这么做,造成性能急剧下降,毕竟要列出两张表,包括各自没有匹配到的数据。

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students FULL OUTER JOIN Majors
ON Students.MajorID = Majors.ID

1.4 CROSS JOIN(交叉连接)

  交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉连接也称作笛卡尔积。 简单查询两张表组合,这是求笛卡儿积,效率最低。切记千万别这么做。

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students CROSS JOIN Majors

二、分组查询(GROUP BY)

  它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。
  分组查询分组,Select项的规则:

  • Select指定字段包含在GroupBY语句中
  • Select指定字段要被包含在聚合函数中(sum,max,min,avg,count)

  通过GROUP BY,有一点需要注意下,显示的时候只显示你获取到的小区域数据内的某一条。什么意思呢,就是学生表中,按照班级GROUP BY,OK,显示时候,并不是该班级中的所有学生都显示出来,而是只显示一个班级一个学生,具体是哪个学生,可以where控制下,比如只选择班长,然后按照班级分组。
  原表

idnameclassidismonitor
1a10
2b11
3c20
4d21
5e30
6f31
SELECT * FROM Studentds t GROUP BY t.classid

  结果

idnameclassidismonitor
1a10
3c20
5e31

  HAVING 是用来筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件过滤出特定的组,也可以使用多个分组标准进行分组。
  HAVING 条件必须分组的条件或者带有Select中聚合函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值