• 一步
    2019-07-05
    所有的连接类型,是不是都先对连接的表做笛卡尔,然后在根据条件进行数据筛选的?

    对于上一个问题,可能没有表达清楚,我想问的是,各种连接的内部执行步骤,比如先根据连接生成中间表数据,然后在连接类型,on,where进行数据筛选得到数据的步骤

    作者回复: 完整的SELECT语句内部执行顺序是:
    1、FROM子句组装数据(包括通过ON进行连接)
    2、WHERE子句进行条件筛选
    3、GROUP BY分组
    4、使用聚集函数进行计算;
    5、HAVING筛选分组;
    6、计算所有的表达式;
    7、SELECT 的字段;
    8、ORDER BY排序
    9、LIMIT筛选

     1
     21
  • mickey
    2019-07-18
    # 编写 SQL 查询语句,查询不同身高级别(对应 height_grades 表)对应的球员数量(对应 player 表)
    SELECT h.height_level AS '身高级别', COUNT(player_id) AS '球员数量'
    FROM height_grades as h LEFT JOIN player as p ON height BETWEEN h.height_lowest AND h.height_highest
    GROUP BY height_level;

    身高级别 球员数量
    ---------------------------
    A    18
    B    14
    C    5
    D    0
    展开

    作者回复: 正确

    
     13
  • 墨禾
    2019-07-05
    跟踪到第四个星期的专栏学习,这里对前面的知识点做个阶段性的总结。首先我自己是个用过mssql、mysql做过项目开发的人,所以我学习这几节课的专栏比较轻松,除了对过去的项目做个复盘提醒之外,还有些新的收获——从纵向广度、横向深度了解sql语言的特点。
    -----------------------------------------------------------------------------------------------------
    1、纵向广度
    几乎每节专栏都会对 mysql 和 oracle 的知识点做对比,让我从不同之中寻找练习,迁移默化之中加强知识迁移的能力,让我在技术不断迭代更新的时代减少一些焦虑感。
    -------------------------------------------------------------------------------------------------------
    2、横向深度
    -- 熟悉了更多的专业术语(如DML、DDL、DQL、TCL、SQL92、SQL99):之前在实操的时候,只管用,而不管知识属于哪个体系,这样的方法有些粗暴而低效,因为有时候出错的时候,在不理解知识整体结构和专业术语的情况下,难以定位具体的出错点,也就难以检索到对应的解决办法。

    -- 理清楚mysql的知识脉络结构,学习一种思维模式:每一节专栏都有对应的思维导图,看完文字听完语音,掌握了知识要点后,可能忽略了知识之间的联系,思维导图可以很清晰地展现知识之间的联系。其实看老师的专栏的结构组织,也就是一种学习【思维模式】,让我逐渐地转变学生思维,一年后,以更为优秀的姿态走向社会。

    -- 摆正心态:大步迈进,小步迭代。看到知识点都是自己学过的,有时候会觉得有些亏。 但反过来想,老师这么厉害的人,尚且与我们一起学习基础知识,我有什么理由好高骛远? 所以我要做到每节课不落地认真做笔记,最重要的还是要多实践,实践方能出真知。
    展开

    作者回复: 多谢支持,不同企业使用的DBMS会有不同,所以在竞争激烈的环境下掌握不同的RDBMS的使用有时候会是一种优势。
    我们知道数据库都有自己的“方言”,同时也都遵循一定的规范标准,所以对规范标准的掌握有时候更重要,“方言”在实际使用中查阅相应的RDBMS文档,当然日常积累也很重要
    专栏里不同人所处的阶段不同,所以需要先交付基础,当然即使是基础篇也需要了解底层原理,这样对后续的SQL优化很有必要。
    赞下总结笔记的习惯,我接触很多同学,一般来说经常写总结笔记的同学收获更大,在实际工作中也会游刃有余。

     2
     12
  • lmingzhi
    2019-07-05
    "需要注意的是 MySQL 不支持全外连接,否则的话全外连接会返回左表和右表中的所有行。当表之间有匹配的行,会显示内连接的结果。当某行在另一个表中没有匹配时,那么会把另一个表中选择的列显示为空值。"

    请问一下,这里的否则,指的是支持全外连接的数据库吗?

    作者回复: 对的 就是讲解下如果支持全外连接的数据库是怎样的结果。Oracle支持全外连接 FULL JOIN,而MySQL不支持,不过想要写全外连接的话,可以用 左外连接 UNION 右外连接,比如:
    SELECT * FROM player LEFT JOIN team ON player.team_id = team.team_id
    UNION
    SELECT * FROM player RIGHT JOIN team ON player.team_id = team.team_id

    
     7
  • 一步
    2019-07-05
    对于连接执行的顺序,有点不太确定,希望老师讲解下各种连接及相关的关键字 执行的顺序?
    
     7
  • 一叶知秋
    2019-07-05
    SELECT g.height_level, count(*)
    FROM height_grades as g, player as p
    WHERE p.height
    BETWEEN g.height_lowest AND g.height_highest
    GROUP BY g.height_level;
    执行结果:
    +--------------+----------+
    | height_level | count(*) |
    +--------------+----------+
    | A | 18 |
    | B | 14 |
    | C | 5 |
    +--------------+----------+
    3 rows in set (0.01 sec)

    一下午真正追完了~~~~
    展开
     2
     2
  • 夜路破晓
    2019-07-05
    建议多表连接使用SQL99标准.好了本章结束,继续!

    作者回复: 加油~

    
     2
  • 圆子蛋
    2019-07-05
    SELECT h.height_level,COUNT(*) AS num FROM height_grades AS h JOIN player AS p ON p.player_height BETWEEN h.height_lowest AND h.height_highest GROUP BY h.height_level ORDER BY h.height_level ASC
    
     2
  • Geek_635558
    2019-07-05
    结果相同可以有N种写法,其实很多时候更应该关注查询的效率如何。希望可以详解

    作者回复: 对的,我们需要先了解都有哪些写法,然后在正确性的基础上提升SQL优化的能力,这部分会在后面陆续讲到。
    SQL优化有很多维度,最常用的考虑可以从两方面入手:如何建立有效的索引策略(包括主键),以及不要在WHERE的字段中做函数运算。
    在此基础上,我们还会了解事务处理,锁的机制,不同RDBMS的特点和使用等等。

    
     2
  • rike
    2019-09-01
    我有一个疑问,在例子上写的很多sql连接查询时,只有join...on关键字,但是没有其他的,但是这种join...on和left join...on的区别是什么?

    作者回复: JOIN 就是默认的 INNER JOIN,LEFT JOIN是左连接
    左连接:以左表为主,关联上右表
    内连接:左表和右表的交集

    
     1
  • Oliver
    2019-07-07
    老师好,问个问题,在一对多的关系中,怎么写sql语句?初学者一枚

    作者回复: SQL查询语句是面向集合的思维方式,你需要思考你想提取的数据是什么?不论是一对多,一对一,还是多对多的关系,关注的都应该是你想提取的数据是什么。
    不过在建数据表的时候,你需要考虑到这些关系的特性,比如一张数据表是一对多的关系,可以将1端设置为主键,这样在查询的时候效率更高。

    
     1
  • 白了少年头
    2019-07-05
    select height_level, count(player_name) as player_num from player as p left join height_grades as h on p.height between h.height_lowest and h.height_highest group by height_level;
    +--------------+------------+
    | height_level | player_num |
    +--------------+------------+
    | A | 18 |
    | B | 14 |
    | C | 5 |
    +--------------+------------+
    3 rows in set (0.00 sec)
    展开
    
     1
  • 郡鸿
    2019-07-05
    select h.height_level,count(*) as num from player p join height_grades h on p.height between h.height_lowest and h.height_highest group by h.height_level;
    
     1
  • pain
    2019-07-05
    把链接条件写在 join 里面跟写在 where 会有什么不同吗。老师能不能讲一下,工作的时候常常遇到,发现有时候筛选条件放的位置没有影响,有时候又是有两者差别又很大
    
     1
  • 爬行的蜗牛
    2020-01-22
    mysql> SELECT h.height_level AS '身高等级', COUNT(player_id) as '球员数量'
        -> FROM height_grades as h LEFT JOIN player ON height
        -> BETWEEN h.height_lowest AND h.height_highest
        -> GROUP BY h.height_level;
    +--------------+--------------+
    | 身高等级 | 球员数量 |
    +--------------+--------------+
    | A | 18 |
    | B | 14 |
    | C | 5 |
    | D | 0 |
    +--------------+--------------+
    4 rows in set (0.00 sec)
    展开
    
    
  • ,
    2020-01-16
    老师,请问 SQL 标准规范是由什么组织机构负责维护和更新的呢?网上没有找到相对权威的“官网”和 SQL 标准规范的资料(某些网站上的 SQL 标准需要积分才能下载 -_-)。老师能否分享下 SQL92/SQL99 的标准文档或“官方”链接?
    
    
  • 风轻扬
    2020-01-01
    老师,评论上能不能加一个编号。因为评论是懒加载的。有的时候因为网络不好,会导致已经拖不动了,但实际上,评论并没有看完。目前,在屏幕的右上角已经统计了当前文章所有的评论数量,再对比一下当前的评论编号,就知道是不是翻到底了。以免错过好的评论
    
    
  • Krison
    2019-11-27
    我SQL很差,之前订了课程一直没时间学。今天捡起来。这个sql想了很久,总算是想出来了。加油!
    SELECT
        CONCAT( '身高级别', ' - ', b.height_level ),
        CONCAT( '球员数量', ' - ', count( b.height_level ) )
    FROM
        `player` AS a
        LEFT JOIN height_grades AS b ON a.height BETWEEN b.height_lowest
        AND b.height_highest
    GROUP BY
        b.height_level;
    ------结果如下------------
    身高级别 - A    球员数量 - 18
    身高级别 - B    球员数量 - 14
    身高级别 - C    球员数量 - 5
    展开

    作者回复: 加油Krison,SQL写的不错

    
    
  • 爬行的蜗牛
    2019-11-25
    SELECT COUNT(*), h.height_level
       FROM player as p JOIN height_grades as h
       ON p.height BETWEEN h.height_lowest AND h.height_highest
       GROUP BY h.height_level;

    作者回复: 正确

    
    
  • Victor.
    2019-11-11
    SELECT DISTINCT h.height_level,count(*) AS num FROM player AS p LEFT JOIN height_grades AS h ON height BETWEEN h.height_lowest AND h.height_highest GROUP BY h.height_level
    
    
我们在线,来聊聊吧