Тесты по SQL с ответами
2. Имеются элементы запроса: 1. SELECT employees.name, departments.name; 2. ON employees.department_id=departments.id; 3. FROM employees; 4. LEFT JOIN departments. В каком порядке их нужно расположить, чтобы выполнить поиск имен всех работников со всех отделов?
3. Как расшифровывается SQL?
+ structured query language
— strict question line
— strong question language
4. Запрос для выборки всех значений из таблицы «Persons» имеет вид:
— SELECT ALL Persons
+ SELECT * FROM Persons
5. Какое выражение используется для возврата только разных значений?
6. Для подсчета количества записей в таблице «Persons» используется команда:
— COUNT ROW IN Persons
+ SELECT COUNT(*) FROM Persons
— SELECT ROWS FROM Persons
7. Наиболее распространенным является тип объединения:
8. Что возвращает запрос SELECT * FROM Students?
+ Все записи из таблицы «Students»
— Рассчитанное суммарное количество записей в таблице «Students»
— Внутреннюю структуру таблицы «Students»
9. Запрос «SELECT name ___ Employees WHERE age ___ 35 AND 50» возвращает имена работников, возраст которых от 35 до 50 лет. Заполните пропущенные места в запросе.
тест 10. Какая агрегатная функция используется для расчета суммы?
11. Запрос для выборки первых 14 записей из таблицы «Users» имеет вид:
+ SELECT * FROM Users LIMIT 14
— SELECT * LIMIT 14 FROM Users
— SELECT * FROM USERS
12. Выберите верное утверждение:
— SQL чувствителен к регистру при написании запросов
— SQL чувствителен к регистру в названиях таблиц при написании запросов
— SQL нечувствителен к регистру
13. Заполните пробелы в запросе «SELECT ___, Сountry FROM ___ », который возвращает имена заказчиков и страны, где они находятся, из таблицы «Customers».
14. Запрос, возвращающий все значения из таблицы «Countries», за исключением страны с имеет вид:
— SELECT * FROM Countries EXP >
+ SELECT * FROM Countries WHERE ID !=8
— SELECT ALL FROM Countries LIMIT 8
15. Напишите запрос для выборки данных из таблицы «Customers», где условием является проживание заказчика в городе Москва
+ SELECT * FROM Customers WHERE City=”Moscow”
— SELECT City=”Moscow” FROM Customers
— SELECT Customers WHERE City=”Moscow”
16. Напишите запрос, возвращающий имена, фамилии и даты рождения сотрудников (таблица «Employees»). Условие – в фамилии содержится сочетание «se».
— SELECT FirstName, LastName, BirthDate from Employees WHERE LastName=“se”
— SELECT * from Employees WHERE LastName like “_se_”
+ SELECT FirstName, LastName, BirthDate from Employees WHERE LastName like “%se%”
17. Какая функция позволяет преобразовать все буквы в выбранном столбце в верхний регистр?
18. Напишите запрос, позволяющий переименовать столбец LastName в Surname в таблице «Employees».
— RENAME LastName into Surname FROM Employees
+ ALTER TABLE Employees CHANGE LastName Surname varchar(50)
— ALTER TABLE Surname(LastName) FROM Employees
19. Для создания новой виртуальной таблицы, которая базируется на результатах сделанного ранее SQL запроса, используется команда:
— CREATE VIRTUAL TABLE
тест-20. В таблице «Emlpoyees» содержатся данные об именах, фамилиях и зарплате сотрудников. Напишите запрос, который изменит значение зарплаты с 2000 на 2500 для сотрудника с >
— SET Salary=2500 FROM Salary=2000 FOR FROM Employees
— ALTER TABLE Employees Salary=2500 FOR >
+ UPDATE Employees SET Salary=2500 WHERE >
21. К какому результату приведет выполнение запроса DROP DATABASE Users?
+ Полное удаление базы данных «Users»
— Блокировка на внесение изменений в базу данных «Users»
— Удаление таблицы «Users» из текущей базы данных
22. В таблице «Animals» базы данных зоопарка содержится информация обо всех обитающих там животных, в том числе о лисах: red fox, grey fox, little fox. Напишите запрос, возвращающий информацию о возрасте лис.
— SELECT %fox age FROM Animals
+ SELECT age FROM Animals WHERE Animal LIKE «%fox»
— SELECT age FROM %Fox.Animals
23. Что возвращает запрос SELECT FirstName, LastName, Salary FROM Employees Where Salary<(Select AVG(Salary) FROM Employees) ORDER BY Salary DESC?
— Имена, фамилии и зарплаты сотрудников, значения которых соответствуют среднему значению среди всех сотрудников
— Имена, фамилии сотрудников и их среднюю зарплату за весь период работы, с выполнением сортировки по убыванию
+ Имена, фамилии и зарплаты сотрудников, для которых справедливо условие, что их зарплата ниже средней, с выполнением сортировки зарплаты по убыванию
24. Напишите запрос, возвращающий значения из колонки «FirstName» таблицы «Users».
+ SELECT FirstName FROM Users
— SELECT * FROM Users.FirstName
25. Напишите запрос, возвращающий информацию о заказчиках, проживающих в одном из городов: Москва, Тбилиси, Львов.
— SELECT Moscow, Tbilisi, Lvov FROM Customers
+ SELECT * FROM Customers WHERE City IN (‘Moscow’, ‘Tbilisi’, ‘Lvov’)
— SELECT City IN (‘Moscow’, ‘Tbilisi’, ‘Lvov’) FROM Customers
26. Какая команда используется для объединения результатов запроса без удаления дубликатов?
27. Оператор REVOKE предназначен для:
— Предоставления пользователю или группе пользователей прав на осуществление определенных операций;
— Задавания пользователю или группе пользователей запрета, который является приоритетным по сравнению с разрешением;
+ Отзыва у пользователя или группы пользователей выданных ранее разрешений
28. Для чего в SQL используются aliases?
+ Для назначения имени источнику данных в запросе при использовании выражения в качестве источника данных или для упрощения структуры запросов
— Для переименования полей
— Для более точного указания источника данных, если в базе данных содержатся таблицы с одинаковыми названиями полей
29. Напишите запрос, который будет возвращать значения городов из таблицы «Countries».
— SELECT * FROM Countries WHERE >
+ SELECT City FROM Countries
тест_30. Имеются элементы запроса: 1. ORDER BY Name; 2. WHERE Age В каком порядке их нужно расположить, чтобы выполнить поиск имен и фамилий студентов в возрасте до 19 лет с сортировкой по имени?
31. Для чего в SQL используется оператор PRIVILEGUE?
— Для наделения суперпользователя правами администратора
— Для выбора пользователей с последующим наделением их набором определенных прав
+ Такого оператора не существует
32. Напишите запрос, который будет возвращать текущую дату.
33. Какой оператор используется для выборки значений в пределах заданного диапазона?
Оператор выборки SELECT
1.6. Оператор выборки SELECT Оператор SELECT — один из наиболее важных и самых распространенных операторов SQL. Он позволяет производить выборки данных из таблиц и преобразовывать к нужному виду полученные результаты. Будучи очень мощным, он способен выполнять действия, эквивалентные операторам реляционной алгебры, причем в пределах единственной выполняемой команды. При его помощи можно реализовать сложные и громоздкие условия отбора данных из различных таблиц. Оператор SELECT — средство, которое полностью абстрагировано от вопросов представления данных, что помогает сконцентрировать внимание на проблемах доступа к данным. Примеры его использования наглядно демонстрируют один из основополагающих принципов больших (промышленных) СУБД: средства хранения данных и доступа к ним отделены от средств представления данных. Операции над данными производятся в масштабе наборов данных, а не отдельных записей. SELECT [ALL | DISTINCT ] <*|[имя_столбца [AS новое__имя]]>FROM имя таблицы [[AS] псевдоним] [. п] [WHERE ] [ORDER BY desc или asc] [GROUP BY ] Используются встроенные функции
Рекомендуемые материалы
Расчетно-графическая работа по курсу «Программирование». Семинар 2. Овладение навыками обработки символьных данных.Вариант 16
Программирование и алгоритмизация
Семинар 1. Разработка циклических алгоритмов,вариант 16
Программирование и алгоритмизация
Условные операторы. Циклы
Информатика
Все лекции по информатике 1 семестр (2016)
Информатика
ЛР №2 — Составные операторы и управляющие конструкции
Информатика
Описание оператора If
Информатика
COUNT – подсчет количества в группе AVJ – среднее арифметическое значение МАХ SUM MIN [HAVING <критерии выбора групп>] Обработка элементов оператора SELECT выполняется в следующей последовательности: — FROM – определяются имена используемых таблиц; — WHERE – выполняется фильтрация строк объекта в соответствии с заданными условиями, при формирования запроса можно использовать , >, and, nod, or; — GROUP BY – образуются группы строк , имеющих одно и то же значение в указанном столбце; — HAVING – фильтруются группы строк объекта в соответствии с указанным условием, определят условие по которому группы включаются в выходные данные, применяется только с GROUP BY; — SELECT – устанавливается, какие столбцы должны присутствовать в выходных данных; — ORDER BY – определяется упорядоченность результатов выполнения операторов. сортировка). Сортировать можно по нескольким полям. ASC возрастающий он принят по умолчанию, DESC убывающий; Порядок предложений и фраз в операторе SELECT не может быть изменен. Только два предложения SELECT и FROM являются обязательными, все остальные могут быть опущены. SELECT – закрытая операция: результат запроса к таблице представляет собой другую таблицу. Существует множество вариантов записи данного оператора, что иллюстрируется приведенными ниже примерами. Оператор SELECT определяет поля (столбцы), которые будут входить в результат выполнения запроса. В списке они разделяются запятыми и приводятся в такой очередности, в какой должны быть представлены в результате запроса. Если используется имя поля, содержащее пробелы или разделители, его следует заключить в квадратные скобки. Символом * можно выбрать все поля, а вместо имени поля применить выражение из нескольких имен. Если обрабатывается ряд таблиц, то (при наличии одноименных полей в разных таблицах) в списке полей используется полная спецификация поля, т.е. Имя_таблицы. Имя_поля. 1.6.1. Предложение FROM Предложение FROM задает имена таблиц и просмотров, которые содержат поля, перечисленные в операторе SELECT. Необязательный параметр псевдонима – это сокращение, устанавливаемое для имени таблицы. Пример 1. Показать фамилии и имена студентов из таблицы «студент». SELECT Fam, Imy FROM Student; При указании списка полей данные будут выводиться в соответствие с этим списком, а не в соответствии со структурой. Пример 2. Показать студентов и день рождения. SELECT Fam, Birthday FROM Student; SELECT * FROM Student; Пример 3. Показать города, в которых живут студенты. SELECT City FROM Student; SELECT DISTING City FROM Student; Пример 4. Составить список сведений о всех клиентах. SELECT * FROM Klient Пример 5. Составить список всех фирм. SELECT ALL Klient.Firma FROM Klient Или (что эквивалентно) SELECT Klient.Firma FROM Klient Результат выполнения запроса может содержать дублирующиеся значения, поскольку в отличие от операций реляционной алгебры оператор SELECT не исключает повторяющихся значений при выполнении выборки данных. Предикат DISTINCT следует применять в тех случаях, когда требуется отбросить блоки данных, содержащие дублирующие записи в выбранных полях. Значения для каждого из приведенных в инструкции SELECT полей должны быть уникальными, чтобы содержащая их запись смогла войти в выходной набор. Причиной ограничения в применении DISTINCT является то обстоятельство, что его использование может резко замедлить выполнение запросов. 1.6.2.. Предложение WHERE С помощью WHERE – параметра пользователь определяет, какие блоки данных из приведенных в списке FROM таблиц появятся в результате запроса. За ключевым словом WHERE! следует перечень условий поиска, определяющих те строки, которые должны быть выбраны при выполнении запроса. Существует пять основных типов условий поиска (или предикатов): — сравнение, сравниваются результаты вычисления одного выражения с результатами вычисления другого. — диапазон: проверяется, попадает ли результат вычисления выражения в заданный диапазон значений. — принадлежность множеству, проверяется, принадлежит ли результат вычислений выражения заданному множеству значений. — соответствие шаблону, проверяется, отвечает ли некоторое строковое значение заданному шаблону. — значение NULL: проверяется, содержит ли данный столбец определитель NULL (неизвестное значение). Пример 6. Отобразить студентов с ФИО Петров. SELECT Fam, Imy FROM Student WHERE Fam = «Петров»; Пример 7. Выбрать студентов 3 – его курса получивших стипендию. SELECT Fam, Imy FROM Student WHERE Kurs = 3 AND Stip > 0; Запрос выбирающий в следующем порядке Курс, ФИО, Стипендия. SELECT Kurs, Fam, Stip FROM Student; Сравнение В языке SQL можно использовать следующие операторы сравнения: = – равенство; < – меньше; >– больше; = – больше или равно; <> – не равно. Пример 8. Показать все операции отпуска товаров объемом больше 20. SELECT * FROM Sdelka WHERE Kolichestvo>20 Более сложные предикаты могут быть построены с помощью логических операторов AND, OR или NOT, а также скобок, используемых для определения порядка вычисления выражения. Вычисление выражения в условиях выполняется по следующим правилам. — Выражение вычисляется слева направо. — Первыми вычисляются подвыражения в скобках. — Операторы NOT выполняются до выполнения операторов AND и OR. — Операторы AND выполняются до выполнения операторов OR. Для устранения любой возможной неоднозначности рекомендуется использовать скобки. Пример 9. Вывести список товаров, цена которых больше или равна 100 и меньше или равна 150. SELECT Nazvanie,Cena FROM Tovar WHERE Cena>=100 And CenaПример 10. Вывести список клиентов из Москвы или из Самары. SELECT Familiya, GorodKlienta FROM Klient WHERE GorodKlienta=»Москва» Or GorodKlienta =»Самара» Диапазон Оператор BETWEEN используется для поиска значения внутри некоторого интервала, определяемого своими минимальным и максимальным значениями. При этом указанные значенья включаются в условие поиска. BETWEEN AND Пример 11. Вывести список товаров, цена которых лежит в диапазоне от 100 до 150. SELECT Nazvanie, Cena FROM Tovar WHERE Cena Between 100 And 150 Пример 12. Список товаров, цена которых не лежит в диапазоне от 100 до 150. SELECT * FROM Subject WHERE Hour BETWEEN 30 AND 40 i* Пример 13. Получить сведения о студентах получающих стипендию от 100 – 140 руб. SELECT * FROM Student WHERE Stip BETWEEN 100 AND 140 Пример 14. Вывести список товаров, цена которых лежит в диапазоне от 100 до 150. SELECT Nazvanie, Cena FROM Tovar WHERE Cena Between 100 And 150 Принадлежность множеству Оператор IN используется для сравнения некоторого значения со списком заданных значений, при этом проверяется, соответствует ли результат вычисления выражения одному из значений в предоставленном списке. При помощи оператора IN может быть достигнут тот же результат, что и в случае применения оператора OR, однако оператор IN выполняется быстрее. IN (, ) Пример 15. Вывести список клиентов из Москвы или из Самары SELECT Familiya, GorodKlienta FROM Klient WHERE GorodKlienta in («Москва», «Самара») NOT IN используется для отбора любых значений, кроме тех, которые указаны в представленном списке. Пример 16. Вывести список клиентов, проживающих не в Москве и не в Самаре. SELECT Familiya, GorodKlienta FROM Klient WHERE GorodKlienta Not in («Москва»,»Самара») Пример 17. Получить список предметов 1 – ого, 2 – ого семестра. SELECT * FROM Subject WHERE Curs IN (1, 2) 4 Пример 18. Получить фамилии студентов 1 – ого, 4 – ого курса. SELECT Fam FROM Student WHERE Curs IN (1, 4) Пример 19. Определить товары, покупку которых осуществляют только клиенты из Москвы, и никто другой. SELECT DISTINCT Tovar.Nazvanie, Klient. GorodKlientа FROM Tovar INNER JOIN (Klient INNER JOIN Sdelka ON Klient.KodKlientа=Sdelka.KodKlientа) ON Tovar. КодTovarа=Sdelka. Kod Tovarа WHERE Tovar.Nazvanie NOT IN (SELECT Tovar.Nazvanie FROM Tovar INNER JOIN Klient INNER JOIN Sdelka ON Klient.KodKlientа=Sdelka.KodKlientа) ON Tovar.KodTovarа=Sdelka.KodTovarа WHERE Klient.GorodKlientао’Москва’) Пример 20. Какие товары ни разу не купили московские клиенты? SELECT DISTINCT Tovar.Nazvanie, Klient. GorodKlientа FROM Tovar INNER JOIN (Klient INNER JOIN Sdelka ON Klient.KodKlientа=Sdelka.KodKlientа) ON Tovar.KodTovarа=Sdelka.KodTovarа WHERE Tovar.Nazvanie NOT IN (SELECT Tovar.Nazvanie FROM Tovar INNER JOIN (Klient INNER JOIN Sdelka ON Klient.KodKlientа=Sdelka.KodKlientа) ON Tovar. KodTovarа=Sdelka.KodTovarа WHERE.GorodKlientа=’Москва’) Соответствие шаблону С помощью оператора можно выполнять сравнение выражения с заданным шаблоном, в котором допускается использование символов – заменителей: — Символ % – вместо этого символа может быть подставлено любое Kolichestvo произвольных символов. — Символ __ заменяет один символ строки. — [] – вместо символа строки будет подставлен один из возможных символов, указанный в этих ограничителях. — [ ^ ] – вместо соответствующего символа строки будут подставлены все символы, кроме указанных в ограничителях. Like применяется только с символьными выражениями. Просматривает символьное поле и выявляет совпадает ли значение поля с выражением в операторе Like. Like Пример 21. Показать фамилии студентов начинающихся с буквы А SELECT * FROM Student WHERE Fam LIKE «A%» Пример 22. Найти клиентов, у которых в номере телефона вторая цифра – 4. SELECT Klient.Familiya, Klient.Telefon FROM Klient WHERE Klient.Telefon Like»_4%» Пример 23. Найти клинтов, у которых в номере телефона вторая цифра – 2 или 4. SELiiCT Klient.Familiya, Klient.Telefon FROM Klient WHERE Klient.Telefon Like «_[24]%» Пример 24. Найти клиентов, у которых в номере телефона вторая цифра 2, 3 или 4. SELECT Klient.Familiya, Klient.Telefon FROM Klient. WHERE Klient.Telefon Like «[2 – 4]%» Пример 25. Найти клинтов, у которых в фамилии встречается слог «ро». SELECT Klient.Familiya FP ОМ Klient. WHERE Klient.Familiya Like «%ро%» Значение NULL Оператор IS NULL используется для сравнения текущего значения со значением NULL – специальным значением, указывающим на отсутствие любого значения. NULL – это не то же самое, что знак пробела (пробел – допустимый символ) или ноль (0 – допустимое число). NULL отличается и от строки нулевой длины (пустой строки). Пример 26. Найти сотрудников, у которых нет телефона (поле Телефон не содержит никакого значения). SELECT Familiya, Telefon FROM Klient WHERE Telefon Is Null Пример 27. Выборка сотрудников, у которых есть телефон (поле Телефон, содержит какое – либо значение). SELECT Klient.Familiya, Klient.Telefon FROM Klient. WHERE Klient.Telefon Is Not ull 1.6.3. Предложение ORDER BY В общем случае строки в результирующей таблице SQL – запроса никак не упорядочены. Однако их можно требуемым образом отсортировать, для чего в оператор SELECT помещается фраза ORDER BY, которая сортирует данные выходного набора в заданной последовательности. Сортировка может выполняться по нескольким полям, в этом случае они перечисляются за ключевым словом ORDER BY через запятую. Способ сортировки задается ключевым словом, указываемым в рамках параметра ORDER BY следом за названием поля, по которому выполняется сортировка. По умолчанию реализуется сортировка по возрастанию. Явно ога задается ключевым словом ASC. Для выполнения сортировки в обратной последовательности необходимо после имени поля, по которому она выполняется, указать ключевое слово DESC. Фраза ORDER BY позволяет упорядочить выбранные записи в порядке возрастания или убывания значений любого столбца или комбинации столбцов, независимо от того, присутствуют эти столбцы в таблице результата или нет. Фраза ORDER BY всегда должна быть последним элементом в операторе SELECT. Пример 28. Вывести список клиентов в алфавитном порядке. SELECT Klient.Familiya, Klient.Telefon FROM Klient ORDER BY Klient.Familiya, Пример 29. Показать записи из таблицы предметы в алфавитном порядке наименование предметов. SELECT * FROM Subject ORDER BY Name; Пример 30. Показать в убывающем порядке количество часов SELECT * FROM Subject ORDER BY Hours DESC; Пример 31. Упорядочить по 2-м полям. SELECT * FROM Subject ORDER BY Sem, Name; Лекция «16. Потери напора по длине потока» также может быть Вам полезна. Во фразе ORDER BY может быть указано и больше одного элемента. Главный (первый) ключ сортировки определяет общую упорядоченность строк результирующей таблицы. Если во всех строках результирующей таблицы значения главного ключа сортировки являются уникальными, нет необходимости использовать дополнительные ключи сортировки. Однако, если значения главного ключа не уникальны, в результирующей таблице будет присутствовать несколько строк с одним и тем же значением старшего ключа сортировки. В этом случае, возможно, придется упорядочить строки с одним и тем же значением главного ключа по какому – либо дополнительному ключу сортировки. Пример 32. Вывести список фирм и клиентов. Названия фирм упорядочить в алфавитном порядке, имена клиентов в каждой фирме отсортировать в обратном порядке. SELECT Klient.Firma, Klient.Familiya FROM Klient ORDER BY Klient.Firma, Klient.Familiya DESCкритерии>
Поделитесь ссылкой:
Рекомендуемые лекции
- Вещества вторичного синтеза
- Приборы наблюдения
- Вопрос 13
- 16. Потери напора по длине потока
- 18 Нечеткие множества
SQL-Ex blog
Оптимизатор запросов SQL Server опирается на статистику для построения адекватного плана запроса. Если статистика неверна, устарела или отсутствует, вы имеете весьма слабую надежду на хорошую производительность ваших запросов. Поэтому важно понимать, как SQL Server поддерживает статистику распределения.
Что такое статистика?
Оптимизатор запросов SQL Server использует статистику распределения, чтобы определиться с тем, как выполнять ваш запрос. Эта статистика представляет собой распределение данных в столбце или столбцах. Оптимизатор запросов использует его для оценки количества строк, которые будут возвращены планом запроса. При отсутствии статистики по распределению данных оптимизатор не будет иметь возможности сравнить эффективность различных планов и, следовательно, зачастую будет вынужден просто выполнять сканирование таблицы или индекса. Без статистики он не сможет узнать, содержит ли столбец искомые данные без его просмотра. При наличии статистики о содержимом столбца у оптимизатора будет значительно больше шансов сделать лучший выбор механизма доступа к данным и использования ваших индексов.
Статистика распределения создается автоматически при создании индекса. Если у вас настроено автоматическое создание статистики (установка по умолчанию параметра базы данных AUTO_CREATE_STATISTICS), вы будете получать созданную статистику при всяком обращении к столбцу в предложениях запроса, выполняющих фильтрацию или задающих критерии соединения JOIN.
Данные измеряются двумя различными способами в пределах единого набора статистики: по плотности и по распределению.
Плотность
Плотность проще понять; она представляет собой отношение, которое просто показывает, сколько уникальных значений содержится в данном столбце или наборе столбцов. Формула проще простого:
Плотность = 1/Число различных значений столбца (столбцов)
Она позволяет вам написать запрос к вашей таблице, чтобы точно увидеть, какой должна быть плотность:
SELECT 1.0 / COUNT(DISTINCT MyColumn)
FROM dbo.MyTable;
Вы также можете увидеть плотность для комбинации столбцов. Для этого в запросе достаточно сначала получить уникальную комбинацию списка столбцов:
SELECT 1.0 / COUNT(*)
FROM (SELECT DISTINCT FirstColumn,
SecondColumn
FROM dbo.MyTable) AS DistinctRows;
И, конечно, вы можете добавить столбцы, по которым построен индекс, чтобы увидеть плотность индекса.
Плотность важна, поскольку она является мерой селективности данного индекса, а также одним из лучших способов оценки эффективности его использования для выполнения запроса. Высокая плотность (низкая селективность, незначительная доля уникальных значений) делает маловероятным использование индекса оптимизатором ввиду его неэффективности для получения ваших данных. Например, если ваш столбец содержит данные типа бит, скажем, подписан клиент на почтовую рассылку или нет, то для миллиона строк вы будете видеть только одно из двух значений. Это означает, что использование индекса или статистики для получения данных из таблицы на основе двух значений сведется к сканированию, в то время как более селективные данные, например, адрес электронной почты, приводит к более эффективному доступу к данным.
Следующая мера — распределение данных — несколько сложнее.
Распределение данных
Распределение данных представляет статистический анализ вида данных, которые находятся в первом столбце, доступном для статистики. Это справедливо также и для составного индекса, т.е. вы получите только единственный столбец данных для их распределения. Это одна из причин рекомендации размещать наиболее селективный столбец первым в индексе. Однако помните, что это только предложение, и существует множество исключений, например, если первый столбец сортирует данные более эффективно при том, что он не самый селективный. Вернемся, однако, к распределению данных. Механизм хранения информации о распределении называется гистограммой. По статистическому определению гистограммой является визуальное представление распределения данных; однако статистика распределения использует более общий математический смысл этого термина.
Гистограмма — это функция, которая подсчитывает число вхождений данных в каждое множество категорий (известных как bins), и в статистике распределения эти категории выбираются так, чтобы представлять распределение данных. Именно эта информация может использоваться оптимизатором для оценки числа строк, возвращаемых заданным значением.
В SQL Server гистограмма содержит до 200 различных шагов, или bin’ов. Почему 200? 1) Это статистически существенно или, как мне говорят, 2) это мало, 3) это работает для большинства распределений данных в объеме до нескольких сотен миллионов строк. При больших объемах вам придется обратиться к материалам, относящимся к фильтрованной статистике, фрагментированным (секционированным) таблицам и другим архитектурным решениям. Эти 200 шагов представлены строками таблицы. Строки представляют способ распределения данных в столбце, показывая части данных, описывающих это распределение:
RANGE_HI_KEY | Это верхняя граница шага, представленного данной строкой на гистограмме. |
RANGE_ROWS | Предполагаемое количество строк, значение столбцов которых находится в пределах шага гистограммы, исключая верхнюю границу. |
EQ_ROWS | Предполагаемое количество строк, значение столбцов которых равно верхней границе шага гистограммы. |
DISTINCT_RANGE_ROWS | Предполагаемое количество строк с различающимся значением столбца в пределах шага гистограммы, исключая верхнюю границу. Если все строки уникальны, то RANGE_ROWS и DISTINCT_RANGE_ROWS будут равны. |
AVG_RANGE_ROWS | Среднее количество строк с повторяющимися значениями столбцов в пределах шага гистограммы, исключая верхнюю границу (RANGE_ROWS/DISTINCT_RANGE_ROWS для DISTINCT_RANGE_ROWS > 0). |
Эти значения определяются одним из двух способов, выборкой или полным сканированием. Когда индексы создаются или перестраиваются, вы получаете статистику, созданную полным сканированием по умолчанию. Когда статистика обновляется автоматически, SQL Server использует механизм выборки для построения гистограммы. Подход на базе выборки делает генерацию и обновление статистики очень быстрой, но она может оказаться не вполне точной. Это обусловлено механизмом выборки, который случайным образом читает данные из таблицы, а затем производит вычисления для получения данных статистики. Такой алгоритм оказывается достаточно точным для большинства наборов данных, в противном случае, если вам требуется максимально точная статистика, используйте ручное обновление или создание статистики при помощи полного сканирования.
- Если в таблице нет строк, то, когда вы добавляете строку (или строки), происходит автоматическое обновление статистики.
- Если в таблице менее 500 строк, и вы добавляете более 500. Т.е. если у вас 499 строк, то вы должны добавить строки до 999, чтобы произошло автоматическое обновление.
- Когда в таблице более 500 строк, вы должны добавить дополнительно 500 строк + 20% от размера таблицы, чтобы увидеть автоматическое обновление статистики.
Вы также можете обновлять статистику вручную. Для этого SQL Server предлагает два механизма. Во-первых, sp_updatestats. Эта процедура использует курсор для прохода по всей статистике в указанной базе данных. Она учитывает число модификаций строк, и если были выполнены какие-либо изменения, rowmodctr > 0, то обновляет статистику. Вы можете также обновить отдельную статистику с помощью UPDATE STATISTICS, указав имя. При этом вы можете задать использование FULL SCAN, чтобы гарантировать актуальную статистику, однако потребуется написание кода обслуживания, чтобы сделать это изменение постоянным.
Хватит говорить о том, что такое статистика. Давайте посмотрим на её представление и разберемся с данными, которые в ней содержатся.
DBCC SHOW_STATISTICS
- Заголовок (Header): содержит метаданные о наборе статистики.
- Плотность (Density): показывает значения плотности для столбца или столбцов, которые определяют набор статистики.
- Гистограмма (Histogram): Таблица, которая определяет описанную выше гистограмму.
Информация заголовка может оказаться весьма полезной:
- Updated: когда последний раз обновлялся этот набор статистики. Отсюда вы можете узнать о возрасте набора статистики. Если вы знаете, что в один из дней в таблицу были добавлены тысячи строк, но статистика относится к прошлой неделе, вы можете вручную обновить статистику.
- Rows и Rows Sampled: Если эти значения совпадают, вы видите набор статистики, который является результатом полного сканирования. Если они различаются, то, вероятно, статистика получена на основе выборки.
Второй набор данных представляет собой меры плотности. Вот набор, который показывает плотность составного индекса:
Столбец All density содержит значение плотности, полученное по упомянутой выше формуле. Видно, что это значение уменьшается с каждым следующим столбцом. Ясно, что наиболее селективным является первый столбец. Можно также увидеть среднюю длину (Average Length) значений, которые содержатся в столбце, и, наконец, список столбцов, составляющих каждый уровень плотности.
Наконец, следующий график показывает раздел гистограммы:
Видно как данные распределены между шагами. При этом вы можете наблюдать, насколько хорошо SQL Server распределяет вашу информацию. Поскольку все количества строк, за исключением среднего, есть целые числа, это еще один фактор, что данный набор статистики представляет собой результат полного сканирования. Если диапазоны строк представляют собой оценку, они будут представлены десятичными числами.
Вы смотрите гистограмму, когда пытаетесь понять, почему план запроса SQL Server содержит scan или seek, в то время когда вы ожидаете увидеть что-то другое. Способ, которым распределяются данные, показывает, например, среднее число строк для заданного значения в пределах некоторого диапазона, что позволяет вам понять, насколько хорошо эти данные могут использоваться оптимизатором. Если вы наблюдаете большое расхождение между строками диапазона или уникальными строками диапазона, то, вероятно, ваша статистика устарела или построена на выборке. Кроме того, если диапазон и уникальные строки сильно расходятся при том, что у вас актуальная и точная статистика, это может говорить о серьезном перекосе данных, которые требуют других подходов к индексированию и построению статистики, например, фильтрованная статистика.
Заключение
Вы можете увидеть множество статистики, поддерживаемой SQL Server. Это жизненно важная часть достижения лучшей производительности системы. Понимание того, как она работает, создается, поддерживается и как её анализировать, поможет вам в работе с собственной статистикой.
Основы SQL для выражений запроса, применяемых в ArcGIS
Structured Query Language (SQL) — это стандартный компьютерный язык, содержащий набор определенного синтаксиса и выражений, используемых для доступа и управления данными в базах данных и в других технологиях обработки данных.
Американский национальный институт стандартов (ANSI) определяет стандарт для SQL. Большинство СУБД используют этот стандарт и расширяют его, благодаря чему синтаксис SQL в разных СУБД немного отличается друг от друга.
Выражения запроса в ArcGIS соответствуют стандартным выражениям SQL. Синтаксис SQL, который вы используете в выражении, зависит от источника данных. Каждый источник данных имеет свой собственный вариант SQL, они называются диалектами SQL, к ним относятся:
- Файловые данные, включая файловые базы геоданных, шейп-файлы, виды таблиц в памяти, текстовые файлы, такие как таблицы .dbf , .csv , .txt , .xlsx и сервисы объектов, которые используют стандартизованные запросы, используют диалект ArcGIS SQL, который поддерживает подмножество возможностей SQL.
- Мобильные базы геоданных, ST_geometry SQLite , GeoPackage и Excel используют диалект SQL SQLite .
- Базы данных или многопользовательские базы геоданных используют синтаксис SQL базовой СУБД, например , Oracle , SQL Server , PostgreSQL , SAP HANA и, IBM Db2 , где каждая база данных использует свой собственный немного другой диалект SQL.
При использовании диалоговых окон ArcGIS для построения выражения SQL используется автозаполнение, чтобы помочь вам применить правильный синтаксис для запрашиваемого источника данных. По мере ввода появляется запрос, показывающий имена полей, значения, ключевые слова и операторы, поддерживаемые вашим источником данных.
Подсказка:
- Если данные в вашем выражении SQL поступают из нескольких источников данных, произойдет следующее:
- Если источниками данных являются как файловые источники, так и СУБД, будет использоваться синтаксис ArcGIS SQL.
- Если источником данных являются данные на основе файлов, будет использоваться синтаксис ArcGIS SQL.
- Если источником данных является база данных или многопользовательская база геоданных, ArcGIS передаст выражение SQL в СУБД для разрешения, и вам нужно будет проконсультироваться с документацией для вашей системы управления базой данных, чтобы узнать о синтаксисе конкретного выражения и поддерживаемых типах данных.
- Выбрать по атрибутам с помощью инструмента геообработки Выбрать в слое по атрибуту .
- Вкладка Определяющий запрос в диалоговом окне Свойства слоя .
- Вкладка Фильтры отображения на панели Символы .
- Создать запрос с помощью панели Создать новые запросы .
- Экспортируйте таблицы с помощью инструмента геообработки Экспорт таблицы .
- Экспортируйте объекты с помощью инструмента геообработки Экспорт объектов .
- Используйте инструмент геообработки Вычислить поле , чтобы создать выражение для выполнения простых или сложных вычислений значений поля.
- Используйте Выборку для запроса данных для дальнейшего анализа.
- Используйте инструмент геообработки Создать таблицу запроса , чтобы создать Вид слоя или таблицы.
- Используйте инструмент геообработки Создать векторный слой , чтобы создать такой слой.
- Создайте вид в базе данных или базе геоданных с помощью инструмента геообработки Создать вид базы данных .
- Используйте инструмент геообработки Присоединить , чтобы добавить несколько входных наборов данных в целевой набор данных.
- Используйте ProSDK Core.Data.QueryDef.
Синтаксис выражения SQL
Выражение SQL содержит комбинацию одного или нескольких значений, операторов и функций SQL, которые можно использовать для запроса или выбора подмножества объектов и записей таблиц в ArcGIS.
Все запросы SQL выражаются с помощью ключевого слова SELECT.
SELECT * FROM формирует первую часть выражения SQL и автоматически предоставляется вам в большинстве диалоговых окон ArcGIS. Например, когда вы составляете запрос, записывая синтаксис SQL, оператор SELECT используется для выбора полей из слоя или таблицы и предоставляется вам.
Следующая часть выражения SQL, которая приходит после SELECT * FROM — это предложение WHERE. Предложение WHERE используется для получения записей, соответствующих определенным критериям, и является частью выражения, которое вы должны построить.
Подсказка:
Звездочка (*) в выражении SQL используется для запроса всех столбцов.
Вот базовая форма предложения WHERE SQL-выражения:
Например, STATE_NAME = ‘Florida’ . Это выражение содержит одно предложение и выбирает все объекты, содержащие слово ‘Florida’ в поле STATE_NAME .
Для составных выражений используется следующая форма:
Например, STATE_NAME = ‘Florida’ OR (STATE_NAME = ‘South Carolina’ AND POP2010 > 15000) . Это составное выражение состоит из нескольких предложений, связанных логическим оператором И или ИЛИ, и выбирает все объекты, содержащие Florida в поле STATE_NAME , и все объекты, которые содержат как South Carolina в поле STATE_NAME , так и имеют значение больше 15000 в поле с именем POP2010 .
Подсказка:
По желанию, круглые скобки () могут использоваться для определения порядка операций в составных выражениях.
Поскольку вы выбираете столбцы в целом, то не можете ограничить оператор SELECT возвратом только некоторых столбцов в соответствующей таблице, поскольку синтаксис SELECT * жестко запрограммирован. По этой причине ключевые слова, такие как DISTINCT, ORDER BY и GROUP BY, нельзя использовать в выражении SQL в ArcGIS, за исключением случаев использования подзапросов. Чтобы узнать больше, посмотрите раздел Подзапросы ниже.
В следующих разделах описаны элементы общих выражений SQL-запросов, используемых в ArcGIS.
Часто используемые запросы: поиск строк
Строковые значения в выражениях всегда заключаются в одинарные кавычки, например:
STATE_NAME = 'California'
Строки в выражениях чувствительны к регистру, кроме случаев работы в базах геоданных в Microsoft SQL Server . Чтобы выполнять не чувствительный к регистру поиск в других источниках данных, можно использовать функцию SQL для преобразования всех значений в один регистр. Для источников данных на основе файлов, таких как файловые базы геоданных или шейп-файлы, для задания регистра выборки можно использовать функции UPPER или LOWER. Например, при помощи следующего выражения выбирается штат, имя которого написано как ‘Rhode Island’ или ‘RHODE ISLAND’:
UPPER(STATE_NAME) = 'RHODE ISLAND'
Если строка содержит одинарную кавычку, вам в первую очередь требуется использовать другую одинарную кавычку как символ управляющей последовательности, например:
NAME = 'Alfie''s Trough'
При помощи оператора LIKE (вместо оператора = ) строится поиск частей строк. Например, данное выражение выбирает Mississippi и Missouri среди названий штатов США:
STATE_NAME LIKE 'Miss%'
Символ процента (%) означает, что на этом месте может быть что угодно – один символ или сотня, или ни одного. В качестве альтернативы, для поиска с помощью подстановочного знака, представляющего один символ, используйте знак подчеркивания (_). Следующий пример показывает выражение для выбора имен Catherine Smith и Katherine Smith:
OWNER_NAME LIKE '_atherine Smith'
Можно также использовать операторы больше (>), меньше (<), больше или равно (>=), меньше или равно (<=), не равно (<>) и BETWEEN, чтобы выбирать строковые значения на основании их сортировки. Например, этот запрос выбирает все города в покрытии, названия которых начинаются с букв от М до Z:
CITY_NAME >= 'M'
Строковые функции могут использоваться для форматирования строк. Например функция LEFT возвращает определенное количество символов начиная с левого края строки. Данный запрос возвращает все штаты, начинающиеся на букву A:
LEFT(STATE_NAME,1) = 'A'
Список поддерживаемых функций вы найдете в документации по своей СУБД.
Часто используемые выражения: поиск значений NULL
Вы можете использовать ключевое слово NULL, чтобы отбирать объекты и записи, содержащие пустые поля. Перед ключевым словом NULL всегда стоит IS или IS NOT. Например, чтобы найти города, для которых не была введена численность населения по данным переписи 1996 года, можно использовать следующее выражение:
POPULATION IS NULL
Или, чтобы найти все города, для которых указана численность населения, используйте:
POPULATION96 IS NOT NULL
Часто используемые выражения: поиск чисел
Точка (.) всегда используется в качестве десятичного разделителя, независимо от региональных настроек. В выражениях в качестве разделителя десятичных знаков нельзя использовать запятую.
Вы можете запрашивать цифровые значения, используя операторы равно (=), не равно (<>), больше (>), меньше (<), больше или равно (>=) и меньше или равно (<=), а также BETWEEN (между), например:
POPULATION >= 5000
Числовые функции можно использовать для форматирования чисел. Например функция ROUND округляет до заданного количества десятичных знаков данные в файловой базе геоданных:
ROUND(SQKM,0) = 500
Список поддерживаемых числовых функций см. в документации по СУБД.
Даты и время
Общие правила и часто используемые выражения
В таких источниках данных, как база геоданных, даты хранятся в полях даты–времени. Однако в шейп-файлах это не тек. Поэтому большинство из примеров синтаксиса запроса, представленных ниже, содержит ссылки на время. В некоторых случаях часть запроса, касающаяся времени, может быть без всякого вреда пропущена, когда известно, что поле содержит только даты; в других случаях её необходимо указывать, или запрос вернет синтаксическую ошибку.
Поиск полей с датой требует внимания к синтаксису, необходимому для источника данных. Если вы создаете запрос в Конструкторе запросов в режиме Условие, правильный синтаксис будет сгенерирован автоматически. Ниже приведен пример запроса, который возвращает все записи после 1 января 2011, включительно, из файловой базы геоданных:
INCIDENT_DATE >= date '2011-01-01 00:00:00'
Примечание:
Даты хранятся в исходной базе данных относительно 30 декабря 1899 года, 00:00:00. Это действительно для всех источников данных, перечисленных здесь.
Цель этого подраздела – помочь вам в построении запросов по датам, но не по значениям времени. Когда со значением даты хранится не нулевое значение (например, январь 12, 1999, 04:00:00), то запрос только по дате не возвратит данную запись, поскольку если вы задаете в запросе только дату для поля в формате дата–время, недостающие поля времени заполняются нулями, и будут выбраны только те записи, в которых указано время 12:00:00 утра.
Таблица атрибутов отображает дату и время в удобном для пользователя формате, согласно вашим региональным установкам, а не в формате исходной базы данных. Это подходит для большинства случаев, но имеются и некоторые недостатки:
- Строка, отображаемая в SQL-запросе, может иметь только небольшое сходство со значением, показанным в таблице, особенно когда в нее входит время. Например время, введенное как 00:00:15, отображается в атрибутивной таблице как 12:00:15 AM с региональными настройками США, а сопоставимый синтаксис запроса Datefield = ‘1899-12-30 00:00:15’.
- Атрибутивная таблица не имеет сведений об исходных данных, пока вы не сохраните изменения. Она сначала попытается отформатировать значения для соответствия её собственному формату, затем, поверх сохраненных изменений, она попытается подогнать получившиеся результаты для соответствия базе данных. По этой причине, вы можете вводить время в шейп-файл, но обнаружите, что оно удаляется при сохранении ваших изменений. Поле будет содержать значение ‘1899-12-30’, которое будет отображаться как 12:00:00 AM или эквивалентно, в зависимости от ваших региональных настроек.
Синтаксис даты-времени для многопользовательских баз геоданных
Oracle
Datefield = date 'yyyy-mm-dd'
Имейте в виду, что записи, где время не равно нулю, возвращены не будут.
Альтернативный формат при запросах к датам в Oracle следующий:
Datefield = TO_DATE('yyyy-mm-dd hh:mm:ss','YYYY-MM-DD HH24:MI:SS')
Второй параметр ‘YYYY-MM-DD HH24:MI:SS’ описывает используемый при запросах формат. Актуальный запрос выглядит так:
Datefield = TO_DATE('2003-01-08 14:35:00','YYYY-MM-DD HH24:MI:SS')
Вы можете использовать более короткую версию:
TO_DATE('2003-11-18','YYYY-MM-DD')
И снова записи, где время не равно нулю, не будут возвращены.
SQL Server
Datefield = 'yyyy-mm-dd hh:mm:ss'
Часть запроса hh:mm:ss может быть опущена, когда в записях не установлено время.
Ниже приведен альтернативный формат:
Datefield = 'mm/dd/yyyy'
IBM Db2
Datefield = TO_DATE('yyyy-mm-dd hh:mm:ss','YYYY-MM-DD HH24:MI:SS')
Часть запроса hh:mm:ss не может быть опущена, даже если время равно 00:00:00.
PostgreSQL
Datefield = TIMESTAMP 'YYYY-MM-DD HH24:MI:SS' Datefield = TIMESTAMP 'YYYY-MM-DD'
Вы должны указать полностью временную метку при использовании запросов типа «равно», в или не будет возвращено никаких записей. Вы можете успешно делать запросы со следующими выражениями, если запрашиваемая таблица содержит записи дат с точными временными метками (2007-05-29 00:00:00 или 2007-05-29 12:14:25):
select * from table where date = '2007-05-29 00:00:00';
select * from table where date = '2007-05-29 12:14:25';
При использовании других операторов, таких как больше, меньше, больше или равно, или меньше или равно, вам не нужно указывать время, но это можно сделать для повышения точности. Оба эти выражения работают:
select * from table where date < '2007-05-29';
select * from table where date < '2007-05-29 12:14:25';
Файловые базы геоданных, шейп-файлы, покрытия и прочие файловые источники данных
Datefield = date 'yyyy-mm-dd'
Файловые базы геоданных поддерживают использование времени в поле даты, поэтому его можно добавить в выражение:
Datefield = date 'yyyy-mm-dd hh:mm:ss'
Шейп-файлы и покрытия не поддерживают использование времени в поле даты.
Примечание:
SQL, используемый в файловой базе геоданных, базируется на стандарте SQL-92.
Известные ограничения
Построение запросов к датам, находящимся в левой части (первой таблице) соединения, работает только для файловых источников данных, таких как файловые базы геоданных, шейп-файлы и таблицы DBF. Но возможен обходной путь при работе с другими, не файловыми, источниками, такими как многопользовательские данные, как описано ниже.
Запрос к датам левой части соединения будет выполнен успешно, если использовать ограниченную версию SQL, разработанную для файловых источников данных. Если вы не используете такой источник данных, можете перевести выражение для использования этого формата. Это можно сделать, убедившись, что выражение запроса включает поля из более чем одной присоединенной таблицы. Например, если соединены класс пространственных объектов и таблица (FC1 и Table1), и они поступают из многопользовательской базы геоданных, следующее выражение не будет выполнено или не вернет данные:
FC1.date = date #01/12/2001# FC1.date = date '01/12/2001'
Чтобы запрос был выполнен успешно, можно создать вот такой запрос:
FC1.date = date '01/12/2001' and Table1.OBJECTID > 0
Так как запрос включает поля из обеих таблиц, будет использована ограниченная версия SQL. В этом выражении Table1.OBJECTID всегда > 0 для записей, которые сопоставлены в процессе создания соединения, поэтому это выражение всегда верно для всех строк, содержащих сопоставления соединения.
Чтобы быть уверенным, что каждая запись с FC1.date = date '01/12/2001' выбрана, используйте следующий запрос:
FC1.date = date '01/12/2001' and (Table1.OBJECTID IS NOT NULL OR Table1.OBJECTID IS NULL)
Такой запрос будет выбирать все записи с FC1.date = date '01/12/2001', независимо от того, есть ли сопоставление при соединении для каждой отдельной записи.
Комбинированные выражения
Составные запросы могут комбинироваться путем соединения выражений операторами AND (И) и OR (ИЛИ). Вот пример запроса для выборки всех домов с общей площадью более 1500 квадратных футов и гаражом более чем на три машины:
AREA > 1500 AND GARAGE > 3
Когда вы используете оператор OR (ИЛИ), по крайней мере одно из двух разделенных оператором выражений, должно быть верно для выбираемой записи, например:
RAINFALL < 20 OR SLOPE >35
Используйте оператор NOT (НЕ) в начале выражения, чтобы найти объекты или записи, не соответствующие условию выражения, например:
NOT STATE_NAME = 'Colorado'
Оператор NOT можно комбинировать с AND и OR. Вот пример запроса, который выбирает все штаты Новой Англии за исключением штата Maine:
SUB_REGION = 'New England' AND NOT STATE_NAME = 'Maine'
Вычисления
Вычисления можно включить в запросы с помощью математических операторов +, –, * и /. Можно использовать вычисление между полем и числом, например:
AREA >= PERIMETER * 100
Вычисления также могут производиться между полями. Например чтобы найти районы с плотностью населения меньшим или равным 25 человек на 1 квадратную милю, можно использовать вот такой запрос:
POP1990 / AREA
Приоритет выражения в скобках
Выражения выполняются в последовательности, определяемой стандартными правилами. Например, заключённая в круглые скобки часть выражения выполняется раньше, чем часть выражения за скобками.
HOUSEHOLDS > MALES * (POP90_SQMI + AREA)
Вы можете добавить скобки в режиме Редактирование SQL вручную, или использовать команды Группировать и Разгруппировать в режиме Условие, чтобы добавить или удалить их.
Подзапросы
Подзапрос – это запрос, вложенный в другой запрос и поддерживаемый только в базах геоданных. Подзапросы могут использоваться в SQL-выражении для применения предикативных или агрегирующих функций, или для сравнения данных со значениями, хранящимися в другой таблице и т.п. Это может быть сделано с помощью ключевых слов IN или ANY. Например этот запрос выбирает только те страны, которых нет в таблице indep_countries:
COUNTRY_NAME NOT IN (SELECT COUNTRY_NAME FROM indep_countries)
Примечание:
Шейп-файлы и прочие файловые источники данных, не относящиеся к базам геоданных, не поддерживают подзапросы. Подзапросы, выполняемые на версионных многопользовательских классах объектов и таблицах, не возвращают объекты, которые хранятся в дельта-таблицах. Файловые базы геоданных имеют ограниченную поддержку подзапросов, описанных в данном разделе, в то время, как многопользовательские базы геоданных поддерживают их полностью. Информацию обо всех возможностях подзапросов к многопользовательским базам геоданных смотрите в документации по своей СУБД.
Этот запрос возвращает объекты, где GDP2006 больше, чем GDP2005 любых объектов, содержащихся в countries (странах):
GDP2006 > (SELECT MAX(GDP2005) FROM countries)
Поддержка подзапросов в файловых базах геоданных ограничена следующим:
-
Скалярные подзапросы с операторами сравнения. Скалярный подзапрос возвращает одно значение, например:
GDP2006 > (SELECT MAX(GDP2005) FROM countries)
EXISTS (SELECT * FROM indep_countries WHERE COUNTRY_NAME = 'Mexico')
Операторы
Ниже приведен полный список операторов, поддерживаемых файловыми базами геоданных, шейп-файлами, покрытиями и прочими файловыми источниками данных. Они также поддерживаются в многопользовательских базах геоданных, хотя для этих источников данных может требоваться иной синтаксис. Кроме нижеперечисленных операторов, многопользовательские базы геоданных поддерживают дополнительные возможности. Более подробную информацию см. в документации по своей СУБД.
Арифметические операторы
Для сложения, вычитания, умножения и деления числовых значений можно использовать арифметические операторы.
Арифметический оператор умножения
Арифметический оператор деления
Арифметический оператор сложения
Арифметический оператор вычитания
Операторы сравнения
Операторы сравнения используются для сравнения одного выражения с другим.
Меньше. Может использоваться со строками (сравнение основывается на алфавитном порядке) и для числовых вычислений, а также дат.
Меньше или равно. Может использоваться со строками (сравнение основывается на алфавитном порядке) и для числовых вычислений, а также дат.
Не равно. Может использоваться со строками (сравнение основывается на алфавитном порядке) и для числовых вычислений, а также дат.
Больше. Может использоваться со строками (сравнение основывается на алфавитном порядке) и для числовых вычислений, а также дат.
Больше или равно. Может использоваться со строками (сравнение основывается на алфавитном порядке) и для числовых вычислений, а также дат.
[NOT] BETWEEN x AND y
Выбирает записи, если они содержат значение больше или равное x, но меньше или равное y. Если в начале указано NOT, выбирает запись, содержащую значение вне указанного диапазона. Например это выражение выбирает все записи со значениями, которые больше или равны 1 и меньше или равны 10:
OBJECTID BETWEEN 1 AND 10
Вот эквивалент этого выражения:
OBJECTID >= 1 AND OBJECTID
Однако, выражение с оператором BETWEEN обрабатывается быстрее, если у вас поле проиндексировано.
Возвращает TRUE (истинно), если подзапрос возвращает хотя бы одну запись; в противном случае возвращает FALSE (ложно). Например, данное выражение вернет TRUE, если поле OJBECTID содержит значение 50:
EXISTS (SELECT * FROM parcels WHERE OBJECTID = 50)
EXISTS поддерживается только в файловых и многопользовательских базах геоданных.
Выбирает запись, если она содержит одну из нескольких строк или значений в поле. Если впереди стоит NOT, выбирает запись, где нет таких строк или значений. Например, это выражение будет искать четыре названия штатов:
STATE_NAME IN ('Alabama', 'Alaska', 'California', 'Florida')
Выбирает запись, если там в определенном поле есть нулевое значение. Если перед NULL стоит NOT, выбирает запись, где в определенном поле есть какое-то значение.
x [NOT] LIKE y [ESCAPE 'escape-character']
Используйте оператор LIKE (вместо оператора = ) с групповыми символами, если хотите построить запрос по части строки. Символ процента (%) означает, что на этом месте может быть что угодно – один символ или сотня, или ни одного. В качестве альтернативы, для поиска с помощью группового подстановочного знака, представляющего один символ, используйте знак подчеркивания (_). Если вам нужен доступ к несимвольным данным, используйте функцию CAST. Например, этот запрос возвращает числа, начинающиеся на 8, из целочисленного поля SCORE_INT:
CAST (SCORE_INT AS VARCHAR(10)) LIKE '8%'
Для включения символа (%) или (_) в вашу строку поиска, используйте ключевое слово ESCAPE для указания другого символа вместо escape, который в свою очередь обозначает настоящий знак процента или подчёркивания. Например данное выражение возвращает все строки, содержащие 10%, такие как 10% DISCOUNT или A10%:
AMOUNT LIKE '%10$%%' ESCAPE '$'
Логические операторы
Соединяет два условия и выбирает запись, в которой оба условия являются истинными. Например, выполнение следующего запроса выберет все дома с площадью более 1 500 квадратных футов и гаражом на две и более машины:
AREA > 1500 AND GARAGE > 2
Соединяет два условия и выбирает запись, где истинно хотя бы одно условие. Например выполнение следующего запроса выберет все дома с площадью более 1,500 квадратных футов или гаражом на две и более машины:
AREA > 1500 OR GARAGE > 2
Выбирает записи, не соответствующие указанному выражению. Например это выражение выберет все штаты, кроме Калифорнии (California):
NOT STATE_NAME = 'California'
Операторы строковой операции
Возвращает символьную строку, являющуюся результатом конкатенации двух или более строковых выражений.
FIRST_NAME || MIDDLE_NAME || LAST_NAME
Функции
Ниже приведен полный список функций, поддерживаемых файловыми базами геоданных, шейп-файлами, покрытиями и прочими файловыми источниками данных. Функции также поддерживаются в многопользовательских базах геоданных, хотя в этих источниках данных может использоваться иной синтаксис или имена функций. Кроме нижеперечисленных функций, многопользовательские базы геоданных поддерживают дополнительные возможности. Более подробную информацию см. в документации по своей СУБД.
Функции дат
Возвращает текущую дату.
EXTRACT (extract_field FROM extract_source)
Возвращает фрагмент extract_field из extract_source . Аргумент extract_source является выражением даты–времени. Аргументом extract_field может быть одно из следующих ключевых слов: YEAR, MONTH, DAY, HOUR, MINUTE или SECOND.
Возвращает текущую дату.
Строковые функции
Аргументы, обозначаемые как string_exp , могут быть названием столбца, строковой константой или результатом другой скалярной функции, где исходные данные могут быть представлены в виде символов.
Аргументы, обозначаемые character_exp , являются строками символов переменной длины.
Аргументы, указанные как start или length могут быть числовыми постоянными или результатами других скалярных функций, где исходные данные представлены числовым типом.
Строковые функции, перечисленные здесь, базируются на 1; то есть, первым символом в строке является символ 1.
Возвращает длину строкового выражения в символах.
Возвращает строку, идентичную string_exp , в которой все символы верхнего регистра изменены на символы нижнего регистра.
POSITION (character_exp IN character_exp)
Возвращает место первого символьного выражения во втором символьном выражении. Результат – число с точностью, определяемой реализацией и коэффициентом кратности 0.
SUBSTRING (string_exp FROM start FOR length)
Возвращает символьную строку, извлекаемую из string_exp , начинающуюся с символа, положение которого определяется символами start и length .
TRIM ( BOTH | LEADING | TRAILING trim_character FROM string_exp)
Возвращает string_exp с удаленным trim_character с начала, с конца или с обоих концов строки.
Возвращает строку, идентичную string_exp , в которой все символы нижнего регистра изменены на символы верхнего регистра.
Числовые функции
Все числовые функции возвращают числовые значения.
Аргументы, обозначенные как numeric_exp , float_exp или integer_exp , могут быть именем столбца, результатом другой скалярной функции или числовой константой, где исходные данные могут быть представлены числовым типом.
Возвращает абсолютное значение numeric_exp .
Возвращает угол в радианах, равный арккосинусу float_exp .
Возвращает угол в радианах, равный арксинусу float_exp .
Возвращает угол в радианах, равный арктангенсу float_exp .
Возвращает наименьшее целочисленное значение, большее или равное numeric_exp .
Возвращает косинус float_exp в котором float_exp —угол, выраженный в радианах.
Возвращает наибольшее целое значение, меньшее или равное numeric_exp .
Возвращает натуральный логарифм float_exp .
Возвращает логарифм по основанию 10 float_exp .
MOD (integer_exp1, integer_exp2)
Возвращает результат деления integer_exp1 на integer_exp2 .
POWER (numeric_exp, integer_exp)
Возвращает значение numeric_exp в степени integer_exp .
ROUND (numeric_exp, integer_exp)
Возвращает numeric_exp , округленное до integer_exp знаков справа от десятичной точки. Если integer_exp отрицательное, numeric_exp округляется до | integer_exp | знаков слева от десятичной запятой.
Возвращает указатель знака numeric_exp . Если numeric_exp меньше нуля, возвращается -1. Если numeric_exp равно нулю, возвращается 0. Если numeric_exp больше нуля, возвращается 1.
Возвращает синус float_exp , где float_exp — угол, выраженный в радианах.
Возвращает тангенс float_exp , где float_exp — угол, выраженный в радианах.
TRUNCATE (numeric_exp, integer_exp)
Возвращает numeric_exp , округленное до integer_exp знаков справа от десятичной запятой. Если integer_exp отрицательное, numeric_exp округляется до | integer_exp | знаков слева от десятичной запятой.
Функция CAST
Функция CAST() преобразует значение или выражение из одного типа данных в другой указанный тип данных. Синтаксис выглядит так:
- Где expression - обязательный параметр, который может быть буквальным значением или допустимым выражением любого типа (например, имя столбца, переменная), который будет преобразован.
- Где data_type - обязательный параметр, а используемое ключевое слово - это результирующий тип данных, к которому будет приведено выражение. В таблице ниже представлен список ключевых слов, используемых для допустимых типов данных.
- Где length - необязательный параметр, указывающий длину результирующего типа данных.
Например, в некоторых сценариях может потребоваться строковая операция, но запрос не будет работать, если данные хранятся в поле числового типа. Однако с помощью функции CAST () вы можете преобразовать числовое поле в строку для операции SQL. Этот код преобразует числовое поле SQLNUM в текстовое поле, которое затем можно использовать в текстовой операции.
CAST(SQLNUM AS CHARACTER(12))
В следующей таблице содержатся ключевые слова, используемые для преобразования типов данных, которые могут быть указаны в верхнем или нижнем регистре.
Float (с плавающей точкой одинарной точности)
- REAL
- FLOAT [p] по умолчанию 7, что эквивалентно REAL. p > 7 эквивалентно DOUBLE PRECISION
Double (с плавающей точкой двойной точности)
- DOUBLE PRECISION
- NUMERIC (p[,s])
- DECIMAL (p[,s])
- CHAR(n)
- nvarchar(2048)
- CHARACTER(n)
Примечание:
- p - Точность
- s - Масштаб
- n - определяет длину строки в символах
- ( ) - Обязательный параметр
- [ ] - Дополнительный параметр
- Пример 1: CAST(AREA AS INTEGER) Приведение AREA, которое является типом данных Float, к INTEGER возвращает целое число и усекает любое значение результата после десятичного.
- Пример 2: CAST(Rent AS FLOAT) + Utilities > 2000.45 Приведение Rent, которое является типом данных CHARACTER, к типу данных FLOAT, а Utilities также является типом данных FLOAT.
Связанные разделы
- Написание запроса в конструкторе запросов
- Построение и изменение запросов
- Управление порядком операций в запросе SQL
В этом разделе
- Синтаксис выражения SQL
- Часто используемые запросы: поиск строк
- Часто используемые выражения: поиск значений NULL
- Часто используемые выражения: поиск чисел
- Даты и время
- Комбинированные выражения
- Вычисления
- Приоритет выражения в скобках
- Подзапросы
- Операторы
- Функции