Миграция на mysql 8: проблемы и решения

Операторы GROUP BY и HAVING

Последнее обновление: 19.07.2017

Для группировки данных в T-SQL применяются операторы GROUP BY и HAVING, для использования которых применяется следующий формальный синтаксис:

SELECT столбцы
FROM таблица




GROUP BY

Оператор GROUP BY определяет, как строки будут группироваться.

Например, сгруппируем товары по производителю

SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
GROUP BY Manufacturer

Первый столбец в выражении SELECT — Manufacturer представляет название группы, а второй столбец — ModelsCount представляет результат функции Count,
которая вычисляет количество строк в группе.

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

И если в выражении SELECT производится выборка по одному или нескольким столбцам и также используются агрегатные функции, то необходимо использовать
выражение GROUP BY. Так, следующий пример работать не будет, так как он не содержит выражение группировки:

SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products

Другой пример, добавим группировку по количеству товаров:

SELECT Manufacturer, ProductCount, COUNT(*) AS ModelsCount
FROM Products
GROUP BY Manufacturer, ProductCount

Оператор может выполнять группировку по множеству столбцов.

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

Следует учитывать, что выражение должно идти после выражения , но до выражения
:

SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
WHERE Price > 30000
GROUP BY Manufacturer
ORDER BY ModelsCount DESC

Фильтрация групп. HAVING

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

Применение HAVING во многом аналогично применению WHERE. Только есть WHERE применяется к фильтрации строк, то HAVING используется для фильтрации групп.

Например, найдем все группы товаров по производителям, для которых определено более 1 модели:

SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
GROUP BY Manufacturer
HAVING COUNT(*) > 1

При этом в одной команде мы можем использовать выражения WHERE и HAVING:

SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
WHERE Price * ProductCount > 80000
GROUP BY Manufacturer
HAVING COUNT(*) > 1

То есть в данном случае сначала фильтруются строки: выбираются те товары, общая стоимость которых больше 80000. Затем выбранные товары
группируются по производителям. И далее фильтруются сами группы — выбираются те группы, которые содержат больше 1 модели.

Если при этом необходимо провести сортировку, то выражение ORDER BY идет после выражения HAVING:

SELECT Manufacturer, COUNT(*) AS Models, SUM(ProductCount) AS Units
FROM Products
WHERE Price * ProductCount > 80000
GROUP BY Manufacturer
HAVING SUM(ProductCount) > 2
ORDER BY Units DESC

В данном случае группировка идет по производителям, и также выбирается количество моделей для каждого производителя (Models)
и общее количество всех товаров по всем этим моделям (Units). В конце группы сортируются по количеству товаров по убыванию.

НазадВперед

Перед началомBefore You Begin

ОграниченияLimitations and Restrictions

  • Стоимостью называется абстрактная единица себестоимости, а не единица ожидаемого времени.The cost refers to an abstracted unit of cost and not a unit of estimated time. Устанавливайте параметр cost threshold for parallelism только на симметричных мультипроцессорах.Only set cost threshold for parallelism on symmetric multiprocessors.

  • SQL ServerSQL Server не учитывает значение параметра cost threshold for parallelism при следующих условиях.ignores the cost threshold for parallelism value under the following conditions:

    • В компьютере имеется только один логический процессор.Your computer has only one logical processor.

    • Только один логический процессор доступен для SQL ServerSQL Server в соответствии с параметром конфигурации affinity mask .Only a single logical processor is available to SQL ServerSQL Server because of the affinity mask configuration option.

    • Параметру max degree of parallelism присвоено значение 1.The max degree of parallelism option is set to 1.

Логический процессор является базовой единицей процессора, которая позволяет операционной системе перенаправлять задачи или выполнить поток.A logical processor is the basic unit of processor hardware that allows the operating system to dispatch a task or execute a thread context. Каждый логический процессор одновременно может выполнять только один поток.Each logical processor can execute only one thread context at a time. Процессорное ядро — это схема, которая обеспечивает возможность расшифровки и выполнения инструкций.The processor core is the circuitry that provides ability to decode and execute instructions. Процессорное ядро может содержать один или более логических процессоров.A processor core may contain one or more logical processors. Следующие запросы Transact-SQLTransact-SQL можно использовать для получения сведений о ЦП системы.The following Transact-SQLTransact-SQL query can be used for obtaining CPU information for the system.

РекомендацииRecommendations

  • Это расширенный параметр, и изменять его следует только опытным администраторам баз данных или сертифицированным по SQL ServerSQL Server специалистам.This option is an advanced option and should be changed only by an experienced database administrator or certified SQL ServerSQL Server professional.

  • В определенных случаях может быть выбран параллельный план, даже если стоимость плана запроса меньше текущего значения параметра cost threshold for parallelism .In certain cases, a parallel plan may be chosen even though the query’s cost plan is less than the current cost threshold for parallelism value. Такое возможно, так как решение использовать параллельный или последовательный план основывается на ожидаемой стоимости, полученной ранее в процессе оптимизации.This can happen because the decision to use a parallel or serial plan is based on a cost estimate provided earlier in the optimization process. Дополнительные сведения см. в разделе .For more information, refer to the .

  • Значение по умолчанию 5 можно вполне использовать в большинстве систем, но вы можете указать другое.While the default value of 5 is adequate for most systems, a different value may be appropriate. При необходимости протестируйте приложение с более низкими или высокими значениями, чтобы оптимизировать его производительность.Perform application testing with higher and lower values if needed to optimize application performance.

PermissionsPermissions

Разрешения на выполнение хранимой процедуры sp_configure без параметров или только с первым параметром по умолчанию предоставляются всем пользователям.Execute permissions on sp_configure with no parameters or with only the first parameter are granted to all users by default. Для выполнения процедуры sp_configure с обоими параметрами для изменения параметра конфигурации или запуска инструкции RECONFIGURE необходимо иметь разрешение ALTER SETTINGS на уровне сервера.To execute sp_configure with both parameters to change a configuration option or to run the RECONFIGURE statement, a user must be granted the ALTER SETTINGS server-level permission. Разрешение ALTER SETTINGS неявным образом предоставлено предопределенным ролям сервера sysadmin и serveradmin .The ALTER SETTINGS permission is implicitly held by the sysadmin and serveradmin fixed server roles.

More HAVING Examples

The following SQL statement lists the employees that have registered more
than 10 orders:

Example

SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrdersFROM
(OrdersINNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID)
GROUP BY LastNameHAVING COUNT(Orders.OrderID) > 10;

The following SQL statement lists if the employees «Davolio» or «Fuller» have registered
more than 25 orders:

Example

SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrdersFROM Orders
INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
WHERE LastName = ‘Davolio’ OR LastName = ‘Fuller’GROUP BY LastNameHAVING
COUNT(Orders.OrderID) > 25;

Типы данных SQL

Типы данных SQL разделяются на три группы:
— строковые;
— с плавающей точкой (дробные числа);
— целые числа, дата и время.

  1. Типы данных SQL строковые

    Типы данных SQL Описание
    Строки фиксированной длиной (могут содержать буквы, цифры и специальные символы). Фиксированный размер указан в скобках. Можно записать до 255 символов
    Может хранить не более 255 символов.
    Может хранить не более 255 символов.
    Может хранить не более 65 535 символов.
    Может хранить не более 65 535 символов.
    Может хранить не более 16 777 215 символов.
    Может хранить не более 16 777 215 символов.
    Может хранить не более 4 294 967 295 символов.
    Может хранить не более 4 294 967 295 символов.
    Позволяет вводить список допустимых значений. Можно ввести до 65535 значений в SQL Тип данных ENUM список. Если при вставке значения не будет присутствовать в списке ENUM, то мы получим пустое значение.
    Ввести возможные значения можно в таком формате:
    SQL Тип данных SET напоминает ENUM за исключением того, что SET может содержать до 64 значений.
  2. Типы данных SQL с плавающей точкой (дробные числа) и целые числа

    Типы данных SQL Описание
    Может хранить числа от -128 до 127
    Диапазон от -32 768 до 32 767
    Диапазон от -8 388 608 до 8 388 607
    Диапазон от -2 147 483 648 до 2 147 483 647
    Диапазон от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807
    Число с плавающей точкой небольшой точности.
    Число с плавающей точкой двойной точности.
    Дробное число, хранящееся в виде строки.
  3. Типы данных SQL — Дата и время

    Типы данных SQL Описание
    Дата в формате ГГГГ-ММ-ДД
    Дата и время в формате
    Дата и время в формате timestamp. Однако при получении значения поля оно отображается не в формате timestamp, а в виде ГГГГ-ММ-ДД ЧЧ:ММ:СС
    Время в формате
    Год в двух значной или в четырехзначном формате.

Тип узла в качестве проверки узлаNode Type as Node Test

Для запросов к типу узла, а не к элементным узлам, используется проверка типа узла.To query for node types other than element nodes, use a node type test. Существует четыре вида проверки типа узла, как показано в следующей таблице:As shown in the following table, there are four node type tests available.

Тип узлаNode type ВозвращаетReturns ПримерExample
Верно для узла комментариев.True for a comment node.
выбирает все узлы комментариев, которые появляются после контекстного узла. selects all the comment nodes that appear after the context node.
Верно для всех узлов.True for a node of any kind.
выбирает все узлы, которые появляются перед контекстным узлом. selects all the nodes that appear before the context node.
Верно для узла инструкций по обработке.True for a processing instruction node.
выбирает все узлы инструкций по обработке в контекстном узле. selects all the processing instruction nodes within the context node.
Верно для текстового узла.True for a text node.
выбирает все текстовые узлы, являющиеся потомками контекстного узла. selects the text nodes that are children of the context node.

Если в качестве проверки узла задан тип узла, например text() или comment() …, то шаг возвращает узлы заданного типа независимо от основного узла оси.If node type, such as text() or comment() …, is specified as the node test, the step just returns nodes of the specified kind, regardless of the principal node kind of the axis. Например, следующее выражение пути возвращает только потомки узла комментариев к контекстному узлу:For example, the following path expression returns only the comment node children of the context node:

Аналогичным образом извлекает дочерние элементы потомков узла элемента> Similarly, retrieves comment node children of the element node child of the element node.

Действие пользователяUser Action

Если ошибка 605 появляется регулярно, это означает, что возникла серьезная проблема, которая должна быть решена путем выполнения следующих задач.If the 605 error is not transient, the problem is severe and must be corrected by performing the following tasks:

  1. Выясните, какие таблицы связаны с указанными в сообщении единицами распределения, запустив следующий запрос.Identify the tables associated with the allocation units specified in the message by running the following query. Замените указанными в сообщении об ошибке единицами распределения.Replace with the allocation units specified in the error message.

    USE;USE;

    GOGO

    SELECT au.allocation_unit_id, OBJECT_NAME(p.object_id) AS table_name, fg.name AS filegroup_name,SELECT au.allocation_unit_id, OBJECT_NAME(p.object_id) AS table_name, fg.name AS filegroup_name,

    au.type_desc AS allocation_type, au.data_pages, partition_numberau.type_desc AS allocation_type, au.data_pages, partition_number

    FROM sys.allocation_units AS auFROM sys.allocation_units AS au

    JOIN sys.partitions AS p ON au.container_id = p.partition_idJOIN sys.partitions AS p ON au.container_id = p.partition_id

    JOIN sys.filegroups AS fg ON fg.data_space_id = au.data_space_idJOIN sys.filegroups AS fg ON fg.data_space_id = au.data_space_id

    WHERE au.allocation_unit_id = OR au.allocation_unit_id = WHERE au.allocation_unit_id = OR au.allocation_unit_id =

    ORDER BY au.allocation_unit_id;ORDER BY au.allocation_unit_id;

    GOGO

  2. Выполните инструкцию DBCC CHECKTABLE без предложения REPAIR для таблицы, связанной со вторым идентификатором единицы распределения, указанным в сообщении об ошибке.Execute DBCC CHECKTABLE without a REPAIR clause on the table associated with the second allocation unit ID specified in the error message.

  3. Выполните инструкцию DBCC CHECKDB без предложения REPAIR как можно скорее, чтобы выявить весь поврежденный экстент в базе данных.Execute DBCC CHECKDB without a REPAIR clause as soon as possible to determine the full extent of the corruption in the entire database.

  4. Проверьте в журнале ошибок наличие других ошибок, которые обычно сопровождают ошибку 605 и выясните, не указывают ли они на какие-либо проблемы, связанные с системой или оборудованием.Check the error log for other errors that often accompany a 605 error and examine the Windows Event Log for any system or hardware related issues. Исправьте все неполадки оборудования, обнаруженные в журналах.Fix any hardware-related problems that are contained in the logs.

Если проблема не связана с оборудованием, выполните одну из следующих задач.If the problem is not hardware related, perform one of the following tasks:

Восстановите базу данных из безошибочной резервной копии.Restore the database from a known clean backup. Восстановление страниц позволяет эффективно восстанавливать из резервных копий только поврежденные страницы.You can leverage the page restore backup feature to restore just the damaged pages.

Для исправления повреждения запустите инструкцию DBCC CHECKDB с предложением REPAIR согласно рекомендации операции DBCC CHECKDB, выполненной на шаге 3.Run DBCC CHECKDB with the REPAIR clause recommended by the DBCC CHECKDB operation performed in step 3 to repair the corruption. Если в результате выполнения инструкции DBCC CHECKDB с одним из предложений REPAIR неполадка устранена не была, обратитесь к вашему основному поставщику услуг технической поддержки.If running DBCC CHECKDB with one of the REPAIR clauses does not correct the problem, contact your primary support provider

Подготовьте к просмотру выходные данные инструкции DBCC CHECKDB.Have the output from DBCC CHECKDB available for review.

Внимание!
Если достоверно неизвестно, к каким последствиям приведет выполнение инструкции DBCC CHECKDB с выбранным предложением REPAIR, перед выполнением этой инструкции обратитесь к вашему основному поставщику услуг технической поддержки.If you are not sure what effect DBCC CHECKDB with a REPAIR clause has on your data, contact your primary support provider before running this statement.

SQL References

SQL Keywords
ADD
ADD CONSTRAINT
ALTER
ALTER COLUMN
ALTER TABLE
ALL
AND
ANY
AS
ASC
BACKUP DATABASE
BETWEEN
CASE
CHECK
COLUMN
CONSTRAINT
CREATE
CREATE DATABASE
CREATE INDEX
CREATE OR REPLACE VIEW
CREATE TABLE
CREATE PROCEDURE
CREATE UNIQUE INDEX
CREATE VIEW
DATABASE
DEFAULT
DELETE
DESC
DISTINCT
DROP
DROP COLUMN
DROP CONSTRAINT
DROP DATABASE
DROP DEFAULT
DROP INDEX
DROP TABLE
DROP VIEW
EXEC
EXISTS
FOREIGN KEY
FROM
FULL OUTER JOIN
GROUP BY
HAVING
IN
INDEX
INNER JOIN
INSERT INTO
INSERT INTO SELECT
IS NULL
IS NOT NULL
JOIN
LEFT JOIN
LIKE
LIMIT
NOT
NOT NULL
OR
ORDER BY
OUTER JOIN
PRIMARY KEY
PROCEDURE
RIGHT JOIN
ROWNUM
SELECT
SELECT DISTINCT
SELECT INTO
SELECT TOP
SET
TABLE
TOP
TRUNCATE TABLE
UNION
UNION ALL
UNIQUE
UPDATE
VALUES
VIEW
WHERE

MySQL Functions
String Functions
ASCII
CHAR_LENGTH
CHARACTER_LENGTH
CONCAT
CONCAT_WS
FIELD
FIND_IN_SET
FORMAT
INSERT
INSTR
LCASE
LEFT
LENGTH
LOCATE
LOWER
LPAD
LTRIM
MID
POSITION
REPEAT
REPLACE
REVERSE
RIGHT
RPAD
RTRIM
SPACE
STRCMP
SUBSTR
SUBSTRING
SUBSTRING_INDEX
TRIM
UCASE
UPPER

Numeric Functions
ABS
ACOS
ASIN
ATAN
ATAN2
AVG
CEIL
CEILING
COS
COT
COUNT
DEGREES
DIV
EXP
FLOOR
GREATEST
LEAST
LN
LOG
LOG10
LOG2
MAX
MIN
MOD
PI
POW
POWER
RADIANS
RAND
ROUND
SIGN
SIN
SQRT
SUM
TAN
TRUNCATE

Date Functions
ADDDATE
ADDTIME
CURDATE
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURTIME
DATE
DATEDIFF
DATE_ADD
DATE_FORMAT
DATE_SUB
DAY
DAYNAME
DAYOFMONTH
DAYOFWEEK
DAYOFYEAR
EXTRACT
FROM_DAYS
HOUR
LAST_DAY
LOCALTIME
LOCALTIMESTAMP
MAKEDATE
MAKETIME
MICROSECOND
MINUTE
MONTH
MONTHNAME
NOW
PERIOD_ADD
PERIOD_DIFF
QUARTER
SECOND
SEC_TO_TIME
STR_TO_DATE
SUBDATE
SUBTIME
SYSDATE
TIME
TIME_FORMAT
TIME_TO_SEC
TIMEDIFF
TIMESTAMP
TO_DAYS
WEEK
WEEKDAY
WEEKOFYEAR
YEAR
YEARWEEK

Advanced Functions
BIN
BINARY
CASE
CAST
COALESCE
CONNECTION_ID
CONV
CONVERT
CURRENT_USER
DATABASE
IF
IFNULL
ISNULL
LAST_INSERT_ID
NULLIF
SESSION_USER
SYSTEM_USER
USER
VERSION

SQL Server Functions
String Functions
ASCII
CHAR
CHARINDEX
CONCAT
Concat with +
CONCAT_WS
DATALENGTH
DIFFERENCE
FORMAT
LEFT
LEN
LOWER
LTRIM
NCHAR
PATINDEX
QUOTENAME
REPLACE
REPLICATE
REVERSE
RIGHT
RTRIM
SOUNDEX
SPACE
STR
STUFF
SUBSTRING
TRANSLATE
TRIM
UNICODE
UPPER

Numeric Functions
ABS
ACOS
ASIN
ATAN
ATN2
AVG
CEILING
COUNT
COS
COT
DEGREES
EXP
FLOOR
LOG
LOG10
MAX
MIN
PI
POWER
RADIANS
RAND
ROUND
SIGN
SIN
SQRT
SQUARE
SUM
TAN

Date Functions
CURRENT_TIMESTAMP
DATEADD
DATEDIFF
DATEFROMPARTS
DATENAME
DATEPART
DAY
GETDATE
GETUTCDATE
ISDATE
MONTH
SYSDATETIME
YEAR

Advanced Functions
CAST
COALESCE
CONVERT
CURRENT_USER
IIF
ISNULL
ISNUMERIC
NULLIF
SESSION_USER
SESSIONPROPERTY
SYSTEM_USER
USER_NAME

MS Access Functions
String Functions
Asc
Chr
Concat with &
CurDir
Format
InStr
InstrRev
LCase
Left
Len
LTrim
Mid
Replace
Right
RTrim
Space
Split
Str
StrComp
StrConv
StrReverse
Trim
UCase

Numeric Functions
Abs
Atn
Avg
Cos
Count
Exp
Fix
Format
Int
Max
Min
Randomize
Rnd
Round
Sgn
Sqr
Sum
Val

Date Functions
Date
DateAdd
DateDiff
DatePart
DateSerial
DateValue
Day
Format
Hour
Minute
Month
MonthName
Now
Second
Time
TimeSerial
TimeValue
Weekday
WeekdayName
Year

Other Functions
CurrentUser
Environ
IsDate
IsNull
IsNumeric

SQL OperatorsSQL Data TypesSQL Quick Ref

Операторы

Можно изменить порядок полей в выборке и тогда результат также будет в другой последовательности:

1
SELECT content, id, title FROM имя таблицы;

Оператор DISTINCT убирает повторяющиеся значения в выборке:

1
SELECT DISTINCT title FROM имя таблицы;

Оператор WHERE добавляет ограничение на выборку:

1
SELECT title FROM имя таблицы WHERE id > 2;

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

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

1
2
-- такая запись также является верной, смотри правило выше
SELECT title FROM имя таблицы WHERE title > 'текст';
  • Оператор =
  • Оператор >
  • Оператор
  • Оператор >=
  • Оператор
  • Оператор или != (неравенство)

Все перечисленные операции могут быть объединены: AND, OR, NOT (изменение результата с true на false и наоборот)

Специальные операторы

Оператор IN — перечисление значений:

1
2
SELECT name FROM имя таблицы WHERE id = 2 OR id = 5 OR id = 8;
SELECT name FROM имя таблицы WHERE id IN(2, 5, 8); -- сокращённая запись используя IN

Оператор BETWEEN — диапазон значений:

1
2
3
4
5
-- выбор всех значений где id от 2 до 5
SELECT name FROM имя таблицы WHERE id BETWEEN 2 AND 5;
 
-- выбор всех полей где name находится в диапазоне от буквы A и до K
SELECT * FROM имя таблицы WHERE name BETWEEN 'A' AND 'K';

Оператор IS NULL — выбор поля без значения:NULL — это поле без значения (пустое поле).

1
2
3
4
5
-- выбор всех полей где поле name не имеет значения (равно NULL)
SELECT * FROM имя таблицы WHERE name IS NULL;
 
-- выбор всех полей где поле name не NULL
SELECT * FROM имя таблицы WHERE name IS NOT NULL;

Оператор LIKE — поиск по таблицам, используется для коротких полей (например VARCHAR):

1
2
3
4
5
6
7
8
-- Символ % указывает любую последовательность символов
SELECT img FROM имя таблицы WHERE img LIKE '%.jpg';
 
-- Символ _ указывает наличие любого ОДНОГО символа
SELECT img FROM имя таблицы WHERE img LIKE '_.jpg';
 
-- Экранирование символов \
SELECT * FROM имя таблицы WHERE name = '\'';

Полнотекстовый поиск — необходимо поставить текстовый индекс для данного поля (полей) таблицы по которым будет производиться поиск.

1
2
3
4
-- text,title поля с текстовым индексом
-- AGAINST - полнотекстовый режим поиска (полное совпадение слова), короткие слова исключаются из поиска
 
SELECT * FROM page WHERE MATCH (text,title) AGAINST ('поисковое слово');

АргументыArguments

scalar_expressionscalar_expressionВозвращаемое значение основано на указанном смещении.The value to be returned based on the specified offset. Это выражение любого типа, возвращающее единичное (скалярное) значение.It is an expression of any type that returns a single (scalar) value. scalar_expression не может быть аналитической функцией.scalar_expression cannot be an analytic function.

offsetoffsetКоличество строк до строки перед текущей строкой, из которой необходимо получить значение.The number of rows back from the current row from which to obtain a value. Если значение аргумента не указано, то по умолчанию принимается 1.If not specified, the default is 1. offset может быть столбцом, вложенным запросом или другим выражением, с помощью которого вычисляется целая положительная величина, или другим типом, который может быть неявно преобразован в bigint.offset can be a column, subquery, or other expression that evaluates to a positive integer or can be implicitly converted to bigint. offset не может быть отрицательным значением или аналитической функцией.offset cannot be a negative value or an analytic function.

значение по умолчаниюdefaultВозвращаемое значение, когда offset находится за пределами секции.The value to return when offset is beyond the scope of the partition. Если значение по умолчанию не задано, то возвращается NULL.If a default value is not specified, NULL is returned. default может быть столбцом, вложенным запросом или другим выражением, но не может быть аналитической функцией.default can be a column, subquery, or other expression, but it cannot be an analytic function. Аргумент default должен быть совместим по типу с аргументом scalar_expression.default must be type-compatible with scalar_expression.

OVER ( order_by_clause )OVER ( order_by_clause)partition_by_clause делит результирующий набор, полученный с помощью предложения FROM, на секции, к которым применяется функция.partition_by_clause divides the result set produced by the FROM clause into partitions to which the function is applied. Если этот параметр не указан, функция обрабатывает все строки результирующего набора запроса как отдельные группы.If not specified, the function treats all rows of the query result set as a single group. order_by_clause определяет порядок данных перед применением функции.order_by_clause determines the order of the data before the function is applied. Если аргумент partition_by_clause задан, он определяет порядок данных в секции.If partition_by_clause is specified, it determines the order of the data in the partition. Аргумент order_by_clause является обязательным.The order_by_clause is required. Дополнительные сведения см. в статье Предложение OVER (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

Пример — использование функции COUNT

Давайте посмотрим, как мы можем использовать HAVING с SQL функцией COUNT.

Вы можете использовать SQL функцию COUNT, чтобы вернуть название department (отдела) и количество employees (сотрудников в соответствующем отделе), sales (продажи) которых составляют более 25000 $ в год. SQL-предложение HAVING будет фильтровать результаты, так что будут возвращены только отделы с более чем 10 сотрудниками.

PgSQL

SELECT department,
COUNT(*) AS «Number of employees»
FROM employees
WHERE salary > 25000
GROUP BY department
HAVING COUNT(*) > 10;

1
2
3
4
5
6

SELECTdepartment,

COUNT(*)AS»Number of employees»

FROMemployees

WHEREsalary>25000

GROUP BYdepartment

HAVINGCOUNT(*)>10;

Общие сведения о доставке журналовLog Shipping Overview

Доставка журналов состоит из этих трех операций:Log shipping consists of three operations:

  1. резервное копирование журнала транзакций на экземпляре сервера-источника;Back up the transaction log at the primary server instance.

  2. копирование резервных копий журнала транзакций на экземпляр сервера-получателя;Copy the transaction log file to the secondary server instance.

  3. восстановление из резервных копий журнала транзакций на экземпляре сервера-получателя.Restore the log backup on the secondary server instance.

Журнал может доставляться нескольким экземплярам серверов-получателей.The log can be shipped to multiple secondary server instances. В этих случаях операции 2 и 3 повторяются для каждого экземпляра сервера-получателя.In such cases, operations 2 and 3 are duplicated for each secondary server instance.

Конфигурация доставки журналов не позволяет автоматически переходить с сервера-источника на сервер-получатель.A log shipping configuration does not automatically fail over from the primary server to the secondary server. Если база данных-источник становится недоступна, любой из серверов-получателей может быть вручную переведен в режим «в сети».If the primary database becomes unavailable, any of the secondary databases can be brought online manually.

Сервер-получатель можно использовать для построения отчетов.You can use a secondary database for reporting purposes.

Кроме того, можно настроить предупреждения в конфигурации доставки журналов.In addition, you can configure alerts for your log shipping configuration.

Типичная конфигурация доставки журналовA Typical Log Shipping Configuration

Следующий рисунок показывает конфигурацию доставки журналов с экземпляром сервера-источника, тремя экземплярами сервера-получателя и экземпляром сервера мониторинга.The following figure shows a log shipping configuration with the primary server instance, three secondary server instances, and a monitor server instance. Рисунок отображает шаги, выполняемые задачами резервного копирования, копирования и восстановления, следующим образом:The figure illustrates the steps performed by backup, copy, and restorejobs, as follows:

  1. экземпляр сервера-источника запускает задачу резервного копирования, чтобы создать резервную копию журнала транзакций в базе данных-источнике.The primary server instance runs the backup job to back up the transaction log on the primary database. Затем этот экземпляр сервера размещает резервную копию журнала в первичный файл резервной копии журнала, который сохраняется в папке резервного копирования.This server instance then places the log backup into a primary log-backup file, which it sends to the backup folder. На данном рисунке папка резервного копирования находится в общедоступном каталоге — общем каталоге резервных копий.In this figure, the backup folder is on a shared directory-the backup share.

  2. каждый из трех экземпляров сервера-получателя выполняет задачу копирования файла-источника резервной копии журнала в его локальную целевую папку;Each of the three secondary server instances runs its own copy job to copy the primary log-backup file to its own local destination folder.

  3. каждый экземпляр сервера-получателя запускает собственную задачу восстановления резервной копии журналов из локальной целевой папки в локальную базу данных-получатель.Each secondary server instance runs its own restore job to restore the log backup from the local destination folder onto the local secondary database.

Экземпляры сервера-источника и сервера-получателя посылают собственный журнал и состояние экземпляру сервера мониторинга.The primary and secondary server instances send their own history and status to the monitor server instance.

Использование конструкции GROUP BY с операцией ROLLUP

Как с помощью конструкции получать промежуточные итоговые значения (subtotals), уже было показано. За счет использования конструкции с операцией , однако, можно получать как промежуточные итоговые, так и общие суммарные (totals) значения и, следовательно, генерировать промежуточные агрегатные значения на любом уровне. Другими словами, операция позволяет получать агрегатные значения для каждой группы на отдельных уровнях. Промежуточные итоговые строки и конечные суммарные строки называются суперагрегатными строками (superaggregate rows).

В листинге ниже приведен пример применения конструкции с операцией .

SQL> SELECT Year,Country,SUM(Sales) AS Sales
FROM Company_Sales
GROUP BY ROLLUP (Year,Country);
  YEAR    COUNTRY     SALES
--------  --------  -------
  1997    France       3990
  1997    USA         13090
  1997                17080
  1998    France       4310
  1998    USA         13900
  1998                18210
  1999    France       4570
  1999    USA         14670
  1999                19240
                      54530 /* Так выглядит конечное суммарное значение */
SQL>

Символьные типы данных

Ниже перечислены символьные типы данных в Oracle/PLSQL:

Типы данных Размер Описание
char(размер) Максимальный размер 2000 байт. Где размер — количество символов фиксированной длины. Если сохраняемое значение короче, то дополняется пробелами; если длиннее, то выдается ошибка.
nchar(размер) Максимальный размер 2000 байт. Где размер — количество символов фиксированной длины в кодировке Unicode. Если сохраняемое значение короче, то дополняется пробелами; если длиннее, то выдается ошибка.
nvarchar2(размер) Максимальный размер 4000 байт. Где размер – количество сохраняемых символов в кодировке Unicode переменной длины.
varchar2(размер) Максимальный размер 4000 байт. Максимальный размер в PLSQL 32KB. Где размер – количество сохраняемых символов переменной длины.
long Максимальный размер 2GB. Символьные данные переменной длины.
raw Максимальный размер 2000 байт. Содержит двоичные данные переменной длины
long raw Максимальный размер 2GB. Содержит двоичные данные переменной длины

Применение: Oracle 9i, Oracle 10g, Oracle 11g, Oracle 12c

Примеры обработки ошибок MySQL

Давайте рассмотрим несколько примеров объявления обработчиков.

Обработчик, приведенный ниже, означает: когда происходит ошибка, устанавливается значение переменной has_error 1 и выполнение продолжается:

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET has_error = 1;

Ниже приводится другой обработчик, который означает, что в случае возникновении любой ошибки, производится откат предыдущей операции, выдается сообщение об ошибке и осуществляется выход из текущего блока кода.

Если вы объявляете его внутри блока BEGIN END хранимой процедуры, он немедленно завершает хранимую процедуру:

DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated';
END;

Если строк для вывода больше нет, для вариантов cursor или оператора SELECT INTO, значение переменной no_row_found устанавливается равным 1 и продолжается исполнение:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_row_found = 1;

При возникновении ошибки дублирования ключа, выдается ошибка MySQL 1062. Следующий обработчик выдает сообщение об ошибке и продолжает выполнение:

DECLARE CONTINUE HANDLER FOR 1062
SELECT 'Error, duplicate key occurred';

Просмотр текущих значений

Выполняется в оболочке mysql — для подключения вводим:

mysql -uroot -p

Посмотреть максимально разрешенное количество подключений:

> SHOW VARIABLES WHERE `variable_name`=’max_connections’;

Максимально разрешенное количество подключений на пользователя:

> SHOW VARIABLES WHERE `variable_name`=’max_user_connections’;

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

> SHOW status WHERE `variable_name` = ‘threads_connected’;

Тайм-аут ожидания для запросов:

> SHOW VARIABLES WHERE `variable_name`=’wait_timeout’;

Максимальный размер пакета:

> SHOW VARIABLES WHERE `variable_name`=’max_allowed_packet’;

Introduction to MySQL HAVING clause

The   clause is used in the  statement to specify filter conditions for a group of rows or aggregates.

The clause is often used with the  clause to filter groups based on a specified condition. If the clause is omitted, the clause behaves like the  clause.

The following illustrates the syntax of the clause:

1
2
3
4
5
6
7
8
9
10

SELECT

select_list

FROM

table_name

WHERE

search_condition

GROUPBY

group_by_expression

HAVING

group_condition;

In this syntax, you specify a condition in the clause. If a row, which is generated by the group by clause, causes the to evaluate to true, the query will include it in the result set.

Notice that the clause applies a filter condition to each group of rows, while the clause applies the filter condition to each individual row.

MySQL evaluates the clause after the , , and clauses and before , and clauses.


Note that the SQL standard specifies that the is evaluated before clause and after clause.

ОбъяснениеExplanation

База данных помечается как подозрительная из-за ошибки в процессе восстановления, который должен переводить ее в согласованное транзакционное состояние.The database is marked as suspect because it failed the recovery process that brings a database to a consistent transactional state. Это может происходить во время следующих операций.This can occur during the following operations:

  • Запуск экземпляра SQL ServerSQL Server.Starting up an instance of SQL ServerSQL Server.

  • Присоединение базы данных.Attaching a database.

  • Использование процедур RESTORE и RESTORE LOG.Using the RESTORE database or RESTORE LOG procedures.

Ссылка на основную публикацию