Учебники

7) Запрос

Чтобы писать SQL- запросы в базе данных SQLite, вы должны знать, как работают предложения SELECT, FROM, WHERE, GROUP BY, ORDER BY и LIMIT и как их использовать.

В этом уроке вы узнаете, как использовать эти предложения и как писать предложения SQLite.

В этом уроке вы узнаете

Чтение данных с помощью Select

Предложение SELECT является основным оператором, который вы используете для запроса базы данных SQLite. В предложении SELECT вы указываете, что выбрать. Но перед предложением select давайте посмотрим, откуда мы можем выбирать данные, используя предложение FROM.

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

Обратите внимание, что для всех следующих примеров вы должны запустить sqlite3.exe и открыть соединение с образцом базы данных как текущее:

Шаг 1) На этом этапе

  1. Откройте Мой компьютер и перейдите в следующий каталог » C: \ sqlite » и
  2. Затем откройте « sqlite3.exe »:

SQLite - выберите, где, предел, количество, группировка, объединение

Шаг 2) Откройте базу данных « TutorialsSampleDB.db » с помощью следующей команды:

SQLite - выберите, где, предел, количество, группировка, объединение

Теперь вы готовы выполнить любой тип запроса к базе данных.

В предложении SELECT вы можете выбрать не только имя столбца, но и множество других опций, чтобы указать, что выбрать. Следующим образом:

ВЫБРАТЬ *

Эта команда выберет все столбцы из всех ссылочных таблиц (или подзапросов) в предложении FROM. Например:

SELECT * 
FROM Students
INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;		

Это выберет все столбцы из таблиц студентов и отделов:

SQLite - выберите, где, предел, количество, группировка, объединение

ВЫБЕРИТЕ имя таблицы. *

Это позволит выбрать все столбцы только из таблицы «имя таблицы». Например:

SELECT Students.*
FROM Students
INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;

Это выберет все столбцы только из таблицы студентов:

SQLite - выберите, где, предел, количество, группировка, объединение

Буквальное значение

Литеральное значение — это постоянное значение, которое можно указать в операторе выбора. Вы можете использовать литеральные значения, как и имена столбцов в предложении SELECT. Эти литеральные значения будут отображаться для каждой строки из строк, возвращаемых SQL-запросом.

Вот несколько примеров различных литеральных значений, которые вы можете выбрать:

  • Числовой литерал — числа в любом формате, например, 1, 2,55 и т. Д.
  • Строковые литералы — любая строка «США», «это образец текста» и т. Д.
  • NULL — значение NULL.
  • Current_TIME — Это даст вам текущее время.
  • CURRENT_DATE — это даст вам текущую дату.

Это может быть полезно в некоторых ситуациях, когда вам нужно выбрать постоянное значение для всех возвращаемых строк. Например, если вы хотите выбрать всех студентов из таблицы «Студенты», с новым столбцом под названием страна, в котором содержится значение «США», вы можете сделать это:

SELECT *, 'USA' AS Country FROM Students;

Это даст вам все столбцы студентов, а также новый столбец «Страна», например:

SQLite - выберите, где, предел, количество, группировка, объединение

Обратите внимание, что этот новый столбец Страна фактически не является новым столбцом, добавленным в таблицу. Это виртуальный столбец, созданный в запросе для отображения результатов, и он не будет создан в таблице.

Имена и Псевдоним

Псевдоним — это новое имя для столбца, которое позволяет выбрать столбец с новым именем. Псевдонимы столбцов указываются с использованием ключевого слова «AS».

Например, если вы хотите выбрать столбец StudentName, который будет возвращаться с именем «Student Name» вместо «StudentName», вы можете задать ему псевдоним:

SELECT StudentName AS 'Student Name' FROM Students;		

Это даст вам имена студентов с именем «Имя студента» вместо «Имя студента», например:

SQLite - выберите, где, предел, количество, группировка, объединение

Обратите внимание, что имя столбца по-прежнему » StudentName «; столбец StudentName остается прежним, он не изменяется псевдонимом.

Псевдоним не изменит имя столбца; он просто изменит отображаемое имя в предложении SELECT.

Также обратите внимание, что ключевое слово «AS» является необязательным, вы можете поставить псевдоним без него, например:

SELECT StudentName 'Student Name' FROM Students;

И это даст вам тот же результат, что и предыдущий запрос:

SQLite - выберите, где, предел, количество, группировка, объединение

Вы также можете указывать псевдонимы таблиц, а не только столбцы. С тем же ключевым словом «AS». Например, вы можете сделать это:

SELECT s.* FROM Students AS s;		

Это даст вам все столбцы в таблице студентов:

SQLite - выберите, где, предел, количество, группировка, объединение

Это может быть очень полезно, если вы объединяете более одной таблицы; вместо того, чтобы повторять полное имя таблицы в запросе, вы можете дать каждой таблице короткое имя псевдонима. Например, в следующем запросе:

SELECT Students.StudentName, Departments.DepartmentName
FROM Students
INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;

Этот запрос выберет имя каждого студента из таблицы «Студенты», а название отдела — из таблицы «Отделы»:

SQLite - выберите, где, предел, количество, группировка, объединение

Однако тот же запрос может быть написан так:

SELECT s.StudentName, d.DepartmentName
FROM Students AS s
INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;		
  • Мы дали таблице студентов псевдоним «s», а таблице отделов — псевдоним «d».
  • Затем вместо полного имени таблицы мы использовали их псевдонимы для ссылки на них.
  • INNER JOIN объединяет две или более таблицы вместе, используя условие. В нашем примере мы соединили таблицу «Студенты» с таблицей «Отделы» со столбцом «DepartmentId». Существует также подробное объяснение ВНУТРЕННЕГО СОЕДИНЕНИЯ в учебнике «Соединения SQLite».

Это даст вам точный результат как предыдущий запрос:

SQLite - выберите, где, предел, количество, группировка, объединение

ГДЕ

Написание SQL-запросов с использованием одного предложения SELECT с предложением FROM, как мы видели в предыдущем разделе, даст вам все строки из таблиц. Однако, если вы хотите отфильтровать возвращенные данные, вы должны добавить предложение WHERE.

Предложение WHERE используется для фильтрации набора результатов, возвращаемых запросом SQL. Вот как работает предложение WHERE:

  • В предложении WHERE вы можете указать «выражение».
  • Это выражение будет оцениваться для каждой строки, возвращаемой из таблицы (таблиц), указанной в предложении FROM.
  • Выражение будет оцениваться как логическое выражение с результатом true, false или null.
  • Тогда будут возвращены только те строки, для которых выражение было оценено с истинным значением, а строки с ложными или нулевыми результатами будут игнорироваться и не включаться в набор результатов.
  • Чтобы отфильтровать набор результатов с помощью предложения WHERE, вы должны использовать выражения и операторы.

Список операторов в SQLite и как их использовать

В следующем разделе мы объясним, как вы можете фильтровать, используя выражения и операторы.

Выражение — это одно или несколько буквенных значений или столбцов, объединенных друг с другом оператором.

Обратите внимание, что вы можете использовать выражения как в предложении SELECT, так и в предложении WHERE.

В следующих примерах мы попробуем выражения и операторы как в предложении select, так и в предложении WHERE. Для того, чтобы показать вам, как они работают.

Существуют различные типы выражений и операторов, которые можно указать следующим образом:

SQLite оператор конкатенации «||»

Этот оператор используется для объединения одного или нескольких литеральных значений или столбцов друг с другом. Он выдаст одну строку результатов из всех объединенных литеральных значений или столбцов. Например:

SELECT 'Id with Name: '|| StudentId || StudentName AS StudentIdWithName
FROM Students;

Это объединит в новый псевдоним » StudentIdWithName «:

  • Литеральное строковое значение » Id with Name: «
  • со значением столбца « StudentId » и
  • со значением из столбца « StudentName »

SQLite - выберите, где, предел, количество, группировка, объединение

SQLite CAST оператор:

Оператор CAST используется для преобразования значения из типа данных в другой тип данных.

Например, если у вас есть числовое значение, хранящееся в виде строкового значения, такого как « 12 .5 », и вы хотите преобразовать его в числовое значение, вы можете использовать оператор CAST, чтобы сделать это как « CAST (’12 .5 ‘AS). НАСТОЯЩИЙ) «. Или, если у вас есть десятичное значение, например 12,5, и вам нужно получить только целую часть, вы можете привести его к целому числу, например, «CAST (12.5 AS INTEGER)».

пример

В следующей команде мы попытаемся преобразовать различные значения в другие типы данных:

SELECT CAST('12.5' AS REAL) ToReal, CAST(12.5 AS INTEGER) AS ToInteger;

Это даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

Результат выглядит следующим образом:

  • CAST (’12 .5 ‘AS REAL) — значение ’12 .5’ является строковым значением, оно будет преобразовано в значение REAL.
  • CAST (12.5 AS INTEGER) — значение 12.5 является десятичным значением, оно будет преобразовано в целочисленное значение. Десятичная часть будет усечена, и станет 12.

Арифметические операторы SQLite:

Возьмите два или более числовых литеральных значения или числовых столбца и верните одно числовое значение. Арифметические операторы, поддерживаемые в SQLite:

  • Дополнение « + » — дать сумму двух операндов.
  • Вычитание « » — вычитает два операнда и приводит к разнице.
  • Умножение « * » — произведение двух операндов.
  • Напоминание (по модулю) » % » — дает остаток, который получается в результате деления одного операнда на второй операнд.
  • Деление » / » — возвращает частные результаты деления левого операнда на правый операнд.

Пример:

В следующем примере мы попробуем пять арифметических операторов с буквенными числовыми значениями в одном и том же

выберите пункт:

SELECT 25+6, 25-6, 25*6, 25%6, 25/6;

Это даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

Обратите внимание, как мы использовали оператор SELECT без предложения FROM. И это разрешено в SQLite, если мы выбираем литеральные значения.

Операторы сравнения SQLite

Сравните два операнда друг с другом и верните true или false следующим образом:

  • « < » — возвращает true, если левый операнд меньше правого.
  • « <= » — возвращает истину, если левый операнд меньше или равен правому операнду.
  • « > » — возвращает true, если левый операнд больше правого.
  • » > = » — возвращает true, если левый операнд больше или равен правому операнду.
  • » = » и » == » — возвращает true, если два операнда равны. Обратите внимание, что оба оператора одинаковы, и между ними нет никакой разницы.
  • » ! = » и » <> » — возвращает true, если два операнда не равны. Обратите внимание, что оба оператора одинаковы, и между ними нет никакой разницы.

Обратите внимание, что SQLite выражает истинное значение с 1 и ложное значение с 0.

Пример:

SELECT 
  10<6 AS '<', 10<=6 AS '<=',
  10>6 AS '>', 10>=6 AS '>=',
  10=6 AS '=', 10==6 AS '==',
  10!=6 AS '!=', 10<>6 AS '<>';

Это даст что-то вроде этого:

SQLite - выберите, где, предел, количество, группировка, объединение

Операторы соответствия шаблонов SQLite

« LIKE » — используется для сопоставления с образцом. Используя « Like », вы можете искать значения, которые соответствуют шаблону, указанному подстановочным знаком.

Операндом слева может быть либо строковое литеральное значение, либо строковый столбец. Шаблон может быть указан следующим образом:

  • Содержит шаблон. Например, StudentName LIKE «% a%» — при этом будут выполняться поиск имен учащихся, содержащих букву «a», в любой позиции в столбце StudentName.
  • Начинается с рисунка. Например, « StudentName LIKE ‘a%’ » — поиск имен учащихся, которые начинаются с буквы «a».
  • Заканчивается с рисунком. Например, « StudentName LIKE ‘% a’ » — поиск имен учащихся, заканчивающихся буквой «a».
  • Соответствие любому отдельному символу в строке с использованием буквы подчеркивания «_». Например, « StudentName LIKE ‘J___’ » — поиск имен учеников длиной 4 символа. Он должен начинаться с буквы «J» и может содержать любые другие три символа после буквы «J».

Примеры сопоставления с образцом:

  1. Получите имена учеников, которые начинаются с буквы «j»:
    SELECT StudentName FROM Students WHERE StudentName LIKE 'j%';

    Результат:

    SQLite - выберите, где, предел, количество, группировка, объединение

  2. Имена учеников заканчиваются буквой «у»:
    SELECT StudentName FROM Students WHERE StudentName LIKE '%y';				

    Результат:

    SQLite - выберите, где, предел, количество, группировка, объединение

  3. Получите имена учеников, которые содержат букву «n»:
    SELECT StudentName FROM Students WHERE StudentName LIKE '%n%';

    Результат:

    SQLite - выберите, где, предел, количество, группировка, объединение

«GLOB» — эквивалент оператора LIKE, но GLOB чувствителен к регистру, в отличие от оператора LIKE. Например, следующие две команды будут возвращать разные результаты:

SELECT 'Jack' GLOB 'j%';
SELECT 'Jack' LIKE 'j%';

Это даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

  • Первый оператор возвращает 0 (ложь), потому что оператор GLOB чувствителен к регистру, поэтому ‘j’ не равно ‘J’. Тем не менее, второй оператор вернет 1 (true), потому что оператор LIKE нечувствителен к регистру, поэтому «j» равно «J».

Другие операторы:

SQLite И

Логический оператор, который объединяет одно или несколько выражений. Он вернет true, только если все выражения выдают «истинное» значение. Однако он вернет false только в том случае, если все выражения выдают «ложное» значение.

Пример:

Следующий запрос будет искать студентов, которые имеют StudentId> 5 и StudentName начинается с буквы N, возвращаемые студенты должны соответствовать двум условиям:

SELECT * 
FROM Students 
WHERE (StudentId > 5) AND (StudentName LIKE 'N%');

SQLite - выберите, где, предел, количество, группировка, объединение

В качестве вывода на приведенном выше снимке экрана это даст вам только «Нэнси». Нэнси — единственная студентка, которая отвечает обоим условиям.

SQLite ИЛИ

Логический оператор, который объединяет одно или несколько выражений, так что если один из объединенных операторов выдает true, он вернет true. Однако, если все выражения выдают false, оно вернет false.

Пример:

Следующий запрос будет искать студентов, у которых StudentId> 5 или StudentName начинается с буквы N, возвращаемые студенты должны соответствовать хотя бы одному из условий:

SELECT * 
FROM Students 
WHERE (StudentId > 5) OR (StudentName LIKE 'N%');

Это даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

В качестве вывода на приведенном выше снимке экрана это даст вам имя студента с буквой «n» в имени плюс идентификатор студента со значением> 5.

Как видите, результат отличается от запроса с оператором AND.

SQLite МЕЖДУ

МЕЖДУ используется для выбора тех значений, которые находятся в диапазоне двух значений. Например, « X МЕЖДУ Y И Z » вернет true (1), если значение X находится между двумя значениями Y и Z. В противном случае он вернет false (0). « X МЕЖДУ Y И Z » эквивалентно « X> = Y И X <= Z », X должно быть больше или равно Y, а X меньше или равно Z.

Пример:

В следующем примере запроса мы напишем запрос, чтобы получить студентов со значением Id от 5 до 8:

SELECT *
FROM Students
WHERE StudentId BETWEEN 5 AND 8;

Это даст только студентам с идентификаторами 5, 6, 7 и 8:

SQLite - выберите, где, предел, количество, группировка, объединение

SQLite IN

Принимает один операнд и список операндов. Он вернет true, если значение первого операнда равно значению одного из операндов из списка. Оператор IN возвращает true (1), если список операндов содержит первое значение операнда в своих значениях. В противном случае он вернет false (0).

Примерно так: « col IN (x, y, z) ». Это эквивалентно » (col = x) или (col = y) или (col = z) «.

Пример:

Следующий запрос выберет студентов с идентификаторами 2, 4, 6, 8:

SELECT * 
FROM Students
WHERE StudentId IN(2, 4, 6, 8);

Нравится:

SQLite - выберите, где, предел, количество, группировка, объединение

Предыдущий запрос даст точный результат как следующий запрос, потому что они эквивалентны:

SELECT * 
FROM Students
WHERE (StudentId = 2) OR (StudentId =  4) OR (StudentId =  6) OR (StudentId = 8);

Оба запроса дают точный результат. Однако разница между этими двумя запросами заключается в том, что в первом запросе мы использовали оператор «IN». Во втором запросе мы использовали несколько операторов «ИЛИ».

Оператор IN эквивалентен использованию нескольких операторов OR. « WHERE StudentId IN (2, 4, 6, 8) » эквивалентно « WHERE (StudentId = 2) ИЛИ (StudentId = 4) ИЛИ (StudentId = 6) ИЛИ (StudentId = 8); »

Нравится:

SQLite - выберите, где, предел, количество, группировка, объединение

SQLite НЕ В

Операнд NOT IN является противоположностью оператора IN. Но с тем же синтаксисом; требуется один операнд и список операндов. Он вернет true, если значение первого операнда не равно значению одного из операндов из списка. т.е. он вернет true (0), если список операндов не содержит первый операнд. Примерно так: « col NOT IN (x, y, z) ». Это эквивалентно » (col <> x) AND (col <> y) AND (col <> z) «.

Пример:

Следующий запрос выберет студентов с идентификаторами, не равными одному из этих идентификаторов 2, 4, 6, 8:

SELECT * 
FROM Students
WHERE StudentId NOT IN(2, 4, 6, 8);

Нравится

SQLite - выберите, где, предел, количество, группировка, объединение

Предыдущий запрос мы даем точный результат как следующий запрос, потому что они эквивалентны:

SELECT * 
FROM Students
WHERE (StudentId <> 2) AND (StudentId <> 4) AND (StudentId <> 6) AND (StudentId <> 8);

Нравится:

SQLite - выберите, где, предел, количество, группировка, объединение

На скриншоте выше,

Мы использовали несколько неравных операторов «<>», чтобы получить список студентов, которые не равны ни одному из следующих идентификаторов 2, 4, 6 или 8. Этот запрос вернет всех других студентов, кроме этого списка идентификаторов.

SQLite СУЩЕСТВУЕТ

Операторы EXISTS не принимают никаких операндов; после него требуется только предложение SELECT. Оператор EXISTS вернет true (1), если есть какие-либо строки, возвращенные из предложения SELECT, и вернет false (0), если вообще нет строк, возвращенных из предложения SELECT.

Пример:

В следующем примере мы выберем название отдела, если идентификатор отдела существует в таблице студентов:

SELECT DepartmentName
FROM Departments AS d
WHERE EXISTS (SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId);

Это даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

Только три отдела » IT, физика и искусство » будут возвращены. И название кафедры « Математика » не будет возвращено, потому что на этом факультете нет ученика, поэтому идентификатор кафедры не существует в таблице учеников. Вот почему оператор EXISTS проигнорировал отдел « Математика ».

SQLite НЕ

Обращает результат предшествующего оператора, который идет после него. Например:

  • NOT BETWEEN — Возвращает true, если BETWEEN возвращает false и наоборот.
  • NOT LIKE — он вернет true, если LIKE вернет false, и наоборот.
  • NOT GLOB — Возвращает true, если GLOB возвращает false и наоборот.
  • NOT EXISTS — он вернет true, если EXISTS вернет false и наоборот.

Пример:

В следующем примере мы будем использовать оператор NOT с оператором EXISTS, чтобы получить имена отделов, которых нет в таблице Students, что является обратным результатом оператора EXISTS. Таким образом, поиск будет осуществляться через DepartmentId, которого нет в таблице отдела.

SELECT DepartmentName
FROM Departments AS d
WHERE NOT EXISTS (SELECT DepartmentId 
                  FROM Students AS s 
                  WHERE d.DepartmentId = s.DepartmentId);

Выход :

SQLite - выберите, где, предел, количество, группировка, объединение

Только отдел » Математика » будет возвращен. Потому что « математический » отдел — единственный отдел, которого нет в таблице учеников.

Ограничение и порядок

SQLite Order

Порядок SQLite — это сортировка вашего результата по одному или нескольким выражениям. Чтобы упорядочить набор результатов, вы должны использовать предложение ORDER BY следующим образом:

  • Во-первых, вы должны указать предложение ORDER BY.
  • Предложение ORDER BY должно быть указано в конце запроса; только предложение LIMIT может быть указано после него.
  • Укажите выражение для упорядочения данных, это выражение может быть именем столбца или выражением.
  • После выражения вы можете указать необязательное направление сортировки. Либо DESC, чтобы упорядочить данные по убыванию, либо ASC, чтобы упорядочить данные по возрастанию. Если вы не указали ни один из них, данные будут отсортированы по возрастанию.
  • Вы можете указать больше выражений, используя «,» между собой.

пример

В следующем примере мы выберем всех студентов, упорядоченных по их именам, но по убыванию, а затем по названию отдела в порядке возрастания:

SELECT s.StudentName, d.DepartmentName
FROM Students AS s
INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId
ORDER BY d.DepartmentName ASC , s.StudentName DESC;

Это даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

  • SQLite сначала упорядочит всех студентов по названию отделения в порядке возрастания
  • Затем для каждого названия отделения все студенты под этим названием будут отображаться в порядке убывания их имен.

SQLite Limit:

Вы можете ограничить количество строк, возвращаемых вашим SQL-запросом, используя предложение LIMIT. Например, LIMIT 10 даст вам только 10 строк и проигнорирует все остальные строки.

В предложении LIMIT вы можете выбрать определенное количество строк, начиная с определенной позиции, используя предложение OFFSET. Например, « LIMIT 4 OFFSET 4 » будет игнорировать первые 4 строки и вернет 4 строки, начиная с пятых, так что вы получите строки 5,6,7 и 8.

Обратите внимание, что предложение OFFSET является необязательным, вы можете написать его как « LIMIT 4, 4 », и оно даст вам точные результаты.

Пример :

В следующем примере мы вернем только 3 ученика, начиная с идентификатора ученика 5, используя запрос:

SELECT * FROM Students LIMIT 4,3;

Это даст вам только трех студентов, начиная со строки 5. Таким образом, это даст вам строки с StudentId 5, 6 и 7:

SQLite - выберите, где, предел, количество, группировка, объединение

Удаление дубликатов

Если ваш запрос SQL возвращает повторяющиеся значения, вы можете использовать ключевое слово « DISTINCT », чтобы удалить эти дубликаты и вернуться к различным значениям. Вы можете указать более одного столбца после работы клавиши DISTINCT.

Пример:

Следующий запрос вернет дубликаты «значений названий отделов»: Здесь у нас есть дубликаты значений с именами IT, Physics и Arts.

SELECT d.DepartmentName
FROM Students AS s
INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;

Это даст вам повторяющиеся значения для названия отдела:

SQLite - выберите, где, предел, количество, группировка, объединение

Обратите внимание, как существуют дублирующиеся значения для названия отдела. Теперь мы будем использовать ключевое слово DISTINCT с тем же запросом, чтобы удалить эти дубликаты и получить только уникальные значения. Нравится:

SELECT DISTINCT d.DepartmentName
FROM Students AS s
INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;

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

SQLite - выберите, где, предел, количество, группировка, объединение

заполнитель

Агрегаты SQLite — это встроенные функции, определенные в SQLite, которые группируют несколько значений нескольких строк в одно значение.

Вот агрегаты, поддерживаемые SQLite:

SQLite AVG ()

Возвращает среднее для всех значений х.

Пример:

В следующем примере мы получим среднюю оценку, которую студенты получают за все экзамены:

SELECT AVG(Mark) FROM Marks;

Это даст вам значение «18.375»:

SQLite - выберите, где, предел, количество, группировка, объединение

Эти результаты получены путем суммирования всех значений меток, поделенных на их количество.

COUNT () — COUNT (X) или COUNT (*)

Возвращает общее количество раз, когда появилось значение x. И вот несколько вариантов, которые вы можете использовать с COUNT:

  • COUNT (x): считает только значения x, где x — имя столбца. Он будет игнорировать значения NULL.
  • COUNT (*): Подсчитать все строки из всех столбцов.
  • COUNT (DISTINCT x): Вы можете указать ключевое слово DISTINCT перед x, чтобы получить количество различных значений x.

пример

В следующем примере мы получим общее количество отделов с COUNT (DepartmentId), COUNT (*) и COUNT (DISTINCT DepartmentId) и их различия:

SELECT COUNT(DepartmentId), COUNT(DISTINCT DepartmentId), COUNT(*) FROM Students;

Это даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

Следующим образом:

  • COUNT (DepartmentId) подсчитает все идентификаторы отдела и проигнорирует нулевые значения.
  • COUNT (DISTINCT DepartmentId) дает вам различные значения DepartmentId, которые равны только 3. Это три разных значения названия отдела. Обратите внимание, что в имени студента есть 8 значений названия отдела. Но только три различных значения: математика, информационные технологии и физика.
  • COUNT (*) подсчитывает количество строк в таблице студентов, которые составляют 10 строк для 10 студентов.

GROUP_CONCAT () — GROUP_CONCAT (X) или GROUP_CONCAT (X, Y)

Агрегатная функция GROUP_CONCAT объединяет кратные значения в одно значение с запятой для их разделения. Он имеет следующие параметры:

  • GROUP_CONCAT (X): это объединит все значения x в одну строку с запятой «,», используемой в качестве разделителя между значениями. Значения NULL будут игнорироваться.
  • GROUP_CONCAT (X, Y): это объединит значения x в одну строку со значением y, используемым в качестве разделителя между каждым значением вместо разделителя по умолчанию ‘,’. Значения NULL также будут игнорироваться.
  • GROUP_CONCAT (DISTINCT X): это объединит все различные значения x в одну строку с запятой «,», используемой в качестве разделителя между значениями. Значения NULL будут игнорироваться.

Пример GROUP_CONCAT (DepartmentName)

Следующий запрос объединит все значения названий отделов из таблицы студентов и отделов в одну строку через запятую. Таким образом, вместо того, чтобы возвращать список значений, по одному значению в каждой строке. Он вернет только одно значение в одной строке со всеми значениями, разделенными запятой:

SELECT GROUP_CONCAT(d.DepartmentName)
FROM Students AS s
INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;

Это даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

Это даст вам список значений из 8 названий отделов, объединенных в одну строку через запятую.

Пример GROUP_CONCAT (DISTINCT DepartmentName)

Следующий запрос объединит отдельные значения названия отдела из таблицы студентов и отделов в одну строку через запятую:

SELECT GROUP_CONCAT(DISTINCT d.DepartmentName)
FROM Students AS s
INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;

Это даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

Обратите внимание, как результат отличается от предыдущего результата; возвращены только три значения, которые являются разными названиями отделов, а дубликаты были удалены.

Пример GROUP_CONCAT (DepartmentName, ‘&’)

Следующий запрос объединит все значения столбца имени отдела из таблицы студентов и отделов в одну строку, но с символом «&» вместо запятой в качестве разделителя:

SELECT GROUP_CONCAT(d.DepartmentName, '&')
FROM Students AS s
INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;

Это даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

Обратите внимание, как символ «&» используется вместо символа по умолчанию «,» для разделения значений.

SQLite MAX () и MIN ()

MAX (X) возвращает вам самое высокое значение из значений X. MAX вернет значение NULL, если все значения x равны нулю. Принимая во внимание, что MIN (X) возвращает вам наименьшее значение из значений X. MIN вернет значение NULL, если все значения X равны нулю.

пример

В следующем запросе мы будем использовать функции MIN и MAX, чтобы получить самую высокую оценку и самую низкую оценку из таблицы « Marks »:

SELECT MAX(Mark), MIN(Mark) FROM Marks;

Это даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

SQLite SUM (x), Всего (x)

Они оба вернут сумму всех значений x. Но они отличаются в следующем:

  • SUM вернет ноль, если все значения равны нулю, а Total вернет 0.
  • ВСЕГО всегда возвращает значения с плавающей запятой. SUM возвращает целочисленное значение, если все значения x являются целыми числами. Однако, если значения не являются целыми числами, он вернет значение с плавающей запятой.

пример

В следующем запросе мы будем использовать SUM и total для получения суммы всех отметок в таблицах « Marks »:

SELECT SUM(Mark), TOTAL(Mark) FROM Marks;

Это даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

Как видите, TOTAL всегда возвращает число с плавающей запятой. Но SUM возвращает целочисленное значение, потому что значения в столбце «Марк» могут быть целыми числами.

Разница между суммой и итоговым примером:

В следующем запросе мы покажем разницу между SUM и TOTAL, когда они получат SUM из значений NULL:

SELECT SUM(Mark), TOTAL(Mark) FROM Marks WHERE TestId = 4;

Это даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

Обратите внимание, что для TestId = 4 нет отметок, поэтому для этого теста есть нулевые значения. SUM возвращает нулевое значение как пустое, тогда как TOTAL возвращает 0.

Группа по

Предложение GROUP BY используется для указания одного или нескольких столбцов, которые будут использоваться для группировки строк в группы. Строки с одинаковыми значениями будут собраны (сгруппированы) в группы.

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

Пример:

Следующий запрос даст вам общее количество студентов, присутствующих на каждом факультете.

SELECT d.DepartmentName, COUNT(s.StudentId) AS StudentsCount
FROM Students AS s 
INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId
GROUP BY d. DepartmentName;

Это даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

Предложение GROUPBY DepartmentName объединит всех студентов в группы по одному для каждого названия отделения. Для каждой группы «отдела» он будет рассчитывать на студентов.

HAVING пункт

Если вы хотите отфильтровать группы, возвращаемые предложением GROUP BY, вы можете указать предложение «HAVING» с выражением после GROUP BY. Выражение будет использоваться для фильтрации этих групп.

пример

В следующем запросе мы выберем те отделы, в которых работают только два студента:

SELECT d.DepartmentName, COUNT(s.StudentId) AS StudentsCount
FROM Students AS s 
INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId
GROUP BY d. DepartmentName
HAVING COUNT(s.StudentId) = 2;

Это даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

Предложение HAVING COUNT (S.StudentId) = 2 отфильтровывает возвращаемые группы и возвращает только те группы, которые содержат ровно двух студентов. В нашем случае на факультете искусств обучаются 2 студента, поэтому он отображается в выводе.

SQLite Query & Subquery

Внутри любого запроса вы можете использовать другой запрос либо в SELECT, INSERT, DELETE, UPDATE, либо в другом подзапросе.

Этот вложенный запрос называется подзапросом. Теперь мы увидим несколько примеров использования подзапросов в предложении SELECT. Однако в руководстве по изменению данных мы увидим, как мы можем использовать подзапросы с инструкциями INSERT, DELETE и UPDATE.

Использование подзапроса в примере предложения FROM

В следующем запросе мы включим подзапрос в предложение FROM:

SELECT
  s.StudentName, t.Mark
FROM Students AS s 
INNER JOIN
(
   SELECT StudentId, Mark
   FROM Tests AS t
   INNER JOIN Marks AS m ON t.TestId = m.TestId
)  ON s.StudentId = t.StudentId;

Запрос:

   SELECT StudentId, Mark
   FROM Tests AS t
   INNER JOIN Marks AS m ON t.TestId = m.TestId

Приведенный выше запрос называется здесь подзапросом, потому что он вложен в предложение FROM. Обратите внимание, что мы дали ему псевдоним «t», чтобы мы могли ссылаться на столбцы, возвращаемые из него в запросе.

Этот запрос даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

Так что в нашем случае

  • s.StudentName выбирается из основного запроса, который дает имя студентов и
  • t.Mark выбран из подзапроса; что дает оценки, полученные каждым из этих студентов

Использование подзапроса в примере предложения WHERE

В следующем запросе мы включим подзапрос в предложение WHERE:

SELECT DepartmentName
FROM Departments AS d
WHERE NOT EXISTS (SELECT DepartmentId 
                  FROM Students AS s 
                  WHERE d.DepartmentId = s.DepartmentId);

Запрос:

SELECT DepartmentId 
FROM Students AS s 
WHERE d.DepartmentId = s.DepartmentId

Приведенный выше запрос называется здесь подзапросом, потому что он вложен в предложение WHERE. Подзапрос вернет значения DepartmentId, которые будут использоваться оператором NOT EXISTS.

Этот запрос даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

В вышеприведенном запросе мы выбрали отдел, в котором нет студентов. Какой отдел «Математика» здесь.

Операции над множествами — UNION, Intersect

SQLite поддерживает следующие операции SET:

СОЮЗ И СОЮЗ ВСЕХ

Он объединяет один или несколько наборов результатов (группа строк), возвращаемых из нескольких операторов SELECT, в один набор результатов.

UNION будет возвращать различные значения. Однако UNION ALL не будет содержать дубликаты.

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

Пример UNION

В следующем примере мы получим список DepartmentId из таблицы студентов и список DepartmentId из таблицы кафедры в том же столбце:

SELECT DepartmentId AS DepartmentIdUnioned FROM Students
UNION
SELECT DepartmentId FROM Departments;

Это даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

Запрос возвращает только 5 строк, которые являются различными значениями идентификатора отдела. Обратите внимание на первое значение, которое является нулевым значением.

Пример SQLite UNION ALL

В следующем примере мы получим список DepartmentId из таблицы студентов и список DepartmentId из таблицы кафедры в том же столбце:

SELECT DepartmentId AS DepartmentIdUnioned FROM Students
UNION ALL
SELECT DepartmentId FROM Departments;

Это даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

Запрос вернет 14 строк, 10 строк из таблицы студентов и 4 из таблицы отделов. Обратите внимание, что в возвращаемых значениях есть дубликаты. Также обратите внимание, что имя столбца было указано в первом операторе SELECT.

Теперь давайте посмотрим, как UNION all даст разные результаты, если мы заменим UNION ALL на UNION:

SQLite INTERSECT

Возвращает значения, существующие в обоих наборах результатов. Значения, которые существуют в одном из комбинированных результатов, будут игнорироваться.

пример

В следующем запросе мы выберем значения DepartmentId, которые существуют в таблицах студентов и отделов в столбце DepartmentId:

SELECT DepartmentId FROM Students
Intersect
SELECT DepartmentId FROM Departments;

Это даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

Запрос возвращает только три значения 1, 2 и 3. Какие значения существуют в обеих таблицах.

Однако значения NULL и 4 не были включены, поскольку значение NULL существует только в таблице студентов, а не в таблице отделов. И значение 4 существует в таблице отделов, а не в таблице студентов.

Вот почему оба значения NULL и 4 были проигнорированы и не включены в возвращаемые значения.

КРОМЕ

Предположим, если у вас есть два списка строк, list1 и list2, и вы хотите, чтобы строки только из list1, которого нет в list2, вы можете использовать предложение «EXCEPT». Предложение EXCEPT сравнивает два списка и возвращает те строки, которые существуют в list1 и не существуют в list2.

пример

В следующем запросе мы выберем значения DepartmentId, которые существуют в таблице департаментов, но не существуют в таблице студентов:

SELECT DepartmentId FROM Departments
EXCEPT
SELECT DepartmentId FROM Students;

Это даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

Запрос возвращает только значение 4. Это единственное значение, которое существует в таблице отделов и не существует в таблице студентов.

Обработка NULL

Значение NULL является специальным значением в SQLite. Он используется для представления значения, которое является неизвестным или отсутствует значение. Обратите внимание, что нулевое значение полностью отличается от значения « 0 » или «пусто». Поскольку 0 и пустое значение является известным значением, однако, нулевое значение неизвестно.

Значения NULL требуют специальной обработки в SQLite, теперь мы увидим, как обрабатывать значения NULL.

Поиск значений NULL

Вы не можете использовать оператор нормального равенства (=) для поиска нулевых значений. Например, следующий запрос ищет студентов с нулевым значением DepartmentId:

SELECT * FROM Students WHERE DepartmentId = NULL;

Этот запрос не даст никакого результата:

SQLite - выберите, где, предел, количество, группировка, объединение

Поскольку значение NULL не равно никакому другому значению, включает само нулевое значение, поэтому оно не вернуло никакого результата.

  • Однако, чтобы запрос работал, вы должны использовать оператор «IS NULL» для поиска нулевых значений следующим образом:
SELECT * FROM Students WHERE DepartmentId IS NULL;

Это даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

Запрос вернет тех студентов, которые имеют нулевое значение DepartmentId.

  • Если вы хотите получить те значения, которые не равны NULL, вы должны использовать оператор « IS NOT NULL », например:
SELECT * FROM Students WHERE DepartmentId IS NOT NULL;

Это даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

Запрос вернет тех студентов, которые не имеют значения NULL DepartmentId.

Условные результаты

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

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

Например, если у вас есть столбец «Оценка» и вы хотите выбрать текстовое значение на основе значения оценки следующим образом:

— «Отлично», если оценка выше 85.

— «Очень хорошо», если оценка от 70 до 85.

— «Хорошо», если оценка составляет от 60 до 70.

Затем вы можете использовать выражение CASE, чтобы сделать это.

Это может быть использовано для определения некоторой логики в предложении SELECT, чтобы вы могли выбирать определенные результаты в зависимости от определенных условий, таких как, например, оператор if.

Оператор CASE может быть определен с различными синтаксисами следующим образом:

  1. Вы можете использовать разные условия:
CASE 
  WHEN condition1 THEN result1
  WHEN condition2 THEN result2
  WHEN condition3 THEN result3
  …
  ELSE resultn
END
  1. Или вы можете использовать только одно выражение и выбирать разные возможные значения:
CASE expression
  WHEN value1 THEN result1
  WHEN value2 THEN result2
  WHEN value3 THEN result3
  …
  ELSE restuln 
END

Обратите внимание, что предложение ELSE является необязательным.

пример

В следующем примере мы будем использовать выражение CASE со значением NULL в столбце «Идентификатор отдела» в таблице «Студенты» для отображения текста «Нет отдела» следующим образом:

SELECT 
  StudentName,
  CASE 
    WHEN DepartmentId IS NULL THEN 'No Department'
    ELSE DepartmentId 
  END AS DepartmentId
FROM Students;
  • Оператор CASE проверит значение DepartmentId, является ли оно нулевым или нет.
  • Если это значение NULL, то вместо значения DepartmentId будет выбрано литеральное значение «Нет отдела».
  • Если не пустое значение, он выберет значение столбца DepartmentId.

Это даст вам вывод, как показано ниже:

SQLite - выберите, где, предел, количество, группировка, объединение

Общее табличное выражение

Общие табличные выражения (CTE) — это подзапросы, которые определены внутри оператора SQL с заданным именем.

Он имеет преимущество перед подзапросами, поскольку определяется из операторов SQL и облегчает чтение, обслуживание и понимание запросов.

Общее табличное выражение можно определить, поместив предложение WITH перед операторами SELECT следующим образом:

WITH CTEname
AS
(
   SELECT statement
)
SELECT, UPDATE, INSERT, or update statement here FROM CTE

« CTEname » — это любое имя, которое вы можете дать для CTE, вы можете использовать его для обращения к нему позже. Обратите внимание, что вы можете определить операторы SELECT, UPDATE, INSERT или DELETE для CTE

Теперь давайте рассмотрим пример использования CTE в предложении SELECT.

пример

В следующем примере мы определим CTE из оператора SELECT, а затем будем использовать его позже в другом запросе:

WITH AllDepartments
AS
(
  SELECT DepartmentId, DepartmentName
  FROM Departments
)
SELECT 
  s.StudentId,
  s.StudentName,
  a.DepartmentName
FROM Students AS s
INNER JOIN AllDepartments AS a ON s.DepartmentId = a.DepartmentId;

В этом запросе мы определили CTE и дали ему имя « AllDepartments ». Этот CTE был определен из запроса SELECT:

  SELECT DepartmentId, DepartmentName
  FROM Departments

Затем, после того как мы определили CTE, мы использовали его в запросе SELECT, который идет после него.

Обратите внимание, что общие табличные выражения не влияют на вывод запроса. Это способ определить логическое представление или подзапрос, чтобы повторно использовать их в одном запросе. Общие табличные выражения похожи на переменную, которую вы объявляете, и используете ее как подзапрос. Только оператор SELECT влияет на вывод запроса.

Этот запрос даст вам:

SQLite - выберите, где, предел, количество, группировка, объединение

Расширенные запросы

Расширенные запросы — это те запросы, которые содержат сложные объединения, подзапросы и некоторые агрегаты. В следующем разделе мы увидим пример сложного запроса:

Где мы получаем,

  • Имена кафедр со всеми студентами для каждой кафедры
  • Имя ученика разделяется запятой и
  • Показывает отдел, в котором по крайней мере три студента
SELECT 
  d.DepartmentName,
  COUNT(s.StudentId) StudentsCount,
  GROUP_CONCAT(StudentName) AS Students
FROM Departments AS d 
INNER JOIN Students AS s ON s.DepartmentId = d.DepartmentId
GROUP BY d.DepartmentName
HAVING COUNT(s.StudentId) >= 3;

Мы добавили предложение JOIN, чтобы получить DepartmentName из таблицы Departments. После этого мы добавили предложение GROUP BY с двумя агрегатными функциями:

  • «СЧЕТ», чтобы подсчитать студентов для каждой группы отдела.
  • GROUP_CONCAT для объединения студентов для каждой группы с запятой, разделенной в одной строке.
  • После GROUP BY мы использовали предложение HAVING, чтобы отфильтровать отделы и выбрать только те отделы, в которых есть как минимум 3 студента.

Результат будет следующим:

SQLite - выберите, где, предел, количество, группировка, объединение

Резюме:

Это было введение в написание запросов SQLite и основы запросов к базе данных, а также о том, как можно фильтровать возвращаемые данные. Теперь вы можете написать свои собственные запросы SQLite.