联接分组查询里知识点
where(条件查询) having(筛选) group by(分组) order by(排序) limit(限制order by的查询结果)
where(条件查询)常用的运算符
比较运算符
>, <, =, !=(<>), >=, <=,in ,between and
如:
select Name as 姓名
from StudentS
where Address in(‘北京‘,‘上海‘,‘广州‘)
order by 列名(此列名最好是唯一的,可以不在Select 语句里出现,只要Students表里有这个列)
另外:
select Name as姓名
from StudentS
where studentresult between 60 and 80
order by Studentresult desc,examdate asc
注:此时between and 里,and左右两边的值只能从小往大书写,意思是>=小数值<=大数值,如果两个值写反成为>=大数值<=小数值,语法无错,但是无值。
还有order by后是可以按照多个列进行不同的排序的。 order by 列名1 asc,列名2 desc 一个列升序,另一个降序来排列的,他们俩不冲突。在列名1的值相等的情况下,按照列名2进行排序。
逻辑运算符
not(!) 逻辑非 or(||)逻辑或 and(&&)逻辑与
where NO>=99 and NO<=500 or NO>=1000 and NO<=9999
where NO not between 501 and 999
模糊查询
where Adress like 通配符 ‘字符串‘ (模糊查询 like 和通配符 在一起才可以使用)
通配符:%任意字符 where Adress like ‘%八一路% ‘ _任意单个字符 where StuName like ‘_金平‘
[]括号中所指定的范围内的一个字符 where StuNO like ‘ABC[0-9]‘ 括号内只能填写0-9之间的任意一个数字
[^]不在括号指定范围内的任意一个字符 where StuNo like ‘ABC[^1-5]‘ 括号内可以是除了1-5之间的任意一个字符
----------------------------------------------------------------------------------------------------------------------------
group by 需要和聚合函数一起使用才有意义,因为分组查询一般用于:汇总分析和统计数据
五种聚合函数sum() 求和, avg() 求平均值, max() 求最大值,min() 求最小值, count() 统计记录
sum()和count()的区别,比如:学生表STU里有NO列和result列,NO result
NO1 80
NO1 100
select NO,sum(result) from STU where result>=60 这时返回的是 NO1 180 学生NO1的分数总和为180
select NO,count(result) from STU where result>=60 这时返回的是 NO1 2 学生NO1的成绩记录为2条
+++++++++++++++++++++++++++++++++++++++++++
还有一种写法
USE MYschool
select * from Result
compute
max(studentresult),min(studentresult)
这出来的结果是两张视图
如若
select * from Result order by studentresult
compute
max(studentresult),min(studentresult) by studentresult
会按照拍序列的值返回多个列,每列都会多返回一个最大值和最小值
++++++++++++++++++++++++++++++++++++++++++++
having 和 where 的异同:having 必须是在分组查询时使用,用在group by之后与where 执行顺序不一样!where在分组前进行匹配符合条件的数据,having用于分组后进行筛选!
select 列, 6
聚合函数 4
from 表 1
where 条件表达式 2
group by 列 3
having 条件表达式 5
order by 7
第一步从from表开始定位,第二步 挑选符合条件的列,第三步使用group by子句对符合条件的数据重新分组,第四步 新组对每一行运用聚合函数计算出一个对应的值,
第五步再用having子句筛选不符合条件的组,第六步显示出新组各个列,第七步按照order by子句对新组进行排序
另:对于第6步和第7步的执行顺序争议非常大,我这里现在也不知道如何取舍了暂且按老师教的去理解,这些步骤只存在内存当中用视图效果显示出来结果,但是不会在数据库表中创建新表。
order by 的几种用法:
select * from Stu order by StuName desc(descending按照降序排列)
select * from Stu order by result asc(ascending不书写asc默认按asc排序)
select * from Stu order by result desc,StuName asc
Select * from Stu order by rand()(随机排列)
select top 10 * from Stu order result()(按照成绩查询前十名的所有信息)
select top 10 percent * from Stu oreder result()(按照成绩查询前10%的所有信息,此查询不太精确,但是可以大概推出表中有多少行数据)
------------------------------------------------------------------------------------------------------------------------------------------------------
limit 检索位置,取出的数据数量
其中检索位置从0开始,不谢则默认为0.
select StuNO, result from Stu order by result desc limit 2,3
(取出第三名到第六名的学生的学生编号和成绩)
---------------------------------------------------------------------------------------------------------------------------------------------------------
多表联接查询应用场景:当多张表中有主外键关系时。
内联接中A和B两张表中,必须有公共字段 实现内连接的的方式有两种:inner join on 和where
学生表Stu中有姓名列(StuName),成绩表Result有分数列(Score),都有一个共同列学生编号列stuno
方式一:select StuName,score,Stu.stuno from Stu inner join Result on Stu.stuno=Result.stuno
方式二:select StuName,score from Stu,Result where Stu.stuno=Result.stuno
inner join关键字两边的表名顺序可以对调,关键字on后等号两边的内容也可以对调,两者都对调后,对执行结果没有影响!
如果所联接的列(select后的列)有公共列输出,那么我们必须加上表明,不然系统无法判定这个公共列是属于哪个表的列。
如果通过where方式书写内联接,后续还有其他限定条件,那么通过and联接。如果多张表联接,where条件后不能出现连等于(如:A.NO=B.NO=C.NO),不然会报错,
要用and (如:where A.NO=B.NO and A.NO=C.NO)
外连接特点:外连接分为左外连接和右外连接。外连接 join两边的表明顺序不能对调。
对于左外连接:左边的表叫主表,查询结果会显示左表和右表中公共字段相匹配的结果,还会讲坐标中在右表中找不到的列匹配项记录用Null值填充。右联接,右边的表叫主表,一般不用,只需用左联接把left outer join 后的表明调换位置就行。
交叉联接会出现笛卡尔积
交叉联接会将A表和B表的记录通过乘法运算形成结果集
(A:10条数据 B:10条数据)结果会有100条数据,A表里的每条数据和B表里的每天数据交叉返回。如从A1开始依次和B1-B10联接返回数据,再依次A2一直到A10。
A1 B1
A2 B2
A3 B3
A4 B4
A5 B5
A6 B6
A7 B7
A8 B8
A9 B9
A10 B10
内联接和外联接的不同点:
内联接里的表地位都是平等的,返回的都是符合联接条件的数据,去掉不符合联接条件的数据。
外联接是两张或多张表中,以主表的数据列为主找到并返回从表中所对应的数据列,如若从表没有对应数据,则在结果集中返回对应的Null值。
如学生表Stu和成绩表Result里,Stu是主表,Result是从表。每一个对应的学生都应该有一个对应的成绩。在使用外联接的时候,如若张三同学没来参加考试,那么学生表中Stu里的张三联接Result表时是没有对应的成绩值的,但是结果集中除了会显示两张表中有对应数据的列,还会显示张三并在成绩表中直接返回NULL值。
原文:http://www.cnblogs.com/345214483-qq/p/3512603.html