zoukankan      html  css  js  c++  java
  • 读《MYSQL开发者SQL权威指南》笔记

    USING使用

    FROM     TEAMS INNER JOIN PLAYERS ON TEAMS.PLAYERNO = PLAYERS.PLAYERNO

    FROM     TEAMS INNER JOIN PLAYERS USING(PLAYERNO)

    聚合函数与分组数据

    聚合函数

    数据分组

    前面提到的SQL函数,其实都是行函数。所谓行函数就是作用在每条记录上的函数。本章将介绍列函数,它们都是用于统计汇总数据。除列函数以外,本章还将介绍数据分组的方法,即Group By 子句的用法。在实际应用中,统计汇总和数据分组会经常被放在一起使用。

    使用 count 函数求记录个数

    count 语法

    count ( 列名 )

    例:统计student表中的学生人数

    select count ( * ) as 总人数 from student

    例:统计没有邮箱的人数

    select count ( * ) as 没有邮箱的人数 from student where mail is null

    使用 sum 函数求和

    语法:

    sum ( 列名 )

    例:计算wj2内 jihe 的总成绩

    select sum ( jihe ) as 几何成绩 from wj2

    使用 avg 函数求某字段的平均值

    语法:

    avg ( 列名 )

    例:求 wj2 表中 jihe 的平均值

    select    avg ( jihe ) as 几何成绩平均值 from wj2

    使用 max 、min 函数求最大、最小值

    语法:

    max ( 列名 )

    min ( 列名 )

    例:求wj2表中几何的最高成绩和最低成绩

    select max ( jihe ) as 几何最高成绩 , min ( jihe ) as 几何最低成绩 from wj2

    数据分组(group by)

    group by 子句用来分组数据,首先必须了解分组是根据指定字段的不同值划分的。例如,性别字段只只有2种值,因此,如果按性别字段分组数据就会产生两个数组;又例如,假设所属院系字段值中有5种不同的值,则如果按所属院系分组就会产生5个组等。

    例:student表,按所属院系分组

    select 所属院系

    from student

    group by 所属院系

    聚合函数与分组配合使用

    count ( * ) 与 group by 的配合使用

    例:student 表,按所属院系分组,并显示人数

    select 所属院系,count(*) as 各院系人数

    from student

    group by 所属院系

    查询数据的直方图

    直方图是表示不同实体之间数据相对分布的条状图,在一个查询语句中使用group by 子句,不仅可以查询数据,还可以格式化数据生成图表。

    例:从student表中,查询一个表示每个院系学生人数的直方图

    select 所有院系

               replicate ( ' = ' , count ( * ) * 3 ) as 人数对比图

    from student

    group by 所属院系

    排序分组结果

    例:在student表中,统计每个院系的学生人数,并按学生人数降序排序

    select 所属院系,count(*) as 人数
    from student
    group by 所属院系
    order by count(*) desc

    反转查询结果

    有时,执行查询语句后得到的数据虽然正确元误,但是当人们查看时会很不方便

    例:从student表中,查询每个院系的男生人数和女生人数

    select 所属院系,性别,count(*) as 人数
    from student
    group by 所属院系,性别
    order by count(*) desc

    上面的查询结果,虽然将统计数据查询出来了,但并不是人们习惯的统计样式。那么人们习惯的统计样式又是什么样的呢?

    例:上一个例子中的习惯样式

    select 所属院系,

              count ( case

                                when 性别 = '男' then 1

                                else null

                          end ) as 男生人数 ,

              count ( case

                                 when 性别 = '女' then 1

                                 else null

                           end) as 女生人数

    from student

    group by 所属院系

    使用 having 子句设置分组查询条件

    有时,人们只希望查看想要的分组的统计信息,而不是所有分组的统计信息。例如只想查看软件工程和计算机硬件的总人数。这时就需要把其它的系过滤掉

    例:在student 表中,统计软件工程系和计算机硬件系的人数,并按学生人数排序

    select 所属院系 , count ( * ) as 人数

    from student

    group by 所属院系

    having 所属院系 in ( ' 软件工程 ' , ' 计算机硬件 ' )

    order by count ( * )

    例:统计Score表中,考试总成线大于450分的学生的信息

    select 学号 , sum(考试成绩) as 考试总成绩

    from score

    group by 学号

    having sum(考试成绩)>=450

    order by 考试总成绩 desc

    第11章

    多表连接查询

    将数据存储在多个不同表的原因

    范式

    连接查询

    高级连接查询组合查询

    多表连接查询是SQL语言最强大的功能之一。它可以在执行查询时动态地先将表连接起来,然后从中查询数据。本章将介绍多表连接查询的相关内容,同进介绍组合查询的用法。

    范式

    第一范式:

    第一范式是关系数据库的底线,要想成为关系数据库则必须满足第一范式,第一范式的内容为,记录的第一个分量都是不可分割的基本数据项。

    第二范式:

    要满足第二范式,首先必须满足第一范式,即满足第一范式是满足第二范式的前提条件,其次,第二范式增加的要求是每一个非主属性要完全函数依赖于码。

    第三范式:

    第三范式是在满足第二范式的基础上,增加了每一个非主属性都不传递依赖于码的要求。

    连接查询

    无连接规则连接

    无连接规则连接后得到的结果是两个表中的每一行都互相连接,即结果为笛卡儿积。

    语法:

    select    *(或字段列表)

    from 表名1,表名2

    有连接规则连接

    有连接规则连接,其实就是在无连接规则的基础上,加上Where子句指定连接规则的连接方法。

    语法:

    select *(或字段列表)

    from    表名1,表名2

    Where 连接规则

    例:将T1和T2表正确连接的语句如下

    select *

    from T1,T2

    where T1.职工号=T2.职工号

    使用两表连接查询数据

    例:查询名为“张三”的学生的所有课程的平时成绩和才试成绩

    select student.学号,student. 姓名,score.课号,score.平时成绩,score.考试成绩

    from student,score

    where student.姓名='张三'

    and student.学号=score.学号

    order by score.才试成绩 desc,score.平时成绩 desc

    使用表别名简化语句

    例:

    select st.学号,st.姓名,c.课名,s.平时成现,s.考试成绩

    from student as a

             score as b

             sourse as c

    where st.姓名='张三'

    and st.学号=s.学号

    and s.课号=c.课号

    例:查询“计算机基础”课程,考试成绩大于等于90分的学生的学号、姓名、系别和考试成绩,并按考试成绩降序排序

    select st.学号,st.姓名,st.所属院系,s.考试成绩

    from score as s ,

    course as c,

    student as st

    where c.课名='计算机基础'

    and s.考试成绩>=90

    and s.课号=c.课号

    and st.学号=s.学号

    order by s.考试成绩 desc

    使用 inner join 连接查询

    语法:

    select * (或字段列表)

    from 表名1

            inner join 表名2

           on 连接规则

           inner join 表名3

           on 连接规则

    其中,关键字“ON”之后是连接表的规则

    高级查询

    自连接查询

    例:

    select st1.*

    from student as st1,student as st2

    where st1.所属院系=st2.所属院系

    and st2.姓名='张三'

    或:

    select *

    from student as st1,student as st2

    where st2.姓名='张三'

    and st1.所属院系=st2.所属院系

    外连接查询

    左外连接:

    例:

    select *

    from student left outer join student2 on student.姓名=student.姓名

    右外连接:

    例:

    select *

    from student right outer join student2 on student.姓名=student.姓名

    全外连接:

    例:

    select *

    from student full outer join student2 on student.姓名=student.姓名

    左外连接

    select * from student left outer join student2 on student.姓名=student2.姓名

    右外连接

    select * from student right outer join student2 on student.姓名=student2.姓名

    全外连接

    select * from student full outer join student2 on student.姓名=student2.姓名

    组合查询(注意:因为组合查询结果集的字段名列表是根据第一个select子句的字段名列表而定的,所以用户在使用order by 时应当注意这一点)

    组合查询使用union 关键字

    语法:

    select 语句1

    union

    select 语句2

    union

    select 语句3

    例:从student表中,查谒来源地为“北京市”或“江苏省”或“内蒙古自治区”的学生的所属院系信息。

    select 所属院系

    from student

    where 来源地='广东省'

    union

    select 所属院系

    from student

    where 来源地='江苏省'

    union

    select 所属院系

    from student

    where 来源地='内蒙古自治区'

    使用union 得到复杂的统计江总样式

    例:

    select 学号,课号,考试成绩

    from student

    union

    select 学号,'总分',sum(考试成绩)

    from student

    group by 学号

    select 学号,'总分',avg(考试成绩)

    from student

    group by 学号

    第12章

    子查询

    返回单值的子查询

    返回一列值的子查询

    相关子查询

    嵌入另一个seelct语句中的select语句称为子查询。目前,子查询能完成的工作通过表连接几乎都可以完成,而在过去,因为内连接的运行效率 比较差,外连接又不能使用,所以子查询被运用重非常广。但是,由于开发人员在过去几年对DBMS的优化,使得内连接的运行效率明显优于子查询,面外连接也 被开发出来。所以人们开始放弃那些难理解的子查询语句,而改用相对容易理解的表连接查询语句。

    虽然多数情况下,使用表连接查询要优于子查询,但是,在特定环境下,子查询运行的效率可能优于表连接查询。为了能够阅读、理解早年编写的SQL语句,所以本书还是将子查询的内容加入了进来。

    使用返回单值的子查询

    例:查询所有学生“心理学”的考试成绩,并以考试成绩降序进行排序

    select 学号,考试成绩

    from score

    where 课号=(select 课号 from course where 课名 ='心理学')

    order by 考试成绩 desc

    子查询与聚合函数的配合使用

    例:查询出生日期最小的学生的所有信息

    select *

    from student

    where 出生日期=(select min(出生日期) from student)

    例:查询“心理学”考试成绩大于其考试成绩大于其考试成绩平均分的所有学生的学号、平时成绩和考试成绩。

    select 学号,平时成绩,考试成绩

    from score

    where 课号=(select 课号 from course where 课名='心理学') and 考试成绩>(select avg(考试成绩) from score where 课号=(select 课号 from course where 课名='心理学'))

    使用in 的子查询

    例:使用in的例子

    select 课号

    from score

    where 课号 in (select 课号 from course where 类型='必修')

    相关子查询(它是一种使用SQL的旧方法,查询的效率非常低,不提倡使用。只要明白就可以)

    第13章 视图

    视图基础

    视图的创建

    视图的删除

    本章将讲解SQL中的另一个概念--视图。视图在数据库应用中经常会出现,它最主要的应用是简化复杂的查询语句。视图是由英文单词VIEW翻译过来的名词,其实VIEW还有“查看”的意思,笔者认为有时该单词译成“查看方式”可能更贴切一些。

    视图基础

    例:定义一个视图vw1,将一个查询语句放入视图内

    create view vw1

    as

    select * from student

    使用视图时:

    select * from vw1

    视图的删除:

    drop view vw1

    视图建立语法:

    create view 视图名

    as

    数据库操作语句

    例:

    create view view_student_all

    as

    select st1.*,st2.*

    from student as st1 join student2 as st2 on st1.姓名=st2.姓名

    利用视图提高数据安全性

    1.隐藏列数据

    例:创建一个只能查看 学号 姓名 和 性别 3个列的视图 vw_student1

    create voiw vw_student1

    as

    select 学号,姓名,性别

    from student

    2.隐藏行数据

    例:创建一个只能查看计算机系学生信息析视图vw_student2

    create view vw_student2

    as

    select *

    from student

    where 所属院系='计算机系'

    利用视图得到汇总数据

    例:创建一个视图vw_student3,显示每个不同院系的学生人数。

    create view vw_student3

    as

    select 所属院系,count ( * ) as 人数

    from student

    group by 所属院系

    第14章

    插入数据

    直接向表插入数据

    通过视图插入数据

    向数据表插入数据也是SQL语言最基本的功能之一。插入数据有多种方法,也需要遵循一定的规则。插入数据使用的SQL语句是INSERT。本章将详细介绍INSERT的各种用法和使用时需要注意的规则。

    直接向表插入数据

    insert into 表名或视图名

    values (字段1的值,字段2的值。。。)

    例:插入一条数据

    insert into student(姓名,性别,总分,平时成绩,address,所属院系)

    values ( '大彪','男',99,99,'中国长春','计算机软件工程')

    将查询结果插入表

    语法:

    insert into 表名(字段表)

    select 语句

    例:将student表中查询到的数据存到student2中

    insert into student2

    select * from student where 姓名='大彪'

    insert select 与 select into 的区别

    insert select 将表中查询到的内容插入到另一个表中

    select into    将表中查询到的内容重新保存为一个新表

    通过视图插入数据

    例:先建立视图

    create view vw_computer

    as

    select *

    from student

    where 所属院系='计算机系'

    在创建视图后执行下面语句

    select *

    from vw_computer

    查询 所属院系 为 计算机系 的数据。

    再进行插入操作

    insert into vw_computer

    values ( '0017','蒋十九','女','1982-05-09','山东省',null,null,'计算机系' )

    with check option

    最后的一句 with check option 是为了保证插入的数据内,所属院系=计算机系,这样才可能使数据安全,因为视图操作的只是 计算机系 的学员信息。

  • 相关阅读:
    line-height 行高
    CSS菜单横竖布局要点
    鬼吹灯之精绝古城迅雷下载
    sublime less高亮插件
    Swiper说明&&API手册
    jQuery的deferred对象详解
    js中typeof与instanceof的不同用法
    js中apply方法的使用
    Javascript获取当前时间戳的方法
    json对象和json字符串转换方法
  • 原文地址:https://www.cnblogs.com/myphoebe/p/2131874.html
Copyright © 2011-2022 走看看