select文の論理実行順序を知っていますか?
4690 ワード
前回のブログで述べた質問を振り返ってみましょう.
mysql -uroot -ptest
アカウントとパスワードを裸でスクリプトに書くことはできません.これは良い方法ではありません.スクリプトにアクセスできるすべての人は、データベースのユーザーアカウントとパスワードを知っています.この問題を解決するには、ここで皆さんに方法を提供します.
1つ目は、データベースのプロファイル/etc/myを編集することです.cnf
[mysqld]に行を追加:skip_grant_tablesは、データベースの起動時のセキュリティ認証をスキップし、スクリプトにパスワードを入力せずにログインできます.もちろん、安全のためにスクリプトを実行した後、この行を注釈したほうがいいです.プロファイルを変更するたびに、サービスを再起動する必要があります.
select文の論理実行順序を知っていますか?
from join on where group by avg,sum,countなどの各種関数 having select distinct order by(asc(昇順)、desc(降順)) LIMIT
例:
例1、学生id上位7名の同級生情報を検出する.
私のところに学生表があります.情報は以下の通りです.
そして私たちはこのように戦いました
よく知っていますか?where文はorder byより前に有効になるため、このように打つのは間違いであることは明らかです.正しい書き方はこのようにすべきです.
実行順序は次のとおりです.
1、from students; まずstudentsテーブルをクエリーします.
2、where stuid <=7; 前のステップに基づいてwhere条件を満たす行をリストします.
3、ステップ2に基づいてstuid列で並べ替えます.-------デフォルトは降順配列で、昇順配列はbyの後にdescを付ける必要があります.
4、select stuid,nameを実行する.
注意:私たちの実行のすべてのステップは、前のステップの基礎の上に構築されています.
例2、クラスIDでグループ化し、クラスごとの学生の人数を表示する
ここではstudentsテーブルも使います.
実行順序は次のとおりです.
1、from students; studentsテーブルのクエリー
2、group by classid;classidをパケット化してgroupby文を実行します.
3、count関数は同じclassidフィールドが発生した回数を計算します.
4、countidの値を表示し、同じcountidが発生した回数をリストします.
このようにして、私たちは各クラスの学生の人数を計算する目的を達成しました.
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文の論理実行順序です.
例:
例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が発生した回数をリストします.
このようにして、私たちは各クラスの学生の人数を計算する目的を達成しました.