[2023] データベース SQL の追加、削除、変更、クエリ実行コマンドの概要 (詳細な例付き)

1. 単一テーブルクエリ

データ クエリ言語。特にテーブル内のデータを検索するために使用されます。

select * from emp;

キーワード

 テーブル名から * を選択

テーブル内のすべてのデータをクエリする

インポート元ファイルのアドレス\ファイル名

ダンプデータのインポート末尾に「;」を付けることはできません

mysqlのデータバックアップファイルをダンプファイルと呼びます

  1. 算術

四則演算 +、-、*、 / //クエリを演算子と組み合わせて出力をクエリすることもできます

 2. 重複を削除する

キーワード:

明確な。

すべての列のデータが同じ場合にのみ、重複が削除されます。

構文: テーブル名から個別の列名を選択します。

#現在募集中の求人を確認してください。

        emp から別のジョブを選択します。

 3. ここで: フィルター

文法:

        選択             //クエリ

        列名 1、列名 2…

        from          //どのテーブルを見つけるか

        テーブル名

        ここで           //フィルター制約

        フィルター条件。

フィルタ基準: 比較演算子:

>、<、<=、>=、!=、<>

  1. 実行プロセス: 最初に from を実行してテーブルの位置を特定し、次に where を実行して条件付きフィルタリングを実行し、最後に選択クエリの出力を実行します。

フィルタリングされた結果セット。

  1. 仮想テーブル: 結果セットがメモリ内で実行されるときに生成される仮想テーブル。

仮想ラベルは結果セットを保存するために使用されます

結果セットは、仮想マークに表示されるテーブルの一部です。

4. null: 空です

文法:

        選択 //クエリ

        列名 1、列名 2…

        from //検索するテーブル

        テーブル名

        ここで // フィルター制約

        Column name is null //列名が空であることを示します

例: ボーナスのない従業員に関する情報をクエリします。

        select * from emp (comm は null);

5. null ではありません: 空ではありません

not は、「〜ではない」という意味で他のキーワードと組み合わせて使用​​することもできます。

文法:

        選択 //クエリ

        列名 1、列名 2…

        from //検索するテーブル

        テーブル名

        ここで // フィルター制約

        Column name is not null // 列名がではないことを示します

例: ボーナスのある従業員に関する情報をクエリします。

        select * from emp (comm が null ではない)

6. そして: そして

文法:

        選択 //クエリ

        ename as name, //エイリアスを表します。ename、結果セットを出力するときに、結果セット内でのみ名前をエイリアスとして表示します。

        sal as給与、// 表示しても、実際にはテーブルのヘッダーは変更されません

        from //検索するテーブル

        テーブル名

        ここで // フィルター制約

        列名条件と列名条件 //前の条件が満たされ次の条件が満たされたことを示します。

例: 給与が 1000 を超え、ボーナスを受け取ることができる従業員の名前、給与、ボーナスをクエリします。

select
        ename as 姓名, sal 工资, comm 奖金
from  emp 
where   
        sal > 1000  and  comm is not null;
7. または、または

文法:

        選択 //クエリ

        列名 1、列名 2…

        from //検索するテーブル

        テーブル名

        ここで // フィルター制約

        列名条件 1 または列名条件 2 //クエリ出力が条件 1 を満たすか、条件 2 を満たすことを示します

例: 営業部門で働く従業員、または給与が 2,000 以上の従業員の数、職種、入社時間、給与をクエリします。

select
        empno,job,hiredate,sal
from   emp
where
        job = 'salesman'  or  sal>=2000;

8. そうでない:反対する、反対する

文法:

        選択する

        列名 1、列名 2…。

        から

        テーブル名

        どこ

        記載されていない状態。

例: 営業職以外の給与が 1,500 以上の従業員の数、名前、役職、給与、入社時刻をクエリします。

選択する

        エネーム、仕事、サラ、入社日

従業員から

どこ

(job="salesman") ではなく、    (sal<1500) でもない。

9. との間: 間隔

文法

        選択する

        列名 1、列名 2...

        から

        テーブル名

        どこ

        条件と条件の間の列名。

注: と の間は >= と <= に相当します。 // 文字も判定でき、最初の文字の値が判定されます。

例: 給与が 1500 を超え 3000 未満の従業員の情報をクエリする

        選択する

        *

        から

        従業員

        どこ

        サルは1500から3000の間。

10. in: 含む、意味を含む

文法:

        選択する

        列名 1、列名 2...

        から

        テーブル名

        どこ

        (条件 1、条件 2...) の列名。

例: 番号 7566、7900、7369、および 8888 の従業員の情報をクエリします。   

        選択する

        *

        から

        従業員

        どこ

        empno in(7566,7900,7369,8888) ;

11. 含まれていない:含まれていません

文法:

        選択する

        列名 1、列名 2...

        から

        テーブル名

        どこ

        (条件 1、条件 2...) に列名がありません。

例: SMITH、MARTIN、または ADAMS 以外の従業員情報をクエリします。

        選択する

        *

        から

        従業員

        どこ

        enameが in('smith','martin','adams') にありません

12. いいね: ファジーマッチング

2 つのワイルドカードと組み合わせて使用​​する必要があります

  1. _任意の文字に一致
  2. % は任意の長さの文字に一致します

文法:

        選択する

        列名 1、列名 2...

        から

        テーブル名

        どこ

        列名のような条件

例: 名前の 3 文字目が A である従業員の情報を問い合わせます。

        選択する

        *

        から

        従業員

        どこ

        '__a%' のような名前にします。

    //__には 2 つの'_ _'があり、最初の 2 文字のいずれかを意味します。3 番目の文字がAの場合、その後の%文字は任意です。

例: 1989 年に入社した従業員の情報をクエリします。

        選択する

        *

        から

        従業員

        どこ

        雇用率は「1988%」のようなものです。

13. 並べ替え: 並べ替え

構文: where がある場合、order by は where の後にある必要があります。

        選択する

        列名 1、列名 2…

        テーブル名から

        どこ

        フィルター条件

        までに注文する

        列 1 をソート、列 2 をソート.... asc | desc; // '|' は or を意味します

ソート規則は次のようになります。ソート列 1 が同じ場合は、列 2 のソート順序に従ってソートされます。

asc: デフォルト、昇順でソート、オプション

desc: 降順に並べ替えます

例 1: 従業員情報をクエリし、給与の低い順に並べ替えます。

        選択する

        *

        従業員から

        サルの説明で注文します。

例 2: 部門 10 の従業員の情報をクエリし、給与の高い順に並べ替えます。

        選択する

        *

        従業員から

        ここで、deptno=10

        サルで注文。

例 3: 全従業員の年収 [(sal+comm)*12] をクエリし、年収の高い順に並べ替えます。

        選択する

        エナメル、

        (sal+ifnull(comm,0)) * 12 年収  

        従業員から

        年収順に並べる。

SQL実行プロセス:

から --> どこから --> 選択 --> 並べ替え

14.limit(startIndex,size): ページング

文法:

        選択する

        列名 1、列名 2…

        から

        テーブル名

        どこ

        フィルター条件

        までに注文する

        列 1 のソート、列 2 のソート….asc

        startIndex 、サイズを制限します。

startIndex: 開始インデックス

サイズ: いくつか取ってください

例:

#1500構造未満の最初の3つのデータの従業員情報を取得

        選択する

        *

        から

        エモ

        どこ

        sal<1500;         //給与が1500未満のテーブルを取得します

        制限 (1-1)*3,3;    

ページングアルゴリズム:

要件: 各ページに 3 つのデータが表示されますが、合計で何ページ表示されますか?

データの最初のページをクエリする

最後のページのデータを問い合わせる

現在のページ: デフォルト 1

総ページ数: 総データ量/ページごとに表示されるアイテム数。14/3=5

//コンピュータがページングを呼び出すと、最終的にはページング アルゴリズムに従って最下層が呼び出されます。

開始添え字を計算します: (現在のページ-1 ) *各ページに表示される項目の数。

仮想テーブル:

        仮想ラベルは SQL の実行プロセス中に生成される多数のテーブルであり、結果セットは仮想ラベルに表示されるテーブルの 1 つです。

2. 複数テーブルのクエリ

1. 等価接続

構文: 選択

        リスト名…

        から

        テーブル名 1 別名 1、テーブル名 2 別名 2...

        どこ

        接続に成功しました

select
    e.*,d.*
from
    emp e,dept d;

#上記のクエリは、デカルト積クエリ (クロス クエリ) になります。

#Decartes 積: 2 つのデータ セットのセット。

     //接続条件がないため

#Dekal 製品クエリに移動

等結合:

    select   e.*,b.*   
    from  emp e,dept d
    where
        e.deptno=d.deptno;   //需要通过两个表中相同的字段进行等值连接

例 1: emp テーブルと dept テーブル内のすべてのデータをクエリします。

        選択する

        e.*、d.*

        から

        従業員、部署

        どこ

        e.deptno = d.deptno;

例 2: 全従業員の番号、名前、給与、部署名、部署名を問い合わせます。

        選択する

        e.empno、e.ename、e.sal、d.dname、d.loc

        から

        従業員、部署

        どこ

        e.deptno=d.deptno;

例 3: 部門 10 の従業員の番号、名前、給与、部門名、部門住所をクエリします。

        選択する

        e.empno、e.ename、e.sal、d.dname、d.loc

        から

        従業員、部署

        どこ

        e.deptno=d.deptno

        そして

         e.deptno=10;

自己結合: テーブル内の異なるフィールドの接続

例 1: 従業員名、給与、リーダー名、リーダー給与をクエリします。

select
e.ename,e.sal,e2.ename,e2.sal
from
emp e,emp e2       #一个表中建立两个对象
where
e.mgr=e2.empno;    #emp表中e对象的mgr字段和e2对象的empno字段进行连接

非等結合: および

比較および接続出力の等価フィールドと非等価フィールドを表します。

例: 従業員の名前、給与、部門名、および従業員の給与等級をクエリします。

 

select
e.ename,e.sal,d.dname,s.grade 工资等级
from
emp e,dept d,salgrade s
where
e.deptno=d.deptno
and
e.sal between s.losal and s.hisal;    //等值字段和范围字段进行输出

例 2: 従業員の名前、給与、部門名、従業員の給与等級、リーダーの給与、名前、および給与等級をクエリします。

選択する

e.ename、e.sal、d.dname、s.grade 従業員の給与等級、

m.ename リーダー名、m.sal リーダー給与、sm.grade リーダー給与グレード

から

emp e、dept d、salgrade s、emp m、salgrade sm

どこ

e.deptno=d.deptno

そして

e.mgr=m.ename

そして

sm間のm.sal losalsm.hisal ;

SQL99:

SQL99 は 1999 年に策定されたデータ クエリ ステートメントの標準です

  1. 概念: 複数テーブルのクエリに対する 1 つの構文
  2. 分類
    1. 内部結合
    2. 外部結合

1. 内部結合: 等値結合です (------値が等しいデータのみを結果セットに入れることができます)

  #innerキーワードの内部結合は    省略可能

等結合

文法:

        列名を選択してください

        from テーブル名 1 エイリアス 1 結合テーブル名 2 エイリアス 2

 #接続条件        を判断する              

        接続条件

        join              #テーブル接続を再度追加する必要がある場合、それを接続とし​​て使用します

        テーブル名3 別名3

#再接続条件        について           

        接続条件。

例: 給与が 1500 を超える従業員の名前、給与、部門名、およびリーダー名をクエリする

select
    e.ename,e.sal,d.dname,m.ename
from  emp e 
    join dept d   on   e.deptno = d.deptno  #两个表进行连接
    join emp m   on   e.mgr = m.empno          #新加入一个       
where
    e.sal > 1500;

2. 外部接続

 left: 左外部結合-----左側のテーブルをメインテーブルとして使用します (メインテーブル内のすべてのデータが結果セットに表示され、スレーブテーブルに見つからないデータは null として表示されます)。

        from では常に左側のテーブルのデータをすべて表示し、右側のデータと一致する場合は一致するデータを表示し、一致しない場合は null を表示します。

文法:

a.名前、b.ジョブを選択してください 

t_b b 左から   

参加してください

b.a_id = a.id;

right: 右外部結合-----右側をメインテーブルとして使用します (上記と同じ、つまり、結合の右側をメインテーブルとして使用します)

データを常に右側に表示する

文法:

select   a.name,   b.job
from  t_b b
right join t_a a
on  b.a_id = a.id;

例: 従業員名、部門名、部門住所 (担当者のいない部門も含む) をクエリします。

e.ename、d.dname、d.loc を選択します

emp eから

右   参加部門

e.deptno = d.deptno;

3. 集計関数と組み合わせたグループ統計:

キーワード: グループ化

文法:

        列名 1 を選択します

        テーブル名から

        どこ

        フィルター条件

        グループ化

        グループ1、グループ2…。

        までに注文する

        ソート列 1.... 制限

サンプルデータ

create table t_group(        
        id int,
        name varchar(20),
        num int
);

create table t_group(
        id int,
        name varchar(20),
        num int
);

insert into t_group values(1,'aa',2);
insert into t_group values(2,'aa',3);
insert into t_group values(3,'bb',4);
insert into t_group values(4,'bb',5);
insert into t_group values(5,'cc',6);
insert into t_group values(6,'dd',7);
insert into t_group values(7,'bb',5);
insert into t_group values(8,'ee',8);
insert into t_group values(9,'cc',6);

例: t_group テーブル内のデータを名前でグループ化します。

選択する *

t_グループから

名前ごとにグループ化します    。

持つ: グループ化されたデータをフィルタリングするために使用されます

キーワード

        where ステートメントはグループ化する前にデータをフィルター処理し、group by およびhave の前に where ステートメントが実行されます。

グループ化されたデータは、having キーワードを使用してフィルタリングする必要があります。

実行順序: from -->on(where---join) -->group by -->select-->having -->order by -->limit( pagination )

 

例: 平均給与が 2,000 元を超える部門番号と平均給与をクエリします。

        select d.dname,avg(e.sal)

        従業員、部門より

        ここで、    e.deptno=d.deptno

        d.deptno によるグループ化

           平均(e.sal)>2000を有する。

 

:従業員数が 3 人以上の部門名と従業員数をクエリします。

        select d.dname,count(e.ename)

        emp eから

        部門に参加する

        e.deptno=d.deptno で

        d.deptno によるグループ化

          count(e.ename)>3 を持つ ;

サブクエリ:

        1. 概念: クエリの結果は、サブクエリと呼ばれる別のクエリの条件として使用されます。ネストされたクエリとも呼ばれます

        計算する場合は、まず判定条件を取得し、メインコードの出力に判定条件を埋め込みます。

2. 条件を判断する際は細分化して把握する フィルタ条件はwhere で        グループ化する必要はなく、グループ化が必要なものはhave ;を使用する。

        閲覧したいデータはselectで取得し、途中で使用するテーブルはfromで書き込み、後ほど要求する平均給与をフィルター条件としています。

実行プロセスは次の図に示すとおりです。

        1. まず会社の平均給与を調べます

        2. から使用する必要があるテーブルを記述します。

        3. 要件として where にフィルタリング条件を記述します

        4. select を使用して、表示する必要がある列を書き出します。

例 1: 会社で最も給与が高い人の給与はいくらですか、名前は何ですか? というクエリを実行します。

---会社の最高給与はいくらですか?

emp から max(sal) を選択します。   

サル、エナメを選択

従業員から

どこ

sal=(select max(sal) from emp);     #最高給与を問い合わせる

例 2: 給与が 7698 より高い従業員の情報をクエリします。

select sal from emp where empno=7698 // 給与が最も高い人の給与を最初に取得します

選択する     

*エンプから

どこ

sal> (select sal from emp where empno=7698);   #最も給与が高い人の給与を条件とする

サブクエリ:    

  1. 単一列のサブクエリ
    1. 返される結果セットは単一の行と単一の列です。
    2. 結合演算子 > < = != を使用します。

  2. 複数行のサブクエリ

    1. 返される結果セットは複数の行と単一の列です。

  3. 複数列のサブクエリ

    1. 返される結果セットは複数の行と列です (結果セットとみなすことができます)

1. 単一列のサブクエリ

例 1: 各部門の数と最低給与をクエリします。最低給与は部門 30 の最低給与以上である必要があります。

--セクター30の最低賃金はいくらですか? (最低賃金が先)

deptno =30 の emp から min(sal) を選択します。

select deptno min(sal) 最低賃金 #最低賃金は min(sal) の別名です。

従業員から

部門別のグループ化

最低賃金がある> emp から min(sal) を選択、ここで deptno =30;

例 2: 部門の名前、部門の従業員数、部門の平均給与、部門内で最も給与の低い従業員の名前をクエリします。

select ename from emp where sal =min(sal)

select d.dname 部門番号、count(e.ename) 部門従業員数、avg(e.sal) 部門平均給与、

( sal =min(e.sal) の emp からenameを選択) 部門最低賃金名

部門から

従業員に参加したままにする

d.deptno=e.deptno で

d.deptno ごとにグループ化します。

2. 複数行のサブクエリ

通常は判定条件を作るために使用されます

  1. 主に演算子を使用する
    1. に: が含まれています
    2. any : どれよりも大きい、どれよりも小さい
      1. =any: in と同等で、通常は比較的まれに使用されます。
      2.  >any: 内部の最小値より大きい
      3. <any: 内部の最大値未満

    3. all : 最大値より大きい、最小値より小さい

      1. >all: 内部の最大値より大きい

      2. <all: 内部の最小値未満

  1. 例: 部門 20 の全従業員と同じ給与を持つ従業員情報をクエリする

---部門20の従業員の給与はいくらですか?

deptno=20 の emp から sal を選択します。

選択する *

従業員から

where sal in(select sal from emp where deptno=20);

1. すべてのキーワード

例: 各部門のマネージャーの給与よりも給与が高い従業員の情報を問い合わせる

---まずは各部長の給料を調べてください。

select sal from emp where job='manager';

選択する *

emp eから

join (sal,deptno を emp から選択します (job='manager')) m

e.deptno=m.deptno で

e.deptno ごとにグループ化

e.deptno=m.deptno を持つ

そして e.sal>m.sal;

2. 複数列のサブクエリ

複数列のサブクエリは、複数の行と複数の列、または 1 つの行と複数の列を返します。

一般的に結果セットで使用され、テーブルとして使用されます ( fromで使用されます)

例: 給与が 1500 を超える従業員に関する情報が営業職に表示される

----営業は誰がやっているのですか?

select * from emp where job = 'セールスマン'

複数のテーブル演習

1. 従業員が 4 人以上いる部門の名前を列挙します。

d.dnameを選択します

従業員からの入社部門

e.deptno=d.deptno で

d.deptno によるグループ化

持っている

count(e.ename)>4;

2. 給与が「SMITH」を超えるすべての従業員をリストします。

名前を選択

従業員から

どこ

sal>(ename='SMITH' の emp から sal を選択);

3. 全従業員の名前と直属の上司の名前をリストアップします。

e.ename、m.enameを選択します

従業員から、従業員から

どこ

e.mgr=m.empno;

4. 直属の上司より入社日が古いすべての従業員の番号、氏名、部署名をリストアップします。

e.empno、e.ename、d.dnameを選択します

従業員、従業員、部門から

どこ

e.mgr=m.empno

そして

e.deptno=d.deptno

そして

e.hiredate<m.hiredate;

5.「事務」業務に従事する従業員全員の氏名、部署名、部員数を記載します。

select count(ename) 部門の人数, deptno from emp group by deptno;  #まず各部門の人数を取得します

選択する

e.ename,d.dname,t.部門の人数

従業員からの入社部門

e.deptno=d.deptno で

参加する

 (select count(ename) 部門ヘッドカウント,deptno from emp group by deptno) t    #部門ヘッドカウントはテーブルであるため

e.deptno=t.deptno で

ここで、job='事務員';

6. 「営業」部門 (営業部) に勤務する従業員の名前を列挙します。営業部の部門番号は不明であると仮定します。

選択する

エナメ

から

  従業員

どこ

deptno=(dname ='sales' の dept から deptno を選択);

おすすめ

転載: blog.csdn.net/weixin_52315708/article/details/131500171