目次
ケースの演習を行う前に、テーブルを追加する必要があります
create table salgrade(
grade int,
losal int, -- 对应等级的最低薪资
hisal int -- 对应等级的最高薪资
) comment '薪资等级表';
insert into salgrade values (1,0,3000);
insert into salgrade values (2,3001,5000);
insert into salgrade values (3,5001,8000);
insert into salgrade values (4,8001,10000);
insert into salgrade values (5,10001,15000);
insert into salgrade values (6,15001,20000);
insert into salgrade values (7,20001,25000);
insert into salgrade values (8,25001,30000);
練習する前に、3 つのテーブルをすべて取り出します。
演習 1
- 従業員の名前、年齢、役職、部門情報のクエリ(暗黙的な内部接続)
- 30歳未満の従業員の名前、年齢、役職、部門情報を照会します(明示的な内部接続)
- 従業員に部門IDと部門名を問い合わせる
- 40 歳以上のすべての従業員とその従業員が所属する部門の名前をクエリします。従業員に部門が割り当てられていない場合は、それも表示する必要があります。
- 全従業員の給与等級を問い合わせる
1-1
-- 従業員の名前、年齢、役職、部門情報を照会します (暗黙的な内部接続)
select e.name '姓名',e.age '年龄',e.job '职位',d.name '部门信息'
from emp e,dept d where e.dept_id = d.id;
検索結果:
1-2
-- 30 歳未満の従業員の名前、年齢、役職、部門情報を照会します (明示的な内部接続)
select e.name '姓名',e.age '年龄',e.job '职位',d.name '部门信息'
from emp e inner join dept d on e.dept_id = d.id where e.age < 30;
検索結果:
1-3
-- 従業員に部門ID、部門名を問い合わせ
-- ポイント:自己接続、キーワードの重複排除
select distinct d.id,d.name from emp e,dept d where e.dept_id = d.id;
検索結果:
1-4
-- 40 歳以上のすべての従業員とその部門名をクエリします。従業員に部門が割り当てられていない場合は、それらの部門名も表示する必要があります。
-- キーポイント: 左外部結合
select e.name '姓名',d.name '部门名称'
from emp e left join dept d on e.dept_id = d.id where age > 40;
検索結果:
1-5
-- すべての従業員の給与等級を照会します。
-- ポイント: テーブル構造は emp と salgrade であり、2 つのテーブルの接続条件を明確にする
select e.name '姓名',s.grade '工资等级'
from emp e left join salgrade s on e.salary >= s.losal and e.salary <= s.hisal;
-- 另一种写法
select e.name '姓名',s.grade '工资等级'
from emp e left join salgrade s on e.salary between s.losal and s.hisal;
検索結果:
演習 2
- 「研究開発部門」の全従業員の情報と給与水準を照会します。
- 「研究開発部門」の従業員の平均給与を照会します。
- 給与が「消滅」よりも高い従業員に関する情報を照会します。
- 平均給与よりも高い従業員に関する情報をクエリする
- 部門の平均給与よりも給与が低い従業員に関する情報を照会します。
- すべての部門情報をクエリし、部門内の従業員数をカウントします。
- 全学生のコース選択状況を照会し、学生名、学生番号、コース名を表示します。
2-1
-- 「研究開発部門」の全従業員の情報と給与レベルを照会します。
-- ポイント:接続条件とクエリ条件を理解する
--接続条件:
(e.dept_id = d.id)
(例: losal と hisal の間の給与)
-- クエリ条件 (d.name = '研究開発部')
select e.*,s.grade
from emp e,
dept d,
salgrade s
where (e.dept_id = d.id)
and (e.salary between losal and hisal)
and (d.name = '研发部');
検索結果:
2-2
-- 「研究開発部門」の従業員の平均給与をクエリします。
-- 重要なポイント: 関数 avg()
select avg(e.salary)
from emp e,
dept d
where e.dept_id = d.id
and d.name = '研发部';
検索結果:
2-3
-- 給与が「消滅」より高い従業員情報を照会します。
select *
from emp
where salary > (select salary from emp where name = '灭绝');
検索結果:
2-4
-- 平均給与よりも高い従業員に関する情報をクエリする
select *
from emp
where salary > (select avg(salary) from emp);
検索結果:
2-5
-- 部門の平均給与よりも給与が低い従業員に関する情報を照会します。
-- ポイント:各部門の平均給与を調べよう
select *, (select avg(e1.salary) from emp e1 where e1.dept_id = e2.dept_id) '所在部门平均工资'
from emp e2
where e2.salary < (select avg(e1.salary) from emp e1 where e1.dept_id = e2.dept_id);
検索結果:
2-6
-- すべての部門情報をクエリし、部門内の従業員数をカウントします。
まず、すべての部門の部門情報をクエリします。
select * from dept;
次に、1 つの部門の従業員の数を数えます。
select count(*) from emp where dept_id = 1;
すべてをまとめてください:
select d.*, (select count(*) from emp e where e.dept_id = d.id) '员工人数'
from dept d;
検索結果:
2-7
-- 全学生の科目選択状況を照会し、学生名、学生番号、科目名を表示します
他の 3 つのテーブルが関係するため、多対多のリレーションシップになります。
3 つのテーブル間の接続関係を明確にすることでクエリを実行できます。
select s.name '学生名称', s.no '学号', c.name '课程名称'
from student s,
course c,
student_course sc
where (s.id = sc.studentid)
and (c.id = sc.courseid);
検索結果:
要約する
1.複数のテーブルの関係
1 対多:多側に外部キーを設定し、一方の側の主キーに関連付けます。
多対多: 2 つの外部キーを含み、2 つのテーブルの主キーを関連付ける中間テーブルを作成します。
1 対 1:テーブル構造を分割し、どちらかの側に外部キー (UNIQUE) を設定し、もう一方の側の主キーを関連付けるために使用されます。
2.複数テーブルクエリ
自己接続
暗黙的: SELECT...FROM テーブル A、テーブル B WHERE 条件...
明示的: SELECT...FROM テーブル A INNER JOIN テーブル B ON 条件...
外部結合:
左外側: SELECT...FROM テーブル A LEFT JOIN テーブル B ON 条件...
右外側: SELECT...FROM テーブル A RIGHT JOIN テーブル B ON 条件...
自己結合: SELECT ... FROM テーブル A エイリアス 1、テーブル A エイリアス 2 WHERE 条件...
サブクエリ:スカラー サブクエリ、列サブクエリ、行サブクエリ、テーブル サブクエリ
終わり
学習内容: ダークホース プログラマー - MySQL データベース コース