联接分组查询里知识点

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值。

联接分组查询里知识点

上一篇:基于JavaWeb的汽车销售管理系统设计与实现 项目源码及数据库文件+论文


下一篇:【POJ】3006