Основы языка SQL pdf книга: http://www.ict.edu.ru/ft/004864/sql.pdf
Московский государственный технический университет имени Н.Э.БАУМАНА кафедра САПР
Московский государственный технический университет имени Н.Э.БАУМАНА кафедра САПР
SELECT (обучающий этап) задачи по SQL запросам 120 штук, DML 10 шт. Дистанционное обучение языку баз данных SQL. Интерактивные упражнения и тестирование по операторам SELECT,INSERT,UPDATE,DELETE языка SQL. SQL remote education. SQL statements exercises. Подзапросы, Соединение таблиц, Функции SQL, Введение в SQL, Скачать книги по SQL. Команды SQL,CREATE SEQUENCE,CREATE SYNONYM,CREATE USER,CREATE VIEW,Create Table,DROP,GRANT,INSERT,REVOKE,SET ROLE,SET TRANSACTION,SQL ALTER TABLE,SQL команды.
select
извлечения данных не рассматриваются как часть DML, поскольку они не изменяют состояние данных. Все операторы DML носят декларативный характер.commit
для подтверждения изменений, сделанных в ходе транзакции, rollback
для их отмены и savepoint
для разбиения транзакции на несколько меньших частей.dual
, используемой для запросов, не требующих обращения к настоящим таблицам.select 'Hello, World!'
from dual;
level
для создания псевдотаблиц t1
и t2
, содержащих числа от 1 до 16,sum
, позволяющую суммировать элементы множества без явного использования цикла,ln
и exp
, позволяющие заменить произведение (необходимое для вычисления факториала) на сумму (предоставляемую SQL).ln(0)
приводит к исключению.select t2.n || '! = ' || round(exp(sum(ln(t1.n))))
from
( select level n
from dual
connect by level <= 16) t1,
( select level n
from dual
connect by level <= 16) t2
where t1.n<=t2.n
group by t2.n
order by t2.n
ROUND
, POWER
и SQRT
для вычисления n-ого числа Фибоначчи;level
для создания псевдотаблицы t1, содержащей числа от 1 до 16;SYS_CONNECT_BY_PATH
для упорядоченной конкатенации полученных чисел. SELECT REPLACE(MAX(SYS_CONNECT_BY_PATH(fib||', ', '/')),'/','')||'...' fiblist
FROM (
SELECT n, fib, ROW_NUMBER()
OVER (ORDER BY n) r
FROM (select n, round((power((1+sqrt(5))*0.5, n)-power((1-sqrt(5))*0.5, n))/sqrt(5)) fib
from (select level n
from dual
connect by level <= 16) t1) t2
)
START WITH r=1
CONNECT BY PRIOR r = r-1;
select 'Hello, World!';
with factorial(n, f) as
(
select 0, convert(bigint,1)
union all
select n+1, f*(n+1) from factorial where n<20
)
select cast(n as varchar)+'! = '+cast(f as varchar)
from factorial
with fibonacci(a, b) as
(
select 1, 1
union all
select b, a+b from fibonacci where b < 1000
)
SELECT cast(a as varchar)+', ' AS [text()]
FROM fibonacci
FOR XML PATH ('')
model
, доступного начиная с версии Oracle 10g и позволяющего обработку строк запроса как элементов массива. Каждая строка содержит два поля — номер строки n и его факториал f.select n || '! = ' || f factorial
from dual
model
return all rows
dimension by ( 0 d )
measures ( 0 f, 1 n )
rules iterate (17)
( f[iteration_number] = decode(iteration_number, 0, 1, f[iteration_number-1]*iteration_number),
n[iteration_number] = iteration_number
);
model
, доступного начиная с версии Oracle 10g и позволяющего обработку строк запроса как элементов массива. Каждая строка содержит два поля — само число Фибоначчи и конкатенация всех чисел, меньше или равных ему. Итеративная конкатенация чисел в том же запросе, в котором они генерируются, выполняется проще и быстрее, чем агрегация как отдельное действие.select max(s) || ', ...'
from
(select s
from dual
model
return all rows
dimension by ( 0 d )
measures ( cast(' ' as varchar2(200)) s, 0 f)
rules iterate (16)
( f[iteration_number] = decode(iteration_number, 0, 1, 1, 1, f[iteration_number-1] + f[iteration_number-2]),
s[iteration_number] = decode(iteration_number, 0, to_char(f[iteration_number]), s[iteration_number-1] || ', ' || to_char(f[iteration_number]))
)
);
TABLE
на любую таблицу, к которой есть доступ, например, mysql.help_topic
.select concat(cast(t2.n as char), "! = ", cast(exp(sum(log(t1.n))) as char))
from
( select @i := @i+1 AS n
from TABLE, (select @i := 0) as sel1
limit 16 ) t1,
( select @j := @j+1 AS n
from TABLE, (select @j := 0) as sel1
limit 16 ) t2
where t1.n <= t2.n
group by t2.n
TABLE
на любую таблицу, к которой есть доступ, например, mysql.help_topic
.select concat(group_concat(f separator ', '), ', ...')
from (select @f := @i + @j as f, @i := @j, @j := @f
from TABLE, (select @i := 1, @j := 0) sel1
limit 16) t
dbms_output
.begin
dbms_output.put_line('Hello, World!');
end;
declare
n number := 0;
f number := 1;
begin
while (n<=16)
loop
dbms_output.put_line(n || '! = ' || f);
n := n+1;
f := f*n;
end loop;
end;
varray
— аналоге массива.declare
type vector is varray(16) of number;
fib vector := vector();
i number;
s varchar2(100);
begin
fib.extend(16);
fib(1) := 1;
fib(2) := 1;
s := fib(1) || ', ' || fib(2) || ', ';
for i in 3..16 loop
fib(i) := fib(i-1) + fib(i-2);
s := s || fib(i) || ', ';
end loop;
dbms_output.put_line(s || '...');
end;
&
перед ним каждый раз, когда нужно сослаться на эту переменную. Когда запрос выполняется, пользователь получает запрос на ввод значений всех заменяемых переменных, использованных в запросе. После ввода значений каждая ссылка на такую переменную заменяется на ее значение, и полученный запрос выполняется.&&
. Таким образом значение для каждой переменной вводится только один раз, а все последующие ссылки на нее будут заменены тем же самым значением (при использовании одиночного амперсанда в SQL*Plus значение для каждой ссылки на одну и ту же переменную приходится вводить отдельно). В PL/SQL Developer ссылки на все переменные должны предваряться одиночным знаком &
, иначе будет возникать ошибка ORA-01008 “Not all variables bound”.alter session set NLS_NUMERIC_CHARACTERS='. ';
select 'Not a quadratic equation.' ans
from dual
where &&A = 0
union
select 'x = ' || to_char(-&&B/2/&A)
from dual
where &A != 0 and &B*&B-4*&A*&&C = 0
union
select 'x1 = ' || to_char((-&B+sqrt(&B*&B-4*&A*&C))/2/&A) || ', x2 = ' || to_char(-&B-sqrt(&B*&B-4*&A*&C))/2/&A
from dual
where &A != 0 and &B*&B-4*&A*&C > 0
union
select 'x1 = (' || to_char(-&B/2/&A) || ',' || to_char(sqrt(-&B*&B+4*&A*&C)/2/&A) || '), ' ||
'x2 = (' || to_char(-&B/2/&A) || ',' || to_char(-sqrt(-&B*&B+4*&A*&C)/2/&A) || ')'
from dual
where &A != 0 and &B*&B-4*&A*&C < 0;
regexp_replace
заменяет все цифры на пробелы — это необходимо для initcap
, которая считает цифры частью слов и не переводит буквы, следующие за цифрами, в верхний регистр. Затем применяется initcap
, которая переводит все слова в нижний регистр, а их первые буквы — в верхний. Наконец, второе использование regexp_replace
удаляет из строки все знаки пунктуации и пробелы.select regexp_replace(initcap(regexp_replace('&TEXT', '[[:digit:]]', ' ')), '([[:punct:] | [:blank:]])', '')
from dual
regexp_substr
возвращает подстроку text
, являющуюся соответствием заданному регулярному выражению номер occurrence
.declare
text varchar2(100) := '&user_input';
word varchar2(100);
camelcase varchar2(100);
occurrence number := 1;
begin
loop
word := regexp_substr(text, '[[:alpha:]]+', 1, occurrence);
exit when word is null;
camelcase := camelcase || initcap(word);
occurrence := occurrence + 1;
end loop;
dbms_output.put_line(camelcase);
end;
declare
A number := '&A';
B number := '&B';
C number := '&C';
D number := B * B - 4 * A * C;
begin
if A = 0 then
dbms_output.put_line('Not a quadratic equation.');
return;
end if;
if D = 0 then
dbms_output.put_line('x = ' || to_char(-B/2/A));
elsif D > 0 then
dbms_output.put_line('x1 = ' || to_char((-B-sqrt(D))/2/A));
dbms_output.put_line('x2 = ' || to_char((-B+sqrt(D))/2/A));
else
dbms_output.put_line('x1 = (' || to_char(-B/2/A) || ', ' || to_char(sqrt(-D)/2/A) || ')');
dbms_output.put_line('x2 = (' || to_char(-B/2/A) || ', ' || to_char(-sqrt(-D)/2/A) || ')');
end if;
end;
!
(существует также префиксная форма !!
) и функцией generate_series
, которая генерирует набор строк, содержащих значения от первого до второго аргумента, включительно.select n || '! = ' || (n!)
from generate_series(0,16) as seq(n);
WITH RECURSIVE t(a,b) AS (
VALUES(1,1)
UNION ALL
SELECT b, a + b FROM t
WHERE b < 1000
)
SELECT array_to_string(array(SELECT a FROM t), ', ') || ', ...';
declare @max_n tinyint = 20
;with t as (
select 1 as n, convert(bigint,1) as f
union all
select n+1, f*(n+1) from t
where n < @max_n
)
select convert(varchar,n)+'! = '+convert(varchar(32),f)+', '
from t as [text]
FOR XML PATH ('')
declare @max_n tinyint = 92
;with t as (
select n = 1, fib = convert(bigint,1), xfib = convert(bigint,0)
union all
select n = n+1, fib = fib+xfib, xfib = fib from t
where n < @max_n
)
select fib from t