zoukankan      html  css  js  c++  java
  • 联接分组查询里知识点

    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 列,                       7

    聚合函数                         4

    from 表                          1

    where 条件表达式             2

    group by 列                    3

    having 条件表达式            5

    order by                        6

    第一步从from表开始定位,第二步 挑选符合条件的列,第三步使用group by子句对符合条件的数据重新分组,第四步 新组对每一行运用聚合函数计算出一个对应的值,

    第五步再用having子句筛选不符合条件的组,第六步显示出新组各个列,第七步按照order by子句对新组进行排序

    另:对于第6步和第7步的执行顺序争议非常大,现在我又咨询了一下老师,select列可以拆开两部分来看,就相当于select执行了两次,第一次是在Order by之前查询后再排序,但是排序完之后,select语句可以看做又重新执行了一遍然后展现在你的眼前。所以select的执行顺序一定是最后的。

    这些步骤只存在内存当中用视图效果显示出来结果,但是不会在数据库表中创建新表。

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

  • 相关阅读:
    css选择器的优先级
    ECHO.js 纯javascript轻量级延迟加载
    Chrome测试网站加载时间与流量消耗
    演示:纯CSS实现自适应布局表格
    通过jquery-ui中的sortable来实现拖拽排序
    XAMPP下的composer的安装
    jQuery动态五星评分
    HTML,CSS编码规范
    mysql排序,可以对统计的数据进行排序
    thinkphp中配置信息的二维数组设置与使用
  • 原文地址:https://www.cnblogs.com/345214483-qq/p/3512603.html
Copyright © 2011-2022 走看看