select文の論理実行順序を知っていますか?

4690 ワード

前回のブログで述べた質問を振り返ってみましょう.
mysql -uroot -ptest
アカウントとパスワードを裸でスクリプトに書くことはできません.これは良い方法ではありません.スクリプトにアクセスできるすべての人は、データベースのユーザーアカウントとパスワードを知っています.この問題を解決するには、ここで皆さんに方法を提供します.
1つ目は、データベースのプロファイル/etc/myを編集することです.cnf
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
......
skip_grant_tables
......

[mysqld]に行を追加:skip_grant_tablesは、データベースの起動時のセキュリティ認証をスキップし、スクリプトにパスワードを入力せずにログインできます.もちろん、安全のためにスクリプトを実行した後、この行を注釈したほうがいいです.プロファイルを変更するたびに、サービスを再起動する必要があります.

さあ、今日の本題に入ります!


select文の論理実行順序を知っていますか?


引用:


この知識点は技術的な問題ではありませんが、sqlの作成、心配の排除、最適化に役立ちます.
しかし、周りの人に聞いてみると、この問題に気づいた人は何人いますか?この問題をはっきり説明できるものはいくつありますか.
本文:
select文の論理実行順序
以下はSELECT文の論理実行順序です.
  • from
  • join
  • on
  • where
  • group by
  • avg,sum,countなどの各種関数
  • having
  • select
  • distinct
  • order by(asc(昇順)、desc(降順))
  • LIMIT

  • 例:
    例1、学生id上位7名の同級生情報を検出する.
    私のところに学生表があります.情報は以下の通りです.
    MariaDB [hellodb]> select * from students;
    +-------+----------------+-----+--------+---------+-----------+
    | StuID | Name           | Age | Gender | ClassID | TeacherID |
    +-------+----------------+-----+--------+---------+-----------+
    |     1 | Hou Yi         |  22 | M      |       2 |         3 |
    |     2 | Ya Se          |  22 | M      |       1 |         7 |
    |     3 | An Qila        |  53 | F      |       2 |        16 |
    |     4 | Da Ji          |  32 | F      |       4 |         4 |
    |     5 | Sun Shangxiang |  26 | F      |       3 |         1 |
    |     6 | Huang Zhong    |  46 | M      |       5 |      NULL |
    |     7 | Liu Bei        |  19 | M      |       3 |      NULL |
    |     8 | Guan Yu        |  17 | M      |       7 |      NULL |
    |     9 | Zhang Fei      |  20 | M      |       6 |      NULL |
    

    そして私たちはこのように戦いました
    MariaDB [hellodb]> select stuid,name from students order by stuid where stuid <= 7;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that 
    
    corresponds to your MariaDB server version for the right syntax to use near 'where stuid <= 7' at line 1
    

    よく知っていますか?where文はorder byより前に有効になるため、このように打つのは間違いであることは明らかです.正しい書き方はこのようにすべきです.
    MariaDB [hellodb]> select stuid,name from students where stuid <= 7 order by stuid;
    +-------+----------------+
    | stuid | name           |
    +-------+----------------+
    |     1 | Hou Yi         |
    |     2 | Ya Se          |
    |     3 | An Qila        |
    |     4 | Da Ji          |
    |     5 | Sun Shangxiang |
    |     6 | Huang Zhong    |
    |     7 | Liu Bei        |
    +-------+----------------+
    

    実行順序は次のとおりです.
    1、from students; まずstudentsテーブルをクエリーします.
    2、where stuid <=7; 前のステップに基づいてwhere条件を満たす行をリストします.
    3、ステップ2に基づいてstuid列で並べ替えます.-------デフォルトは降順配列で、昇順配列はbyの後にdescを付ける必要があります.
    4、select stuid,nameを実行する.
    注意:私たちの実行のすべてのステップは、前のステップの基礎の上に構築されています.
    例2、クラスIDでグループ化し、クラスごとの学生の人数を表示する
    ここではstudentsテーブルも使います.
    MariaDB [hellodb]> select * from students;
    +-------+----------------+-----+--------+---------+-----------+
    | StuID | Name           | Age | Gender | ClassID | TeacherID |
    +-------+----------------+-----+--------+---------+-----------+
    |     1 | Hou Yi         |  22 | M      |       2 |         3 |
    |     2 | Ya Se          |  22 | M      |       1 |         7 |
    |     3 | An Qila        |  53 | F      |       2 |        16 |
    |     4 | Da Ji          |  32 | F      |       4 |         4 |
    |     5 | Sun Shangxiang |  26 | F      |       3 |         1 |
    |     6 | Huang Zhong    |  46 | M      |       5 |      NULL |
    |     7 | Liu Bei        |  19 | M      |       3 |      NULL |
    |     8 | Guan Yu        |  17 | M      |       7 |      NULL |
    |     9 | Zhang Fei      |  20 | M      |       6 |      NULL |
    MariaDB [hellodb]>  select classid,count(classid) from students group by classid;
    +---------+----------------+
    | classid | count(classid) |
    +---------+----------------+
    |    NULL |              0 |
    |       1 |              4 |
    |       2 |              3 |
    |       3 |              4 |
    |       4 |              4 |
    |       5 |              1 |
    |       6 |              4 |
    |       7 |              3 |
    +---------+----------------+
    
    

    実行順序は次のとおりです.
    1、from students; studentsテーブルのクエリー
    2、group by classid;classidをパケット化してgroupby文を実行します.
    3、count関数は同じclassidフィールドが発生した回数を計算します.
    4、countidの値を表示し、同じcountidが発生した回数をリストします.
    このようにして、私たちは各クラスの学生の人数を計算する目的を達成しました.