На сегодняшний день курсы SQL "для чайников" становятся все более популярными. Это можно очень просто объяснить, ведь в современном мире все чаще можно встретить так называемые "динамичные" веб-сервисы. Они отличаются достаточно гибкой оболочкой и основываются на Все начинающие программисты, которые решили посвятить сайтов, прежде всего записываются на курсы SQL "для чайников".
Зачем изучать данный язык?
Прежде всего SQL учат с целью дальнейшего создания самых разнообразных приложений для одного из самых популярных на сегодняшний день движков блогов - WordPress. После прохождения нескольких простых уроков вы уже сможете создавать запросы любой сложности, что только подтверждает простоту этого языка.
Что такое SQL?
Или язык структурированных запросов, был создан с одной-единственной целью: определять предоставлять к ним доступ и обрабатывать их за достаточно короткие промежутки времени. Если вы знаете SQL-значение, тогда вам будет понятно, что этот сервер относят к так называемым "непроцедурным" языкам. То есть в его возможности входит всего лишь описание каких-либо компонентов или результатов, которые вы хотите увидеть в будущем на сайте. Но при не указывает на то, какие точно результаты собирается получить. Каждый новый запрос в этом языке является как бы дополнительной "надстройкой". Именно в таком порядке, в каком они введены в базе данных, запросы и будут исполняться.
Какие процедуры можно совершать с помощью этого языка?
Несмотря на свою простоту, база данных SQL позволяет создать достаточно много самых разнообразных запросов. Так что же вы сможете делать, если выучите этот важный в программировании язык?
- создавать самые разнообразные таблицы;
- получать, хранить и изменять полученные данные;
- изменять структуры таблиц на свое усмотрение;
- объединять полученную информацию в единые блоки;
- вычислять полученные данные;
- обеспечивать полную защиту информации.
Какие команды являются самыми популярными в данном языке?
Если вы решили посетить курсы SQL "для чайников", тогда вы получите подробную информацию о командах, которые используются в создании запросов с его помощью. Самыми распространенными на сегодняшний день являются такие:
- DDL - является командой, которая определяет данные. Она используется для того, чтобы создавать, изменять и удалять самые разнообразные объекты в базе.
- DCL - является командой, которая управляет данными. Ее используют для предоставления доступа разным пользователям к информации в базе, а также чтобы использовать таблицы или представления.
- TCL - команда, которая управляет разнообразного рода транзакциями. Ее главной целью является определение хода транзакции.
- DML - манипулирует полученными данными. В ее задачу входит позволение пользователю перемещать различную информацию из базы данных или вносить туда ее.
Типы привилегий, которые существуют в этом сервере
Под привилегиями подразумеваются те действия, которые может выполнить тот или иной пользователь в соответствии со своим статусом. Самой минимальной, безусловно, является обычный вход в систему. Конечно же, со временем привилегии могут меняться. Старые будут удаляться, а новые добавляться. На сегодняшний день, все те, кто проходит курсы SQL Server "для чайников", знают, что существует несколько типов разрешенных действий:
- Объектный тип - пользователю разрешается выполнять какую-либо команду только по отношению к определенному объекту, который находится в базе данных. При этом для разных объектов привилегии отличаются. Они также привязываются не только к тому или иному пользователю, но и к таблицам. Если кто-либо, пользуясь своими возможностями, создал таблицу, то он считается ее владельцем. Поэтому в его праве назначать новые привилегии для других пользователей, связанные с информацией в ней.
- Системный тип - это так называемые авторские права на данные. Пользователи, которые получили такие привилегии, могут создавать различные объекты в базе.
История создания SQL
Этот язык был создан исследовательской лабораторией IBM в 1970 году. В то время название его было несколько иным (SEQUEL), но через несколько лет использования его поменяли, немного сократив. Несмотря на это, даже сегодня многие известные мировые специалисты в области программирования все еще произносят название по старинке. Создана была SQL с одной-единственной целью - изобрести язык, который был бы настолько простым, что его могли бы без особых проблем выучить даже простые пользователи Интернета. Интересен тот факт, что на то время SQL был не единственным подобным языком. В Калифорнии еще одна группа специалистов разработала похожий Ingres, но он так и не стал широко распространенным. До 1980 года существовало несколько вариаций SQL, которые лишь в некоторой мере отличались друг от друга. Чтобы предотвратить замешательства, в 1983-м был создан стандартный его вариант, который популярен и сегодня. Курсы SQL "для чайников" позволяют узнать намного больше о сервисе и полностью изучить его за несколько недель.
Основные команды SQL, которые должен знать каждый программист
Язык SQL или Structured Query Language (язык структурированных запросов) предназначен для управления данными в системе реляционных баз данных (RDBMS). В этой статье будет рассказано о часто используемых командах SQL, с которыми должен быть знаком каждый программист. Этот материал идеально подойдёт для тех, кто хочет освежить свои знания об SQL перед собеседованием на работу. Для этого разберите приведённые в статье примеры и вспомните, что проходили на парах по базам данных.
Обратите внимание, что в некоторых системах баз данных требуется указывать точку с запятой в конце каждого оператора. Точка с запятой является стандартным указателем на конец каждого оператора в SQL. В примерах используется MySQL, поэтому точка с запятой требуется.
Настройка базы данных для примеров
Создайте базу данных для демонстрации работы команд. Для работы вам понадобится скачать два файла: DLL.sql и InsertStatements.sql . После этого откройте терминал и войдите в консоль MySQL с помощью следующей команды (статья предполагает, что MySQL уже установлен в системе):
Mysql -u root -p
Затем введите пароль.
Выполните следующую команду. Назовём базу данных «university»:
CREATE DATABASE university;
USE university;
SOURCE Может понадобиться создать ограничения для определённых столбцов в таблице. При создании таблицы можно задать следующие ограничения: Можно задать больше одного первичного ключа. В этом случае получится составной первичный ключ. Создайте таблицу «instructor»: CREATE TABLE instructor (ID CHAR(5),
name VARCHAR(20) NOT NULL,
dept_name VARCHAR(20),
salary NUMERIC(8,2),
PRIMARY KEY (ID),
FOREIGN KEY (dept_name) REFERENCES department(dept_name));
Можно просмотреть различные сведения (тип значений, является ключом или нет) о столбцах таблицы следующей командой: DESCRIBE При добавлении данных в каждый столбец таблицы не требуется указывать названия столбцов. INSERT INTO SELECT используется для получения данных из определённой таблицы: SELECT Следующей командой можно вывести все данные из таблицы: SELECT * FROM В столбцах таблицы могут содержаться повторяющиеся данные. Используйте SELECT DISTINCT для получения только неповторяющихся данных. SELECT DISTINCT Можно использовать ключевое слово WHERE в SELECT для указания условий в запросе: SELECT В запросе можно задавать следующие условия: Попробуйте выполнить следующие команды. Обратите внимание на условия, заданные в WHERE: SELECT * FROM course WHERE dept_name=’Comp. Sci.’;
SELECT * FROM course WHERE credits>3;
SELECT * FROM course WHERE dept_name="Comp. Sci." AND credits>3;
Оператор GROUP BY часто используется с агрегатными функциями, такими как COUNT , MAX , MIN , SUM и AVG , для группировки выходных значений. SELECT Выведем количество курсов для каждого факультета: SELECT COUNT(course_id), dept_name
FROM course
GROUP BY dept_name;
Ключевое слово HAVING было добавлено в SQL потому, что WHERE не может быть использовано для работы с агрегатными функциями. SELECT Выведем список факультетов, у которых более одного курса: SELECT COUNT(course_id), dept_name
FROM course
GROUP BY dept_name
HAVING COUNT(course_id)>1;
ORDER BY используется для сортировки результатов запроса по убыванию или возрастанию. ORDER BY отсортирует по возрастанию, если не будет указан способ сортировки ASC или DESC . SELECT Выведем список курсов по возрастанию и убыванию количества кредитов: SELECT * FROM course ORDER BY credits;
SELECT * FROM course ORDER BY credits DESC;
BETWEEN используется для выбора значений данных из определённого промежутка. Могут быть использованы числовые и текстовые значения, а также даты. SELECT Выведем список инструкторов, чья зарплата больше 50 000, но меньше 100 000: SELECT * FROM instructor
WHERE salary BETWEEN 50000 AND 100000;
Оператор LIKE используется в WHERE , чтобы задать шаблон поиска похожего значения. Есть два свободных оператора, которые используются в LIKE: Выведем список курсов, в имени которых содержится «to» , и список курсов, название которых начинается с «CS-»: SELECT * FROM course WHERE title LIKE ‘%to%’;
SELECT * FROM course WHERE course_id LIKE "CS-___";
С помощью IN можно указать несколько значений для оператора WHERE: SELECT Выведем список студентов с направлений Comp. Sci., Physics и Elec. Eng.: SELECT * FROM student
WHERE dept_name IN (‘Comp. Sci.’, ‘Physics’, ‘Elec. Eng.’);
JOIN используется для связи двух или более таблиц с помощью общих атрибутов внутри них. На изображении ниже показаны различные способы объединения в SQL. Обратите внимание на разницу между левым внешним объединением и правым внешним объединением: SELECT Выведем список всех курсов и соответствующую информацию о факультетах: SELECT * FROM course
JOIN department
ON course.dept_name=department.dept_name;
Выведем список всех обязательных курсов и детали о них: SELECT prereq.course_id, title, dept_name, credits, prereq_id
FROM prereq
LEFT OUTER JOIN course
ON prereq.course_id=course.course_id;
Выведем список всех курсов вне зависимости от того, обязательны они или нет: SELECT course.course_id, title, dept_name, credits, prereq_id
FROM prereq
RIGHT OUTER JOIN course
ON prereq.course_id=course.course_id;
View - это виртуальная таблица SQL, созданная в результате выполнения выражения. Она содержит строки и столбцы и очень похожа на обычную SQL-таблицу. View всегда показывает самую свежую информацию из базы данных. Создадим view , состоящую из курсов с 3 кредитами: Эти функции используются для получения совокупного результата, относящегося к рассматриваемым данным. Ниже приведены общеупотребительные агрегированные функции: Вложенные подзапросы - это SQL-запросы, которые включают выражения SELECT , FROM и WHERE , вложенные в другой запрос. Найдём курсы, которые преподавались осенью 2009 и весной 2010 годов: SELECT DISTINCT course_id
FROM section
WHERE semester = ‘Fall’ AND year= 2009 AND course_id IN (SELECT course_id
FROM section
WHERE semester = ‘Spring’ AND year= 2010);
Для того, чтобы начать изучать SQL
нам нужно сначала понять, что такое база данных. База данных (БД)
- упорядоченный набор логически взаимосвязанных данных, используемых совместно, и которые хранятся в одном месте. Если коротко, то простейшая БД
это обычная таблица со строками и столбцами в которой хранится разного рода информация (примером может служить таблица в Excel
). Так, часто, с БД
нераздельно связывают Системы управления базами данных (СУБД)
, которые предоставляют функционал для работы с БД
. Язык SQL
как раз и является частью СУБД
, которая осуществляет управление информацией в БД
. Мы будем считать БД
набором обычных таблиц, которые хранятся в отдельных файлах. Итак, переходим к SQL
. SQL
- простой язык программирования, который имеет немного команд и которой может научиться любой желающий. Расшифровывается как Structured Query Language
- язык структурированных запросов, который был разработан для работы с БД
, а именно, чтобы получать /добавлять /изменять данные, иметь возможность обрабатывать большие массивы информации и быстро получать структурированную и сгруппированную информацию. Есть много вариантов языка SQL
, но у них всех основные команды почти одинаковы. Также существует и много СУБД
, но основными из них являются: Microsoft Access, Microsoft SQL Server, MySQL, Oracle SQL, IBM DB2 SQL, PostgreSQL та Sybase Adaptive Server SQL
. Чтобы работать с SQL
кодом, нам понадобится одна из вышеперечисленных СУБД
. Для обучения мы будем использовать СУБД Microsoft Access
. SQL
как и другие языки программирования имеет свои команды (операторы), с помощью которых отдаются инструкции для выборки данных.
Чтобы рассмотреть как работают операторы SQL
, мы будем использовать мнимую БД
с информацией о реализованной продукции. Язык программирования
SQL (Structured Query Language — Структурированный язык запросов) — язык управления базами данных для реляционных баз данных. Сам по себе SQL не является Тьюринг-полным языком программирования, но его стандарт позволяет создавать для него процедурные расширения, которые расширяют его функциональность до полноценного языка программирования. Язык был создан в 1970х годах под названием “SEQUEL” для системы управления базами данных (СУБД) System R. Позднее он был переименован в “SQL” во избежание конфликта торговых марок. В 1979 году SQL был впервые опубликован в виде коммерческого продукта Oracle V2. Первый официальный стандарт языка был принят ANSI в 1986 году и ISO — в 1987. С тех пор были созданы еще несколько версий стандарта, некоторые из них повторяли предыдущие с незначительными вариациями, другие принимали новые существенные черты. Несмотря на существование стандартов, большинство распространенных реализаций SQL отличаются так сильно, что код редко может быть перенесен из одной СУБД в другую без внесения существенных изменений. Это объясняется большим объемом и сложностью стандарта, а также нехваткой в нем спецификаций в некоторых важных областях реализации. SQL создавался как простой стандартизированный способ извлечения и управления данными, содержащимися в реляционной базе данных. Позднее он стал сложнее, чем задумывался, и превратился в инструмент разработчика, а не конечного пользователя. В настоящее время SQL (по большей части в реализации Oracle) остается самым популярным из языков управления базами данных, хотя и существует ряд альтернатив. SQL состоит из четырех отдельных частей: Следует отметить, что SQL реализует декларативную парадигму программирования: каждый оператор описывает только необходимое действие, а СУБД принимает решение о том, как его выполнить, т.е. планирует элементарные операции, необходимые для выполнения действия и выполняет их. Тем не менее, для эффективного использования возможностей SQL разработчику необходимо понимать то, как СУБД анализирует каждый оператор и создает его план выполнения. Строка ‘Hello, World!’ выбирается из встроенной таблицы dual , используемой для запросов, не требующих обращения к настоящим таблицам. select
"Hello, World!"
from
dual
;
SQL не поддерживает циклы, рекурсии или пользовательские функции. Данный пример демонстрирует возможный обходной путь, использующий: Строка “0! = 1” не войдет в набор строк, полученный в результате, т.к. попытка вычислить ln(0) приводит к исключению. SQL не поддерживает циклы или рекурсии, кроме того, конкатенация полей из разных строк таблицы или запроса не является стандартной агрегатной функцией. Данный пример использует: 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!"
;
Используется рекурсивное определение факториала, реализованное через рекурсивный запрос. Каждая строка запроса содержит два числовых поля — n и n!, и каждая следующая строка вычисляется с использованием данных из предыдущей. Можно вычислить целочисленные факториалы только до 20!. При попытке вычислить 21! возникает ошибка “Arithmetic overflow error”, т.е. происходит переполнение разрядной сетки. Для вещественных чисел вычисляется факториал 100! (Для этого в примере необходимо заменить bigint на float в 3-ей строке) Используется итеративное определение чисел Фибоначчи, реализованное через рекурсивный запрос. Каждая строка запроса содержит два соседних числа последовательности, и следующая строка вычисляется как (последнее число, сумма чисел) предыдущей строки. Таким образом все числа, кроме первого и последнего, встречаются дважды, поэтому в результат входят только первые числа каждой строки. Этот пример демонстрирует использование оператора 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
]))
)
);
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
В этом примере используется анонимный блок PL/SQL, который выводит сообщение в стандартный поток вывода с помощью пакета dbms_output . begin
dbms_output
.
put_line
("Hello, World!"
);
end
;
Этот пример демонстрирует итеративное вычисление факториала средствами PL/SQL. 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, TOAD и PL/SQL Developer. Чистый SQL позволяет вводить переменные в процессе исполнения запроса в виде заменяемых переменных. Для определения такой переменной ее имя (в данном случае A, B и C) следует использовать с амперсандом & перед ним каждый раз, когда нужно сослаться на эту переменную. Когда запрос выполняется, пользователь получает запрос на ввод значений всех заменяемых переменных, использованных в запросе. После ввода значений каждая ссылка на такую переменную заменяется на ее значение, и полученный запрос выполняется. Существует несколько способов ввести значения для заменяемых переменных. В данном примере первая ссылка на каждую переменную предваряется не одинарным, а двойным амперсандом && . Таким образом значение для каждой переменной вводится только один раз, а все последующие ссылки на нее будут заменены тем же самым значением (при использовании одиночного амперсанда в SQL*Plus значение для каждой ссылки на одну и ту же переменную приходится вводить отдельно). В PL/SQL Developer ссылки на все переменные должны предваряться одиночным знаком & , иначе будет возникать ошибка ORA-01008 “Not all variables bound”. Первая строка примера задает символ для десятичного разделителя, который используется при преобразовании чисел-корней в строки. Сам запрос состоит из четырех разных запросов. Каждый запрос возвращает строку, содержащую результат вычислений, в одном из случаев (A=0, D=0, D>0 и D<0) и ничего — в трех остальных случаях. Результаты всех четырех запросов объединяются, чтобы получить окончательный результат. 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
;
У всех есть мнение относительно того, как писать код TSQL:
по форматированию, присвоению переменных, системным функциям, стандартам ANSI
или любым другим вопросам. И эти мнения могут существенно отличаться друг от друга, о чем свидетельствует множество сообщений на форумах и горячих дискуссий в комментариях к статьям. Но большинство согласится с тем, что хорошо читаемый и высокопроизводительный код является лучшим решением для всех. Конечно, вся загвоздка в том, как достичь этого. Лучше всего начать с создания набора стандартов, которые помогут определиться разработчикам T-SQL
, а затем ссылаться на них при построении решений. Таким образом, стандарты помогают устранить различия и работать в направлении общей цели. В этой статье я детально остановлюсь на общих принципах, которые могут применяться к коду, независимо от типов операторов T-SQL
. В ней охватываются такие вопросы, как форматирование, системные функции, устаревшие элементы языка и определяемые пользователем переменные. О форматировании TSQL
написано немало статей. Иногда в определенный момент нужно просмотреть большую часть кода, понять, что делает код, не говоря уже о выявлении потенциальных проблем. В качестве примера возьмем операторы USE
и SELECT
, которые написаны строчными буквами, без разделителей строк или пробелов, кроме тех случаев, когда это необходимо: use adventureworks2014
go
select emp.businessentityid empid,psn.firstname,psn.lastname,emp.sickleavehours sickleave,emp.nationalidnumber natid,emp.JobTitle from humanresources.employee emp inner join person.person psn on emp.businessentityid=psn.businessentityid where emp.jobtitle="production technician - wc60" or emp.jobtitle="production technician - wc50" order by emp.JobTitle desc,EmpID asc По умолчанию SQL Server
настроен так, что регистр букв не имеет значения. Поэтому нет причин, по которым нельзя было бы использовать этот подход. Или подход, который иллюстрирует следующий пример: USE ADVENTUREWORKS2014
GO
SELECT EMP.BUSINESSENTITYID EMPID,PSN.FIRSTNAME,PSN.LASTNAME,EMP.SICKLEAVEHOURS SICKLEAVE,EMP.NATIONALIDNUMBER NATID,EMP.JOBTITLE FROM HUMANRESOURCES.EMPLOYEE EMP INNER JOIN PERSON.PERSON PSN ON EMP.BUSINESSENTITYID=PSN.BUSINESSENTITYID WHERE EMP.JOBTITLE="PRODUCTION TECHNICIAN - WC60" OR EMP.JOBTITLE="PRODUCTION TECHNICIAN - WC50" ORDER BY EMP.JOBTITLE DESC,EMPID ASC Это вполне допустимо. Но невозможно прочесть. Представьте, что вам нужно просмотреть скрипт, содержащий сотни строк такого кода. Даже код TSQL convert
, который намного лучше этого, может быть сложен для понимания, если он непоследователен или организован случайным образом. Но посмотрите, что происходит, когда мы разбиваем оператор TSQL SELECT
на несколько строк, вставляем отдельные элементы, ключевые слова пишем заглавными буквами и добавляем комментарии для пояснения оператора: /*
Извлекаем данные технических сотрудников WC60 и WC50.
*/
USE AdventureWorks2014;
GO
SELECT emp.BusinessEntityID AS EmpID,
psn.FirstName,
psn.LastName,
emp.SickLeaveHours AS SickLeave,
emp.NationalIDNumber AS NatID,
emp.JobTitle
FROM HumanResources.Employee AS emp
INNER JOIN Person.Person AS psn
ON emp.BusinessEntityID = psn.BusinessEntityID
WHERE (emp.JobTitle = "Production Technician - WC60")
OR (emp.JobTitle = "Production Technician - WC50")
ORDER BY emp.JobTitle DESC, EmpID ASC; Этот код намного легче рассматривать, чем тот, который был приведен в примерах выше. Продуманное использование разрывов строк, пробелов, заглавных букв и отступов облегчает понимание кода T-SQL
, особенно когда все следуют тем же стандартам. T-SQL
код должен быть последовательным и тщательно отформатированным, чтобы он был удобно читаемым и понятным для всех, кто его рассматривает. С этой целью нужно учитывать широкий спектр факторов, таких как заглавные буквы, отступы и разумное использование разрывов строк. Принимая решение, как быть с этими элементами, необходимо тщательно все взвесить. В зависимости от конкретного случая могут быть веские доводы как за, так и против использования определенного подхода. Убедитесь, что вы принимаете во внимание все эти мелкие детали. Например, нужно ли добавлять пробел по обе стороны от оператора сравнения, когда и как делать отступ или где поместить запятые в выборке. Перейдем к комментариям, которые представляют собой простой и эффективный механизм для описания того, что происходит в коде. В том числе и в TSQL case
. Размещенные надлежащим образом комментарии могут сэкономить время и даже указать на несоответствия. Даже если вы просматриваете собственный код, то оцените комментарии, оформленные надлежащим образом, особенно если вы написали этот код несколько лет назад. В связи с этим следует рассмотреть вопрос о том, нужно ли включать расширенные свойства при создании базы данных. Расширенные свойства могут помочь обеспечить более глубокое понимание базы данных и облегчить документирование ее компонентов. Еще один способ облегчить понимание кода — использовать круглые скобки, когда это необходимо. В предыдущем примере я добавил скобки в выражение WHERE
, чтобы продемонстрировать эту концепцию. Хотя в этом случае они действительно не нужны, это служит напоминанием, как и комментарий. Круглые скобки помогают прояснить логику выражения, чтобы сделать инспектирование кода более быстрым и простым. Лучшей практикой считается добавление точки с запятой в конце операторов. Хотя в большинстве случаев для SQL Server
она не обязательна, в Microsoft
предупреждают, что точка с запятой нужна. Это уже стало частью стандартов ANSI
. Старайтесь избегать использования команд GOTO
. Это может затруднить проверку кода, особенно если много. Наша задача состоит в том, чтобы разработать способ последовательного форматирования и представления кода T-SQL
, сделать его читаемым, понятным и поддерживаемым. Еще более важным является создание правильного кода. Этот момент включает в себя использование современных элементов TSQL
. Это развивающийся язык, поэтому вы должны быть внимательными, чтобы не использовать устаревший или несоответствующий синтаксис. Часто встречающийся пример устаревшего кода — это объединение, основанное на стандарте SQL-92
, в котором условие объединения определено в выражении WHERE
, как показано в следующем примере: SELECT emp.BusinessEntityID AS EmpID,
psn.FirstName,
psn.LastName,
emp.NationalIDNumber AS NatID
FROM HumanResources.Employee emp,
Person.Person psn
WHERE emp.BusinessEntityID = psn.BusinessEntityID
AND emp.JobTitle = "Production Technician - WC60"; Хотя SQL Server
по-прежнему поддерживает такой подход, но все равно необходимо придерживаться новой модели, которая должна включать условие объединения в выражении FROM
: Гораздо легче выбрать условие объединения, если оно не спрятано в выражении WHERE
с несколькими другими условиями. Второй подход имеет еще одно преимущество. Если вы забудете включить условие объединения в любой оператор, первый пример вернет перекрестное соединение, которое может содержать огромное количество данных. Второй оператор возвращает ошибку, сообщая, что что-то не так. Другой пример устаревшего кода, когда оператор T-SQL
включает выражение TOP
. В прошлом мы указывали числовое выражение без круглых скобок, как в этом примере: SELECT TOP 10 Title, FirstName, LastName
FROM Person.Person;
Хотя это все еще работает в SQL Server, правильный синтаксис теперь включает в себя круглые скобки:
SELECT TOP(10) Title, FirstName, LastName
FROM Person.Person; Команда, занимающаяся базой данных, должна активно работать над заменой устаревшего кода. Многие T-SQL
и ANSI SQL-элементы
уже устарели или могут устареть в будущем. С учетом того, как быстро меняются стандарты, скорее всего, у вас есть устаревшие элементы в коде. Например, в SQL Server 2016
параметр SET ROWCOUNT
устарел для операторов TSQL INSERT
, UPDATE
и DELETE
. Так же есть типы данных text
, ntext
и image
. Даже такие операторы, как CREATE DEFAULT
и DROP DEFAULT
когда-нибудь устареют. Когда вы определяете стандарты кодирования, не забудьте указать, как поступать с устаревшими элементами. Легко сказать, что разработчики должны их избегать, но этого тяжело добиться. Поэтому нужно объяснить, когда и как их следует удалять. К счастью, Microsoft
предоставляет сведения о том, что устаревает с выходом каждой новой версии SQL Server
. Вы найдете список этих элементов в разделе Deprecated Database Engine Features in SQL Server 2016
. Теперь посмотрим на другой пример сомнительного кода. Следующий оператор выбора делает то, что не должен — оператор сравнения (не равно
) использован для значения NULL
: Несмотря на то, что таблица содержит строки со значением Title NULL
, этот оператор не возвращает строки и не возвращает ошибку. Если вы не будете внимательны, то можете получить неверные результаты. По этой причине следует избегать такого типа конструкции и вместо них использовать оператор IS NULL
или IS NOT NULL
для возвращения правильных строк: Это всего лишь один пример из множества, в которых разработчики могут столкнуться с проблемами при работе со значениями NULL
и TSQL
проверке на NULL
. Возможно, вы захотите описать более распространенные ошибки в своих стандартах. Также необходимо будет принять решение о присвоении столбцам псевдонимов. Часто используется следующий подход: сначала указывается псевдоним, затем знак равенства, как показано в следующем примере: SELECT EmpID = emp.BusinessEntityID,
psn.FirstName,
psn.LastName,
NatID = emp.NationalIDNumber
FROM HumanResources.Employee emp
INNER JOIN Person.Person psn
ON emp.BusinessEntityID = psn.BusinessEntityID
WHERE emp.JobTitle = "Production Technician - WC60"; Другой подход заключается в добавлении псевдонима в конце через необязательное ключевое слово AS
: SELECT emp.BusinessEntityID AS EmpID,
psn.FirstName,
psn.LastName,
emp.NationalIDNumber AS NatID
FROM HumanResources.Employee emp
INNER JOIN Person.Person psn
ON emp.BusinessEntityID = psn.BusinessEntityID
WHERE emp.JobTitle = "Production Technician - WC60"; Сторонники первого подхода утверждают, что он более читаемый. Но сторонники второго подхода также утверждают, что их метод позволяет достичь лучшей читаемости, так как первый подход можно спутать с присвоением переменных. Сторонники второго подхода также указывают, что их способ совместим со стандартами ANSI
. Еще один вопрос, который стоит рассмотреть, использование недокументированных хранимых процедур. Например, следующий оператор SELECT
используется хранимой процедурой sp_mstablespace
для возврата количества строк и объема дискового пространства, используемого таблицей Person
. Пример TSQL exec
: EXECUTE sp_mstablespace "person.person"; Хранимые процедуры прекрасно работают и могут быть очень удобны. Но нет никакого способа узнать, когда Microsoft
изменит или выведет их полностью. Созданный вами код может быть сломан, а вы даже не узнаете об этом. Разумеется, при стандартизации и проверке кода существуют всевозможные проблемы. Одна из основных задач — решить, насколько важно, чтобы код соответствовал стандартам ANSI
. Некоторые утверждают, что он должен всегда соответствовать ANSI
, потому что это делает его переносимым и понятным для разработчиков. С другой стороны, вы можете потерять важные функции, отказавшись от собственных элементов. Необходимо решить, что лучше для вашей команды и организации. SQL Server
предоставляет ряд системных функций для выполнения различных операций. Нужно убедиться, что они используются правильно. Некорректная функция может не возвращать ошибку, но при этом возвращать неправильные результаты. Например, функция ISNUMERIC
печально известна тем, что возвращает непредсказуемые результаты, что продемонстрировано в приведенном ниже примере: DECLARE @a TABLE(ColA VARCHAR(10));
INSERT INTO @a VALUES
("abc"), ("123"), ("$456"), ("22:35:27");
SELECT ColA, CASE
WHEN ISNUMERIC(ColA) = 1
THEN CAST(ColA AS INT)
END AS TestResults
FROM @a; Мы создаем переменную таблицы TSQL
и заполняем ее разными типами значений, которые передаются в виде строк. Затем используем функцию ISNUMERIC
для проверки, является ли значение числовым. Если это так (функция возвращает 1
), пытаемся преобразовать значение в тип данных INT
. Но в данном случае, когда ядро базы данных достигает значения $456
, оно сбрасывается и возвращается сообщение об ошибке: Conversion failed when converting the varchar value "$456" to data type int. Проблема заключается в том, что функция ISNUMERIC
иногда вызывает числовое значение, которое не может быть преобразовано в числовой тип данных, как для $456
. Она даже интерпретирует такие значения, как 7e9 и $.
, как числовые. Лучшим решением данной проблемы является использование функции TRY_CONVERT
: DECLARE @a TABLE(ColA VARCHAR(10));
INSERT INTO @a VALUES
("abc"), ("123"), ("$456"), ("22:35:27");
SELECT ColA, CASE
WHEN TRY_CONVERT(int, ColA) IS NOT NULL
THEN CAST(colA AS INT)
END AS TestResults
FROM @a; Преобразование данных является довольно сложным разделом в SQL Server
, поэтому вы должны быть внимательны. При работе с системными функциями вам придется иметь дело с различными функциями, которые могут использоваться для выполнения аналогичных операций или могут возвращать похожие типы информации. Например, можно использовать функцию CAST
или CONVERT
для преобразования типа данных значения. Функция CAST
является частью стандартов ANSI
, но имеет ограниченные возможности. Функция TSQL CONVERT
не предусмотрена стандартами, но она предоставляет ряд параметров для форматирования значений даты и времени. Хотя во многих случаях лучше оставить форматирование на уровне приложений. Независимо от этого нужно будет принять решение, какие из функций использовать, и насколько важно для вас соответствие кода стандартам ANSI
. Другим примером взаимозаменяемых функций являются COUNT
и EXISTS
, когда они используются для подтверждения существования определенных данных. Например, следующий оператор IF
проверяет, содержит ли таблица Person
строки, имеющие значение EM
в столбце PersonType
: Хотя этот оператор работает отлично, можно увеличить производительность, использовав функцию EXISTS
, особенно для больших наборов данных: Неправильное использование функции — это не всегда проблема функции. Например, в зависимости от ситуации использование функции SCOPE_IDENTITY()
выдает более точную информацию, чем системная переменная @@IDENTITY
. В обоих случаях возвращается последнее значение идентификатора, сгенерированное для таблицы в текущей сессии. Но функция SCOPE_IDENTITY()
применяется только к определенной области, а переменная @@ IDENTITY
этого не делает, что может влиять на правильность возвращаемого значения. Дополнительные сведения об этой проблеме вы найдете в разделе документации SQL
Server SCOPE_IDENTITY (Transact-SQL)
. Использование системных функций TSQL
не должно быть произвольным. Необходимо тщательно взвесить, какие из них задействовать. Рассмотрим простой пример, демонстрирующий некоторые из проблем, которые могут возникнуть: DECLARE @a INT,
@b VARCHAR(25),
@c VARCHAR(2),
@d VARCHAR,
@e MONEY;
SET @a = 25;
SET @b = "twenty-five";
SELECT @c = "EM", @e = 25;
SELECT @a AS "@a",
@c AS "@c",
@d AS "@d",
@e AS "@e",
@f AS "@f"; В этом коротком наборе операторов T-SQL
нам удалось зафиксировать ряд ошибок: Следует избегать любого из этих сценариев, но при работе с объемным кодом легко пропустить несколько необъявленных или неиспользуемых переменных. К счастью, SQL Server
сообщит о переменных, которые вы пытаетесь использовать, не объявляя их, но это не относится к другим сценариям. Ваши стандарты кодирования должны включать в себя несколько напоминаний, поэтому разработчики проверяют, правильно ли они используют переменные.Команды для работы с базами данных
1. Просмотр доступных баз данных
SHOW DATABASES;
2. Создание новой базы данных
CREATE DATABASE;
3. Выбор базы данных для использования
USE 4. Импорт SQL-команд из файла.sql
SOURCE 5. Удаление базы данных
DROP DATABASE Работа с таблицами
6. Просмотр таблиц, доступных в базе данных
SHOW TABLES;
7. Создание новой таблицы
CREATE TABLE Ограничения целостности при использовании CREATE TABLE
Пример
8. Сведения о таблице
9. Добавление данных в таблицу
INSERT INTO 10. Обновление данных таблицы
UPDATE 11. Удаление всех данных из таблицы
DELETE FROM 12. Удаление таблицы
DROP TABLE Команды для создания запросов
13. SELECT
14. SELECT DISTINCT
15. WHERE
Пример
16. GROUP BY
Пример
17. HAVING
Пример
18. ORDER BY
Пример
19. BETWEEN
Пример
20. LIKE
SELECT Пример
21. IN
Пример
22. JOIN
Пример 1
Пример 2
Пример 3
23. View
Создание
CREATE VIEW Удаление
DROP VIEW Пример
24. Агрегатные функции
25. Вложенные подзапросы
Пример
1. Что такое База Данных
2. Что такое SQL
Примеры:
Hello, World!:
Пример для версий
Oracle 10g SQL ,
Oracle 11g SQL
Факториал:
Пример для версий
Oracle 10g SQL ,
Oracle 11g SQL
Числа Фибоначчи:
Пример для версий
Oracle 10g SQL ,
Oracle 11g SQL
Hello, World!:
Пример для версий
Microsoft SQL Server 2005 ,
Microsoft SQL Server 2008 R2 ,
Microsoft SQL Server 2012 ,
MySQL 5 ,
PostgreSQL 8.4 ,
PostgreSQL 9.1 ,
sqlite 3.7.3
Факториал:
Пример для версий
Microsoft SQL Server 2005 ,
Microsoft SQL Server 2008 R2 ,
Microsoft SQL Server 2012
Числа Фибоначчи:
Пример для версий
Microsoft SQL Server 2005 ,
Microsoft SQL Server 2008 R2 ,
Microsoft SQL Server 2012
Факториал:
Пример для версий
Oracle 10g SQL ,
Oracle 11g SQL
Числа Фибоначчи:
Пример для версий
Oracle 10g SQL ,
Oracle 11g SQL
Факториал:
Пример для версий
MySQL 5
Числа Фибоначчи:
Пример для версий
MySQL 5
Hello, World!:
Пример для версий
Oracle 10g SQL ,
Oracle 11g SQL
Факториал:
Пример для версий
Oracle 10g SQL ,
Oracle 11g SQL
Числа Фибоначчи:
Пример для версий
Oracle 10g SQL ,
Oracle 11g SQL
Квадратное уравнение:
Пример для версий
Oracle 10g SQL ,
Oracle 11g SQL
Читаемость и другие аспекты
Написание правильного кода
Несоответствие функций
Переменные и параметры