テーブルとテーブルの関係 単一テーブルクエリ 複数テーブルクエリ 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 : サブクエリには、 IN、NOT IN、ANY、ALL、EXISTS、NOT EXISTSなどのキーワードを含めることができます。 # 4 : 比較演算子も含めることができます: =、!=、>、<など。
# 平均年齢が 25 歳を超える部門の名前を照会します。
select * fromDepartment where id in (従業員グループから dep_id を、avg(age) > 25 を持つ dep_id によって選択します);