MySQL の 2 つのテーブル結合クエリの実践

トピック

1. 営業部門で最年長の従業員の名前を検索します
。 2. 財務部門で最低給与の従業員の名前を検索します。
3. 各部門の合計収入が 9000 を超える部門の名前をリストします
。 4. 検索します。給与 7500 ~ 8500 元、最年長者の名前と所属
5. 営業部門の最も収入の低い従業員の入勤時間を調べます
6. 財務部門のそれ以上の収入の従業員の名前2,000 元以上
7. 各部門の平均収入と部門名をリストします
8. IT 技術部門のエントリ
9. 財務部門の総収入;
最初に部門番号で並べ替え、次にエントリに従って従業員情報テーブルを並べ替えます早い時間から遅い時間まで
11. まだ従業員がいない部門を調べる;
12. 部門の従業員をリストアップする 収入が 7000 を超える部門番号と部門名をリストする;
13. 各部門および部門名の従業員の合計収入をリストする;
14.各部門の最年長の従業員の名前、部門名を列挙します;
15. 李思の収入と部門名を尋ねます
16. 各部門の最も収入の高い従業員の名前、部門名、収入、および降順に列挙します収入 17.
従業員が 1 人以上いる部門の名前を列挙してください
19. Zhang San がいる部門の名前を見つけてください

練習問題

準備

mysql> create database work3;
mysql> use work3;

mysql> create table dept(
    -> dept1 int,
    -> dept_name varchar(11)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> create table emp(
    -> sid int,
    -> name varchar(11),
    -> age int,
    -> worktime_start date,
    -> incoming int,
    -> dept2 int
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> insert into dept values (101,'财务'),(102,'销售'),(103,'IT技术'),(104,'行政');
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> insert into emp values (1789,'张三',35,'1980/1/1',4000,101),(1674,'李四',32,'1983/4/1',3500,101),(1776,'王五',24,'1990/7/1',2000,101),(1568,'赵六',57,'1970/10/11',7500,102),(1564,'荣七',64,'1963/10/11',8500,102),(1879,'牛八',55,'1971/10/20',7300,103);
Query OK, 6 rows affected, 6 warnings (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 6

mysql> select * from dept;
+-------+-----------+
| dept1 | dept_name |
+-------+-----------+
|   101 | 财务      |
|   102 | 销售      |
|   103 | IT技术    |
|   104 | 行政      |
+-------+-----------+
4 rows in set (0.00 sec)

mysql> select * from emp;
+------+--------+------+----------------+----------+-------+
| sid  | name   | age  | worktime_start | incoming | dept2 |
+------+--------+------+----------------+----------+-------+
| 1789 | 张三   |   35 | 1980-01-01     |     4000 |   101 |
| 1674 | 李四   |   32 | 1983-04-01     |     3500 |   101 |
| 1776 | 王五   |   24 | 1990-07-01     |     2000 |   101 |
| 1568 | 赵六   |   57 | 1970-10-11     |     7500 |   102 |
| 1564 | 荣七   |   64 | 1963-10-11     |     8500 |   102 |
| 1879 | 牛八   |   55 | 1971-10-20     |     7300 |   103 |
+------+--------+------+----------------+----------+-------+
6 rows in set (0.00 sec)

答え

1. 営業部門の最年長従業員の名前を見つけます。

mysql> select name as 姓名,age as 年龄,dept_name from dept inner join emp on dept.dept1=emp.dept2 where dept_name = '销售' order by age desc limit 1;
+--------+--------+-----------+
| 姓名   | 年龄   | dept_name |
+--------+--------+-----------+
| 荣七   |     64 | 销售      |
+--------+--------+-----------+
1 row in set (0.00 sec)

2. 財務部門で最低給与の従業員の名前を見つけます。

mysql> select name as 姓名,age as 年龄,dept_name from dept inner join emp on dept.dept1=emp.dept2 where dept_name = '财务' order by age limit 1;
+--------+--------+-----------+
| 姓名   | 年龄   | dept_name |
+--------+--------+-----------+
| 王五   |     24 | 财务      |
+--------+--------+-----------+
1 row in set (0.00 sec)

3.各部門の合計収入が9000を超える部門名を列挙してください

mysql> select dept_name as `部门`,sum(incoming) as `总收入` from dept inner join emp on dept.dept1=emp.dept2 group by dept_name having `总收入` > 9000;
+--------+-----------+
| 部门   | 总收入    |
+--------+-----------+
| 财务   |      9500 |
| 销售   |     16000 |
+--------+-----------+
2 rows in set (0.00 sec)

4. 7500~8500元の給与、最高齢者の名前と所属を尋ねる。

mysql> select name as `姓名`,age as `年龄`,dept_name as `部门`,incoming as `工资` from dept inner join emp on dept.dept1=emp.dept2 where incoming between 7500 and 8500;
+--------+--------+--------+--------+
| 姓名   | 年龄   | 部门   | 工资   |
+--------+--------+--------+--------+
| 荣七   |     64 | 销售   |   8500 |
| 赵六   |     57 | 销售   |   7500 |
+--------+--------+--------+--------+
2 rows in set (0.00 sec)

5. 営業部門で最も給与の低い従業員がいつ入社したかを調べる

mysql> select name as `姓名`,worktime_start as `入职时间`,dept_name as `部门`,incoming as `工资` from dept inner join emp on dept.dept1=emp.dept2 where dept_name = '销售' order by worktime_start limit 1;
+--------+--------------+--------+--------+
| 姓名   | 入职时间     | 部门   | 工资   |
+--------+--------------+--------+--------+
| 荣七   | 1963-10-11   | 销售   |   8500 |
+--------+--------------+--------+--------+
1 row in set (0.00 sec)

6. 収入が2,000元を超える財務部門の従業員の名前

mysql> select name as `姓名`,dept_name as `部门`,incoming as `工资` from dept inner join emp on dept.dept1=emp.dept2 where dept_name = '财务' and incoming > 2000;
+--------+--------+--------+
| 姓名   | 部门   | 工资   |
+--------+--------+--------+
| 张三   | 财务   |   4000 |
| 李四   | 财务   |   3500 |
+--------+--------+--------+
2 rows in set (0.00 sec)

7. 各部門の平均収入と部門名を列挙してください

mysql> select dept_name as `部门`,avg(incoming) as `平均工资` from dept inner join emp on dept.dept1=emp.dept2 group by dept_name;
+----------+--------------+
| 部门     | 平均工资     |
+----------+--------------+
| 财务     |    3166.6667 |
| 销售     |    8000.0000 |
| IT技术   |    7300.0000 |
+----------+--------------+
3 rows in set (0.00 sec)

8. ITテクノロジー部門に入社した社員の社員番号

mysql> select sid as `员工号`,name as `姓名`,dept_name as `部门` from dept inner join emp on dept.dept1=emp.dept2 where dept_name = 'IT技术';
+-----------+--------+----------+
| 员工号    | 姓名   | 部门     |
+-----------+--------+----------+
|      1879 | 牛八   | IT技术   |
+-----------+--------+----------+
1 row in set (0.00 sec)

9. 財務部門の収入の合計。

mysql> select dept_name as `部门`,sum(incoming) as `总工资` from dept inner join emp on dept.dept1=emp.dept2 group by dept_name having dept_name = '财务';
+--------+-----------+
| 部门   | 总工资    |
+--------+-----------+
| 财务   |      9500 |
+--------+-----------+
1 row in set (0.00 sec)

10. まず部門番号の大小でソートし、次に従業員情報テーブルを入力時刻に従って早い順から遅い順にソートします。

mysql> select name,dept_name,worktime_start from emp inner join dept on emp.dept2=dept.dept1 order by dept1 desc, worktime_start desc;
+--------+-----------+----------------+
| name   | dept_name | worktime_start |
+--------+-----------+----------------+
| 牛八   | IT技术    | 1971-10-20     |
| 赵六   | 销售      | 1970-10-11     |
| 荣七   | 销售      | 1963-10-11     |
| 王五   | 财务      | 1990-07-01     |
| 李四   | 财务      | 1983-04-01     |
| 张三   | 财务      | 1980-01-01     |
+--------+-----------+----------------+
6 rows in set (0.00 sec)

11. まだ従業員がいない部門を調べます。

mysql> select name,dept_name,worktime_start from emp left join dept on emp.dept2=dept.dept1 where dept_name is null;

12. 収入が 7000 を超える部門の従業員の部門番号と部門名をリストします。

mysql> select name,incoming,dept_name,dept2 from emp inner join dept on emp.dept2=dept.dept1 where incoming > 7000;
+--------+----------+-----------+-------+
| name   | incoming | dept_name | dept2 |
+--------+----------+-----------+-------+
| 荣七   |     8500 | 销售      |   102 |
| 赵六   |     7500 | 销售      |   102 |
| 牛八   |     7300 | IT技术    |   103 |
+--------+----------+-----------+-------+
3 rows in set (0.00 sec)

13. 従業員の総収入と各部門の部門名をリストします。

mysql> select dept_name as `部门`,sum(incoming) as `总工资` from dept inner join emp on dept.dept1=emp.dept2 group by dept_name;
+----------+-----------+
| 部门     | 总工资    |
+----------+-----------+
| 财务     |      9500 |
| 销售     |     16000 |
| IT技术   |      7300 |
+----------+-----------+
3 rows in set (0.00 sec)

14. 各部門の最年長従業員の名前と部門名をリストします。

mysql> select dept.dept_name as 部门,emp.name as 姓名 from dept inner join  (select deptt2,max(age) as max_age from emp group by dept2) as temp on temp.dept2=dept.dept1  inner  join emp on temp.dept2=emp.dept2 and temp.max_age=emp.age;
+----------+--------+
| 部门     | 姓名   |
+----------+--------+
| 财务     | 张三   |
| 销售     | 荣七   |
| IT技术   | 牛八   |
+----------+--------+
3 rows in set (0.00 sec)

15. リー・シーの収入と部門名を調べる

mysql> select emp.name,dept.dept_name,emp.incoming from emp inner join dept on emp.dept22=dept.dept1 where emp.name = '李四';
+--------+-----------+----------+
| name   | dept_name | incoming |
+--------+-----------+----------+
| 李四   | 财务      |     3500 |
+--------+-----------+----------+
1 row in set (0.00 sec)

16. 各部門の最も収入の多い従業員の名前、部門名、収入を収入の多い順に列挙してください

mysql> select de.name,de.dept_name,temp.max_incoming from (select emp.name,dept.dept_name,emp.incoming from emp inner join dept on emp.dept2=dept.dept1) as de right join (seleect max(incoming) as max_incoming,dept2 from emp group by dept2) as temp on de.incoming==temp.max_incoming;
+--------+-----------+--------------+
| name   | dept_name | max_incoming |
+--------+-----------+--------------+
| 张三   | 财务      |         4000 |
| 荣七   | 销售      |         8500 |
| 牛八   | IT技术    |         7300 |
+--------+-----------+--------------+
3 rows in set (0.00 sec)

17. 複数の従業員がいる部門の名前を列挙してください

mysql> select dept_name,count(dept_name) as `员工人数` from dept inner join emp on dept.dept1=emp.dept2 group by dept_name having `员工人数` > 1;
+-----------+--------------+
| dept_name | 员工人数     |
+-----------+--------------+
| 财务      |            3 |
| 销售      |            2 |
+-----------+--------------+
2 rows in set (0.00 sec)

19. チャン・サンの部署の名前を調べてください

mysql> select name,dept_name from emp inner join dept on dept.dept1=emp.dept2 where name='张三';
+--------+-----------+
| name   | dept_name |
+--------+-----------+
| 张三   | 财务      |
+--------+-----------+
1 row in set (0.00 sec)

おすすめ

転載: blog.csdn.net/bo1029/article/details/131687586