テーブルとテーブルの関係 単一テーブルクエリ 複数テーブルクエリ 055

テーブルとテーブルの関係 単一テーブルクエリ 複数テーブルクエリ 055

1. テーブルとテーブルの関係 --- 外部キーの変形



  1対多または多対1 多対多 1対1

  2 つのテーブル間の関係を見つける

    分析手順:

      #1 まず左側のテーブルの角度に立って探します

        左側のテーブルの複数のレコードが右側のテーブルのレコードに対応できるかどうか。対応する場合は、左側のテーブルのフィールドを証明します。

      外部キーの右側のテーブルのフィールド

      #2 次に右の表の角度から探します

        右のテーブルの複数のレコードが左のテーブルの 1 つのレコードに対応できるかどうか。対応できる場合は、右のテーブルのフィールドを証明します。

      外部キー座標のフィールド

      #3 要約: 

        #多対一

          ステップ 1 のみが確立されている場合、左側のテーブルは多対 1、右側のテーブルは多対 1 になります。

          ステップ 2 のみが確立されている場合、右側のテーブルは多対 1 の左側のテーブルになります。

        #多対多

          ステップ 1 と 2 を同時に確立すると、2 つのテーブルが双方向の多対 1 または多対多であることが証明されます。

          これら 2 つのテーブル間の関係テーブルを定義して、それらの間の関係を保存します。

        #1対1

          1 と 2 は当てはまりませんが、左側のテーブルのレコードは右側のテーブルのレコードに一意に対応し、その逆も同様です。

           この状況は非常に単純です。つまり、左側のテーブルの外部キー、右側のテーブル、左側のテーブルの外部キーに基づいています。

          フィールドは一意に設定できます

        多対 1 の関係: たとえば、出版社は複数の本を出版できます。 

        関連付け方法: 外部キー

# 创建主表
create  table press( 
    id int  キーauto_increment, 
    name varchar ( 20 ) 
); 
# 创建表
create  table book( 
    id int  キーauto_increment, 
    name varchar ( 20 ), 
    press_id int  not  null ,
        制約fk_book_press外部 キー(press_id)は削除時にpress(id)
    を参照します  cascade 
    on  update  cascade , 
); 
# まず、関連付けられたテーブルに挿入します
insert  into press(name)
( '北京産業地雷出版社' ), 
( '人民音楽は良くない出版社' ), 
( '知的財産権役に立たない出版社' ); 
# レコードを関連付けテーブルに挿入する
insert  into book(name,press_id)
( '九陽盛公' , 1 ), 
( '九陰経典' , 2 ), 
( '九陰白骨爪2 )、
( 'ドゥグの九剣'3 )、
( '竜討伐の 10 回の平手打ち'2 )、
( 'ひまわりコレクション'3 )

クエリ結果: 
mysql> select * from book; 
+----+-----------------+----------+ 
| id | name | press_id | 
+--------+---------------------+----------+ 
| 1 | 九太陽 | 1 | 
| 2 | 九陰経典| 2 | 
| 3 | 九陰白骨爪| 2 | 
| 4 |ドゥグ
| 5 |
剣| 3 | 
6 行セット (0.00 秒) 
mysql> select * from press; 
+----+- ----------------------- --------+ 
| ID | 名前 | 
+------+---------- ----------------------- --+ 
| 1 | 北京産業地雷出版社| 
| 2 | 人民音楽は良くない出版社|
 
| 3 | 知的財産権の無用な新聞 | 
+----+--------------------------------+ 
3 rowsインセット (0.00秒)

        多対多の関係(著者と本の関係)

          多対多: 1 人の著者が複数の本を書くことができ、1 つの本に複数の著者を含めることもできます。双方向の 1 対多、

        つまり、多対多の関連付け方法: 外部キー + 新しいテーブル

     ユーザーとブログは 1 対 1 の関係であり、ユーザーが登録できるブログは 1 つだけです

      関連付け方法: 外部キー + 一意

# たとえば、ユーザーは 1 つのブログのみを登録できます
# 2 つのテーブル: ユーザー テーブル ( user ) とブログ テーブル (blog) 
# ユーザー テーブルを作成します
create  table  user ( 
    id int  Primary  key auto_increment, 
    name varchar ( 20 ) 
); 
# ブログを作成しますtable 
create  table blog( 
    id int  キーauto_increment, 
    url varchar ( 100 ),
     user_id  int  unique 制約fk_user外部 キー( user_id)削除カスケードユーザー(id)
    を参照 更新カスケード
); 
# ユーザー テーブルにレコードを挿入ユーザー(名前)挿入
( ' alex ' ), 
( ' wusir ' ), 
( ' egon ' ), 
( ' xiaoma ' ); 
# レコードをブログテーブルに挿入しますinsert into blog(url, user_id )
( ' http://www.cnblog/alex ' ,  
      
  
 1 ), 
( ' http://www.cnblog/wusir ' , 1 ), 
( ' http://www.cnblog/egon ' , 1 ), 
( ' http://www.cnblog/xiaoma ' , 1 ) 、

単一テーブルクエリ:


 

1. 単一テーブルクエリの構文
    select field 1, field 2,... from table name
                 where条件
                グループ byフィルタ
                条件
                を持つフィールドorder byフィールド
                制限 エントリ数を制限
2. キーワード実行優先度 (強調) キーワード
    実行優先度where from
    制限による個別の順序を選択しグループ化する1.テーブルを検索します: from 2. where で指定された制約を使用して、ファイル/テーブルに移動してレコードを取り出します
    3.取り出したレコードをgroup byでグループ化します 
     
    
     
    
    
    
     
    
    
     group  byがない場合は、全体がグループとして
    表示されます。 4.グループ化された結果をフィルタリングします。
     5. select を実行します
    。 6.重複を削除します
    。 7.結果を条件で並べ替えます: order  by 
    8.表示される結果の数を制限します。たとえば、名前だけ見てください
グループ化

group by は where の後に発生します。条件はオプションです

同じフィールドで分類する

 投稿による従業員グループから* を選択します 

注: グループ化後は、グループ化されたフィールドのみを取得できます。グループ内の情報を取得したい場合は、集計関数を使用して計算する必要があります。

 集計関数
max () 最大値
min () 最小値
sum ()
 sum count () 合計数を計算します
avg () 平均値を計算します
limit0,5 最初のパラメータはクエリの開始位置を示します 2 番目のパラメータは取得するパラメータの数を示します数字   0、 5 は上位 5 つを取得することを意味します2 、 5 は 3 ~ 7 つの名前グループ
を取得することを意味します- concat (name) は選択した条件内のすべての名前を表示します
仮想テーブル
# Aは最初にフィルターされたテーブル
を 2 番目のスクリーニングのメイン テーブルとして使用するため、エイリアスを作成します
select   Aa from ( select post, count ( 1 )   as a from従業員グループ by post)

持っている

mysql5.7 全体として SQL をグループとして実行できる

select  *  from給与> 1000000の従業員から;グループを使用しない場合
、フォーム全体がデフォルトでグループ化されます

mysql 5.6 5.5

mysql >   select  *  from従業員の給与> 1000000 ;エラー
1463 ( 42000 ) : 非グループフィールド'給与'が HAVING使用されています
# を使用する前にグループ化する必要があります 

複数テーブルのクエリ

文法:
テーブル 1からフィールド リスト
    を選択内側| 左| 右|テーブル 2 を
    テーブル 1結合します。フィールド=テーブル 2。フィールド   
 
複数テーブル結合クエリ
# 対象となるクエリ
select   *  from従業員,部門where従業員.dep_id =部門.id;
内部結合

 

一致するデータのみを取得する

select  *  from従業員内部 結合部門( employee.dep_id =部門.id;)
左結合または右結合

 

左側または右側のテーブルのすべてのレコードのみを表示します

select  *  from従業員左から 従業員.dep_id =部門.id部門に参加します
完全外部結合

 
select  * 従業員のから、 employee.dep_id =部門.id
  の部門結合します。 Union select *従業員のから、 employee.dep_id =部門.id の部門結合します 
   
サブクエリ

 
# 1 : サブクエリとは、クエリ ステートメントを別のクエリ ステートメント内にネストすることです。
# 2 : 内側のクエリ文のクエリ結果は、外側のクエリ文のクエリ条件を提供できます。
# 3 : サブクエリには、 INNOT  INANYALLEXISTSNOT EXISTSなどのキーワードを含めることができます。 
# 4 : 比較演算子も含めることができます: =!=><など。

# 平均年齢が 25 歳を超える部門の名前を照会します。
select * fromDepartment where id in (従業員グループから dep_id を、avg(age) > 25 を持つ dep_id によって選択します);

 

 

 
posted @ 2018-11-22 16:03 あなたはあなたが思っているほど重要ではありません 読む ( ... ) コメント ( ... ) お気に入りを 編集

おすすめ

転載: blog.csdn.net/bruce_van/article/details/89443049