Основы языка SQL. Часть 1

23 августа 2023

Цикл статей Ивана Климарёва.


Я решил начать цикл записей о языке SQL, стараясь не привязываться к конкретному вендору, чтобы материал можно было использовать для любого SQL-сервера.

Вступление


Язык SQL (Structured Query Language — язык структурированных запросов) является декларативным human readable языком. Это значит он, в первую очередь, ориентирован на человеческое восприятие и не сообщает системе, каким именно образом нужно выполнить действие, он говорит системе, что именно вы хотите получить, а как делать, решает сам SQL сервер.

Язык состоит из трёх основных частей: DDL – Data Definition Language – Язык определения данных, DML – Data Manipulation Language – язык манипулирования данными и DCL – Data Control Language – Язык управления данными.

К операторам языка определения данных (DDL) относятся команды для создания, изменения и удаления таблиц, представлений и других объектов базы данных. К операторам языка манипулирования данными (DML) относятся команды для выборки строк из таблиц, вставки строк в таблицы, обновления и удаления строк. Операторы языка контроля данных (DCL) управляют выдачей и отбором прав пользователей СУБД.

Владение языком SQL является важным показателем квалификации ИТ-специалиста, не важно в сфере разработки или эксплуатации. В этом наборе статей не будет рассматриваться теория баз данных или архитектура СУБД, это тематика будет рассматривать отдельно от языка.
Начнём мы с DDL.
 

DDL

Его основные операторы:
  • Create – создание объекта (таблицы, представления, последовательности, индексы, пользователи, базы данных, схемы, табличные пространства и тому подобное)
  • Alter – изменение объекта, например, можно добавить столбец в таблицу, изменить его или удалить
  • Drop – удаление объекта
  • Truncate – опустошение объекта. Фактически команда truncate table, пересоздаст таблицу со всеми её столбцами, ограничениями целостности и правилами, но без строк.

Я буду приводить команды в контексте PostgreSQL, но в большинстве случаев они применимы в СУБД от других вендоров либо как есть, либо с небольшими изменениями.
Давайте создадим таблицу «Сотрудники», в которой у нас будет набор столбцов: табельный номер, имя, фамилия, отчество, зарплата, 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 и об ограничениях целостности, которые ограничивают хранимые данные и операции с ними.


Автор статьи
Иван Климарёв
Преподаватель:
УЦ АйТи Клауд по направлениям администрирование систем, DevOps, Менеджмент ИТ

Курсы к статье

Затрудняетесь
с выбором курса?

Оставьте заявку на консультацию

Отправляя заявку, вы соглашаетесь с условиями обработки персональных данных

Хотите преподавать в АйТи Клауд?

Если вы имеете компетенции и хотите работать тренером курсов в АйТи Клауд - оставьте ваши данные, мы свяжемся с вами!