SQL演習(2)

- 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  COUNT1FROM コース)

- 解法二
SELECT  * 
FROM 学生
 S_ID 、NOT INはSELECTは S_ID FROM T1スコア  
 GROUP BYが S_ID HAVING COUNT*=SELECT COUNTDISTINCT 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 INSELECT 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名、ROUNDAVG(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 COUNT1> = 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

おすすめ

転載: www.cnblogs.com/Aug-20/p/12035611.html