SQL. Көңілді басқатырғыштар

Сәлем Хабр!

3 жылдан астам уақыт бойы әртүрлі оқу орталықтарында SQL тілінен сабақ беріп келемін, бір байқағаным, студенттер тек мүмкіндіктер мен теориялық негіздерін айтып қоймай, тапсырма берілсе, SQL тілін жақсы меңгеріп, түсінеді.

Бұл мақалада мен сіздермен студенттерге үй тапсырмасы ретінде беретін және SQL тілін терең және анық түсінуге әкелетін әртүрлі ми шабуылдарын өткізетін тапсырмаларымның тізімімен бөлісемін.

SQL. Көңілді басқатырғыштар

SQL (ˈɛsˈkjuˈɛl; ағылш. құрылымдық сұрау тілі) — сәйкес дерекқорды басқару жүйесімен басқарылатын реляциялық дерекқордағы деректерді жасау, өзгерту және басқару үшін қолданылатын декларативті бағдарламалау тілі. Толығырақ ...

SQL туралы әртүрлі нұсқалардан оқуға болады ақпарат көздері.
Бұл мақала сізге SQL тілін нөлден бастап үйретуге арналмаған.

Мәселен, барайық.

Біз танымалды қолданамыз HR схемасы кестелері бар Oracle бағдарламасында (көбірек):

SQL. Көңілді басқатырғыштар
Мен SELECT бойынша тапсырмаларды ғана қарастыратынымызды ескертемін. DML және DDL бойынша тапсырмалар жоқ.

міндеттері

Мәліметтерді шектеу және сұрыптау

Қызметкерлер кестесі. Барлық қызметкерлер туралы ақпарат бар тізімді алыңыз
шешім

SELECT * FROM employees

Қызметкерлер кестесі. «Дэвид» деп аталатын барлық қызметкерлердің тізімін алыңыз
шешім

SELECT *
  FROM employees
 WHERE first_name = 'David';

Қызметкерлер кестесі. job_id "IT_PROG" мәніне тең барлық қызметкерлердің тізімін алыңыз
шешім

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Қызметкерлер кестесі. 50-нан жоғары жалақысы (жалақысы) бар 4000-ші бөлімнен (департамент_id) барлық қызметкерлердің тізімін алыңыз
шешім

SELECT *
  FROM employees
 WHERE department_id = 50 AND salary > 4000;

Қызметкерлер кестесі. 20-шы және 30-шы бөлімдегі барлық қызметкерлердің тізімін алыңыз (департамент_id)
шешім

SELECT *
  FROM employees
 WHERE department_id = 20 OR department_id = 30;

Қызметкерлер кестесі. Атындағы соңғы әрпі «a» болатын барлық қызметкерлердің тізімін алыңыз
шешім

SELECT *
  FROM employees
 WHERE first_name LIKE '%a';

Қызметкерлер кестесі. 50-ші және 80-ші бөлімнен (department_id) бонусы бар барлық қызметкерлердің тізімін алыңыз (commission_pct бағанындағы мән бос емес)
шешім

SELECT *
  FROM employees
 WHERE     (department_id = 50 OR department_id = 80)
       AND commission_pct IS NOT NULL;

Қызметкерлер кестесі. Аты кемінде 2 «n» әрпінен тұратын барлық қызметкерлердің тізімін алыңыз
шешім

SELECT *
  FROM employees
 WHERE first_name LIKE '%n%n%';

Қызметкерлер кестесі. Аты 4 әріптен асатын барлық қызметкерлердің тізімін алыңыз
шешім

SELECT *
  FROM employees
 WHERE first_name LIKE '%_____%';

Қызметкерлер кестесі. Жалақысы 8000 мен 9000 (қоса алғанда) аралығындағы барлық қызметкерлердің тізімін алыңыз
шешім

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Қызметкерлер кестесі. Аты '%' белгісін қамтитын барлық қызметкерлердің тізімін алыңыз
шешім

SELECT *
  FROM employees
 WHERE first_name LIKE '%%%' ESCAPE '';

Қызметкерлер кестесі. Барлық менеджер идентификаторларының тізімін алыңыз
шешім

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Қызметкерлер кестесі. Пішімдегі лауазымдары бар қызметкерлердің тізімін алыңыз: Donald(sh_clerk)
шешім

SELECT first_name || '(' || LOWER (job_id) || ')' employee FROM employees;

Шығаруды теңшеу үшін бір қатарлы функцияларды пайдалану

Қызметкерлер кестесі. Аты 10 әріптен асатын барлық қызметкерлердің тізімін алыңыз
шешім

SELECT *
  FROM employees
 WHERE LENGTH (first_name) > 10;

Қызметкерлер кестесі. Атында «b» әрпі бар барлық қызметкерлердің тізімін алыңыз (әріптерді ескермейді)
шешім

SELECT *
  FROM employees
 WHERE INSTR (LOWER (first_name), 'b') > 0;

Қызметкерлер кестесі. Аты кемінде 2 «a» әрпінен тұратын барлық қызметкерлердің тізімін алыңыз
шешім

SELECT *
  FROM employees
 WHERE INSTR (LOWER (first_name),'a',1,2) > 0;

Қызметкерлер кестесі. Жалақысы 1000 еселенген барлық қызметкерлердің тізімін алыңыз
шешім

SELECT *
  FROM employees
 WHERE MOD (salary, 1000) = 0;

Қызметкерлер кестесі. Қызметкердің телефон нөмірі ХХХ.ХХХ.ХХХХ форматында болса, оның бірінші 3 таңбалы нөмірін алыңыз.
шешім

SELECT phone_number, SUBSTR (phone_number, 1, 3) new_phone_number
  FROM employees
 WHERE phone_number LIKE '___.___.____';

Бөлімшелер кестесі. Атауында бірнеше сөз барлар үшін бөлім атауынан бірінші сөзді алыңыз
шешім

SELECT department_name,
       SUBSTR (department_name, 1, INSTR (department_name, ' ')-1)
           first_word
  FROM departments
 WHERE INSTR (department_name, ' ') > 0;

Қызметкерлер кестесі. Атында бірінші және соңғы әріпсіз қызметкер есімдерін алыңыз
шешім

SELECT first_name, SUBSTR (first_name, 2, LENGTH (first_name) - 2) new_name
  FROM employees;

Қызметкерлер кестесі. Аты-жөніндегі соңғы әрпі «m» әрпіне тең және атының ұзындығы 5-тен асатын барлық қызметкерлердің тізімін алыңыз.
шешім

SELECT *
  FROM employees
 WHERE SUBSTR (first_name, -1) = 'm' AND LENGTH(first_name)>5;

Қос үстел. Келесі жұма күнін алыңыз
шешім

SELECT NEXT_DAY (SYSDATE, 'FRIDAY') next_friday FROM DUAL;

Қызметкерлер кестесі. Компанияда 17 жылдан астам жұмыс істеген барлық қызметкерлердің тізімін алыңыз
шешім

SELECT *
  FROM employees
 WHERE MONTHS_BETWEEN (SYSDATE, hire_date) / 12 > 17;

Қызметкерлер кестесі. Телефон нөмірінің соңғы саны тақ және нүктемен бөлінген 3 саннан тұратын барлық қызметкерлердің тізімін алыңыз.
шешім

SELECT *
  FROM employees
 WHERE     MOD (SUBSTR (phone_number, -1), 2) != 0
       AND INSTR (phone_number,'.',1,3) = 0;

Қызметкерлер кестесі. '_' белгісінен кейінгі job_id мәні кемінде 3 таңбадан тұратын, бірақ '_' белгісінен кейінгі бұл мән 'CLERK' мәніне тең емес барлық қызметкерлердің тізімін алыңыз
шешім

SELECT *
  FROM employees
 WHERE     LENGTH (SUBSTR (job_id, INSTR (job_id, '_') + 1)) > 3
       AND SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK';

Қызметкерлер кестесі. PHONE_NUMBER мәніндегі барлық "." орнын ауыстыру арқылы барлық қызметкерлердің тізімін алыңыз '-' бойынша
шешім

SELECT phone_number, REPLACE (phone_number, '.', '-') new_phone_number
  FROM employees;

Түрлендіру функцияларын және шартты өрнектерді пайдалану

Қызметкерлер кестесі. Айдың бірінші күні жұмысқа келген барлық қызметкерлердің тізімін алыңыз (кез келген)
шешім

SELECT *
  FROM employees
 WHERE TO_CHAR (hire_date, 'DD') = '01';

Қызметкерлер кестесі. 2008 жылы жұмысқа келген барлық қызметкерлердің тізімін алыңыз
шешім

SELECT *
  FROM employees
 WHERE TO_CHAR (hire_date, 'YYYY') = '2008';

DUAL кесте. Ертеңгі күнді келесі форматта көрсетіңіз: ертең қаңтардың екінші күні
шешім

SELECT TO_CHAR (SYSDATE, 'fm""Tomorrow is ""Ddspth ""day of"" Month')     info
  FROM DUAL;

Қызметкерлер кестесі. Барлық қызметкерлердің тізімін және олардың басталу күнін келесі форматта алыңыз: 21 жылғы 2007 маусым
шешім

SELECT first_name, TO_CHAR (hire_date, 'fmddth ""of"" Month, YYYY') hire_date
  FROM employees;

Қызметкерлер кестесі. Жалақысы 20%-ға көтерілген қызметкерлердің тізімін алыңыз. Жалақыны доллар белгісімен көрсетіңіз
шешім

SELECT first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') new_salary
  FROM employees;

Қызметкерлер кестесі. 2007 жылдың ақпан айында жұмысқа келген барлық қызметкерлердің тізімін алыңыз.
шешім

SELECT *
  FROM employees
 WHERE hire_date BETWEEN TO_DATE ('01.02.2007', 'DD.MM.YYYY')
                     AND LAST_DAY (TO_DATE ('01.02.2007', 'DD.MM.YYYY'));

SELECT *
  FROM employees
 WHERE to_char(hire_date,'MM.YYYY') = '02.2007'; 

DUAL кесте. Экспорт ағымдағы күн, + секунд, + минут, + сағат, + күн, + ай, + жыл
шешім

SELECT SYSDATE                          now,
       SYSDATE + 1 / (24 * 60 * 60)     plus_second,
       SYSDATE + 1 / (24 * 60)          plus_minute,
       SYSDATE + 1 / 24                 plus_hour,
       SYSDATE + 1                      plus_day,
       ADD_MONTHS (SYSDATE, 1)          plus_month,
       ADD_MONTHS (SYSDATE, 12)         plus_year
  FROM DUAL;

Қызметкерлер кестесі. Толық жалақысы бар барлық қызметкерлердің тізімін алыңыз (жалақы + komissiya_pct(%): $24,000.00 форматында.
шешім

SELECT first_name, salary, TO_CHAR (salary + salary * NVL (commission_pct, 0), 'fm$99,999.00') full_salary
  FROM employees;

Қызметкерлер кестесі. Барлық қызметкерлердің тізімін және жалақы бойынша бонустардың болуы туралы ақпаратты алыңыз (Иә/Жоқ)
шешім

SELECT first_name, commission_pct, NVL2 (commission_pct, 'Yes', 'No') has_bonus
  FROM employees;

Қызметкерлер кестесі. Әрбір қызметкердің жалақы деңгейін алыңыз: 5000-нан төмен төмен деңгей, 5000-нан жоғары немесе оған тең және 10000-нан төмен қалыпты деңгей, 10000-нан жоғары немесе оған тең жоғары деңгей деп саналады.
шешім

SELECT first_name,
       salary,
       CASE
           WHEN salary < 5000 THEN 'Low'
           WHEN salary >= 5000 AND salary < 10000 THEN 'Normal'
           ELSE 'High'
       END salary_level
  FROM employees;

Елдер кестесі. Әрбір ел үшін ол орналасқан аймақты көрсетіңіз: 1-Еуропа, 2-Америка, 3-Азия, 4-Африка (қосылусыз)
шешім

SELECT country_name country,
       DECODE (region_id,
               1, 'Europe',
               2, 'America',
               3, 'Asia',
               4, 'Africa',
               'Unknown')
           region
  FROM countries;

SELECT country_name
           country,
       CASE region_id
           WHEN 1 THEN 'Europe'
           WHEN 2 THEN 'America'
           WHEN 3 THEN 'Asia'
           WHEN 4 THEN 'Africa'
           ELSE 'Unknown'
       END
           region
  FROM countries;

Топтық функцияларды пайдалана отырып, жиынтық деректер туралы есеп беру

Қызметкерлер кестесі. Ең төменгі және ең жоғары жалақы, ерте және кеш келу күндері және қызметкерлер саны туралы департамент_id бойынша есеп алыңыз. Қызметкерлер саны бойынша сұрыптау (кеміту)
шешім

  SELECT department_id,
         MIN (salary) min_salary,
         MAX (salary) max_salary,
         MIN (hire_date) min_hire_date,
         MAX (hire_date) max_hire_Date,
         COUNT (*) count
    FROM employees
GROUP BY department_id
order by count(*) desc;

Қызметкерлер кестесі. Аты бір әріптен басталатын қанша қызметкер бар? Саны бойынша сұрыптау. Сан 1-ден үлкен болатындарды ғана көрсет
шешім

SELECT SUBSTR (first_name, 1, 1) first_char, COUNT (*)
    FROM employees
GROUP BY SUBSTR (first_name, 1, 1)
  HAVING COUNT (*) > 1
ORDER BY 2 DESC;

Қызметкерлер кестесі. Бір бөлімде жұмыс істеп, бірдей жалақы алатын қанша қызметкер бар?
шешім

SELECT department_id, salary, COUNT (*)
    FROM employees
GROUP BY department_id, salary
  HAVING COUNT (*) > 1;

Қызметкерлер кестесі. Аптаның әр күні қанша қызметкер қабылданғаны туралы есеп алыңыз. Саны бойынша сұрыптау
шешім

SELECT TO_CHAR (hire_Date, 'Day') day, COUNT (*)
    FROM employees
GROUP BY TO_CHAR (hire_Date, 'Day')
ORDER BY 2 DESC;

Қызметкерлер кестесі. Жыл бойынша қанша қызметкер қабылданғаны туралы есеп алыңыз. Саны бойынша сұрыптау
шешім

SELECT TO_CHAR (hire_date, 'YYYY') year, COUNT (*)
    FROM employees
GROUP BY TO_CHAR (hire_date, 'YYYY');

Қызметкерлер кестесі. Қызметкерлері бар бөлімдердің санын алыңыз
шешім

SELECT COUNT (COUNT (*))     department_count
    FROM employees
   WHERE department_id IS NOT NULL
GROUP BY department_id;

Қызметкерлер кестесі. 30-дан астам қызметкері бар департамент_id тізімін алыңыз
шешім

  SELECT department_id
    FROM employees
GROUP BY department_id
  HAVING COUNT (*) > 30;

Қызметкерлер кестесі. Бөлім идентификаторларының тізімін және әр бөлімдегі қызметкерлердің орташа жалақысын алыңыз.
шешім

  SELECT department_id, ROUND (AVG (salary)) avg_salary
    FROM employees
GROUP BY department_id;

Елдер кестесі. 60-тан асатын барлық ел_аттарының барлық әріптерінің аймақ_id сомасының тізімін алыңыз
шешім

  SELECT region_id
    FROM countries
GROUP BY region_id
  HAVING SUM (LENGTH (country_name)) > 60;

Қызметкерлер кестесі. Бірнеше (>1) job_id қызметкерлері жұмыс істейтін департамент_идентификаторының тізімін алыңыз
шешім

  SELECT department_id
    FROM employees
GROUP BY department_id
  HAVING COUNT (DISTINCT job_id) > 1;

Қызметкерлер кестесі. Қол астындағылардың саны 5-тен көп және оның қарамағындағылардың барлық жалақыларының қосындысы 50000-нан асатын manager_id тізімін алыңыз
шешім

  SELECT manager_id
    FROM employees
GROUP BY manager_id
  HAVING COUNT (*) > 5 AND SUM (salary) > 50000;

Қызметкерлер кестесі. Барлық қарамағындағылардың орташа жалақысы 6000-нан 9000-ға дейін болатын, бонус алмайтын менеджер_id тізімін алыңыз (commission_pct бос)
шешім

  SELECT manager_id, AVG (salary) avg_salary
    FROM employees
   WHERE commission_pct IS NULL
GROUP BY manager_id
  HAVING AVG (salary) BETWEEN 6000 AND 9000;

Қызметкерлер кестесі. "КЛЕРК" сөзімен аяқталатын барлық қызметкерлердің job_id ең жоғары жалақысын алыңыз.
шешім

SELECT MAX (salary) max_salary
  FROM employees
 WHERE job_id LIKE '%CLERK';

SELECT MAX (salary) max_salary
  FROM employees
 WHERE SUBSTR (job_id, -5) = 'CLERK';

Қызметкерлер кестесі. Бөлімдегі барлық орташа жалақының ішінде ең жоғары жалақыны алыңыз
шешім

  SELECT MAX (AVG (salary))
    FROM employees
GROUP BY department_id;

Қызметкерлер кестесі. Атындағы әріптер саны бірдей қызметкерлердің санын алыңыз. Бұл ретте тек аты 5-тен ұзын және аттас қызметкерлер саны 20-дан асатындарды ғана көрсетіңіз. Аты ұзындығы бойынша сұрыптау
шешім

  SELECT LENGTH (first_name), COUNT (*)
    FROM employees
GROUP BY LENGTH (first_name)
  HAVING LENGTH (first_name) > 5 AND COUNT (*) > 20
ORDER BY LENGTH (first_name);

  SELECT LENGTH (first_name), COUNT (*)
    FROM employees
   WHERE LENGTH (first_name) > 5
GROUP BY LENGTH (first_name)
  HAVING COUNT (*) > 20
ORDER BY LENGTH (first_name);

Біріктірулер арқылы бірнеше кестелерден деректерді көрсету

Кесте қызметкерлері, департаменттер, орындар, елдер, аймақтар. Өңірлердің тізімін және әр аймақтағы қызметкерлердің санын алыңыз
шешім

  SELECT region_name, COUNT (*)
    FROM employees e
         JOIN departments d ON (e.department_id = d.department_id)
         JOIN locations l ON (d.location_id = l.location_id)
         JOIN countries c ON (l.country_id = c.country_id)
         JOIN regions r ON (c.region_id = r.region_id)
GROUP BY region_name;

Кесте қызметкерлері, департаменттер, орындар, елдер, аймақтар. Әрбір қызметкер туралы толық ақпарат алыңыз:
Аты_жөні, Тегі_аты, Бөлім, Жұмыс, Көше, Ел, Аймақ
шешім

SELECT First_name,
       Last_name,
       Department_name,
       Job_id,
       street_address,
       Country_name,
       Region_name
  FROM employees  e
       JOIN departments d ON (e.department_id = d.department_id)
       JOIN locations l ON (d.location_id = l.location_id)
       JOIN countries c ON (l.country_id = c.country_id)
       JOIN regions r ON (c.region_id = r.region_id);

Қызметкерлер кестесі. 6-дан астам қызметкері бар барлық менеджерлерді көрсетіңіз
шешім

  SELECT man.first_name, COUNT (*)
    FROM employees emp JOIN employees man ON (emp.manager_id = man.employee_id)
GROUP BY man.first_name
  HAVING COUNT (*) > 6;

Қызметкерлер кестесі. Ешкімге есеп бермейтін барлық қызметкерлерді көрсетіңіз
шешім

SELECT emp.first_name
  FROM employees  emp
       LEFT JOIN employees man ON (emp.manager_id = man.employee_id)
 WHERE man.FIRST_NAME IS NULL;

SELECT first_name
  FROM employees
 WHERE manager_id IS NULL;

Қызметкерлер кестесі, Job_history. Қызметкерлер кестесі барлық қызметкерлерді сақтайды. Job_history кестесі компаниядан кеткен қызметкерлерді сақтайды. Барлық қызметкерлер және олардың компаниядағы мәртебесі туралы есеп алу (жұмыспен айналысқан немесе кеткен күнімен компаниядан кеткен)
Мысал:
аты_жөні | күй
Дженнифер | 31 жылдың 2006 желтоқсанында компаниядан кетті
Клара | Қазіргі уақытта жұмыс істейді
шешім

SELECT first_name,
       NVL2 (
           end_date,
           TO_CHAR (end_date, 'fm""Left the company at"" DD ""of"" Month, YYYY'),
           'Currently Working')
           status
  FROM employees e LEFT JOIN job_history j ON (e.employee_id = j.employee_id);

Кесте қызметкерлері, департаменттер, орындар, елдер, аймақтар. Еуропада тұратын қызметкерлер тізімін алыңыз (аймақ_аты)
шешім

 SELECT first_name
  FROM employees
       JOIN departments USING (department_id)
       JOIN locations USING (location_id)
       JOIN countries USING (country_id)
       JOIN regions USING (region_id)
 WHERE region_name = 'Europe';
 
 SELECT first_name
  FROM employees  e
       JOIN departments d ON (e.department_id = d.department_id)
       JOIN locations l ON (d.location_id = l.location_id)
       JOIN countries c ON (l.country_id = c.country_id)
       JOIN regions r ON (c.region_id = r.region_id)
 WHERE region_name = 'Europe';

Үстел қызметкерлері, бөлімдер. 30-дан астам қызметкері бар барлық бөлімдерді көрсетіңіз
шешім

SELECT department_name, COUNT (*)
    FROM employees e JOIN departments d ON (e.department_id = d.department_id)
GROUP BY department_name
  HAVING COUNT (*) > 30;

Үстел қызметкерлері, бөлімдер. Ешбір бөлімде жоқ барлық қызметкерлерді көрсетіңіз
шешім

SELECT first_name
  FROM employees  e
       LEFT JOIN departments d ON (e.department_id = d.department_id)
 WHERE d.department_name IS NULL;

SELECT first_name
  FROM employees
 WHERE department_id IS NULL;

Үстел қызметкерлері, бөлімдер. Қызметкерлері жоқ барлық бөлімдерді көрсетіңіз
шешім

SELECT department_name
  FROM employees  e
       RIGHT JOIN departments d ON (e.department_id = d.department_id)
 WHERE first_name IS NULL;

Қызметкерлер кестесі. Қол астындағы қызметкерлері жоқ барлық қызметкерлерді көрсетіңіз
шешім

SELECT man.first_name
  FROM employees  emp
       RIGHT JOIN employees man ON (emp.manager_id = man.employee_id)
 WHERE emp.FIRST_NAME IS NULL;

Үстел қызметкерлері, жұмыс орындары, бөлімдер. Қызметкерлерді пішімде көрсетіңіз: Аты_жөні, Лауазым_атауы, Бөлім_атауы.
Мысал:
аты_жөні | лауазымы | Бөлім_атауы
Дональд | жеткізу | Клерк жөнелту
шешім

SELECT first_name, job_title, department_name
  FROM employees  e
       JOIN jobs j ON (e.job_id = j.job_id)
       JOIN departments d ON (d.department_id = e.department_id);

Қызметкерлер кестесі. Менеджерлері 2005 жылы жұмысқа орналасқан қызметкерлердің тізімін алыңыз, бірақ сонымен бірге бұл жұмысшылардың өздері 2005 жылға дейін жұмысқа орналасты.
шешім

SELECT emp.*
  FROM employees emp JOIN employees man ON (emp.manager_id = man.employee_id)
 WHERE     TO_CHAR (man.hire_date, 'YYYY') = '2005'
       AND emp.hire_date < TO_DATE ('01012005', 'DDMMYYYY');

Қызметкерлер кестесі. Менеджерлері кез келген жылдың қаңтар айында жұмысқа орналасқан және осы қызметкерлердің лауазымының атауы 15 таңбадан асатын қызметкерлердің тізімін алыңыз.
шешім

SELECT emp.*
  FROM employees  emp
       JOIN employees man ON (emp.manager_id = man.employee_id)
       JOIN jobs j ON (emp.job_id = j.job_id)
 WHERE TO_CHAR (man.hire_date, 'MM') = '01' AND LENGTH (j.job_title) > 15;

Сұрауларды шешу үшін ішкі сұрауларды пайдалану

Қызметкерлер кестесі. Ең ұзын аты бар қызметкерлердің тізімін алыңыз.
шешім

SELECT *
  FROM employees
 WHERE LENGTH (first_name) =
       (SELECT MAX (LENGTH (first_name)) FROM employees);

Қызметкерлер кестесі. Барлық қызметкерлердің орташа жалақысынан жоғары жалақысы бар қызметкерлердің тізімін алыңыз.
шешім

SELECT *
  FROM employees
 WHERE salary > (SELECT AVG (salary) FROM employees);

Кесте қызметкерлері, бөлімдер, орындар. Қызметкерлері ең аз жалақы алатын қаланы алыңыз.
шешім

SELECT city
    FROM employees e
         JOIN departments d ON (e.department_id = d.department_id)
         JOIN locations l ON (d.location_id = l.location_id)
GROUP BY city
  HAVING SUM (salary) =
         (  SELECT MIN (SUM (salary))
              FROM employees e
                   JOIN departments d ON (e.department_id = d.department_id)
                   JOIN locations l ON (d.location_id = l.location_id)
          GROUP BY city);

Қызметкерлер кестесі. Басшысы 15000 XNUMX-нан жоғары жалақы алатын қызметкерлердің тізімін алыңыз.
шешім

SELECT *
  FROM employees
 WHERE manager_id IN (SELECT employee_id
                        FROM employees
                       WHERE salary > 15000)

Үстел қызметкерлері, бөлімдер. Қызметкерлері жоқ барлық бөлімдерді көрсетіңіз
шешім

SELECT *
  FROM departments
 WHERE department_id NOT IN (SELECT department_id
                               FROM employees
                              WHERE department_id IS NOT NULL);

Қызметкерлер кестесі. Менеджер болып табылмайтын барлық қызметкерлерді көрсетіңіз
шешім

SELECT *
  FROM employees
 WHERE employee_id NOT IN (SELECT manager_id
                             FROM employees
                            WHERE manager_id IS NOT NULL)

Қызметкерлер кестесі. 6-дан астам қызметкері бар барлық менеджерлерді көрсетіңіз
шешім

SELECT *
  FROM employees e
 WHERE (SELECT COUNT (*)
          FROM employees
         WHERE manager_id = e.employee_id) > 6;

Үстел қызметкерлері, бөлімдер. IT бөлімінде жұмыс істейтін қызметкерлерді көрсетіңіз
шешім

SELECT *
  FROM employees
 WHERE department_id = (SELECT department_id
                          FROM departments
                         WHERE department_name = 'IT');

Үстел қызметкерлері, жұмыс орындары, бөлімдер. Қызметкерлерді пішімде көрсетіңіз: Аты_жөні, Лауазым_атауы, Бөлім_атауы.
Мысал:
аты_жөні | лауазымы | Бөлім_атауы
Дональд | жеткізу | Клерк жөнелту
шешім

SELECT first_name,
       (SELECT job_title
          FROM jobs
         WHERE job_id = e.job_id)
           job_title,
       (SELECT department_name
          FROM departments
         WHERE department_id = e.department_id)
           department_name
  FROM employees e;

Қызметкерлер кестесі. Менеджерлері 2005 жылы жұмысқа орналасқан қызметкерлердің тізімін алыңыз, бірақ сонымен бірге бұл жұмысшылардың өздері 2005 жылға дейін жұмысқа орналасты.
шешім

SELECT *
  FROM employees
 WHERE     manager_id IN (SELECT employee_id
                            FROM employees
                           WHERE TO_CHAR (hire_date, 'YYYY') = '2005')
       AND hire_date < TO_DATE ('01012005', 'DDMMYYYY');

Қызметкерлер кестесі. Менеджерлері кез келген жылдың қаңтар айында жұмысқа орналасқан және осы қызметкерлердің лауазымының атауы 15 таңбадан асатын қызметкерлердің тізімін алыңыз.
шешім

SELECT *
  FROM employees e
 WHERE     manager_id IN (SELECT employee_id
                            FROM employees
                           WHERE TO_CHAR (hire_date, 'MM') = '01')
       AND (SELECT LENGTH (job_title)
              FROM jobs
             WHERE job_id = e.job_id) > 15;

Әзірге бәрі осы.

Тапсырмалар қызықты және әсерлі болды деп үміттенемін.
Мен бұл тізімді мүмкіндігінше толықтырамын.
Мен сондай-ақ кез келген ескертулер мен ұсыныстарға қуанышты боламын.

PS: Егер біреу SELECT-те қызықты тапсырма шықса, түсініктемеге жазыңыз, мен оны тізімге қосамын.

рахмет.

Ақпарат көзі: www.habr.com

пікір қалдыру