Вступление
Язык SQL (Structured Query Language — язык структурированных запросов) является декларативным human readable языком. Это значит он, в первую очередь, ориентирован на человеческое восприятие и не сообщает системе, каким именно образом нужно выполнить действие, он говорит системе, что именно вы хотите получить, а как делать, решает сам SQL сервер.
Язык состоит из трёх основных частей: DDL – Data Definition Language – Язык определения данных, DML – Data Manipulation Language – язык манипулирования данными и DCL – Data Control Language – Язык управления данными.
К операторам языка определения данных (DDL) относятся команды для создания, изменения и удаления таблиц, представлений и других объектов базы данных. К операторам языка манипулирования данными (DML) относятся команды для выборки строк из таблиц, вставки строк в таблицы, обновления и удаления строк. Операторы языка контроля данных (DCL) управляют выдачей и отбором прав пользователей СУБД.
Владение языком SQL является важным показателем квалификации ИТ-специалиста, не важно в сфере разработки или эксплуатации. В этом наборе статей не будет рассматриваться теория баз данных или архитектура СУБД, это тематика будет рассматривать отдельно от языка.
DDL
Его основные операторы:-
Create – создание объекта (таблицы, представления, последовательности, индексы, пользователи, базы данных, схемы, табличные пространства и тому подобное)
-
Alter – изменение объекта, например, можно добавить столбец в таблицу, изменить его или удалить
-
Drop – удаление объекта
-
Truncate – опустошение объекта. Фактически команда truncate table, пересоздаст таблицу со всеми её столбцами, ограничениями целостности и правилами, но без строк.
Давайте создадим таблицу «Сотрудники», в которой у нас будет набор столбцов: табельный номер, имя, фамилия, отчество, зарплата, email, телефон и табельный номер руководителя.
Сreate table employees (emp_id integer, first_name text, last_name text, middle_name text, email text, phone text, salary numeric, mgr_id integer, hire_date date);
Давайте разберём команду:
“create” – я хочу создать объект
“table” – какой именно объект я хочу создать. Таблицу - тут могут быть варианты, например, если я хочу создать представление, то тут будет “view”
“employees” – название объекта, я рекомендую использовать латиницу в нижнем регистре
“ (описания столбцов)” – тут мы описываем, какие именно столбцы мы хотим, указывая названия столбца “emp_id”, тип данных в этом столбце – integer (целое число). Это необходимо для понимания СУБД, что за данные тут лежат, и какие действия можно к ним применять (разные типы данных мы рассмотрим в следующей статье). Также здесь указываются ограничения целостности (constraint), но мы их пока не используем
“;” – SQL команда должна заканчивать точкой с запятой, что говорит о том, что мы закончили выражение.
Допустим я хочу изменить таблицу, добавив в неё ещё один столбец:
Аlter table employees add department integer;
“alter” – оператор изменения существующего объекта
“table” – тип объекта, в который вносится изменение
“employees” – называние объекта, ведь нам нужно изменить конкретную таблицу, а не случайную
“add” – хотите добавить столбец, в некоторых СУБД нужно писать add column
“department” – название столбца
“integer” – его тип данных.
Командой удаления объекта будет drop:
Droр table employees;
“drop” – оператор удаления; обратите внимание, что в большинстве СУБД объект сразу удалится, без помещения в корзину
“table” – тип удаляемого объекта
“employees” – называние объекта
В команде сreate table мы указывали типы данных, их великое множество, но давайте поговорим об основных.
Типы данных
Типы данных можно разделить на категории:
ЧИСЛОВЫЕ ТИПЫ ДАННЫХ. Группа числовых типов данных включает в себя целый ряд разновидностей: целочисленные типы, числа фиксированной точности, типы данных с плавающей точкой и другие.
В составе целочисленных типов находятся следующие представители: smallint, integer, bigint. Если столбец таблицы имеет один из этих типов, то он позволяет хранить только целочисленные данные. При этом перечисленные типы различаются по количеству байтов, выделяемых для хранения данных:
-
Smallint - 2 байта, целое в небольшом диапазоне (от -32768 до 32767)
-
Integer - 4 байта, типичный выбор для целых чисел (от -2147483648 до 2147483647)
-
Bigint - 8 байт, целое в большом диапазоне (от -9223372036854775808 до 9223372036854775807)
В общем и целом, обычно используют integer, как компромиссный вариант между максимальным значением, и сколько места будут занимать данные. Чем больше байт, тем больше место занимает значение.
Числа фиксированной точности представлены двумя типами — numeric и decimal. Однако они являются идентичными по своим возможностям.
- Decimal - размер переменный, вещественное число с указанной точностью (до 131072 цифр до десятичной точки и до 16383 — после)
Для задания значения этого типа используются два базовых понятия: масштаб (scale) и точность (precision). Масштаб показывает число значащих цифр, стоящих справа от десятичной точки (запятой). Точность указывает общее число цифр, как до десятичной точки, так и после нее. Например, у числа 12.3456 точность составляет 6 цифр, а масштаб — 4 цифры. Параметры этого типа данных указываются в круглых скобках после имени типа: numeric (точность, масштаб). Например, numeric (6, 2). Если не указать параметры, как в примере с созданием таблицы, то в таком случае ограничение идёт по верхней планке.
Задача этого типа данных — это обеспечение точных результатов при выполнении вычислений. Это оказывается возможным при выполнении сложения, вычитания и умножения. Числа типа numeric могут хранить очень большое количество цифр: 131 072 цифры — до десятичной точки (запятой), 16 383 — после точки. Однако нужно учитывать, что такая точность достигается за счет замедления вычислений по сравнению с целочисленными типами и типами с плавающей точкой. При этом для хранения числа затрачивается больше памяти, чем в случае целых чисел. Этот тип данных часто использую для хранения данных, в которых нужно учитывать десятичные доли и для денег. В нашем случае мы используем его в столбце salary – зарплата.
СИМВОЛЬНЫЕ (СТРОКОВЫЕ) ТИПЫ. Типичные представители строковых типов — это типы varchar(n) и char (n), где параметр указывает максимальное число символов в строке, которую можно сохранить в столбце такого типа. При работе с многобайтовыми кодировками символов, например UTF-8, нужно учитывать, что речь идет о символах, а не о байтах. Если сохраняемая строка символов будет короче, чем указано в определении типа, то значение типа char будет дополнено пробелами до требуемой длины, а значение типа varchar будет сохранено так, как есть. То есть фамилия «Иванов» в char будет выглядеть ‘Иванов ’, а в varchar ‘Иванов’, соответственно varchar занимает гораздо меньше пространства.
PostgreSQL дополнительно предлагает еще один символьный тип — text. В столбец этого типа можно ввести сколь угодно большое значение, в пределах установленных при компиляции исходных текстов СУБД. В примере создания таблицы, для столбцов first_name, last_name, middle_name, email и phone мы используем именно text в качества типа данных.
В Microsoft SQL Server и Oracle char и varchar не юникодовые, что вызывает проблемы с хранением некоторых символов, поэтому там используют специальные юникодовые варианты типа данных nchar и nvarchar соответственно. В Microsoft SQL Server тоже есть тип данных text, но там он является устаревшим типом данных и не рекомендуется к использованию.
Строковые значения в языке SQL всегда заключаются в одинарные кавычки, т.е. фамилия Иванов будет вноситься в таблицу или использоваться ещё каким-либо образом как ‘Иванов’.
ТИПЫ «ДАТА/ВРЕМЯ». Дата и время имеют несколько вариантов хранения и оперируются в соответствии с ISO-стандартом.
- Date – хранит исключительно дату без времени, в разных СУБД может записывать по разному:
PostgreSQL хранит дату как «yyyy-mm-dd», где символы «y», «m» и «d» обозначают цифру года, месяца и дня соответственно. Например, дата написания этой статьи 03.03.2023 хранится как ‘2023-03-03’. PostgreSQL позволяет использовать и другие форматы «дата/время» для ввода, например: «Sep 12, 2016», что означает 12 сентября 2016 года. При выводе значений PostgreSQL использует формат по умолчанию, если не предписан другой формат. По умолчанию используется формат, рекомендуемый стандартом ISO 8601: «yyyy-mm-dd».
Microsoft SQL Server хранит дату как «yyyy-mm-dd», так и «yyyymmdd» (то есть без дефисов), самостоятельно преобразуя один вариант в другой, в зависимости от того как вы обратитесь.
В Oracle формат хранения даты как «yyyy-mm-dd», так и «dd-mon-yyyy», где mon - это текстовое название месяца, сокращённое до трёх символов. Например, дата написания этой статьи 03.03.2023 хранится как ’03-mar-2023’.
- Time - хранит исключительно время без даты в формате “HH:MM:SS ” (часы, минуты, секунды). 12 дня будет выглядеть как ’12:00:00’
- Timestamp – хранит и дату и время по умолчанию без часового пояса, т.е. 12 дня 03.03.2023 будет выглядеть как ‘2023-03-03 12:00:00’
- Timestamp with timezone – хранит дату и время с указанием часового пояса и с указанием «+» или «-» в зависимости от смещения. Например, 12 дня 03.03.2023 в Екатеринбурге, где я пишу эту статью, будет выглядеть как ‘2023-03-03 12:00:00+05’
На этом я заканчиваю статью. В следующей части мы поговорим о DML и об ограничениях целостности, которые ограничивают хранимые данные и операции с ними.
Курсы к статье
Подпишись на рассылку актуальных новостей
и читай нас в соц. сетях