mysql面接問題とその解題構想(一)

17600 ワード

まず、データベース・テーブルを作成します:1.従業員情報テーブル
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.  sqlwhere    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)             (NULLSUM、AVG、COUNT、MAX  MIN           , COUNT(*)    .
2.group by   :
        : sumgroup by emp_no       ,    emp_no             :http://blog.csdn.net/peanutwzk/article/details/79247318
3group by having   
HAVING     GROUP BYGROUP 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             
          ,