- 11、問い合わせは、すべてのコースの学生の完全な情報を学びませんでした - 解決策1:学習するコース数<コース数を SELECTを。S * FROM 学生S LEFT JOINのスコアS1 ON s.`s_id` = s1.`s_id` GROUP BY s1.`s_id` HAVING COUNT(s1.`c_id`)<(SELECT COUNT(1)FROM コース) - 解法二 SELECT * FROM 学生 S_ID 、NOT INは( SELECTは S_ID FROM T1スコア GROUP BYが S_ID HAVING COUNT(*)=(SELECT COUNT(DISTINCT C_ID) FROM コース)) - 12クエリが少なくとも1つのコースと学生数で「01」の学生が同じ情報を学ぶ学生ですしている - ソリューション1:左が参加 SELECT DISTINCT S.を* FROM 学生S LEFT JOINの S1スコアON s.`s_id` = s1.`s_id` s1.`s_id` <> ' 01 ' と s1.`c_id` 、IN (SELECTが C_ID FROMスコアWHERE S_ID = ' 01 ' ) - ソリューションII:副問合せSELECT * FROM学生S_ID Inを ( SELECT DISTINCT a.s_idをFROMスコアA a.c_id IN(SELECT a.c_id FROMスコアA a.s_id = ' 01 ' ) )と S_ID <> ' 01 ' ; - 13個の学生クエリと「01」は、情報の他の学生の研究のまったく同じコースでした - どんな先生に14個のクエリ学んだことがない、「ジョー・スミスは」学生の名前で、もちろん教えて - に対する解決策を SELECTは s_name FROM 学生 WHERE S_ID ないで 、IN ( SELECTがs.`s_id` FROM学生S LEFT JOINのスコアS1 ON Sを.`s_id` = s1.`s_id` WHERE s1.`c_id` IN (SELECTがC_ID FROM教師T LEFT JOINコースC ON t.`t_id` = c.`t_id` t.t_name = ' ジョン・ドウ' ) ) - 解法2 SELECT a.s_name FROM学生A a.s_id ないで、IN ( SELECTが S_ID FROMスコアC_ID = (SELECT C_ID FROMもちろんWHERE t_id = ( SELECT t_id FROM先生t_nameは= ' 张三' ))); - 15、問い合わせは、二つ以上のコースや学校数、平均名と学年ポイントの学生の失敗 - マーク・ SELECT a.s_id学生番号、a.s_name名、ROUND(AVG(b.s_score))成績平均点をFROM 学生A LEFTは JOINスコアbをON a.s_id = b.s_id WHERE a.s_id IN ( SELECTは S_ID FROMスコアs_score < 60 GROUP BYが S_ID HAVING COUNT(1)> = 2 ) GROUP BYは、a.s_nameをa.s_id
次のようにクエリデータを記録した後、SQLは、いくつかの演習をやって、一部のクエリは、念頭に置いてあります。
1、カウント(1)\ COUNT(*)\数(列名)の違いは何ですか?
の(1)の結果
次のように図の試験データを以下に示します。
結果は、カウント(カラム名)を選択 5(1)の結果は、COUNTの選択である 10 ;結果は、COUNT(*)はSELECT 10だけでなく、ヌル値を含まない(カラム名)を数えます。
その選択数(NULL)の結果があるとは何ですか?
その理由は、count()値は括弧内にnullである場合、内部MySQLは自動的に、さらなる問い合わせを0を返していないことです。
(2)効率
原則ビット複雑な、「ハイパフォーマンスMySQLの」勧告が書かれていた数(*)
2、どのように内側と外側が参加するとの違いを説明するには?
インナー一つは、(接続、同等の接続、使用を省略することができる内部結合、同じ効果)参加:戻る2つだけのテーブルのフィールドに等しい結合行を。
第二に、外部接続用コネクタは、左外側、右アウターフル外側のコネクタに分割されます。
(1)(参加左)に参加左:テーブルは、すべての左と右のテーブル記録領域における等価結合のレコードを含む返します。
(2)は(右のカップリング)に参加IGHT:左のテーブルを返しますし、同じ結合右の表レコードのフィールド内のすべてのレコードを含んでいます。
(3)フル(完全に接続された)参加
次のショーの簡単な栗:
次のように今、二つのテーブルの学生、student2は、あります。
学生テーブル:
student2表:
学生S1からSELECT * INNER JOINは student2 S2にs1.s_id = s2.s_id
次のようにクエリ結果は以下のとおりです。
SELECT * FROM student s1 LEFT JOIN student2 s2 ON s1.s_id = s2.s_id
查询结果如下:
SELECT * FROM student s1 RIGHT JOIN student2 s2 ON s1.s_id = s2.s_id
查询结果如下:
(3)全外连接(MySQL目前不支持此种方式,可以用其他方式替代解决。)
那么问题就来了:Full Join的问题该如何解决呢?我们可以用UNION ALL操作来间接使用Full Join。
SELECT * FROM student s1 LEFT JOIN student2 s2 ON s1.s_id = s2.s_id UNION ALL SELECT * FROM student s1 RIGHT JOIN student2 s2 ON s1.s_id = s2.s_id
查询结果如下:
如果想去掉重复的数据呢? 用union即可。
三、Cross Join
交叉连接,又称笛卡尔连接(cartesian join)或叉乘(Product),如果A和B是两个集合,它们的交叉连接就记为:A x B。
SELECT * FROM student s1 CROSS JOIN student2 s2