mysql面接問題とその解題構想(一)
17600 ワード
まず、データベース・テーブルを作成します:1.従業員情報テーブル
3.給与表
4マネージャー所在部門表
5.title表
1.最も遅く入社した従業員情報を検索するための表:従業員情報表
2.入社時間最下位の従業員のすべての情報を検索する表:従業員情報表
3割り当てられたすべての部門の従業員を検索するlast_nameとfirst_nameで使用するテーブル:従業員情報テーブル、従業員所在部門テーブル
4.すべての従業員のlast_を検索nameとfirst_nameおよび対応部門番号dept_No、具体的な部門を割り当てていない従業員の表示も含まれます
5.すべての従業員の入社時の給与状況を検索し、emp_を与えるNoおよびsalary、emp_No逆シーケンスで使用するテーブル:従業員情報テーブル、給与テーブル
6.給料の上昇幅が15回を超える従業員番号empを検索するNo及びそれに対応する上昇幅回数tに用いる表:給与表
7.すべての従業員の現在の(to_date='9999-01-01’)具体的な給与salary状況を特定し、同じ給与に対して1回のみ表示し、逆の順序で使用する表:給与表
8.manager以外のすべての従業員emp_を取得するNo使用するテーブル:dept_managerと従業員テーブル
9.titlesテーブルからtitleに従ってグループ化され、各グループの個数が2以上であり、titleおよび対応する数tが与えられる.
10 employeesテーブルのすべてのemp_を検索Noは奇数でlast_nameはMaryの従業員情報ではなく、hire_に従います.date逆配列で使用するテーブル「従業員基本情報テーブル」
11.従業員番号emp_の検索nowは10001入社以来の給与salary上昇幅値growth
12.すべての従業員が入社してからの給料の上昇幅を検索し、従業員番号empを与える.Noyおよびそれに対応する賃金上昇幅growthはgrowthに従って昇順される
CREATE TABLE `employees` ( `emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `first_name` varchar(14) NOT NULL, `last_name` varchar(16) NOT NULL, `gender` char(1) NOT NULL, `hire_date` date NOT NULL, PRIMARY KEY (`emp_no`));
CREATE TABLE `salaries` ( `emp_no` int(11) NOT NULL, `salary` int(11) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`from_date`));
:
、 number、 、 first/last name、 、 、 number
``
**2. **
``
CREATE TABLE `dept_emp` ( `emp_no` int(11) NOT NULL, `dept_no` char(4) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`dept_no`));
3.給与表
CREATE TABLE `salaries` ( `emp_no` int(11) NOT NULL, `salary` int(11) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`from_date`));
4マネージャー所在部門表
CREATE TABLE `dept_manager` ( `dept_no` char(4) NOT NULL, `emp_no` int(11) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`dept_no`));
5.title表
CREATE TABLE IF NOT EXISTS "titles" ( `emp_no` int(11) NOT NULL, `title` varchar(50) NOT NULL, `from_date` date NOT NULL, `to_date` date DEFAULT NULL);
1.最も遅く入社した従業員情報を検索するための表:従業員情報表
select * from employees where hire_date = (select max(hire_date) from employees) : 1. sql, where 2.max :
2.入社時間最下位の従業員のすべての情報を検索する表:従業員情報表
SELECT *
FROM
employees
WHERE hire_date = (SELECT hire_date FROM employees ORDER BY hire_date DESC LIMIT 2,1);
:
1. sql,
2.order by : 。 desc
3.limit m,n : m , n
3割り当てられたすべての部門の従業員を検索するlast_nameとfirst_nameで使用するテーブル:従業員情報テーブル、従業員所在部門テーブル
select e.last_name,e.first_name,d.dept_no from employees e inner join dept_emp d on e.emp_no=d.emp_no ;
:
1.inner join :
,INNER JOIN 。 , name,dept_no 。
4.すべての従業員のlast_を検索nameとfirst_nameおよび対応部門番号dept_No、具体的な部門を割り当てていない従業員の表示も含まれます
select e.last_name,e.first_name,d.dept_no from employees e left join dept_emp d on e.emp_no=d.emp_no ;
:
left join:
, 。
first last name 。
5.すべての従業員の入社時の給与状況を検索し、emp_を与えるNoおよびsalary、emp_No逆シーケンスで使用するテーブル:従業員情報テーブル、給与テーブル
select e.emp_no,s.salary from employees e,salaries s where e.emp_no=s.emp_no
and e.hire_date = s.from_date
order by e.emp_no desc;
:
order by where ,
, , emp_no from_date,
6.給料の上昇幅が15回を超える従業員番号empを検索するNo及びそれに対応する上昇幅回数tに用いる表:給与表
select emp_no ,count(emp_no) as t
from salaries
group by emp_no having t>15;
:
1.count( ):COUNT(column_name) (NULL )
SUM、AVG、COUNT、MAX MIN , COUNT(*) .
2.group by :
: sum, group by emp_no , emp_no :http://blog.csdn.net/peanutwzk/article/details/79247318
3、group by having
HAVING GROUP BY , GROUP BY 。HAVING WHERE 。
7.すべての従業員の現在の(to_date='9999-01-01’)具体的な給与salary状況を特定し、同じ給与に対して1回のみ表示し、逆の順序で使用する表:給与表
select salary from salaries
where to_date='9999-01-01'
group by salary
order by salary desc ;
:
, distinct group by group by
8.manager以外のすべての従業員emp_を取得するNo使用するテーブル:dept_managerと従業員テーブル
: NOT IN employees dept_manager emp_no
SELECT emp_no FROM employees WHERE emp_no NOT IN (SELECT emp_no FROM dept_manager) :not in exists: in SELECT emp_no FROM employees WHERE NOT exists (SELECT emp_no FROM dept_manager);
in exists :
: LEFT JOIN , dept_no NULL emp_no
SELECT employees.emp_no FROM employees LEFT JOIN dept_manager ON employees.emp_no = dept_manager.emp_no WHERE dept_no IS NULL SELECT emp_no FROM employees WHERE NOT exists (SELECT emp_no FROM dept_manager);
9.titlesテーブルからtitleに従ってグループ化され、各グループの個数が2以上であり、titleおよび対応する数tが与えられる.
select title,count(title)as t from titles group by title having t>=2;
group by having
10 employeesテーブルのすべてのemp_を検索Noは奇数でlast_nameはMaryの従業員情報ではなく、hire_に従います.date逆配列で使用するテーブル「従業員基本情報テーブル」
select * from employees
where emp_no%2=1
and last_name!='Mary'
order by hire_date desc
: , 1 mysql % oracle mod(numer1,number2)
order by desc
11.従業員番号emp_の検索nowは10001入社以来の給与salary上昇幅値growth
:
SELECT ( (SELECT salary FROM salaries WHERE emp_no = 10001 ORDER BY to_date DESC LIMIT 1) - (SELECT salary FROM salaries WHERE emp_no = 10001 ORDER BY to_date ASC LIMIT 1) ) AS growth;
:
1.select select 2.
12.すべての従業員が入社してからの給料の上昇幅を検索し、従業員番号empを与える.Noyおよびそれに対応する賃金上昇幅growthはgrowthに従って昇順される
SELECT sCurrent.emp_no, (sCurrent.salary-sStart.salary) AS growth FROM (SELECT s.emp_no, s.salary FROM employees e LEFT JOIN salaries s ON e.emp_no = s.emp_no WHERE s.to_date = '9999-01-01') AS sCurrent LEFT JOIN salaries s ON e.emp_no = s.emp_no WHERE s.from_date = e.hire_date) AS sStart ON sCurrent.emp_no = sStart.emp_no ORDER BY growth;
11 12
,