SQL文法の練習問題と答え

15950 ワード

前言
以下は牛客ネットでやったSQLの練習問題です。どの問題にも答えがあります。皆さんに教えてください。
練習問題&答え
  • 最終社員のすべての情報を検索します。
    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`));
    
    答え
    select * from employees
    order by hire_date desc limit 0,1
    
  • 入社社員の時間ランキングの下から3番目の従業員のすべての情報を検索します。
    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`));
    
    答え
    select * from employees
    order by hire_date desc limit 2,1
    
  • 各部門の現在(toudiate='9999-01-01')リーダーの現在の給与明細とその対応部門番号dept_NO
  • 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`));
    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`));
    
    答え
    select salaries.*, dept_manager.dept_no
    from salaries, dept_manager
    where dept_manager.emp_no = salaries.emp_no
    and dept_manager.to_date = '9999-01-01'
    and salaries.to_date = '9999-01-01'
    
  • 割り当てられたすべての部門の従業員を検索するlast_。nameとfirst_name
  • 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`));
    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`));
    
    答え
    select employees.last_name, first_name, dept_emp.dept_no
    from dept_emp
    inner join employees
    where dept_emp.emp_no = employees.emp_no;
    
  • すべての従業員のラスターを検索します。nameとfirst_name及び対応部署番号dept_いいえ、具体的な部門を割り当てていない社員を展示することも含みます。
    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`));
    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`));
    
    答え
    select employees.last_name, employees.first_name, dept_emp.dept_no
    from employees
    left join dept_emp
    on employees.emp_no = dept_emp.emp_no
    
  • 社員全員の入社時の給料状況を調べて、emp_を提供します。noとsalaryは、emp_に従います。ノ逆順
  • 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`));
    
    答え
    select employees.emp_no, salaries.salary
    from employees join salaries
    on employees.emp_no = salaries.emp_no and employees.hire_date =  salaries.from_date
    order by salaries.emp_no desc
    
  • 給与の上昇幅が15回を超える従業員番号emp_no及びその対応するゲイン回数t
  • 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`));
    
    答え
    select emp_no, count(emp_no) as t
    from salaries
    group by emp_no
    having count(emp_no) > 15
    
  • 従業員全員の現在の具体的な給料のsalary状況を探し出して、同じ給料に対して一回だけ表示して、逆順に
  • を表示します。
    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`));
    
    答え
    select salary
    from salaries
    where to_date = '9999-01-01'
    group by salary
    order by salary desc
    
  • はすべての部門の現在のmanagerの現在の給料の情況を獲得して、dept_を提供します。の、emp_no及びsalaryは、現在はto_を表しています。date='9999-01-01'
  • 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`));
    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`));
    
    答え
    select salary
    from salaries
    where to_date = '9999-01-01'
    group by salary
    order by salary desc
    
  • すべての非managerの従業員emp_0026 quot;を取得する。NO
  • 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`));
    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`));
    
    答え
    select emp_no
    from employees
    where employees.emp_no not
    in(select emp_no from dept_manager)
    
  • すべての従業員の現在のmanagerを取得し、現在のmanagerが自分であれば結果は表示されません。date='9999-01-01'結果の第一列は現在の従業員にemp_を与えます。ノ、二列目はそのmanagerに対応するmanager_を与えます。ノ・ノ
  • 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`));
    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`));
    
    答え
    select de.emp_no, dm.emp_no as manager_no
    from dept_emp de
    inner join dept_manager dm
    on de.dept_no = dm.dept_no
    where de.emp_no != dm.emp_no
    and dm.to_date = '9999-01-01' and de.to_date = '9999-01-01'
    
  • すべての部門で現在の従業員の給料が一番高いという情報を取得し、dept_を提供する。の、emp_noおよびその対応するsalary
  • 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`));
    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`));
    
    答え
    select de.dept_no, de.emp_no, max(s.salary)
    from  dept_emp de, salaries s
    where de.emp_no = s.emp_no and de.to_date = '9999-01-01' and s.to_date = '9999-01-01'
    group by de.dept_no
    
  • は、titlesテーブルから取得し、titleに従ってパケット化し、各グループの数が2以上であり、title及び対応する数tを与える。
  • 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);
    
    答え
    select title, count(title) as t
    from titles
    group by title
    having count(title) >= 2
    
  • は、titlesテーブルから取得し、titleに従ってパケット化し、各グループの数が2以上であり、title及び対応する数tを与える。繰り返しのemp_に注意してください。ノは無視します
  • 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);
    
    答え
    select title, count(distinct emp_no) as t
    from titles
    group by title
    having count(title) >= 2
    
  • employes表のすべてのemp_を検索します。NOは奇数で、かつlast_nameはMaryの従業員の情報ではなく、hire_に従います。ダテ逆順配列
  • 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`));
    
    答え
    select *
    from employees
    where emp_no % 2 = 1 and last_name != 'Mary'
    order by hire_date desc
    
  • は、現在の各タイプの従業員の現在の給料に対応する平均賃金を集計しています。その結果、title及び平均給与avgが与えられた。
  • 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`));
    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);
    
    答え
    select titles.title, avg(salaries.salary)
    from titles inner join salaries
    on titles.emp_no = salaries.emp_no
    where titles.to_date = '9999-01-01' and salaries.to_date = '9999-01-01'
    group by title
    
  • 現在(toudte='9999-01-01')の給料の第二位の従業員のemp_を取得します。no及びそれに対応する給料salary
  • 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`));
    
    答え
    select emp_no, salary
    from salaries
    where to_date = '9999-01-01'
    order by salary desc
    limit 1, 1
    
  • 現在の給与(toudte='9999-01-01')を検索します。第二位の従業員番号emp_ノ、給料salary、last_nameとfirst_name、order by
  • を使用してはいけません。
    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`));
    
    答え
    select e.emp_no, max(s.salary), e.last_name, e.first_name
    from employees e, salaries s
    where e.emp_no = s.emp_no and s.to_date = '9999-01-01' and s.salary != (select max(salary) from salaries)
    
  • すべての従業員のラスターを検索します。nameとfirst_name及び対応のdept_nameは、まだ配属されていない部門の従業員も含まれています。
    CREATE TABLE `departments` (
    `dept_no` char(4) NOT NULL,
    `dept_name` varchar(40) NOT NULL,
    PRIMARY KEY (`dept_no`));
    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`));
    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`));
    
    答え
    select e.last_name, e.first_name, d.dept_name
    from employees e
    left join dept_emp de on e.emp_no = de.emp_no
    left join departments d on de.dept_no = d.dept_no
    
  • 従業員番号emp_を検索します。nowは10001です。入社以来の給料salaryの上昇幅はgrowth
  • です。
    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`));
    
    答え
    select (max(salary) - min(salary))
    from salaries
    where emp_no = 10001
    
  • 全従業員の入社以来の給与の上昇幅を調べ、従業員番号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`));
    
    答え
    select t1.emp_no, t1.salary - t2.salary as growth
    from (select e.emp_no, s.salary
          from employees e, salaries s
          where e.emp_no = s.emp_no and to_date = '9999-01-01') as t1,
           (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) as t2
    where t1.emp_no = t2.emp_no
    order by growth
    
  • 各部門の従業員の上げ幅の回数合計を統計して、部門コードのdept_を与えます。ノ、部門名dept_name及び回数sum
  • CREATE TABLE `departments` (
    `dept_no` char(4) NOT NULL,
    `dept_name` varchar(40) NOT NULL,
    PRIMARY KEY (`dept_no`));
    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`));
    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`));
    
    答え
    select de.dept_no, d.dept_name, count(e.salary) as sum
    from salaries e
    inner join dept_emp de on e.emp_no = de.emp_no
    inner join departments d on de.dept_no = d.dept_no
    group by d.dept_no
    
  • は全従業員の現在の給料をsalaryで1-Nの順位によって行います。同じsalaryと並んでemp_0026 quot;に従います。ノ昇順配列
  • 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`));
    
    答え
    select s1.emp_no,s1.salary,count(distinct s2.salary) as rank
    from salaries s1,salaries s2
    where s1.salary<=s2.salary and s1.to_date='9999-01-01' and s2.to_date='9999-01-01'
    group by s1.emp_no
    order by rank
    
  • すべての非managerの従業員の現在の給料の情況を獲得して、dept_を提供します。ノ、emp_no及びsalaryは、現在はto_を表しています。date='9999-01-01'
  • 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`));
    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`));
    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`));
    
    答え
    select de.dept_no, s.emp_no, s.salary
    from salaries s
    join employees e on e.emp_no = s.emp_no
    join dept_emp de on de.emp_no = e.emp_no
    where s.to_date = '9999-01-01' and de.emp_no not in (select emp_no from dept_manager)
    
  • 従業員の現在の給料はそのmanagerの現在の給料より高いです。date='9999-01-01'の結果、最初の列は従業員のemp_を与えました。ノ、二列目はそのmanagerのmanager_を与えます。三列目は従業員の現在の給料empを提供します。salary、第四列はその社員に対応するmanagerの現在の給料managersalary
  • 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`));
    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`));
    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`));
    
    答え
    select t1.emp_no, t2.emp_no as manager_no, t1.salary as emp_salary, t2.salary as manager_salary from
        (select de.dept_no, de.emp_no, s.salary from dept_emp de
        join salaries s on de.emp_no = s.emp_no
        where de.emp_no not in (select emp_no from dept_manager) and s.to_date = '9999-01-01' and de.to_date = '9999-01-01') as t1,
        (select dm.dept_no, dm.emp_no, s.salary from dept_manager dm
        join salaries s on dm.emp_no = s.emp_no
        where s.to_date = '9999-01-01' and dm.to_date = '9999-01-01') as t2
    where emp_salary > manager_salary and t1.dept_no = t2.dept_no
    
    締め括りをつける
    すべていくつかの簡単なSQL文法の練習問題です。
    ご注目ください
    個人の微信の公衆番号:Charming字のところ
    Github:https://github.com/CharmingWhttps://github.com/CharmingW
    読んでくれてありがとうございます