mysqlで7テーブルクエリを実装する例(1)

黄舟
リリース: 2019-12-05 11:42:07
転載
1248 人が閲覧しました

始める前に、興味深いことをお話しておきます。主キーがないと複数テーブルのクエリを実行できないという話をよく聞きます。実際、これはあまりにも一方的です。実際、場合によっては、主キーなしで複数テーブルのクエリを実行することができます (例 1 では、使用されるテーブルは次のテーブルでもあります。最初に 4 テーブルのクエリで準備を整えましょう)。

mysql> select * from student,teacher,sc,course where (student.s=sc.s and teacher.t=course.t) and course.class=sc.class;
+------+--------+------+------+------+--------+------+-------+-------+-------+--------+------+
| s    | sname  | sage | ssex | t    | tname  | s    | class | score | class | cname  | t    |
+------+--------+------+------+------+--------+------+-------+-------+-------+--------+------+
|    1 | 刘一   |   18 | 男   |    1 | 叶平   |    1 |     1 |    56 |     1 | 语文   |    1 |
|    1 | 刘一   |   18 | 男   |    2 | 贺高   |    1 |     2 |    78 |     2 | 数学   |    2 |
|    1 | 刘一   |   18 | 男   |    3 | 杨艳   |    1 |     3 |    67 |     3 | 英语   |    3 |
|    1 | 刘一   |   18 | 男   |    4 | 周磊   |    1 |     4 |    58 |     4 | 物理   |    4 |
|    2 | 钱二   |   19 | 女   |    1 | 叶平   |    2 |     1 |    79 |     1 | 语文   |    1 |
|    2 | 钱二   |   19 | 女   |    2 | 贺高   |    2 |     2 |    81 |     2 | 数学   |    2 |
|    2 | 钱二   |   19 | 女   |    3 | 杨艳   |    2 |     3 |    92 |     3 | 英语   |    3 |
|    2 | 钱二   |   19 | 女   |    4 | 周磊   |    2 |     4 |    68 |     4 | 物理   |    4 |
|    3 | 张三   |   17 | 男   |    1 | 叶平   |    3 |     1 |    91 |     1 | 语文   |    1 |
|    3 | 张三   |   17 | 男   |    2 | 贺高   |    3 |     2 |    47 |     2 | 数学   |    2 |
|    3 | 张三   |   17 | 男   |    3 | 杨艳   |    3 |     3 |    88 |     3 | 英语   |    3 |
|    3 | 张三   |   17 | 男   |    4 | 周磊   |    3 |     4 |    56 |     4 | 物理   |    4 |
|    4 | 李四   |   18 | 女   |    2 | 贺高   |    4 |     2 |    88 |     2 | 数学   |    2 |
|    4 | 李四   |   18 | 女   |    3 | 杨艳   |    4 |     3 |    90 |     3 | 英语   |    3 |
|    4 | 李四   |   18 | 女   |    4 | 周磊   |    4 |     4 |    93 |     4 | 物理   |    4 |
|    5 | 王五   |   17 | 男   |    1 | 叶平   |    5 |     1 |    46 |     1 | 语文   |    1 |
|    5 | 王五   |   17 | 男   |    3 | 杨艳   |    5 |     3 |    78 |     3 | 英语   |    3 |
|    5 | 王五   |   17 | 男   |    4 | 周磊   |    5 |     4 |    53 |     4 | 物理   |    4 |
|    6 | 赵六   |   19 | 女   |    1 | 叶平   |    6 |     1 |    35 |     1 | 语文   |    1 |
|    6 | 赵六   |   19 | 女   |    2 | 贺高   |    6 |     2 |    68 |     2 | 数学   |    2 |
|    6 | 赵六   |   19 | 女   |    4 | 周磊   |    6 |     4 |    71 |     4 | 物理   |    4 |
+------+--------+------+------+------+--------+------+-------+-------+-------+--------+------+
21 rows in set (0.05 second)
ログイン後にコピー

早速、次に使用する 7 つのテーブルを見てみましょう:

mysql> select * from sc;
+------+-------+-------+
| s    | class | score |
+------+-------+-------+
|    1 |     1 |    56 |
|    1 |     2 |    78 |
|    1 |     3 |    67 |
|    1 |     4 |    58 |
|    2 |     1 |    79 |
|    2 |     2 |    81 |
|    2 |     3 |    92 |
|    2 |     4 |    68 |
|    3 |     1 |    91 |
|    3 |     2 |    47 |
|    3 |     3 |    88 |
|    3 |     4 |    56 |
|    4 |     2 |    88 |
|    4 |     3 |    90 |
|    4 |     4 |    93 |
|    5 |     1 |    46 |
|    5 |     3 |    78 |
|    5 |     4 |    53 |
|    6 |     1 |    35 |
|    6 |     2 |    68 |
|    6 |     4 |    71 |
+------+-------+-------+
21 rows in set (0.00 sec)
ログイン後にコピー
mysql> desc sc;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| s     | int(11) | YES  |     | NULL    |       |
| class | int(12) | YES  |     | NULL    |       |
| score | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
3 rows in set (0.00 sec)
ログイン後にコピー
mysql> select * from student;
+------+--------+------+------+
| s    | sname  | sage | ssex |
+------+--------+------+------+
|    1 | 刘一   |   18 | 男   |
|    2 | 钱二   |   19 | 女   |
|    3 | 张三   |   17 | 男   |
|    4 | 李四   |   18 | 女   |
|    5 | 王五   |   17 | 男   |
|    6 | 赵六   |   19 | 女   |
+------+--------+------+------+
6 rows in set (0.00 sec)
ログイン後にコピー
ysql> desc student;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| s     | int(11)  | YES  |     | NULL    |       |
| sname | char(32) | YES  |     | NULL    |       |
| sage  | int(11)  | YES  |     | NULL    |       |
| ssex  | char(8)  | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
4 rows in set (0.02 sec)
ログイン後にコピー
mysql> select * from course;
+-------+--------+------+
| class | cname  | t    |
+-------+--------+------+
|     1 | 语文   |    1 |
|     2 | 数学   |    2 |
|     3 | 英语   |    3 |
|     4 | 物理   |    4 |
+-------+--------+------+
4 rows in set (0.00 sec)
ログイン後にコピー
mysql> desc course;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| class | int(12)  | YES  |     | NULL    |       |
| cname | char(32) | YES  |     | NULL    |       |
| t     | int(11)  | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)
ログイン後にコピー
mysql> select * from teacher;
+------+--------+
| t    | tname  |
+------+--------+
|    1 | 叶平   |
|    2 | 贺高   |
|    3 | 杨艳   |
|    4 | 周磊   |
+------+--------+
4 rows in set (0.00 sec)
ログイン後にコピー
mysql> desc teacher;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| t     | int(11)  | YES  |     | NULL    |       |
| tname | char(16) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
ログイン後にコピー
mysql> select * from cadd;
+--------+------+
| cadd   | s    |
+--------+------+
| 上海   |    3 |
| 广西   |    6 |
| 江西   |    5 |
| 深圳   |    2 |
| 湖南   |    4 |
| 福建   |    1 |
+--------+------+
6 rows in set (0.02 sec)
ログイン後にコピー
mysql> desc cadd;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| cadd  | char(22) | NO   | PRI | NULL    |       |
| s     | int(2)   | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
ログイン後にコピー
mysql> select * from tadd;
+--------+------+
| tadd   | s    |
+--------+------+
| 福建   |    1 |
| 深圳   |    2 |
| 上海   |    3 |
| 湖南   |    4 |
| 江西   |    5 |
| 广西   |    6 |
+--------+------+
6 rows in set (0.00 sec)
ログイン後にコピー
mysql> desc tadd;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| tadd  | char(21) | YES  |     | NULL    |       |
| s     | int(12)  | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
ログイン後にコピー

これら 7 つのテーブルから * を直接選択するとどうなりますか?

結果は実際には非常に興味深いものです:

mysql> select * from cphone;
+--------+------+
| cphone | s    |
+--------+------+
|  12345 |    1 |
|  12346 |    2 |
|  12347 |    3 |
|  12348 |    4 |
|  12349 |    5 |
|  13349 |    6 |
+--------+------+
6 rows in set (0.02 sec)
ログイン後にコピー

このステートメントが実行された後、MYSQL はポイズンされたかのように出力を続けます。行数は 40,000 を超えていますが、まだ出力されていません。

それでは、これら 7 つのテーブルのデータを統合する方法を見てみましょう。

mysql> desc cphone;
+--------+---------+------+-----+---------+-------+
| Field  | Type    | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| cphone | int(12) | YES  |     | NULL    |       |
| s      | int(2)  | YES  |     | NULL    |       |
+--------+---------+------+-----+---------+-------+
2 rows in set (0.01 sec)
ログイン後にコピー

何はともあれ、以前のような「中毒」の状況はありませんが、結果はまだ間違っています。

それで、これはどうですか?

|    1 |     1 |    56 |     3 | 英语   |    3 |    5 | 王五   |   17 | 男   |    3 | 杨艳   | ^西C -- query aborted
西   |    6 | 江西   |    5 |  12347 |    3 |
+------+-------+-------+-------+--------+------+------+--------+------+------+------+--------+--------+------+--------+------+--------+------+
435456 rows in set (2.72 sec)
ログイン後にコピー

うっかり CNAME フィールドを省略してしまいましたが、これは最も重要なエラーではありません。明らかに TADD フィールドの情報が間違っています。SQL ステートメントが間違っているのではなく、TADD が設定された時点ですでに設定されていたのです。テーブルが作成されました。テーブルが間違っていました。T (教師番号) の代わりに S (生徒番号) が使用されました。修正後:

mysql> select * from student,teacher,sc,course, cadd,tadd,cphone where ((((student.s=sc.s and teacher.t=course.t) and course.class=sc.class)and cadd.s=student.s)and tadd.s=student.s) and cphone.s=student.s;
+------+--------+------+------+------+--------+------+-------+-------+-------+--------+------+--------+------+--------+------+--------+------+
| s    | sname  | sage | ssex | t    | tname  | s    | class | score | class | cname  | t    | cadd   | s    | tadd   | s    | cphone | s    |
+------+--------+------+------+------+--------+------+-------+-------+-------+--------+------+--------+------+--------+------+--------+------+
|    1 | 刘一   |   18 | 男   |    1 | 叶平   |    1 |     1 |    56 |     1 | 语文   |    1 | 福建   |    1 | 福建   |    1 |  12345 |    1 |
|    1 | 刘一   |   18 | 男   |    2 | 贺高   |    1 |     2 |    78 |     2 | 数学   |    2 | 福建   |    1 | 福建   |    1 |  12345 |    1 |
|    1 | 刘一   |   18 | 男   |    3 | 杨艳   |    1 |     3 |    67 |     3 | 英语   |    3 | 福建   |    1 | 福建   |    1 |  12345 |    1 |
|    1 | 刘一   |   18 | 男   |    4 | 周磊   |    1 |     4 |    58 |     4 | 物理   |    4 | 福建   |    1 | 福建   |    1 |  12345 |    1 |
|    2 | 钱二   |   19 | 女   |    1 | 叶平   |    2 |     1 |    79 |     1 | 语文   |    1 | 深圳   |    2 | 深圳   |    2 |  12346 |    2 |
|    2 | 钱二   |   19 | 女   |    2 | 贺高   |    2 |     2 |    81 |     2 | 数学   |    2 | 深圳   |    2 | 深圳   |    2 |  12346 |    2 |
|    2 | 钱二   |   19 | 女   |    3 | 杨艳   |    2 |     3 |    92 |     3 | 英语   |    3 | 深圳   |    2 | 深圳   |    2 |  12346 |    2 |
|    2 | 钱二   |   19 | 女   |    4 | 周磊   |    2 |     4 |    68 |     4 | 物理   |    4 | 深圳   |    2 | 深圳   |    2 |  12346 |    2 |
|    3 | 张三   |   17 | 男   |    1 | 叶平   |    3 |     1 |    91 |     1 | 语文   |    1 | 上海   |    3 | 上海   |    3 |  12347 |    3 |
|    3 | 张三   |   17 | 男   |    2 | 贺高   |    3 |     2 |    47 |     2 | 数学   |    2 | 上海   |    3 | 上海   |    3 |  12347 |    3 |
|    3 | 张三   |   17 | 男   |    3 | 杨艳   |    3 |     3 |    88 |     3 | 英语   |    3 | 上海   |    3 | 上海   |    3 |  12347 |    3 |
|    3 | 张三   |   17 | 男   |    4 | 周磊   |    3 |     4 |    56 |     4 | 物理   |    4 | 上海   |    3 | 上海   |    3 |  12347 |    3 |
|    4 | 李四   |   18 | 女   |    2 | 贺高   |    4 |     2 |    88 |     2 | 数学   |    2 | 湖南   |    4 | 湖南   |    4 |  12348 |    4 |
|    4 | 李四   |   18 | 女   |    3 | 杨艳   |    4 |     3 |    90 |     3 | 英语   |    3 | 湖南   |    4 | 湖南   |    4 |  12348 |    4 |
|    4 | 李四   |   18 | 女   |    4 | 周磊   |    4 |     4 |    93 |     4 | 物理   |    4 | 湖南   |    4 | 湖南   |    4 |  12348 |    4 |
|    5 | 王五   |   17 | 男   |    1 | 叶平   |    5 |     1 |    46 |     1 | 语文   |    1 | 江西   |    5 | 江西   |    5 |  12349 |    5 |
|    5 | 王五   |   17 | 男   |    3 | 杨艳   |    5 |     3 |    78 |     3 | 英语   |    3 | 江西   |    5 | 江西   |    5 |  12349 |    5 |
|    5 | 王五   |   17 | 男   |    4 | 周磊   |    5 |     4 |    53 |     4 | 物理   |    4 | 江西   |    5 | 江西   |    5 |  12349 |    5 |
|    6 | 赵六   |   19 | 女   |    1 | 叶平   |    6 |     1 |    35 |     1 | 语文   |    1 | 广西   |    6 | 广西   |    6 |  13349 |    6 |
|    6 | 赵六   |   19 | 女   |    2 | 贺高   |    6 |     2 |    68 |     2 | 数学   |    2 | 广西   |    6 | 广西   |    6 |  13349 |    6 |
|    6 | 赵六   |   19 | 女   |    4 | 周磊   |    6 |     4 |    71 |     4 | 物理   |    4 | 广西   |    6 | 广西   |    6 |  13349 |    6 |
+------+--------+------+------+------+--------+------+-------+-------+-------+--------+------+--------+------+--------+------+--------+------+
21 rows in set (0.00 sec)
ログイン後にコピー

EXPLAIN を使用してこのステートメントを見てみましょう:

mysql> select student.s,sname,sage,sc.class,score,teacher.t,tname,ssex,cadd,cphone,tadd from student,teacher,sc,course, cadd,tadd,cphone where ((((student.s=sc.s and teacher.t=course.t) and course.class=sc.class)and cadd.s=student.s)and tadd.s=cadd.s)
 and cphone.s=student.s;
+------+--------+------+-------+-------+------+--------+------+--------+--------+--------+
| s    | sname  | sage | class | score | t    | tname  | ssex | cadd   | cphone | tadd   |
+------+--------+------+-------+-------+------+--------+------+--------+--------+--------+
|    1 | 刘一   |   18 |     1 |    56 |    1 | 叶平   | 男   | 福建   |  12345 | 福建   |
|    1 | 刘一   |   18 |     2 |    78 |    2 | 贺高   | 男   | 福建   |  12345 | 福建   |
|    1 | 刘一   |   18 |     3 |    67 |    3 | 杨艳   | 男   | 福建   |  12345 | 福建   |
|    1 | 刘一   |   18 |     4 |    58 |    4 | 周磊   | 男   | 福建   |  12345 | 福建   |
|    2 | 钱二   |   19 |     1 |    79 |    1 | 叶平   | 女   | 深圳   |  12346 | 深圳   |
|    2 | 钱二   |   19 |     2 |    81 |    2 | 贺高   | 女   | 深圳   |  12346 | 深圳   |
|    2 | 钱二   |   19 |     3 |    92 |    3 | 杨艳   | 女   | 深圳   |  12346 | 深圳   |
|    2 | 钱二   |   19 |     4 |    68 |    4 | 周磊   | 女   | 深圳   |  12346 | 深圳   |
|    3 | 张三   |   17 |     1 |    91 |    1 | 叶平   | 男   | 上海   |  12347 | 上海   |
|    3 | 张三   |   17 |     2 |    47 |    2 | 贺高   | 男   | 上海   |  12347 | 上海   |
|    3 | 张三   |   17 |     3 |    88 |    3 | 杨艳   | 男   | 上海   |  12347 | 上海   |
|    3 | 张三   |   17 |     4 |    56 |    4 | 周磊   | 男   | 上海   |  12347 | 上海   |
|    4 | 李四   |   18 |     2 |    88 |    2 | 贺高   | 女   | 湖南   |  12348 | 湖南   |
|    4 | 李四   |   18 |     3 |    90 |    3 | 杨艳   | 女   | 湖南   |  12348 | 湖南   |
|    4 | 李四   |   18 |     4 |    93 |    4 | 周磊   | 女   | 湖南   |  12348 | 湖南   |
|    5 | 王五   |   17 |     1 |    46 |    1 | 叶平   | 男   | 江西   |  12349 | 江西   |
|    5 | 王五   |   17 |     3 |    78 |    3 | 杨艳   | 男   | 江西   |  12349 | 江西   |
|    5 | 王五   |   17 |     4 |    53 |    4 | 周磊   | 男   | 江西   |  12349 | 江西   |
|    6 | 赵六   |   19 |     1 |    35 |    1 | 叶平   | 女   | 广西   |  13349 | 广西   |
|    6 | 赵六   |   19 |     2 |    68 |    2 | 贺高   | 女   | 广西   |  13349 | 广西   |
|    6 | 赵六   |   19 |     4 |    71 |    4 | 周磊   | 女   | 广西   |  13349 | 广西   |
+------+--------+------+-------+-------+------+--------+------+--------+--------+--------+
21 rows in set (0.02 sec)
ログイン後にコピー

元のアドレス: https://blog.csdn.net/number1killer/article/details/77896758 著者:number1killer

以上がmysqlで7テーブルクエリを実装する例(1)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:number1killer
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート