ホームページ >データベース >mysql チュートリアル >mysqlで7テーブルクエリを実装する例(1)
始める前に、興味深いことをお話しておきます。主キーがないと複数テーブルのクエリを実行できないという話をよく聞きます。実際、これはあまりにも一方的です。実際、場合によっては、主キーなしで複数テーブルのクエリを実行することができます (例 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 サイトの他の関連記事を参照してください。