1. 単一テーブルクエリ
データ クエリ言語。特にテーブル内のデータを検索するために使用されます。
select * from emp;
キーワード
テーブル名から * を選択 |
テーブル内のすべてのデータをクエリする |
インポート元ファイルのアドレス\ファイル名 |
ダンプデータのインポート(末尾に「;」を付けることはできません) |
mysqlのデータバックアップファイルをダンプファイルと呼びます
-
算術
四則演算 +、-、*、 / //クエリを演算子と組み合わせて出力をクエリすることもできます
2. 重複を削除する
キーワード:
明確な。
すべての列のデータが同じ場合にのみ、重複が削除されます。
構文: テーブル名から個別の列名を選択します。
#現在募集中の求人を確認してください。
emp から別のジョブを選択します。
3. ここで: フィルター
文法:
選択 //クエリ
列名 1、列名 2…
from //どのテーブルを見つけるか
テーブル名
ここで //フィルター制約
フィルター条件。
フィルタ基準: 比較演算子:
>、<、<=、>=、!=、<>
- 実行プロセス: 最初に from を実行してテーブルの位置を特定し、次に where を実行して条件付きフィルタリングを実行し、最後に選択クエリの出力を実行します。
フィルタリングされた結果セット。
- 仮想テーブル: 結果セットがメモリ内で実行されるときに生成される仮想テーブル。
仮想ラベルは結果セットを保存するために使用されます
結果セットは、仮想マークに表示されるテーブルの一部です。
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...
から
テーブル名
どこ
列名のような条件
例: 名前の 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 。losalとsm.hisal ;
SQL99:
SQL99 は 1999 年に策定されたデータ クエリ ステートメントの標準です
- 概念: 複数テーブルのクエリに対する 1 つの構文
- 分類
- 内部結合
- 外部結合
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: 各部門の数と最低給与をクエリします。最低給与は部門 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. 複数行のサブクエリ
通常は判定条件を作るために使用されます
- 主に演算子を使用する
- に: が含まれています
- any : どれよりも大きい、どれよりも小さい
- =any: in と同等で、通常は比較的まれに使用されます。
- >any: 内部の最小値より大きい
<any: 内部の最大値未満
all : 最大値より大きい、最小値より小さい
>all: 内部の最大値より大きい
<all: 内部の最小値未満
-
例: 部門 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 を選択);