単一テーブルおよび複数テーブルの結合クエリの実践

1. 単一テーブルクエリの実践
/* 素材
CREATE TABLE emp (
empno int(4) NOT NULL、
ename varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL、
ジョブ varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL、
mgr int(4) NULL デフォルト NULL、
入社 日が NULL ではありません。
sai int(255) NOT NULL、
comm int(255) NULL デフォルト NULL、
deptno int(2) NOT NULL、
BTREE を使用した主キー ( empno )
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = 動的;
INSERT INTO emp VALUES (1001, ' Ganning ', ' crew ', 1013, '2000-12-17', 8000, NULL, 20);
INSERT INTO emp VALUES (1002, ' Daikis ', ' Salesperson ', 1006, '2001-02-20', 16000, 3000, 30);
INSERT INTO emp VALUES (1003, ' ying Tianzheng ', ' Salesperson ', 1006, '2001-02-22', 12500, 5000, 30);
INSERT INTO emp VALUES (1004, ' 劉備 ', ' マネージャー ', 1009, '2001-04-02', 29750, NULL, 20);
INSERT INTO emp VALUES (1005, ' Xie Xun ', ' Salesman ', 1006, '2001-09-28', 12500, 14000, 30);
INSERT INTO emp VALUES (1006, ' 関羽 ', ' マネージャー ', 1009, '2001-05-01', 28500, NULL, 30);
INSERT INTO emp VALUES (1007, ' 張飛 ', ' マネージャー ', 1009, '2001-09-01', 24500, NULL, 10);
INSERT INTO emp VALUES (1008, ' 諸葛亮 ', ' アナリスト ', 1004, '2007-04-19', 30000, NULL, 20);
INSERT INTO emp VALUES (1009, ' Zeng A Niu ', ' President ', NULL, '2001-11-17', 50000, NULL, 10);
INSERT INTO emp VALUES (1010, ' Wei Yixiao ', ' Salesman ', 1006, '2001-09-08', 15000, 0, 30);
INSERT INTO emp VALUES (1011, ' 周泰 ', ' 事務員 ', 1006, '2007-05-23', 11000, NULL, 20);
INSERT INTO emp VALUES (1012, ' Cheng Pu ', ' 事務員 ', 1006, '2001-12-03', 9500, NULL, 30);
INSERT INTO emp VALUES (1013, ' Pang Tong ', ' Analyst ', 1004, '2001-12-03', 30000, NULL, 20);
INSERT INTO emp VALUES (1014, ' yellow cover ', ' crew ', 1007, '2002-01-23', 13000, NULL, 10);
INSERT INTO emp VALUES (1015, ' Zhang San ', ' Cleaning ', 1001, '2013-05-01', 80000, 50000, 50);
1. 部門番号が 30 であるすべての従業員をクエリします
。 select * from emp where deptno = 30;
2. すべての営業担当者の名前、番号、および部門番号を照会します。
 select ename,empno,mgr from emp;
3. ボーナスが給与より高い従業員を検索します。
 select * from emp where sai < comm;
4. ボーナスが給与より 60% 高い従業員を検索します。
 select * from emp where sai < (comm * 0.6);
5. 部門番号 10 のすべてのマネージャーと部門番号 20 のすべての営業マンの詳細を調べます。
 select * from emp where deptno in (10,20) and job in ('manager','salesperson');
6. 部門番号 10 のすべてのマネージャー、部門番号 20 のすべての営業担当者、およびそのどちらでもないすべての従業員の詳細を検索します。マネージャーでも営業マンでも、給与が 20000 以上の者。
 select * from emp where (deptno = 10 and job = 'Manager') または (deptno = 20 and job = 'Sales') または (sai >= 20000 and job != 'Manager' and job !='Sales' );
7。 ボーナスなしまたはボーナスが 1,000 未満の従業員。
 select * from emp where comm is null or comm < 1000;
8. 名前が 3 文字で構成される従業員をクエリします。
select * from emp where length(ename) = 9;  
9. 2000 年に入社した従業員をクエリします。
select * from emp where year(hiredate)=2000;
10. 全従業員の詳細情報を問い合わせて番号昇順に並べ替えます
 select * from emp order by empno;
11. 全従業員の詳細情報を問い合わせて並べ替えます給与が同じ場合は、エントリ Date ascending order
 select * from emp order by sai desc,hiredate;
12. 各部門の平均給与をクエリ
select deptno,avg(sai) as total from emp group by deptno;
13. 各部門の従業員数をクエリ
 select deptno, count(job) as total from emp group by deptno;
14. 各ジョブの最高賃金、最低賃金、人数をクエリ
select job,max(sai)ジョブごとの emp グループからの、min(sai)、count(job)。
2. 複数テーブルの結合クエリ
mydb3 を使用します。
--部門テーブルの作成
テーブルが存在しない場合は作成します dept3(
deptno varchar(20) 主キー , -- 部門番号
name varchar(20) -- 部署名
);
--従業員テーブルの作成
テーブルが存在しない場合は作成 emp3(
eid varchar(20) 主キー , --従業員番号
ename varchar(20), --従業員名
age int, --従業員の 年齢
dept_id varchar(20) -- 従業員 の部門
);
--dept3テーブル データを追加します
insert into dept3 value('1001',' 研究開発部門 ');
insert into dept3 value('1002',' 営業部門 ');
dept3 値に挿入 ('1003',' 財務部門 ');
insert into dept3 values('1004',' 人事部 ');
-- emp3テーブル データを追加します。
emp3 に挿入 value('1',' Qiao Feng ',20, '1001');
emp3 に挿入 value('2',' Duanyu ',21,'1001');
emp3 に挿入 value('3',' Xuzhu ',23,'1001');
emp3 に挿入 value('4',' Azi ',18,'1001');
insert into emp3 value('5',' 掃除僧 ',85, '1002');
emp3 に挿入 value('6',' 李秋水 ',33,'1002');
emp3 に挿入 value('7',' Jumozhi ',50, '1002');
emp3 値に挿入 ('8',' 天山児童長老 ',60, '1003');
emp3 に挿入します。values('9',' Murongbo ',58,'1003');
emp3 に挿入します。values('10',' Ding Chunqiu ',71, '1005');
1 各部門の従業員をクエリ
 select name,GROUP_CONCAT(ename) from emp3 e RIGHT JOIN dept3 d on e.dept_id = d.deptno GROUP BY name ;
2 研究開発部門の従業員をクエリ
select name,GROUP_CONCAT(ename) from emp3 e RIGHT JOIN dept3 d on e.dept_id = d.deptno and name='研究開発部門';
3. 研究開発部門と営業部門の従業員にクエリを実行
し、名前、GROUP_CONCAT(ename) from emp3 e RIGHT JOIN dept3 d on e.dept_id = d.deptno group by name and d.name='研究開発部' または d.name='営業部' ;
4. 各部門の従業員数をクエリし、昇順で並べ替えます
select name,count(deptno) as total from emp3 e left JOIN dept3 d on e.dept_id = d.deptno GROUP BY d.name HAVING NAME is not null ORDER BY total;
5. 番号が 3 以上の部門をクエリし、降順に並べ替えます人数に応じて
select name,count(deptno) as total from emp3 e left JOIN dept3 d on e.dept_id = d.deptno GROUP BY d.name HAVING NAME が null ではなく、合計 > 1 ORDER BY total desc 

新しい従業員テーブル emp と部門テーブル dept を追加します
 。 create table dept (dept1 int ,dept_name varchar(11));
 create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int);

     部門値
    (101,'財務')、
    (102,'営業')、
    (103,'IT テクノロジー')、
    (104,'管理') に挿入します。

     emp 値に挿入
    (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 、'Rongqi',64,'1963/10/11',8500,102)、
    (1879,'Niuba',55,'1971/10/20',7300,103);

1. 営業部門の最年長従業員の名前を調べます。 select name
from emp e ,dept d where e.dept2=d.dept1 and dept_name='sales' and age=(select max(age) from emp where dept2= ( select dept1 from dept where dept_name='sales'));
 2. 財務部門の最低給与を持つ従業員の名前を検索します
select name from emp e ,dept d where e.dept2=d.dept1 and dept_name=' Finance' and incoming=(
select min(incoming) from emp where dept2=(select dept1 from dept where dept_name='service'));

 3. 各部門の合計収入が 9000 を超える部門名をリストします
select dept_name from dept d,(select dept2 from emp group by dept2 getting sum(incoming)> 9000 ) e where d.dept1=e.dept2;
 4. 7500 ~ 8500 元の給与を尋ね、最年長の人の名前と所属を
選択します。 dept_name, `name` from emp e RIGHT JOIN dept d on e.dept2 = d.dept1 WHERE incoming >= 7500 AND incoming <= 8500 and d.dept_name = '売上' 年齢順に注文 LIMIT 1;
5. 営業部門で最も収入の低い従業員の入社時刻を検索します 
SELECT worktime_start FROM emp e RIGHT JOIN dept d ON e.dept2 = d.dept1 where d.dept_name = 'Sales' ORDER BY incoming ASC LIMIT 1;
6 . 財務部門の収入は次を超えています Select name
from emp e RIGHT JOIN dept d on e.dept2 = d.dept1 where d.dept_name = 'finance' and incoming > 2000;
7. 各部門の平均収入と部門名をリストします。
select dept_name ,AVg(incoming) from emp e RIGHT JOIN dept d on e.dept2 = d.dept1 group by dept_name;
8.
select sid from emp e RIGHT JOIN dept d on e.dept2 = d.dept1 where d.dept_name = 'IT テクノロジー'
9. 財務部門の収入の合計;
select dept_name, sum(incoming) from emp e RIGHT JOIN dept d on e.dept2 = d.dept1 WHERE d.dept_name = 'finance' ;
10 .部門ごとに並べ替え最初に番号を入力し、入力時刻に従って従業員情報テーブルを早い順から遅い順に並べ替えます。
select * from emp e RIGHT JOIN dept d on e.dept2 = d.dept1 ORDER BY dept2,worktime_start;
11. まだ従業員がいない部門を調べます;
select dept_name from emp e RIGHT JOIN dept d on e.dept2 = d。 dept1 WHERE worktime_start is NULL;
12. 収入が 7000 を超える部門従業員の部門番号と部門名をリストします; select
dept1, dept_name from emp e RIGHT JOIN dept d on e.dept2 = d.dept1 WHERE incoming > 7000;
13従業員の合計所得と各部門の部門名をリストします。
select dept_name,sum(incoming) from emp e RIGHT JOIN dept d on e.dept2 = d.dept1 group by dept_name

14. 各部門の最年長従業員の名前と部門名をリストします;
select MAX(age), dept_name from emp e RIGHT JOIN dept d on e.dept2 = d.dept1 group by dept_name
15. Li Si の収入と部門名を調べます
select `name`,incoming,dept_name from emp e RIGHT JOIN dept d on e.dept2 = d.dept1 where name = 'Li Si'
16. 各部門の最高収入の従業員の名前、部門名、収入をリストします。 , そして、emp e RIGHT JOIN dept d on e.dept2 = d.dept1 から name,MAX(incoming),dept_name を選択し、収入の降順で
dept_name でグループ化します。

17. 従業員が 1 人以上いる部門の名前をリストします
select dept_name, dept2 from emp e RIGHT JOIN dept d on e.dept2 = d.dept1 group by dept_name HAVING COUNT(dept2) > 1; 19.
Zhang San がいる場所を見つける部門名
select dept_name from emp e RIGHT JOIN dept d on e.dept2 = d.dept1 where name = 'Zhang San'

おすすめ

転載: blog.csdn.net/m0_70940822/article/details/131651369