前の章の内容についてどう思いますか?
次は少しずつ掘り下げていきましょう。
1. テストのスコアが 60 点を超えるすべての情報をクエリする:
mysql> select * from(select student.s,sname,cadd,sage,sc.class,teacher.t,cname,score,tname,tadd,ssex,cphone 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.t=teacher.t) and cphone.s=student.s)as a1 where score>60; +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+ | s | sname | cadd | sage | class | t | cname | score | tname | tadd | ssex | cphone | +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+ | 1 | 刘一 | 福建 | 18 | 2 | 2 | 数学 | 78 | 贺高 | 深圳 | 男 | 12345 | | 1 | 刘一 | 福建 | 18 | 3 | 3 | 英语 | 67 | 杨艳 | 上海 | 男 | 12345 | | 2 | 钱二 | 深圳 | 19 | 1 | 1 | 语文 | 79 | 叶平 | 福建 | 女 | 12346 | | 2 | 钱二 | 深圳 | 19 | 2 | 2 | 数学 | 81 | 贺高 | 深圳 | 女 | 12346 | | 2 | 钱二 | 深圳 | 19 | 3 | 3 | 英语 | 92 | 杨艳 | 上海 | 女 | 12346 | | 2 | 钱二 | 深圳 | 19 | 4 | 4 | 物理 | 68 | 周磊 | 湖南 | 女 | 12346 | | 3 | 张三 | 上海 | 17 | 1 | 1 | 语文 | 91 | 叶平 | 福建 | 男 | 12347 | | 3 | 张三 | 上海 | 17 | 3 | 3 | 英语 | 88 | 杨艳 | 上海 | 男 | 12347 | | 4 | 李四 | 湖南 | 18 | 2 | 2 | 数学 | 88 | 贺高 | 深圳 | 女 | 12348 | | 4 | 李四 | 湖南 | 18 | 3 | 3 | 英语 | 90 | 杨艳 | 上海 | 女 | 12348 | | 4 | 李四 | 湖南 | 18 | 4 | 4 | 物理 | 93 | 周磊 | 湖南 | 女 | 12348 | | 5 | 王五 | 江西 | 17 | 3 | 3 | 英语 | 78 | 杨艳 | 上海 | 男 | 12349 | | 6 | 赵六 | 广西 | 19 | 2 | 2 | 数学 | 68 | 贺高 | 深圳 | 女 | 13349 | | 6 | 赵六 | 广西 | 19 | 4 | 4 | 物理 | 71 | 周磊 | 湖南 | 女 | 13349 | +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+ 14 rows in set (0.00 sec)
2. テストのスコアが 60 点を超える 18 歳の男子学生に関するすべての情報をクエリする:
mysql> select * from(select student.s,sname,cadd,sage,sc.class,teacher.t,cname,score,tname,tadd,ssex,cphone 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.t=teacher.t) and cphone.s=student.s)as a1 where (score>60 and sage=18)and ssex="男"; +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+ | s | sname | cadd | sage | class | t | cname | score | tname | tadd | ssex | cphone | +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+ | 1 | 刘一 | 福建 | 18 | 2 | 2 | 数学 | 78 | 贺高 | 深圳 | 男 | 12345 | | 1 | 刘一 | 福建 | 18 | 3 | 3 | 英语 | 67 | 杨艳 | 上海 | 男 | 12345 | +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+ 2 rows in set (0.00 sec)
3.各生徒が受講したコース、合計スコア、平均スコア、およびそのすべての情報 (CNAME フィールドを除く):
非常に単純に見えますが、:
mysql> select count(t),sum(score),avg(score),student.s,sname,cadd,sage,sc.class,score,teacher.t,tname,tadd,ssex,cphone from(select student.s,sname,cadd,sage,sc.class,score,teacher.t,tname,tadd,ssex,cphone 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.t=teacher.t) and cphone.s=student.s)as a1; ERROR 1054 (42S22): Unknown column 'student.s' in 'field list'
AS には新しいテーブルがあるため、クエリされたフィールドを下に置かないでください。古いテーブル。
mysql> select count(t),sum(score),avg(score),s,sname,cadd,sage,class,score,t,tname,tadd,ssex,cphone from(select student.s,sname,cadd,sage,sc.class,score,teacher.t,tname,tadd,ssex,cphone 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.t=teacher.t) and cphone.s=student.s)as a1; +----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+ | count(t) | sum(score) | avg(score) | s | sname | cadd | sage | class | score | t | tname | tadd | ssex | cphone | +----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+ | 21 | 1483 | 70.6190 | 1 | 刘一 | 福建 | 18 | 1 | 56 | 1 | 叶平 | 福建 | 男 | 12345 | +----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+ 1 row in set (0.08 sec)
グループを指定しないと、最初の行のデータが直接コピーされます。
正解:
mysql> select a1.*,sum(score),count(t),avg(score) from(select student.s,sname,cadd,sage,sc.class,teacher.t,cname,score,tname,tadd,ssex,cphone 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.t=teacher.t) and cphone.s=student.s)as a1 group by s; +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------------+----------+------------+ | s | sname | cadd | sage | class | t | cname | score | tname | tadd | ssex | cphone | sum(score) | count(t) | avg(score) | +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------------+----------+------------+ | 1 | 刘一 | 福建 | 18 | 1 | 1 | 语文 | 56 | 叶平 | 福建 | 男 | 12345 | 259 | 4 | 64.7500 | | 2 | 钱二 | 深圳 | 19 | 1 | 1 | 语文 | 79 | 叶平 | 福建 | 女 | 12346 | 320 | 4 | 80.0000 | | 3 | 张三 | 上海 | 17 | 1 | 1 | 语文 | 91 | 叶平 | 福建 | 男 | 12347 | 282 | 4 | 70.5000 | | 4 | 李四 | 湖南 | 18 | 2 | 2 | 数学 | 88 | 贺高 | 深圳 | 女 | 12348 | 271 | 3 | 90.3333 | | 5 | 王五 | 江西 | 17 | 1 | 1 | 语文 | 46 | 叶平 | 福建 | 男 | 12349 | 177 | 3 | 59.0000 | | 6 | 赵六 | 广西 | 19 | 1 | 1 | 语文 | 35 | 叶平 | 福建 | 女 | 13349 | 174 | 3 | 58.0000 | +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------------+----------+------------+ 6 rows in set (0.00 sec)
4. 各学生が参加したコースの合計数、合計スコア、平均スコア、およびすべての情報をクエリします。合計点に応じて降順に表示 評価点が80点以上の学生の全情報:
mysql> select * from(select count(t),sum(score),avg(score),s,sname,cadd,sage,class,score,t,tname,tadd,ssex,cphone from(select student.s,sname,cadd,sage,sc.class,score,teacher.t,tname,tadd,ssex,cphone 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.t=teacher.t) and cphone.s=student.s)as a1 group by s order by sum(score) desc)a3 having avg(score)>=80; Empty set (0.00 sec)
SQL文は正しい(CNAMEフィールドが欠落している) )、しかし、結果は...
+----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+ | count(t) | sum(score) | avg(score) | s | sname | cadd | sage | class | score | t | tname | tadd | ssex | cphone | +----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+ | 4 | 320 | 80.0000 | 2 | 钱二 | 深圳 | 19 | 1 | 79 | 1 | 叶平 | 福建 | 女 | 12346 | | 4 | 282 | 70.5000 | 3 | 张三 | 上海 | 17 | 1 | 91 | 1 | 叶平 | 福建 | 男 | 12347 | | 3 | 271 | 90.3333 | 4 | 李四 | 湖南 | 18 | 2 | 88 | 2 | 贺高 | 深圳 | 女 | 12348 | | 4 | 259 | 64.7500 | 1 | 刘一 | 福建 | 18 | 1 | 56 | 1 | 叶平 | 福建 | 男 | 12345 | | 3 | 177 | 59.0000 | 5 | 王五 | 江西 | 17 | 1 | 46 | 1 | 叶平 | 福建 | 男 | 12349 | | 3 | 174 | 58.0000 | 6 | 赵六 | 广西 | 19 | 1 | 35 | 1 | 叶平 | 福建 | 女 | 13349 | +----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+ 6 rows in set (0.00 sec)
mysql> select * from(select count(t),sum(score),avg(score),s,sname,cadd,sage,class,score,t,tname,tadd,ssex,cphone from(select student.s,sname,cadd,sage,sc.class,score,teacher.t,tname,tadd,ssex,cphone 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.t=teacher.t) and cphone.s=student.s)as a1 group by s order by sum(score) desc)a3 having avg(score)>0; +----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+ | count(t) | sum(score) | avg(score) | s | sname | cadd | sage | class | score | t | tname | tadd | ssex | cphone | +----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+ | 4 | 320 | 80.0000 | 2 | 钱二 | 深圳 | 19 | 1 | 79 | 1 | 叶平 | 福建 | 女 | 12346 | +----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+ 1 row in set (0.00 sec)
そして、この発言とこの結果の現れは私を完全に混乱させました。
最後に、火には火で対抗する方法を考えて、ついに捕獲しました。
mysql> select * from(select count(t),sum(score),avg(score),s,sname,cadd,sage,class,score,t,tname,tadd,ssex,cphone from(select student.s,sname,cadd,sage,sc.class,score,teacher.t,tname,tadd,ssex,cphone 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.t=teacher.t) and cphone.s=student.s)as a1 group by s order by sum(score) desc)a3 having sum(score)/4>=80; +----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+ | count(t) | sum(score) | avg(score) | s | sname | cadd | sage | class | score | t | tname | tadd | ssex | cphone | +----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+ | 4 | 320 | 80.0000 | 2 | 钱二 | 深圳 | 19 | 1 | 79 | 1 | 叶平 | 福建 | 女 | 12346 | +----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+ 1 row in set (0.02 sec)
しかし、それは役に立ちません...
もちろん、正解はあります:
mysql> select * from (select a1.*,sum(score) as ss,count(t) as ct,avg(score) as a3 from(select student.s,sname,cadd,sage,sc.class,teacher.t,cname,score,tname,tadd,ssex,cphone 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.t=teacher.t) and cphone.s=student.s)as a1 group by s desc)as a2 where a3=80 or a3>80; +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------+----+---------+ | s | sname | cadd | sage | class | t | cname | score | tname | tadd | ssex | cphone | ss | ct | a3 | +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------+----+---------+ | 4 | 李四 | 湖南 | 18 | 2 | 2 | 数学 | 88 | 贺高 | 深圳 | 女 | 12348 | 271 | 3 | 90.3333 | | 2 | 钱二 | 深圳 | 19 | 1 | 1 | 语文 | 79 | 叶平 | 福建 | 女 | 12346 | 320 | 4 | 80.0000 | +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------+----+---------+ 2 rows in set (0.00 sec)
科学的に厳密な態度から(まあ、私は何度も間違いを犯しました、残念ですが)、一緒にそれを検証しましょう:
mysql> select * from (select a1.*,sum(score) as ss,count(t) as ct,avg(score) as a3 from(select student.s,sname,cadd,sage,sc.class,teacher.t,cname,score,tname,tadd,ssex,cphone 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.t=teacher.t) and cphone.s=student.s)as a1 group by s desc)as a2 where a3=80 or a3>60; +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------+----+---------+ | s | sname | cadd | sage | class | t | cname | score | tname | tadd | ssex | cphone | ss | ct | a3 | +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------+----+---------+ | 4 | 李四 | 湖南 | 18 | 2 | 2 | 数学 | 88 | 贺高 | 深圳 | 女 | 12348 | 271 | 3 | 90.3333 | | 3 | 张三 | 上海 | 17 | 1 | 1 | 语文 | 91 | 叶平 | 福建 | 男 | 12347 | 282 | 4 | 70.5000 | | 2 | 钱二 | 深圳 | 19 | 1 | 1 | 语文 | 79 | 叶平 | 福建 | 女 | 12346 | 320 | 4 | 80.0000 | | 1 | 刘一 | 福建 | 18 | 1 | 1 | 语文 | 56 | 叶平 | 福建 | 男 | 12345 | 259 | 4 | 64.7500 | +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------+----+---------+ 4 rows in set (0.00 sec)
mysql> select * from (select a1.*,sum(score) as ss,count(t) as ct,avg(score) as a3 from(select student.s,sname,cadd,sage,sc.class,teacher.t,cname,score,tname,tadd,ssex,cphone 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.t=teacher.t) and cphone.s=student.s)as a1 group by s desc)as a2; +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------+----+---------+ | s | sname | cadd | sage | class | t | cname | score | tname | tadd | ssex | cphone | ss | ct | a3 | +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------+----+---------+ | 6 | 赵六 | 广西 | 19 | 1 | 1 | 语文 | 35 | 叶平 | 福建 | 女 | 13349 | 174 | 3 | 58.0000 | | 5 | 王五 | 江西 | 17 | 1 | 1 | 语文 | 46 | 叶平 | 福建 | 男 | 12349 | 177 | 3 | 59.0000 | | 4 | 李四 | 湖南 | 18 | 2 | 2 | 数学 | 88 | 贺高 | 深圳 | 女 | 12348 | 271 | 3 | 90.3333 | | 3 | 张三 | 上海 | 17 | 1 | 1 | 语文 | 91 | 叶平 | 福建 | 男 | 12347 | 282 | 4 | 70.5000 | | 2 | 钱二 | 深圳 | 19 | 1 | 1 | 语文 | 79 | 叶平 | 福建 | 女 | 12346 | 320 | 4 | 80.0000 | | 1 | 刘一 | 福建 | 18 | 1 | 1 | 语文 | 56 | 叶平 | 福建 | 男 | 12345 | 259 | 4 | 64.7500 | +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------+----+---------+ 6 rows in set (0.00 sec)
このケースを通して、7つの共同クエリーがはっきりとわかります。多くの場合、クエリ結果は正しくても、ステートメントさえ正しいように見えます...しかし、実際には間違っています。本当に真実の陳述は、繰り返しの検証に耐えなければなりません(ようやく理解できました。励ましてください)。
以上がmysqlで7テーブルクエリを実装する例(2)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。