查询是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控制下,比如只选择班长,然后按照班级分组。
原表
id | name | classid | ismonitor |
---|---|---|---|
1 | a | 1 | 0 |
2 | b | 1 | 1 |
3 | c | 2 | 0 |
4 | d | 2 | 1 |
5 | e | 3 | 0 |
6 | f | 3 | 1 |
SELECT * FROM Studentds t GROUP BY t.classid
结果
id | name | classid | ismonitor |
---|---|---|---|
1 | a | 1 | 0 |
3 | c | 2 | 0 |
5 | e | 3 | 1 |
HAVING 是用来筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件过滤出特定的组,也可以使用多个分组标准进行分组。
HAVING 条件必须分组的条件或者带有Select中聚合函数