黑暗天使 发表于 2020-3-3 21:36:35

学习数据库,从基本的SQL命令开始

本帖最后由 黑暗天使 于 2020-3-4 00:33 编辑



       大家好,欢迎来到黑暗天使的基础学堂。时间真快,又到了学习的时间了。今天学什么内容好呢? 先别急,在此之前,我问大家这样一个问题,什么是论坛? 相信大家第一反应很可能都是回答,论坛嘛就是来分享资源,买资源,大家共同交流,休闲的地方吧。这样说当然也没错啦,但是如果是站在计算机的角度或领域,就应该更加准确的表达。论坛的实质可以看成是动态网站+后台数据库的结合体。网页大家都见过,最原始的是HTML语言,一般可以理解为静态网。静态网它上面的文字或图片数据都是静态的,不能自动更新,因为它没有数据库的支持。动态网站一般常见的有ASP,JSP,PHP,后台数据库最常见有ACCESS,ORACLE,MySQL等。现在的很多社区或论坛一般都是PHP+MYSQL组合模型。


       好了好了,我们就不深入了,我们这不是微软就业班,只是给非计算机的人多一份对论坛对数据库的热情或了解,仅此而已。确实有能力的有兴趣的朋友,去贴吧交流,相信你一定收获不浅。回归主题,今天想给大家上一节理论课,计算机可不是光靠实践,编程也好,建网站也好,都要学好理论。今天的主题是《学习基本数据库SQL语言》。


       在下面正式开始具体内容前,有几件事我必须要交代清楚。此处的学习实例纯属虚构和论坛本身毫无关系,我下面的所有内容全都是我自己写的,和百度没有任何关系。下面内容原本是我在学校教计算机时写的一部分教案,拿出来分享给大家学习。论坛的学生党还是有很多的,大学生也不少,不管你是哪个专业,都会学计算机,都会涉及到数据库,学校考试,国家计算机考试也好,总要面对的。把下面学完后,至少数据库语言方面,应付学校或国家二级考试是没问题的,想要更高要求,就只能靠你自己了。


我们先假设构建下面三个表

会员信息表(会员ID,金币,精品值,积分,组别)
购买信息表(会员ID,资源ID,购买日期,原贴地址,备注)
资源信息表(资源ID,资源名称,类型,发布者,发布日期,所在区域,售价)


特别声明

1)这是我们虚构的三个表,只构建了最基本的几个字段,实际论坛中的数据库绝不可能是这么简单。实际中最底层的数据库光是加密可能都有好几层,我们只是学习,所以上面的表合不合理并不是最主要的。

2)之所以要同时有资源ID和资源名称,是因为同一资源如(旋风管家2,既有原盘,又有录制版,还有合成版等。此外,即便是同种类型的资源,比如《一拳超人》高清合成版,在特殊情形下,有可能有多个发布者都发布了,但不管发布多少,资源的ID编号肯定不同。同名同姓的学生有很多,学号是绝不能相同的,一样的道理)



SQL基本格式

   SELECT             字段1,字段2,....字段n
   FROM               表1,表2,表n...
   WHERE             表连接条件
   GROUP BY      分组字段HAVING 分组条件
   ORDER BY         排序字段
   INTO TABLE      输出表名


一 最基础最简单的查询(单表查询)

例1查询论坛中"黑暗天使"的会员信息。

   SELECT *FROM 会员信息表 WHERE 会员ID="黑暗天使"

   *表示所有记录

    此例还可以写作

   SELECT会员ID,金币,精品值,积分,组别FROM 会员信息表; (由于换行了,所以要加分号)
   WHERE会员ID="黑暗天使"
      
   注意: 字段间的顺序不可以调换。
   

例2查询论坛中所有会员的金币和精品值。

   SELECT金币,精品值FROM会员信息表

   此例如果写*号就错了,不要看到题目中有"所有"二字,就写*号,自己体会例1和例2的区别。


二 多表查询

   基本格式   
                  SELECT字段1,字段2,...FROM 表1,表2
                  WHERE   表1.公共字段=表2.公共字段


例3查询论坛中"雨飞飞"会员的积分,精品值,和购买的资源ID。

      SELECT积分,精品值,资源IDFROM 会员信息表,购买信息表;
      WHERE会员信息表.会员ID="雨飞飞" AND 会员信息表.会员ID=购买信息表.会员ID

      此例明显需要2个表,会员信息表.会员ID="雨飞飞"是查询条件,会员信息表.会员ID=购买信息表.会员ID是2个表的连接条件,前后可以调换。


例4查询购买了"旋风管家2"原盘的所有会员的会员ID,积分,购买日期并按积分降序排序。

      SELECT 会员信息表.会员ID,积分,购买日期FROM 会员信息表,购买信息表,资源信息表;
      WHERE资源名称="旋风管家2" AND 类型="原盘";
         AND    会员信息表.会员ID=购买信息表.会员ID;
      AND    购买信息表.资源ID=资源信息表.资源ID;
      ORDER BY 积分DESC
   
   此例中有几个重点我解释一下。

   1)会员ID为什么不能直接写,要写成会员信息表.会员ID. 这是因为2个表中都有会员ID,所以前面加表名限写,那么能不能写成购买信息表.会员ID,答案是肯定的,当然可以。
   2)此例用到了3个表,所以需要连接2次,同理,n个表要连接n-1次
   3)最后的ORDER BY 表示排序,ASC表示升序,DESC表示降序,升序时ASC可以省略不写


三嵌套查询

    嵌套查询是一类特殊的查询,也是整个SQL语句的难点之一。当查询字段在一个表中,而表达条件在另一个表中时,此时要用嵌套查询。
    嵌套查询分为正面嵌套和反面嵌套。


   基本格式

      SELECT 查询字段   FROM   表1
      WHERE 公共字段   IN(SELECT公共字段 IN 表2 WHERE 查询条件)
   

例5查询在2020年3月1日之后(含)购买过资源的会员的积分和金币(正面嵌套)

    分析   查询字段有2个: 积分,金币      在会员信息表中(查询字段在一个表中)
            表达条件   购买日期>=2020/3/1在购买信息表中(表达条件在另一个表中)

            SELECT积分,金币FROM会员信息表;
            WHERE 会员ID IN(SELECT 会员ID FROM 购买信息表WHERE 购买日期>=2020/3/1)


例6   查询没有购买任何资源的会员的所有会员信息(反面嵌套)

      会员信息表(会员ID,金币,精品值,积分,组别)
      购买信息表(会员ID,资源ID,购买日期,原贴地址,备注)

      我们来分析一下,这题的关键点在哪里。上面两个表中都有会员ID,那么它们的区别在哪?

   1)在会员信息表中,强调的是会员的基本信息,也就是说这个表中的会员ID是否买过资源是不一定的,可能买,也可能没买。
   2)在购买信息表中,强调的是购买的情况,那就是说这个表中的所有会员ID至少是买过一个资源的。


      SELECT*FROM 会员信息表;
      WHERE 会员IDNOT IN(SELECT 会员ID FROM 购买信息表)

      先从购买信息表中找到所有的会员ID(此时的会员ID都是至少购买过一个资源的,再反过来NOT IN即可)



例7查询同时购买过资源ID为"1101"和资源ID为"1305"的所有会员的会员ID,金币和精品值,将查询结果保存到表RESULT中(此题有点难度)

      在解答本题之前,先来讲讲本题非常容易犯的一个典型错误。

         SELECT会员信息表.会员ID,金币,精品值FROM 会员信息表,购买信息表;
         WHERE 会员信息表.会员ID=购买信息表.会员ID;
         AND    资源ID="1101" AND 资源ID="1305";
         INTO   TABLE RESULT

      (请大家仔细思考,这种写法到底错在哪里,看上去似乎没问题,其实不然。条件中资源ID="1101"和资源ID="1305" 怎么可能同时成立,明显是矛盾的)

    正确解答

         SELECT   会员ID,金币,精品值 FROM会员信息表;
         WHERE会员ID IN(SELECT 会员ID FROM 购买信息表 WHERE 资源ID="1101");
         AND      会员ID IN(SELECT 会员ID FROM 购买信息表 WHERE 资源ID="1305");
         INTO    TABLERESULT

      第一次挑选出买过资源ID为"1101"的会员ID,然后在第一次查询的结果中再嵌套一次,继续选出购买资源ID为"1305"的会员ID,那么综合起来,就是既购买了"1101"又购买了"1305"的会员,这才是满足要求的正确答案。最后的INTO TABLE表示将结果存放到指定表中。
   

         (今天先写到此,有时间再继续更新)
   

         

eric7711 发表于 2020-3-3 22:50:34

先謝謝教學發佈 幾年前概略學過 再看看還記得多少

黑暗天使 发表于 2020-3-4 09:12:24

eric7711 发表于 2020-3-3 22:50
先謝謝教學發佈 幾年前概略學過 再看看還記得多少

计算机专业的肯定都没问题,其它专业的一般或多或少也可能看过或听说过,其实很简单,就算不一定能自己写对,但看懂应该是没什么难的。

Shinji 发表于 2020-3-4 09:48:38

楼主好专业~发的完全看不懂:dizzy:

雨飞飞 发表于 2020-3-4 11:02:23

感谢黑天使在文章中提到我,虽然不是完全懂,但根据黑天使的详解也略懂一二了

summer888 发表于 2020-3-4 12:24:35

eric7711 发表于 2020-3-4 23:39:32

黑暗天使 发表于 2020-3-4 09:12
计算机专业的肯定都没问题,其它专业的一般或多或少也可能看过或听说过,其实很简单,就算不一定能自己写 ...

最近忙著 文章有空再來看
因為完全是業餘隨意學習 不是專業的:L

超级无敌乔丹 发表于 2020-3-8 15:42:30

楼主真厉害啊,我连编程都不会:'(

黑暗天使 发表于 2020-3-9 09:41:00

超级无敌乔丹 发表于 2020-3-8 15:42
楼主真厉害啊,我连编程都不会

现在哪个大学没学编程,又不是要开发大型软件,只是编一些最基础的小程序,认真学都简单。

超级无敌乔丹 发表于 2020-3-9 22:14:33

黑暗天使 发表于 2020-3-9 09:41
现在哪个大学没学编程,又不是要开发大型软件,只是编一些最基础的小程序,认真学都简单。

我只是一个普普通通的高中生……而且连Python都没有入门……
页: [1] 2 3
查看完整版本: 学习数据库,从基本的SQL命令开始