MySQLマルチテーブルクエリー練習
33690 ワード
*
--
CREATE TABLE dept (
id INT PRIMARY KEY PRIMARY KEY, -- id
dname VARCHAR(50), --
loc VARCHAR(50) --
);
-- 4
INSERT INTO dept(id,dname,loc) VALUES
(10,' ',' '),
(20,' ',' '),
(30,' ',' '),
(40,' ',' ');
-- , ,
CREATE TABLE job (
id INT PRIMARY KEY,
jname VARCHAR(20),
description VARCHAR(50)
);
-- 4
INSERT INTO job (id, jname, description) VALUES
(1, ' ', ' , '),
(2, ' ', ' '),
(3, ' ', ' '),
(4, ' ', ' ')
--
CREATE TABLE emp (
id INT PRIMARY KEY, -- id
ename VARCHAR(50), --
job_id INT, -- id
mgr INT , --
joindate DATE, --
salary DECIMAL(7,2), --
bonus DECIMAL(7,2), --
dept_id INT, --
CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job (id),
CONSTRAINT emp_deptid_ref_dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept (id)
);
--
INSERT INTO emp(id,ename,job_id,mgr,joindate,salary,bonus,dept_id) VALUES
(1001,' ',4,1004,'2000-12-17','8000.00',NULL,20),
(1002,' ',3,1006,'2001-02-20','16000.00','3000.00',30),
(1003,' ',3,1006,'2001-02-22','12500.00','5000.00',30),
(1004,' ',2,1009,'2001-04-02','29750.00',NULL,20),
(1005,' ',4,1006,'2001-09-28','12500.00','14000.00',30),
(1006,' ',2,1009,'2001-05-01','28500.00',NULL,30),
(1007,' ',2,1009,'2001-09-01','24500.00',NULL,10),
(1008,' ',4,1004,'2007-04-19','30000.00',NULL,20),
(1009,' ',1,NULL,'2001-11-17','50000.00',NULL,10),
(1010,' ',3,1006,'2001-09-08','15000.00','0.00',30),
(1011,' ',4,1004,'2007-05-23','11000.00',NULL,20),
(1012,' ',4,1006,'2001-12-03','9500.00',NULL,30),
(1013,' ',4,1004,'2001-12-03','30000.00',NULL,20),
(1014,' ',4,1007,'2002-01-23','13000.00',NULL,10);
--
CREATE TABLE salarygrade (
grade INT PRIMARY KEY, --
losalary INT, --
hisalary INT --
);
-- 5
INSERT INTO salarygrade(grade,losalary,hisalary) VALUES
(1,7000,12000),
(2,12010,14000),
(3,14010,20000),
(4,20010,30000),
(5,30010,99990);
-- :
-- 1. 。 , , , ,
/*
:
1. , , , emp , job
2. emp.job_id = job.id
*/
SELECT
t1.`id`, --
t1.`ename`, --
t1.`salary`,--
t2.`jname`, --
t2.`description` --
FROM
emp t1, job t2
WHERE
t1.`job_id` = t2.`id`;
-- 2. , , , , , ,
/*
:
1. , , emp , job , dept
2. : emp.job_id = job.id and emp.dept_id = dept.id
*/
SELECT
t1.`id`, --
t1.`ename`, --
t1.`salary`,--
t2.`jname`, --
t2.`description`, --
t3.`dname`, --
t3.`loc` --
FROM
emp t1, job t2,dept t3
WHERE
t1.`job_id` = t2.`id` AND t1.`dept_id` = t3.`id`;
-- 3. , ,
/*
:
1. , emp salarygrade
2. emp.salary >= salarygrade.losalary and emp.salary <= salarygrade.hisalary
emp.salary BETWEEN salarygrade.losalary and salarygrade.hisalary
*/
SELECT
t1.ename ,
t1.`salary`,
t2.*
FROM emp t1, salarygrade t2
WHERE t1.`salary` BETWEEN t2.`losalary` AND t2.`hisalary`;
-- 4. , , , , , ,
/*
:
1. , emp , , job , ,dept salarygrade
2. : emp.job_id = job.id and emp.dept_id = dept.id and emp.salary BETWEEN salarygrade.losalary and salarygrade.hisalary
*/
SELECT
t1.`ename`,
t1.`salary`,
t2.`jname`,
t2.`description`,
t3.`dname`,
t3.`loc`,
t4.`grade`
FROM
emp t1,job t2,dept t3,salarygrade t4
WHERE
t1.`job_id` = t2.`id`
AND t1.`dept_id` = t3.`id`
AND t1.`salary` BETWEEN t4.`losalary` AND t4.`hisalary`;
-- 5. 、 、 、
/*
:
1. 、 、 dept 。 emp
2. 。 emp.dept_id , count(id)
3. 2 dept
*/
SELECT
t1.`id`,t1.`dname`,t1.`loc` , t2.total
FROM
dept t1,
(SELECT
dept_id,COUNT(id) total
FROM
emp
GROUP BY dept_id) t2
WHERE t1.`id` = t2.dept_id;
-- 6. ,
/*
:
1. emp, emp
* emp id mgr
2. emp.id = emp.mgr
3. ,
*
*/
/*
select
t1.ename,
t1.mgr,
t2.`id`,
t2.ename
from emp t1, emp t2
where t1.mgr = t2.`id`;
*/
SELECT
t1.ename,
t1.mgr,
t2.`id`,
t2.`ename`
FROM emp t1
LEFT JOIN emp t2
ON t1.`mgr` = t2.`id`;