Большинство современных веб приложений взаимодействуют с базами данных, обычно, с помощью языка под названием SQL. К счастью для нас, этот язык очень легко выучить. В этой статье мы рассмотрим простые SQL запросы и научимся их использовать для взаимодействия с MySQL базой данных.
Что Вам потребуется?
SQL (Structured Query Language) язык специально разработанный для взаимодействия с системами управления баз данных, таких как MySQL, Oracle, Sqlite и прочие… Для выполнения SQL запросов в этой статье я советую Вам установить MySQL на локальный компьютер. Также я рекомендую использовать phpMyAdmin в качестве визуального интерфейса.
Все это имеется во всеми любимом Денвере. Думаю, каждый должен знать, что это и где это взять :). Можно еще использовать WAMP или MAMP.
В денвере есть встроенная MySQL консоль. Ей мы и будем пользоваться.
Автор урока пользуется WAMPом и все скриншоты и примеры будут из этой программы и ее MySQL консоли.
CREATE DATABASE: создание базы данных
Вот и наш первый запрос. Мы создадим нашу первую БД для дальнейшей работы.
Для начала, откройте MySQL консоль и залогиньтесь. Для WAMP пароль по умолчанию пустой. То есть ничего :). Для MAMP — «root». Для Денвера необходимо уточнить.
После логина введите следующую строку и нажмите Enter:
CREATE DATABASE my_first_db;
Заметьте, что точка с запятой (;) добавляется в конце запроса, так же как и в других языках.
Также команды в SQL чувствительны к регистру. Пишем их большими буквами.
Опционально: Character Set и Collation
Если Вы хотите установить character set (набор символов) и collation (сравнение) можно написать следующую команду:
CREATE DATABASE my_first_db DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
- Тут находится список наборов символов, которые поддерживаются в MySQL.
- SHOW DATABASES: выводит список всех БД
- Эта команда используется для вывода всех имеющихся БД.
DROP DATABASE: удаление БД
Вы можете удалить существующую БД с помощью этого запроса.
Будьте осторожны с этой командой, так как она выполняется без предупреждения. Если в Вашей БД есть данные, они будут все удалены.
USE: Выбор БД
Технически это не запрос, а оператор и он не требует точки с запятой в конце.
Он сообщает MySQL выбрать БД для работы по умолчанию для текущей сессии. Теперь мы готовы создавать таблицы и делать прочие вещи с БД.
Что же такое таблица в БД?
Вы можете представить таблицу в БД в виде Excel файла.
Также как и на картинке, у таблиц есть названия колонок, ряды и информация. С помощью SQL запросов мы можем создавать такие таблицы. Мы также можем добавлять, считывать, вносить обновления и удалять информацию.
CREATE TABLE: Создание таблицы
C помощью этого запроса мы можем создавать таблицы в БД. К сожалению, документация MySQL не очень понятна для новичков по этому вопросу. Структура этого типа запросов может быть очень сложной, но мы начнем с легкой.
Следующий запрос создаст таблицу с 2-мя колонками.
CREATE TABLE users ( username VARCHAR(20), create_date DATE );
Обратите внимание, что мы можем писать наши запросы в несколько строк и с табуляциями для отступов.
Первая строка простая. Мы просто создаем таблицу с названием «users». Далее в скобках, через запятую, идет список всех колонок. После каждого названия колонки у нас идут типы информации, такие как VARCHAR или DATE.
VARCHAR(20) означает, что колонка имеет тип строки и может быть максимум 20 символов в длину. DATE также тип информации, который используется для хранения дат в таком формате: «ГГГГ-ММ-ДД».
PRIMARY KEY (первичный ключ)
Перед тем как мы выполним следующий запрос, мы также должны включить колонку для «user_id», которая будет нашим первичным ключом. Вы можете воспринимать PRIMARY KEY как информацию, которая используется для идентифицирования каждого ряда таблицы.
CREATE TABLE users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(20),
create_date DATE
);
INT делает 32 битный целый тип (например, числа). AUTO_INCREMENT автоматически генерирует новое значение ID каждый раз, когда мы добавляем новые ряды информации. Это не обязательно, но делает весь процесс проще.
Эта колонка не обязательна должна быть целым значением, но оно чаще всего используется. Наличие Первичного Ключа также не является обязательным, однако рекомендуется для архитектуры и производительности БД.
Давайте выполним запрос:
SHOW TABLES: показать все таблицы
Этот запрос позволяет получить список таблиц, которые находятся в БД.
EXPLAIN: Показать структуру таблиц
Для показа структуры существующей таблицы Вы можете пользоваться этим запросом.
- Колонки отображаются со всеми свойствами.
- DROP TABLE: удалить таблицу
- Также как и DROP DATABASES, этот запрос удаляет таблицу и ее содержание без предупреждения.
ALTER TABLE: изменить таблицу
Этот запрос также может содержать сложную структуру из-за большего количестве изменений, который он может сделать с таблицей. Давайте посмотрим на примеры.
(если Вы удалили таблицу в прошлом шаге, создайте ее снова для тестов)
ДОБАВЛЕНИЕ КОЛОНКИ
ALTER TABLE users ADD email VARCHAR(100) AFTER username;
Благодаря хорошей читабельности SQL, я думаю, что нет смысла ее подробно объяснять. Мы добавляем новую колонку «email» после «username».
УДАЛЕНИЕ КОЛОНКИ
Это было также очень легко. Используйте этот запрос с осторожностью, так как можно удалить данные без предупреждения.
- Восстановите только что удаленную колонку для дальнейших экспериментов.
- ВНЕСЕНИЕ ИЗМЕНЕНИЯ В КОЛОНКУ
- Иногда Вы можете захотеть внести изменения в свойства колонки, и Вам не надо ее полностью удалять для этого.
Этот запрос переименовал колонку пользователь в «user_name» и изменил ее тип с VARCHAR(20) на VARCHAR(30). Такое изменение не должны изменить данные в таблице.
- INSERT: Добавление информации в таблицу
- Давайте добавим некоторую информацию в таблицу используя следующий запрос.
Как Вы можете увидеть, VALUES () содержит список значений, разделенных запятыми. Все значения заключены в одинарные колонки. И значения должны быть в порядке колонок, которые были определены при создании таблицы.
Заметьте, что первое значение NULL для поля PRIMARY KEY под названием «user_id». Мы делаем это для того, чтобы ID было сгенерировано автоматически, так как колонка имеет свойство AUTO_INCREMENT. Когда информация добавляется первый раз ID будет 1. Следующий ряд — 2, и так далее…
- АЛЬТЕРНАТИВНЫЙ ВАРИАНТ
- Есть еще один вариант запроса для добавления рядов.
- В этот раз мы используем ключевое слово SET вместо VALUES, и у него нет скобок. Есть несколько нюансов:
— Колонку можно пропустить. К примеру, мы не присвоили значение для «user_id», которое по умолчанию получит свое AUTO_INCREMENT значение. Если Вы пропустите колонку с типом VARCHAR, тогда будет добавлено пустая строка.
— К каждой колонке необходимо обращаться по имени. Из за этого их можно упоминать в любом порядке, в отличии от прошлого варианта.
- АЛЬТЕРНАТИВНЫЙ ВАРИАНТ 2
- Вот еще вариант.
- Опять же, поскольку есть упоминания названия колонки, можно задавать значения в любом порядке.
- LAST_INSERT_ID()
- Вы можете использовать этот запрос для получения ID, которое было AUTO_INCREMENT для последнего ряда текущей сессии.
- NOW()
- Теперь настало время показать, как Вы можете использовать функцию MySQL в запросах.
Функция NOW() выводит текущую дату. Так что Вы можете использовать ее для автоматического установления даты колонки на текущую при вставке нового ряда.
Заметьте, что мы получили 1 предупреждение, но не обращайте на него внимания. Причина этому то, что NOW() также служит для вывода временной информации.
SELECT: Чтение данных из таблицы
Если мы добавляем информацию в таблицу значит логично было бы научиться ее оттуда считывать. Именно в этом нам и поможет запрос SELECT.
Ниже представлен самый простой возможный запрос SELECT для чтения таблицы.
В этом случае звездочка (*) означает то, что мы запросили все поля из таблицы. Если Вы хотите только определенные колонки, запрос будет выглядеть так.
Условие WHERE
Чаще всего мы заинтересованы не во всех колонках, а только в некоторых. К примеру, давайте предположим, что нам необходимы только электронный адрес для пользователя «nettuts».
- WHERE позволяет устанавливать условия в запросе и делать подробные выборки.
- Заметьте, что для равенства использоваться один знак равно (=), а не два, как в программировании.
- Вы можете также использовать сравнения.
- AND или OR могут быть использованы для объединения условий:
- Заметьте, что числовые значения не должны находиться в кавычках.
- IN()
- Это полезно для выборки по нескольким значениям
Источник: https://ruseller.com/lessons.php?id=557
Операции Select и SelectMany
34
LINQ — LINQ to Objects — Операции Select и SelectMany
Select
Операция Select используется для создания выходной последовательности одного типа элементов из входной последовательности элементов другого типа. Эти типы не обязательно должны совпадать.
Существуют два прототипа этой операции, которые описаны ниже:
Первый прототип Select public static IEnumerable Select(
this IEnumerable source,
Func selector);
Этот прототип Select принимает входную последовательность и делегат метода-селектора в качестве входных параметров, а возвращает объект, который при перечислении проходит по входной последовательности и выдает последовательность элементов типа S. Как упоминалось ранее, T и S могут быть как одного, так и разных типов.
При вызове Select делегат метода-селектора передается в аргументе selector. Метод-селектор должен принимать тип T в качестве входного, где T — тип элементов, содержащихся во входной последовательности, и возвращать элемент типа S.
Операция Select вызовет метод-селектор для каждого элемента входной последовательности, передав ему этот элемент.
Метод-селектор выберет интересующую часть входного элемента, создаст новый элемент — возможно, другого типа (даже анонимного) — и вернет его.
Второй прототип Select public static IEnumerable Select(
this IEnumerable source,
Func selector);
В этом прототипе операции Select методу-селектору передается дополнительный целочисленный параметр. Это индекс, начинающийся с нуля, входного элемента во входной последовательности.
Пример вызова первого прототипа показан ниже:
string[] cars = { «Nissan», «Aston Martin», «Chevrolet», «Alfa Romeo», «Chrysler», «Dodge», «BMW»,
«Ferrari», «Audi», «Bentley», «Ford», «Lexus», «Mercedes», «Toyota», «Volvo», «Subaru», «Жигули :)»};
IEnumerable sequence = cars.Select(p => p.Length);
foreach (int i in sequence)
Console.Write(i + » «);
Обратите внимание, что метод-селектор передается через лямбда-выражение. В данном случае лямбда-выражение вернет длину каждого элемента из входной последовательности. Также отметьте, что хотя тип входных элементов — строка, тип выходных элементов — int.
Это простой пример, потому что никакого класса не генерируется. Ниже приведена более интересная демонстрация использования первого прототипа:
var sequence = cars.Select(p => new { p, p.Length });
foreach (var i in sequence)
Console.WriteLine(i);
Обратите внимание, что лямбда-выражение создает экземпляр нового анонимного типа. Компилятор динамически сгенерирует анонимный тип, который будет содержать string р и int p.Length, и метод-селектор вернет этот вновь созданный объект. Поскольку тип возвращаемого элемента является анонимным, сослаться на него нет возможности.
Поэтому присвоить выходную последовательность Select экземпляру IEnumerable какого-то известного типа нельзя, как это делалось в первом примере, где она присваивалась переменной типа IEnumerable, представляющей выходную последовательность.
Поэтому выходная последовательность присваивается переменной, указанной с помощью ключевого слова var.
С этим кодом связана одна проблема: управлять именами членов динамически сгенерированного анонимного класса нельзя. Однако, благодаря средству инициализации объектов C#, можно написать лямбда-выражение и задать имена членов анонимного класса, как показано ниже:
var carObj = cars.Select(p => new { LastName = p, Length = p.Length });
foreach (var i in carObj)
Console.WriteLine(«Автомобиль {0} имеет длину {1} символов», i.LastName, i.Length);
Для примера второго прототипа будет добавлен индекс, который передается методу-селектору, в тип элемента выходной последовательности:
var carObj = cars.Select((p, i) => new { Index = i + 1, LastName = p });
foreach (var i in carObj)
Console.WriteLine( i.Index + «. » + i.LastName);
Этот пример выводит номер индекса плюс единица, за которым следует имя. Код производит следующий результат:
SelectMany
Операция SelectMany используется для создания выходной последовательности с проекцией «один ко многим» из входной последовательности. В то время как операция Select возвращает один выходной элемент для каждого входного элемента, SelectMany вернет ноль или более выходных элементов для каждого входного.
Существуют два прототипа этой операции, которые рассматриваются ниже:
Первый прототип SelectMany public static IEnumerable SelectMany(
this IEnumerable source,
Func selector);
Этот прототип операции получает входную последовательность элементов типа T и делегат метода-селектора, а возвращает объект, который при перечислении проходит по входной последовательности, получая каждый элемент индивидуально из входной последовательности и передавая его в метод-селектор. Последний затем возвращает объект, который во время перечисления выдает ноль или более элементов типа S в промежуточную выходную последовательность. Операция SelectMany вернет конкатенированную выходную последовательность при каждом вызове метода-селектора.
Второй прототип SelectMany public static IEnumerable SelectMany(
this IEnumerable source,
Func selector);
Этот прототип ведет себя так же, как и первый, за исключением того, что методу-селектору дополнительно передается индекс, начинающийся с нуля, каждого элемента входной последовательности.
Ниже показан пример вызова первого прототипа:
string[] cars = { «Nissan», «Aston Martin», «Chevrolet», «Alfa Romeo», «Chrysler», «Dodge», «BMW»,
«Ferrari», «Audi», «Bentley», «Ford», «Lexus», «Mercedes», «Toyota», «Volvo», «Subaru», «Жигули :)»};
IEnumerable chars = cars.SelectMany(p => p.ToArray());
foreach (char c in chars)
Console.Write(c + » «);
В предыдущем примере метод-селектор принимает на входе строку и, вызывая метод ToArray на этой строке, возвращает массив символов, который становится выходной последовательностью типа char.
Таким образом, для одного элемента входной последовательности, которым в данном случае является экземпляр string, метод-селектор возвращает последовательность символов.
Для каждой входной строки выводится последовательность char. Операция SelectMany соединяет все эти последовательности символов в единую последовательность, которую и возвращает.
Вывод предыдущего кода выглядит следующим образом:
Это достаточно простой запрос, но не слишком демонстративный в смысле типового применения. В следующем примере будут использоваться общие классы Employee и EmployeeOptionEntry.
На массиве элементов Employee будет вызвана операция SelectMany, и для каждого элемента Employee в массиве делегат метода-селектора вернет ноль или более элементов созданного анонимного класса, содержащего id и optionsCount из массива элементов EmployeeOptionEntry для объекта Employee:
Employee[] employees = Employee.GetEmployeesArray();
EmployeeOptionEntry[] empOptions = EmployeeOptionEntry.GetEmployeeOptionEntries();
var employeeOptions = employees
.SelectMany(e => empOptions
.Where(eo => eo.id == e.id)
.Select(eo => new
{
id = eo.id,
optionsCount = eo.optionsCount
}));
foreach (var item in employeeOptions)
Console.WriteLine(item);
В этом примере каждый сотрудник в массиве Employee передается в лямбда-выражение, в свою очередь, переданное операции SelectMany.
Это лямбда-выражение затем извлечет каждый элемент EmployeeOptionEntry, чей id соответствует id текущего сотрудника, переданного ему посредством операции Where. Это эффективно связывает массив Employee с массивом EmployeeOptionEntry по их членам id.
Операция Select лямбда-выражения затем создает анонимный объект, содержащий члены id и optionsCount для каждой соответствующей записи в массиве EmployeeOptionEntry.
Это значит, что лямбда-выражение возвращает последовательность из нуля или более анонимных объектов для каждого переданного сотрудника. Это дает в результате последовательность или последовательности, которые операция SelectMany может соединить вместе.
Предыдущий код даст такой вывод:
Имейте в виду, что это лямбда-выражение не особо эффективно, если входных элементов много. Дело в том, что лямбда-выражение вызывается для каждого входного элемента. После обработки первых пяти входных элементов просто возвращается пустой массив. Для повышения производительности необходимо отдать предпочтение операции Take.
Операция SelectMany также полезна для соединения множества последовательностей в одну.
Источник: https://professorweb.ru/my/LINQ/base/level2/2_2.php
SQL — Урок 8. Группировка записей и функция COUNT()
![]() |
|
Главная → Уроки SQL → Урок 8. Группировка записей и функция COUNT()
Давайте вспомним, какие сообщения и в каких темах у нас имеются. Для этого можно воспользоваться привычным запросом:
А что, если нам надо лишь узнать сколько сообщений на форуме имеется. Для этого можно воспользоваться встроенной функцией
COUNT(). Эта функция подсчитывает число строк. Причем, если в качестве аргумента этой функции выступает
*, то подсчитываются все строки таблицы. А если в качестве аргумента указывается имя столбца, то подсчитываются только те строки,
которые имеют значение в указанном столбце.
В нашем примере оба аргумента дадут одинаковый результат, т.к. все столбцы таблицы имеют тип NOT NULL.
Давайте напишем запрос, используя в качестве аргумента столбец id_topic:
SELECT COUNT(id_topic) FROM posts;
Итак, в наших темах имеется 4 сообщения. Но что, если мы хотим узнать сколько сообщений имеется в каждой теме. Для этого
нам понадобится сгруппировать наши сообщения по темам и вычислить для каждой группы количество сообщений.
Для группировки в SQL используется оператор GROUP BY. Наш запрос теперь будет выглядеть так:
SELECT id_topic, COUNT(id_topic) FROM posts GROUP BY id_topic;
Оператор GROUP BY указывает СУБД сгруппировать данные по столбцу id_topic (т.е. каждая тема — отдельная группа)
и для каждой группы подсчитать количество строк:
Ну вот, в теме с id=1 у нас 3 сообщения, а с id=4 — одно. Кстати, если бы в поле id_topic были возможны отсутствия значений, то
такие строки были бы объединены в отдельную группу со значением NULL.
Предположим, что нас интересуют только те группы, в которых больше двух сообщений. В обычном запросе мы указали бы условие
с помощью оператора WHERE, но этот оператор умеет работать только со строками, а для групп те же функции
выполняет оператор HAVING:
SELECT id_topic, COUNT(id_topic) FROM posts GROUP BY id_topic HAVING COUNT(id_topic) > 2;
В результате имеем:
В уроке 4 мы рассматривали, какие условия можно задавать оператором WHERE, те же
условия можно задавать и оператором HAVING, только надо запомнить, что WHERE фильтрует
строки, а HAVING — группы.
Итак, сегодня мы узнали, как создавать группы и как подсчитать количество строк в таблице и в группах. Вообще вместе с
оператором GROUP BY можно использовать и другие встроенные функции, но их мы будем изучать позже.
Предыдущий урок Вернуться в раздел Следующий урок
Если этот сайт оказался вам полезен, пожалуйста, посмотрите другие наши статьи и разделы.
Код кнопки: |
Теперь нажмите кнопку, что бы не забыть адрес и вернуться к нам снова.
Источник: https://www.site-do.ru/db/sql8.php
Подзапросы SQL
- SQL подзапрос — это запрос, вложенный в другой запрос;
- Подзапрос может использоваться:
o В инструкции SELECT;
o В инструкции FROM;
o В условии WHERE.
- Подзапрос может быть вложен в инструкции SELECT, INSERT, UPDATE или DELETE, а также в другой подзапрос;
- Подзапрос обычно добавляется в условие WHERE оператора SQL SELECT;
- Можно использовать операторы сравнения, такие как >, 80;
Результат запроса:
Два приведенных запроса определяют студентов, которые получают лучше оценки, чем студент StudentID «V002» (Abhay).
Можно объединить эти два запроса, вложив один запрос в другой. Подзапрос — это запрос внутри круглых скобок. Рассмотрим подзапроса в SQL пример:
Код SQL:
SELECT a.studentid, a.name, b.total_marks
FROM student a, marks b
WHERE a.studentid = b.studentid AND b.total_marks >
(SELECT total_marks
FROM marks
WHERE studentid = 'V002');- Результат запроса:
Графическое представление подзапроса SQL:- Ниже приведен синтаксис подзапроса:
- Синтаксис:
(SELECT [DISTINCT] аргументы_подзапроса_для_отбора
FROM {имя_таблицы | имя_представления}
{ имя_таблицы | имя_представления } …
[WHERE условия_поиска]
[GROUP BY выражение_объединения [,выражение_объединения] …]
[HAVING условия_поиска])Ниже приведен ряд рекомендаций, которым нужно следовать при использовании SQL подзапросов:
- Подзапрос должен быть заключен в круглые скобки;
- Подзапрос должен указываться в правой части оператора сравнения;
- Подзапросы не могут обрабатывать свои результаты, поэтому в подзапрос не может быть добавлено условие ORDER BY;
- Используйте однострочные операторы с однострочными подзапросами;
- Если подзапрос возвращает во внешний запрос значение null, внешний запрос не будет возвращать никакие строки при использовании операторов сравнения в условии WHERE.
- Однострочный подзапрос: возвращает ноль или одну строку;
- Многострочный подзапрос: возвращает одну или несколько строк;
- Многостолбцовый подзапрос: возвращает один или несколько столбцов;
- Коррелированные подзапросы: указывают один или несколько столбцов во внешней инструкции SQL. Такой подзапрос называется коррелированным, поскольку он связан с внешней инструкцией SQL;
- Вложенные подзапросы: подзапросы помещенные в другой подзапрос.
- Также можно использовать подзапрос внутри инструкций INSERT, UPDATE и DELETE.
- Инструкция INSERT может использоваться с подзапросами SQL.
- Синтаксис:
INSERT INTO имя_таблицы [ (столбец1 [, столбец2 ]) ]
SELECT [ *|столбец1 [, столбец2 ]
FROM таблица1 [, таблица2 ]
[ WHERE VALUE OPERATOR ];- Если мы хотим вставить заказы из таблицы ‘orders‘, для которых в таблице «neworder» значение advance_amount составляет 2000 или 5000, можно использовать следующий код SQL:
- Пример таблицы: orders
Источник: https://www.internet-technologies.ru/articles/podzaprosy-sql.html
SQL SELECT
Не многие владеют в совершенстве языками, а если говорит о языках программирования, то большая часть знает о них только то, что изучали в школе. Однако в полной мере об используемых языках, для управления компьютерными программами, можно почерпнуть только при глубоком изучении материала, в высших учебных заведениях и путем самостоятельного обучения.
Огромное количество программ позволяют выбирать данные для финансовых и других отчетов в считанные минуты. Одна из самых простых и к тому же удобных — SQL SELECT.
При знакомстве с ней любой программист сможет без проблем рассказать о том, что SQL – это язык программирования, помогающий структурировать все необходимые запросы, а SELECT – это команда, используемая в комбинации с SQL. Безусловно, в сочетании SQL SELECT позволяют проводить все необходимые действия, изложенные на примерах данной страницы.
В связи, с чем нижеизложенный материал более подробно и наглядно характеризует возможности SQL SELECT. Поэтому, установив программу, используемую SQL SELECT, вы сэкономите время своих сотрудников, а также деньги предприятия.
С помощью запроса SQL SELECT можно выполнять выборку данных из таблицы. Следующие примеры запросов SQL SELECT используются в таких SQL СУБД как MySQL, Oracle, Access и других.
SQL Select
Для выполнения следующих SQL запросов SELECT нам необходимо прежде всего изучить структуру таблиц.
Имя таблицы
Имя поля
Тип поля
Примечание
FAKULTET KOD_F Integer PRIMARY KEY NAZV_F Char, 30 SPEC KOD_S Integer PRIMARY KEY KOD_F Integer NAZV_S Char, 50 STUDENT KOD_STUD Integer PRIMARY KEY KOD_S Integer FAM Char, 30 IM Char, 15 OT Char, 15 STIP Decimal, 3 BALL Decimal, 3 Примеры запросов SELECT на языке SQL:
SQL Пример SELECT №1
Выбрать студентов, получающих стипендию, равную 150.SELECT fname FROM STUDENT WHERE STIP=150;
С помощью данного SQL запроса SELECT выбираются все значения из таблицы STUDENT, поле STIP которых строго равно 150.
SQL Пример SELECT №2
Выбрать студентов, имеющих балл от 82 до 90. Студенты должны быть отсортированы в порядке убывания балла.SELECT FAM FROM STUDENT WHERE BALL BETWEEN 81 AND 91 ORDER BY BALL DESC;
Как видно из SQL примера, чтобы выбрать студентов, которые имеют балл от 82 до 90, мы используем условие BETWEEN. Чтобы отсортировать в убывающем порядке DESC.
SQL Пример SELECT №3
Выбрать студентов, фамилии которых начинаются с буквы «А».SELECT
Источник: https://sql-language.ru/query-select.html
3. Вычисления внутри select
SQLпозволяет выполнять различные
арифметические операции над столбцами
результирующего отношения. В конструкцииможно использовать
константы, функции и их комбинации с
арифметическими операциями и скобками.
Например, чтобы узнать, сколько лет
прошло с 1992 года (год принятия стандарта
SQL-92) до публикации той или иной книги
можно выполнить команду:-
SELECT
title, yearpub-1992 FROM titles WHERE yearpub > 1992; -
В
арифметических выражениях допускаются
операции сложения (+), вычитания (-), -
деления
(/), умножения (*), а также различные функции
(COS, SIN, ABS –
абсолютное
значение и т.д.).В SQLтакже определены так называемые
агрегатные функции, которые совершают
действия над совокупностью одинаковых
полей в группе записей. Среди них:- AVG()— среднее по всем значениям данного поля
- COUNT()илиCOUNT (*)— число записей
- MAX()— максимальное из всех значений данного поля
- MIN()— минимальное из всех значений данного поля
- SUM()— сумма всех значений данного поля
-
Следует учитывать, что каждая агрегирующая
функция возвращает единственное
значение. -
Примеры: определить дату публикации
самой «древней» книги в нашей базе
данных - SELECT
MIN(yearpub) FROM titles; -
подсчитать количество книг в нашей базе
данных: - SELECT
COUNT(*)
FROM
titles; -
Область действия данных функции можно
ограничить с помощью логического
условия. Например, количество книг,
выпущенных после 2000 года: - SELECT
COUNT(*)
FROM
titles WHERE yearpub
> 2000;
4. Функции для работы с датой
-
В MS Access предусмотрен целый
набор встроенных функций дат и времени
Перечислим некоторые из них: -
Date()
—текущая дата, т е сегодняшнее
число, месяц и год; -
Dау(дата)
—извлекает из даты день, например
дата — 12,09,97,результат
применения функции –число12; -
Моnth(дата)
-извлекает из даты месяц, например
дата — 12,09,97,результат
применения функции -число
9; -
Уеаг(дата) —извлекает из даты год, например дата
— 12-09,97,результат применения
функции -число
97; -
Weekday(дата) —извлекает
из даты день недели в американской
системе нумерации дней, а именно в
примере -дата
12,09,97,результат применения функции
— число 6,что соответствует
пятнице, -
DatePart(HHTepBan,
дата) —здесь аргумент
«интервал» -это
сокращенное название нужного компонента
даты, а дата -конкретное
значение даты или имя поля с датой - Например:
-
DatePart(«H»,#12,09,97#)
—
день
недели
—
6,
т е
пятница, -
DatePart(«HH»,#12,09,97#)
—
неделя года
— 37, -
DatePart(«K»,#
12,09,97#)
—
квартал года
— 3 -
DatePart(«a»,#12,09,97#)
— день
-12, -
DatePart(«M»,#12,09,97#)
—месяц
—
9,
DatePart(«rrrr»,#12,09,97#) — год
-1997 -
Пример запроса. Определить, сколько лет
прошло с момента выхода статьи описавшей
стандарт SQL (предположим,
что название статьи ”СтандартSQL”) -
SELECT
Month(Date()-yearpub) - FROM
titles INNER JOIN publishers ON
titles.pub_id
= publishers.pub_idWHERE publisher
= «Стандарт SQL»;5. Задание к лабораторной работе
Замечания
по ходу выполнения лабораторной работы.- Для просмотра результата выполнения запросов необходимо чтобы в таблицах были внесены данные соответствующими сформулированным запросам. При этом данные в запросах (даты, фамилии, количество и т.п.) могут быть изменены по факту внесенных данных в БД.
- При выполнении заданий лабораторной работы все вычисляемые поля заменять синонимами, используя опцию AS в предложении SELECT.
Например:
SELECT
COUNT(*)
AS
Количество_строк
FROM
titles;Реализовать
следующие запросы средствами SQL:-
Найти заказы сделанные в январе.
-
Найти изделия, которые поставляются в количестве не меньше 10, и не больше 100.
-
Получить список изделий получаемых заказчиком “з-д «Красный луч»”, цена которых более 50 тыс. грн.
-
Сколько деталей «Болт» по всем заказам получил заказчик “з-д «Красный луч»”.
Источник: https://studfile.net/preview/3022918/page:2/
6 Язык SQL
- 5. ЯЗЫК SQL
- Язык SQL в настоящее время является промышленным стандартом, который в большей или меньшей степени поддерживает любая СУБД, претендующая на звание «реляционной».
- Необходимо сказать, что хотя SQL и задумывался как средство работы конечного пользователя, в конце концов он стал настолько сложным, что превратился в инструмент программиста.
5.1.
Типы данных SQL.
1) Символьные типы данных — содержат буквы, цифры и специальные символы.
CHAR(n) -символьные строки фиксированной длины. Длина строки определяется параметром n. CHAR без параметра соответсвует CHAR(1). Для хранения таких данных всегда отводится n байт вне зависимости от реальной длины строки.
VARCHAR(n) — символьная строка переменной длины. Для хранения данных этого типа отводится число байт, соответствующее реальной длине строки.
2) Целые типы данных — поддерживают только целые числа (дробные части и десятичные точки не допускаются). Над этими типами разрешается выполнять арифметические операции и применять к ним агрегирующие функции (определение максимального, минимального, среднего и суммарного значения столбца реляционной таблицы).
- INTEGER или INT- целое, для хранения которого отводится, как правило, 4 байта. (Замечание: число байт, отводимое для хранения того или иного числового типа данных зависит от используемой СУБД и аппаратной платформы, здесь приводятся наиболее «типичные» значения) Интервал значений от — 2147483647 до + 2147483648
- SMALLINT — короткое целое (2 байта), интервал значений от — 32767 до +32768
- 3) Вещественные типы данных — описывают числа с дробной частью.
- FLOAT и SMALLFLOAT — числа с плавающей точкой (для хранения отводится обычно 8 и 4 байта соответсвенно).
- DECIMAL(p) — тип данных аналогичный FLOAT с числом значащих цифр p.
- DECIMAL(p,n) — аналогично предыдущему, p — общее количество десятичных цифр, n — количество цифр после десятичной запятой.
4) Денежные типы данных — описывают, естественно, денежные величины. Если в ваша система такого типа данных не поддерживает, то используйте DECIMAL(p,n).
MONEY(p,n) — все аналогично типу DECIMAL(p,n). Вводится только потому, что некоторые СУБД предусматривают для него специальные методы форматирования.
5) Дата и время — используются для хранения даты, времени и их комбинаций. Большинство СУБД умеет определять интервал между двумя датами, а также уменьшать или увеличивать дату на определенное количество времени.
- DATE — тип данных для хранения даты.
- TIME — тип данных для хранения времени.
- INTERVAL — тип данных для хранения временного интервала.
- DATETIME — тип данных для хранения моментов времени (год + месяц + день + часы + минуты + секунды + доли секунд).
6) Двоичные типы данных — позволяют хранить данные любого объема в двоичном коде (оцифрованные изображения, исполняемые файлы и т.д.). Определения этих типов наиболее сильно различаются от системы к системе, часто используются ключевые слова: BINARY, BYTE, BLOB.
5.2. Операторы создания схемы базы данных.
- При описании команд предполагается, что:
- ¾ текст, набранный прописными буквами (например, CREATE TABLE) является обязательным;
- ¾ текст, набранный строчными буквами и заключенный в угловые скобки (например, ) обозначает переменную, вводимую пользователем;
- ¾ в квадратные скобки (например, [NOT NULL]) заключается необязательная часть команды;
- ¾ взаимоисключающие элементы команды разделяются вертикальной чертой (например, [UNIQUE | PRIMARY KEY]).
- Таблица 5.1 — Операторы базы данных
Команда Описание CREATE DATABASE Создание базы данных. DROP DATABASE Удаление базы данных. - А) Создание таблиц
- CREATE TABLE
- (
- [NOT NULL]
- [UNIQUE | PRIMARY KEY]
- [REFERENCES []]
, …)
- Пользователь обязан указать имя таблицы и список столбцов. Для каждого столбца обязательно указываются его имя и тип, а также опционально могут быть указаны параметры
- ¾ NOT NULL — в этом случае элементы столбца всегда должны иметь определенное значение (не NULL)
- ¾ PRIMARY KEY — столбец является первичным ключом.
- ¾ REFERNECES [] — эта конструкция определяет, что данный столбец является внешним ключом и указывает на ключ какой мастер_таблицы он ссылается.
- Пример: создать таблицу Студенты.
- Create table Студенты
- №студента char(3) not null Primary key,
- ФИО varchar(30) not null,
- Дата рождения date.
- Б) Удаление таблицы:
- DROP TABLE
- Примет: удалить таблицу Студенты.
- Drop table Студенты
5.3. Команды модификации данных
К этой группе относятся операторы добавления, изменения и удаления записей.
А) Добавить новую запись в таблицу:
INSERT INTO [ (,,…) ]
VALUES (,,..)
Список столбцов в данной команде не является обязательным параметром. В этом случае должны быть указаны значения для всех полей таблицы в том порядке, как эти столбцы были перечислены в команде CREATE TABLE.
Пример: добавить студента Иванова в таблицу Студенты.
Insert into Студенты values (115, Иванов, , 15.05.90);
Б) Удаление записей
DELETEFROM [ WHERE ]
Удаляются все записи, удовлетворяющие указанному условию. Если ключевое слово WHERE и условие отсутствуют, из таблицы удаляются все записи.
Пример: удалить все записи из таблицы Студенты.
Delete from Студенты;
5.4. Выборка данных.
Для извлечения записей из таблиц в SQL определен оператор SELECT. С помощью этой команды осуществляется не только операция реляционной алгебры «выборка» (горизонтальное подмножество), но и предварительное соединение (join) двух и более таблиц. Это наиболее сложное и мощное средство SQL, полный синтаксис оператора SELECT имеет вид:
SELECT [ALL | DISTINCT]
FROM , …
[ WHERE ]
[ GROUP BY ,… ]
[ HAVING ]
[ORDER BY [ASC | DESC],… ]
Порядок предложений в операторе SELECT должен строго соблюдаться (например, GROUP BY должно всегда предшествовать ORDER BY), иначе это приведет к появлению ошибок.
В конструкции определяется столбец или столбцы, включаемые в результат. Он может состоять из имен одного или нескольких столбцов, или из одного символа * (звездочка), определяющего все столбцы. Элементы списка разделяются запятыми.
- Примеры:
- 1) получить список всех студентов:
- SELECT ФИО студента FROM Студенты;
- 2) получить список всех полей таблицы Студенты:
- SELECT * FROM Студенты;
- В том случае, когда нас интересуют не все записи, а только те, которые удовлетворяют некому условию, это условие можно указать после ключевого слова WHERE.
- 3) найдем всех студентов, родившихся после 1990г.:
- SELECT ФИО студента FROM Студенты WHERE Дата рождения > 1990;
- 4) вывести список студентов с проходным баллом 5:
- SELECT ФИО студента, Проходной балл FROM Студенты WHERE Проходной балл=5;
- 5) вывести студентов, родившихся с 1988 по 1990гг.:
- SELECT ФИО студента FROM Студенты WHERE Дата рождения >=1995 AND Дата рождения
Источник: https://studizba.com/lectures/10-informatika-i-programmirovanie/311-konspekt-lekciy-po-bazam-dannyh/4161-6-yazyk-sql.html
Класс Select() — помогите написать условие Where для сложного запроса
Помогите, пожалуйста, написать условие Where для запроса, используя класс Select().
Запрос (обратите внимание на комментарии в тексте запроса):SELECT
a.Id AS AccountId, a.Name AS AccountName, a.Code AS AccountCode, a.CreatedOn AS AccountCreatedOn
, a.CompanyActivity
, a.OwnerId, o.Name AS OwnerName
, o.OrganizationChartId AS BranchId, b.CustomDepartmentName AS BranchNameFROM Account a
LEFT JOIN Contact o ON o.Id = a.OwnerId
LEFT JOIN AccountOrganizationChart b ON b.Id = o.OrganizationChartIdWHERE
(
EXISTS (SELECT ac.Id FROM Activity ac WHERE ac.AccountId = a.Id)
OR EXISTS (SELECT cam.Id FROM Campaign cam INNER JOIN CampaignTarget ct ON ct.CampaignId = cam.Id WHERE ct.AccountId = a.Id)
OR EXISTS (SELECT d.Id FROM Document d WHERE d.AccountId = a.Id AND d.TypeId = '{EAAEF18E-6E19-41B3-B808-473A78016220}')
)
/* УСЛОВИЯ in МОГУТ ОТСУТСТВОВАТЬ (В ЗАВИСИМОСТИ ОТ ВЫБОРА ПОЛЬЗОВАТЕЛЯ) */
AND o.OrganizationChartId IN ('что-то')
AND a.OwnerId IN ('что-то')ORDER BY a.Nameпока что удалось сделать следующее:
Terrasoft.Core.DB.Select mainQuery = new Terrasoft.Core.DB
.Select(userConnection)
.Column(«a», «Id»).As(«AccountId»).Column(«a», «Name»).As(«AccountName»)
.Column(«a», «Code»).As(«AccountCode»).Column(«a», «CreatedOn»).As(«AccountCreatedOn»)
.Column(«a», «CompanyActivity»).As(«CompanyActivity»)
.Column(«a», «OwnerId»)
.Column(new QueryColumnExpression() { ExpressionType = QueryColumnExpressionType.SqlText, SqlText = «isnull([o].[Name],'')» }).As(«OwnerName»)
.Column(«o», «OrganizationChartId»).As(«BranchId»)
.Column(new QueryColumnExpression() { ExpressionType = QueryColumnExpressionType.SqlText, SqlText = «isnull([b].[CustomDepartmentName],'')» }).As(«BranchName»).From(«Account»).As(«a»)
.LeftOuterJoin(«Contact»).As(«o»).On(«o», «Id»).IsEqual(«a», «OwnerId»)
.LeftOuterJoin(«AccountOrganizationChart»).As(«b»).On(«b», «Id»).IsEqual(«o», «OrganizationChartId»).Where()
.Exists(
new Terrasoft.Core.DB.Select(userConnection).Column(«ac»,»Id»).From(«Activity»).As(«ac»).Where(«ac»,»AccountId»).IsEqual(«a»,»Id»)
).Or()
.Exists(
cQuery /*Terrasoft.Core.DB.Select подзапрос, формируется отдельно по условию*/
).Or()
.Exists(
new Terrasoft.Core.DB.Select(userConnection).Column(«d», «Id»).From(«Document»).As(«d»).Where(«d», «AccountId»).IsEqual(«a», «Id»)
.And(«d», «TypeId»).IsEqual(new QueryColumnExpression() { ExpressionType = QueryColumnExpressionType.SqlText, SqlText = «'EAAEF18E-6E19-41B3-B808-473A78016220'» })
).OrderByAsc(«a», «Name»)
as Select;
Не получается поместить все три exists в блок, чтобы потом добавить условия in.
И еще вопрос: можно ли как-то динамически формировать блок условий (т.к. они у меня зависят от настроек пользователя), а потом «подсовывать» его select'у ?Версия 7.1.0.172
© 2002-2020 Террасофт | Конфиденциальность
Источник: https://community.terrasoft.ru/questions/klass-select-pomogite-napisat-uslovie-where-dla-sloznogo-zaprosa