October 14, 2022

SQL Oracle

Содержание

Основные команды

SELECT

SELECT * from 
DESCRIBE JOBS

Name       Null?    Type         
---------- -------- ------------ 
JOB_ID     NOT NULL VARCHAR2(10) 
JOB_TITLE  NOT NULL VARCHAR2(35) 
MIN_SALARY          NUMBER(6)    
MAX_SALARY          NUMBER(6)    

В столбце Name перечисляются наименования столбцов таблицы.

DISTINCT

Выбор уникального значения командой DISTINCT из столбца в таблице

SELECT DISTINCT column(s) FROM table

При запуске команды с двумя стоблцами значения выведутся только при совпадении уникальных значение в обоих столбцах.

Было:
102	13.01.01	24.07.06	IT_PROG	    60
101	21.09.97	27.10.01	AC_ACCOUNT	110
101	28.10.01	15.03.05	AC_MGR	    110
201	17.02.04	19.12.07	MK_REP	    20
114	24.03.06	31.12.07	ST_CLERK	50
122	01.01.07	31.12.07	ST_CLERK	50
200	17.09.95	17.06.01	AD_ASST	    90
176	24.03.06	31.12.06	SA_REP	    80
176	01.01.07	31.12.07	SA_MAN	    80
200	01.07.02	31.12.06	AC_ACCOUNT	90
SELECT DISTINCT JOB_ID, DEPARTMENT_ID FROM JOB_HISTORY;
SA_REP	    80
AC_MGR     	110
AC_ACCOUNT	90
ST_CLERK	50
MK_REP      20
SA_MAN	    80
AC_ACCOUNT	110
AD_ASST	    90
IT_PROG	    60

Как результат выведены уникальные значения по двум столбцам в совокупности.

CONCATINATION

SELECT LAST_NAME||' '||FIRST_NAME AS NAME FROM EMPLOYEES;

Объединит имя и фамилию и назовет столбец NAME

можно записывать и так:
SELECT 'Моя фамилия '||LAST_NAME||' мое имя '||FIRST_NAME AS NAME
FROM EMPLOYEES;

ALIAS

SELECT 'Моя фамилия '||LAST_NAME||' мое имя '||FIRST_NAME AS "Name 1" 
FROM EMPLOYEES;

ALIAS можеть писать в кавычках и без. Если в кавычках, то только в таких " ".

DELIMETER

SELECT q'<IT'S MY LIFE>'q FROM DUAL;

Также можно использовать две одинарных кавычки в словах IT'S - IT''S. Не двойные кавычки, а два раза одинарные.

WHERE

select first_name, last_name, salary 
from employees 
where salary>10000;

Также можно указывать текствовые значения, например:
....where last_name = 'King'

Можно сравнивать столбцы:
...where manager_id=employee_id
но в этом случае типы данных столбцов должны быть одинаковы.

BETWEEN, IN, NULL

between чаще используют для дат и чисел, хотя для текста также его можно использовать.

select last_name, salary 
from employees 
where salary between 10000 and 20000;

Операнд IN также применяется с чилами, текстами, датами. Он обозначает выведи информацию, которая находится в (in) перечисленном списке.

select first_name from employees where employee_id in (100,120,130);
можно писать используя операнд or
Например, ....where employee_id = 100 or employee_id=120 or..., т.е. 
множесто операндов or можно заменить операндом in.

LIKE

Like в основном употребляется с использованием специальных символов

% и _ . Like как бы заменяет знак "=".

select first_name||' '||last_name as name
from employees where last_name like '%g';

ORDER BY

select last_name from employees  order by last_name;

сортировка по имени столбца last_name

select last_name from employees order by salary;

сортировка по зарплате

select last_name,hire_date from employees 
where job_id = 'FI_ACCOUNT' order by hire_date;

показать last_name и hire_date из таблицы employees, где job_id равно указанному и отсортировать по hire_date.

DESC и ASC

select last_name, salary from employees order by salary DESC

ORDER BY можно применять к выражению, в том числе и к alias

select last_name, salary, salary/2 from employees order by salary/4

select last_name, salary, salary/2 reduced from employees 
order by reduced/4;

Если сортировка по нескольким столбцам, то можно указывать порядковый номер этого столбца.

select last_name, salary from employees order by 2 DESC

last_name - это первый столбец
salary - второй стоблец

Сортировать также можно сразу по нескольким столбцам и сортировка будет происходить последовательно.

select job_id, last_name, salary 
from employees 
order by job_id, last_name,salary;

Сначала отсортирует по job_id, затем внутри этой сортировки отсортирует по last_name, а потом по зарплате.

COUNT

Считает строки. Синтаксис:
select count(job_id) from employees;
Может быть вывод нескольких строк. Например:
select count(commission_pct), count(job_id)  from employees;
select count(job_id) from employees where first_name like 'A%'

вывод кол-во строк имен, которые начинаются на А

SUM, AVG, MIN, MAX

select sum(salary) from employees where job_id='PU_MAN';

Вывод все ЗП по отделу PU_MAN

select avg(salary) from employees where job_id='FI_ACCOUNT';

Вывод средней ЗП из отдела FI_ACCOUNT

select max(length(first_name)) from employees;
select min(length(first_name)) from employees;

вывод размера самого маленького и самого большого имени
Результат: 2 и 11

GROUP BY

group_by - значит объедененны признаком, который указан в group by

select department_id, count(*) from employees 
group by department_id 
order by 1,2;

вывод будет количества строк по признаку department_id т.е. кол-во строк по каждому департменту.

HAVING

работает с группами, а не со столбцами

select department_id,count(*)
from employees
group by department_id
having count(*)>30 and sum(salary)>300000

В данном случае будет произведен вывод департаментов, где количество людей, которые там работают больше 30 и сумма зарплат департамента больше 300 000. В этом коде хорошо видно, что, если применяется group by, то все умоминаемые столбцы будут относиться только и только к тому столбцу, который определяет group by.

Команда having применяется только с group by и имеет тот же смысл, что и where.

Из таблицы countries вывести все region_id, для которых сумма всех букв их стран больше 50ти.
Решение задачи выше.
Выведите информацию о job_id и округленную среднюю зарплату работников для каждого job_id.
Выведите информацию о department, job_id, максимальную и минимальную з/п для всех сочетаний department_id - job_id, где средняя з/п больше 10000.
Получить список manager_id, у которых средняя зарплата всех его подчиненных, не имеющих комиссионные, находится в промежутке от 6000 до 9000.
select manager_id from employees 
where commission_pct is not null
group by manager_id 
having avg(salary) between 6000 and 9000;

Содержание